API 参考
BaseDAO API
TL;DR
基于 Prisma 的通用数据访问对象:统一权限检查、验证、钩子、软删除与 selects 连表。
👀 用法概览
import { BaseDAO } from '@/app/(admin)/actions/dao/base'
const dao = new BaseDAO({
modelName: 'role',
tableName: 'roles', // selects 连表必填
primaryKey: 'id',
softDelete: true,
fields: {
creatable: ['name', 'remark'],
updatable: ['name', 'remark'],
searchable: ['name'],
},
query: { defaultSort: { createdAt: 'desc' }, defaultPageSize: 20 },
validation: {
name: { required: true, minLength: 2, maxLength: 50 },
},
uniqueFields: ['name'],
hooks: {
beforeCreate: async (data) => data,
afterCreate: async (data, result) => {},
},
transforms: {
input: (data) => data,
output: (record) => record,
},
})📦 构造参数
new BaseDAO({
modelName: string,
tableName?: string,
primaryKey?: string, // 默认 'id'
softDelete?: boolean, // 默认 true
requireAdmin?: boolean,
fields?: { creatable?: string[]; updatable?: string[]; searchable?: string[] },
query?: { defaultSort?: Record<string,'asc'|'desc'>; defaultPageSize?: number; baseFilter?: object; foreignDB?: any[] },
validation?: Record<string, any>,
uniqueFields?: string[],
hooks?: Record<string, Function>,
transforms?: { input?: (d)=>any; output?: (r)=>any },
})🧩 关键能力
- 权限:默认检查后台访问;
requireAdmin: true时要求 admin 角色; - 验证:
validation+uniqueFields+ 自定义验证器; - 软删除:
softDelete: true时deletedAt自动过滤与写入; - 连表:支持两种查询模式
- Prisma include(原生)
- selects(
tableName+foreignDB,含数组字段关联)
- 转换:
transforms.input/output用于入库/出库处理; - 钩子:
before/afterCreate|Update|Delete|Batch*。
🧪 常用方法
getList(params)
getDetail(id, options?)
create(data)
update(id, data)
delete(id)
batchUpdate(ids, data)
batchDelete(ids)
count(where?)
sum(field, where?)
max(field, where?)
min(field, where?)
avg(field, where?)
getAll(where?, orderBy?)列表查询(自动分页)
入参(节选):
- pageIndex, pageSize
- sortJson 或 sortArr
- include(Prisma)/ foreignDB(selects)
- filters / whereJson / search
返回:{ success, data, total, pageIndex, pageSize, totalPages }
详情查询
- 优先使用
options.foreignDB进入 selects 连表; - 否则使用 Prisma include;
- 统一处理 Decimal/BigInt → number 的序列化。
✅ 建议
- 需要连表时务必设置
tableName; - 搜索字段写到
fields.searchable,避免拼装复杂 where; - 任何写操作都应在
fields.creatable/updatable中白名单化; - 业务校验放在
validation+hooks。
🔗 相关
- createCrudActions:基于 DAO 快速导出带权限的 Actions →
api/CRUD_HELPER - wrapAction:统一鉴权与日志 →
api/WRAP_ACTION