目录
CRUD抽象化框架构建
视频地址:https://www.bilibili.com/video/BV1pG4y167cV/
CRUD抽象化框架构建
查看上一节的代码我们会发现有很多重复性的CRUD方法在复制粘贴,比如CategoryService
与PostService
,CategoryController
与PostController
等。所以本节的目标是对这些CRUD类进行抽象化
- 实现CRUD的Service基类
- 实现CRUD的Controller基类
核心模块
服务基类
repository
属性为默认的存储类,通过子类的constructor
注入来赋值,必须继承自BaseRepository
或BaseTreeRepository
enabl_trash
属性用于确定是否包含软删除操作list
用于获取数据列表paginate
用于获取分页数据detail
用于获取数据详情creatte
用于创建数 据(注意:此方法由子类实现,子类不实现则调用时抛出403update
方法与create
一样由子类实现delete
用于删除单条数据deleteList
用于批量删除数据deletePaginate
与deleteList
的区别在于删除数据后返回的列表是分页数据restore
,restoreList
,restorePaginate
用于恢复数据,返回的列表与删除雷同buildItemQuery
用于构建单条数据的查询器buildListQuery
用于构建数据列表的查询器
// src/modules/core/crud/service.ts
export abstract class BaseService<
E extends ObjectLiteral,
R extends BaseRepository<E> | BaseTreeRepository<E>,
P extends QueryListParams<E> = QueryListParams<E>,
M extends IPaginationMeta = IPaginationMeta,
> {
protected repository: R;
protected enable_trash = false;
constructor(repository: R) {
this.repository = repository;
if (
!(
this.repository instanceof BaseRepository ||
this.repository instanceof BaseTreeRepository
)
) {
throw new Error(
'Repository must instance of BaseRepository or BaseTreeRepository in DataService!',
);
}
}
async list(params?: P, callback?: QueryHook<E>): Promise<E[]>
async paginate(
options: PaginateDto<M> & P,
callback?: QueryHook<E>,
): Promise<Pagination<E, M>>
async detail(id: string, trashed?: boolean, callback?: QueryHook<E>): Promise<E>
create(data: any): Promise<E>
update(data: any): Promise<E>
async delete(id: string, trash = true)
async deleteList(data: string[], params?: P, trash?: boolean, callback?: QueryHook<E>)
async deletePaginate(
data: string[],
options: PaginateDto<M> & P,
trash?: boolean,
callback?: QueryHook<E>,
)
async restore(id: string, callback?: QueryHook<E>)
async restoreList(data: string[], params?: P, callback?: QueryHook<E>)
async restorePaginate(data: string[], options: PaginateDto<M> & P, callback?: QueryHook<E>)
protected async buildItemQuery(query: SelectQueryBuilder<E>, callback?: QueryHook<E>)
protected async buildListQuery(qb: SelectQueryBuilder<E>, options: P, callback?: QueryHook<E>)
}