mirror of
https://github.com/certd/certd.git
synced 2026-06-10 10:37:34 +08:00
3.1 KiB
3.1 KiB
后端规则
主包:packages/ui/certd-server。后端使用 Node.js、ESM、TypeScript、MidwayJS 3、Koa、TypeORM,默认 better-sqlite3,同时支持 PostgreSQL 和 MySQL,并通过 @certd/midway-flyway-js 使用类似 Flyway 的 SQL 迁移机制。
详细入口、模块和验证命令见 .codex/repo-map.md。
默认开发配置
- HTTP 端口:
7001 - HTTPS 端口:
7002 - 默认 SQLite 数据库:
./data/db.sqlite - 默认文件根目录:
./data/files
数据与迁移
- 后端使用 TypeORM 实体加 SQL 迁移。
- 重点查看
packages/ui/certd-server/src/modules/**/entity/*.ts和packages/ui/certd-server/db/migration/*.sql。 - 默认配置中
synchronize: false,涉及表结构变更时应添加或更新迁移脚本,不要依赖 TypeORM 自动同步。
文件上传
使用 /basic/file/upload 上传文件后,接口返回的是临时缓存 key。业务保存表单或设置时,后端必须调用 FileService.saveFile(userId, key, "public" | "private") 转成永久文件 key 后再入库/入设置;不要直接保存 tmpfile_key_...,否则后续回显或下载会失效。
Service 与事务
- 后端方法参数超过 3 个时,尽量改为对象参数传入。
- 需要传入
manager/EntityManager做事务传播的方法,必须使用对象参数,不要把manager作为位置参数藏在参数列表末尾。 - 后端 service 层只有存在事务链路传播需求时才定义
ctx,不要为了将来可能需要而提前给普通方法加ctx。 - 事务链路方法统一采用
method(ctx, req)形式,ctx放第一位并承载manager?: EntityManager等横切上下文,业务参数放在req对象里,例如settleCommission({ manager }, { tradeId, userId, amount })。 - 无事务链路需求的普通查询、纯函数和简单私有方法继续使用明确参数。
- service 内部需要根据事务上下文选择 Repository 时,优先使用
BaseService.getRepo(ctx, EntityClass);不要在业务方法里反复写ctx.manager?.getRepository(Entity) || this.xxxRepository。 - 拿到 repo 后 save/update/delete/find 都能做,不需要再包一层
saveEntity之类的单一用途方法。 - service 拼接用户与项目范围查询条件时,优先使用
BaseService.buildUserProjectQuery(userId, projectId);不要直接写{ userId, projectId },否则projectId为空时可能把null/undefined带入 TypeORM 条件,导致查询或 update 不符合预期。 ctx类型统一从BaseService导出的ServiceContext复用,不要在每个 service 里重复定义。- 需要“有事务则复用、无事务则开启”时,使用
BaseService.transactionWithCtx(ctx, callback):ctx.manager存在则直接执行 callback,否则自动this.transaction()。不要在业务代码里手写if (ctx.manager) { ... } else { await this.transaction(...) }。 - 新增方法注意不要与
BaseService基类方法签名冲突,例如delete(id)vsBaseService.delete(ids, where?),ts-node 下会直接 TS2416 编译报错。冲突时改用具体名称如deleteById。