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: truedeletedAt 自动过滤与写入;
  • 连表:支持两种查询模式
    • 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