Files
collab-ledger/docs/backend-feature-development.md
T
2026-06-17 20:58:00 +08:00

134 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 后端业务功能开发规范
本文是本项目 Hono 后端新增或修改业务功能时的权威规范。后端代码位于 `backend`,基于 Hono、Prisma、Redis 和统一响应/错误协议实现。
## 架构原则
后端业务代码按 `Route -> Feature Service -> Prisma/Redis/shared Service` 组织。
优先参考这些现有模块:
- `backend/src/routes/modules/system-user.ts`
- `backend/src/routes/modules/system-role.ts`
- `backend/src/routes/modules/system-menu.ts`
- `backend/src/routes/modules/system-notice.ts`
- `backend/src/features/system/system.service.ts`
- `backend/src/features/collaboration/collaboration.service.ts`
Route 只负责 HTTP 层编排,不直接堆业务规则。复杂查询或业务流程放到 `features/<domain>` 下的 service 中。不要把 Prisma 原始记录直接作为跨模块业务契约扩散,面向前端的响应应在 service 中整理为稳定 DTO 形态。
## 开发准备
开发新后端业务功能前,应先确认需求所属领域、涉及的数据表、接口范围、权限标识和相似模块。
开始编码前必须先做一次相似模块调研,确认目标功能最接近 `user``role``menu``notice``config``collaboration` 还是其他模块,再按相似模块的命名、路由、分页、异常、权限、导出和测试风格实现。
## 目录结构
路由入口放在:
```text
backend/src/routes/modules/<module>.ts
```
业务代码放在:
```text
backend/src/features/<domain>/
├── <domain>.service.ts
├── <domain>.schemas.ts
└── public-config.ts
```
共享能力放在:
```text
backend/src/shared/
├── auth/
├── cache/
├── config/
├── db/
├── hono/
└── http/
```
数据库 schema 维护在:
```text
backend/prisma/schema.prisma
```
初始化 SQL 维护在:
```text
backend/sql/init.sql
```
## 各层职责
Route 负责 HTTP 层:
- 声明 Hono 路由和 HTTP 方法。
- 使用 `requireAuth``requirePermission` 做认证和权限控制。
- 使用 `zValidator` 校验请求体或查询参数。
- 调用 Feature Service。
- 使用 `ok()``page()` 或下载响应工具返回统一响应。
Feature Service 负责编排业务用例:
- 分页查询、详情查询、导出查询、新增、修改、删除。
- 处理业务校验和状态变化。
- 调用 Prisma、Redis 或 shared service 完成持久化和缓存操作。
- 将数据库记录转换为前端响应对象。
- 业务失败时抛出 `ApiError`,不要返回布尔值让 Route 解释。
Shared 层只放跨模块复用能力:
- 认证、权限、会话和当前用户。
- Prisma 和 Redis 客户端。
- 统一响应、错误处理、下载、Excel。
- 菜单、配置等跨模块辅助逻辑。
## 开发流程
1. 检索并阅读一个最相似的 Hono 模块,确认命名、路由、分页、异常、权限和导出风格。
2. 确认数据库表结构,必要时更新 `prisma/schema.prisma` 和初始化 SQL。
3.`features/<domain>` 中实现业务函数,保持函数职责单一。
4.`routes/modules/<module>.ts` 中添加路由,接入认证、权限、校验和统一响应。
5. 如功能出现在后台菜单,补充权限标识和 `backend/sql/init.sql` 菜单数据。
6. 如需要字典数据,优先使用 `features/system/system-dictionary.ts` 中的枚举式配置,不要默认创建字典管理表。
7. 增加聚焦测试或至少运行 TypeScript 检查;高风险改动应补充接口级验证。
8. 运行 `pnpm --dir backend typecheck`
## 权限、日志和错误
权限码必须和前端菜单或按钮权限保持一致,格式参考现有系统功能:
```ts
requirePermission("system:user:list")
```
业务错误使用 `ApiError``ErrorCodes`
```ts
throw new ApiError(ErrorCodes.failed, "操作失败");
```
接口返回使用统一响应:
```ts
return c.json(ok(result));
return c.json(page(result.records, result.total));
```
导出接口优先使用 `createWorkbookResponse()`
## 验收清单
- Route 只有 HTTP 编排逻辑。
- 业务校验位于 Feature Service,不散落在前端或 Route。
- 查询返回稳定 DTO,分页返回统一 `page()` 响应。
- 写请求使用 zod schema 校验。
- 权限码、菜单 SQL、前端 API 调用保持一致。
- `pnpm --dir backend typecheck` 通过。