跳转到内容

代码约定

类型格式示例
模块文件kebab-case.{role}.tsuser.controller.ts
Zod Schema{name}.schema.tsuser.schema.ts
中间件{name}.middleware.tsauth-guard.middleware.ts
工具函数{name}.util.tssql.util.ts
Vue 组件PascalCase.vueUserManagement.vue
配置{name}.config.tsenv.config.ts
类型格式示例
PascalCaseUserService
函数camelCasefindPage()
常量UPPER_SNAKE_CASERESPONSE_CODE
枚举值UPPER_SNAKE_CASEUserStatus.ENABLED
接口PascalCase,无 I 前缀UserVO
Zod SchemacamelCase + SchemauserCreateSchema
// 1. Node.js 内置
import * as path from 'node:path'
// 2. 第三方
import { Hono } from 'hono'
import { z } from 'zod'
// 3. Workspace 共享包(优先子路径)
import { userCreateSchema } from '@seed/contracts/schemas/user'
import { BusinessError } from '@seed/contracts/errors'
// 4. 项目内部
import { UserService } from './user.service'

优先子路径导入(@seed/contracts/schemas/user),避免 barrel export 打包冗余。

BusinessError (base)
├── ValidationError (422)
├── UnauthorizedError (401)
├── ForbiddenError (403)
├── NotFoundError (404)
└── ConflictError (409)
// ✅ 语义化工厂方法
throw new NotFoundError('User', id)
throw ConflictError.emailExists(email)
// ❌ 手写状态码
c.json({ error: 'Not Found' }, 404)

Service 与 Repository 层仅负责抛出语义化异常,由 errorHandlerMiddleware 统一拦截并映射为标准 HTTP 响应。

位置类型
packages/contracts/src/schemas/跨模块共享(分页、用户、认证)
packages/services/src/{name}/{name}.schema.ts模块专用

Schema 作为单一数据源(SSOT),系统类型直接基于 schema 静态推导,禁止重复声明 interface:

export const userCreateSchema = z.object({ ... })
export type UserCreateDto = z.infer<typeof userCreateSchema>
职责禁止
Controller路由 + Zod 验证 + 编排不含业务逻辑,不直接操作 ORM
Service业务逻辑 + 抛异常 + 返回 VO不引用 Hono Context
RepositoryDrizzle 数据访问不含业务逻辑
职责禁止
View (.vue)渲染 + 绑定 store不含逻辑
Controller纯 TS 业务逻辑不导入 Vue / Pinia
StoreDI 组装 + reactive 桥接不含业务逻辑
ServiceHTTP 调用不持有状态
对象方式位置
后端 Controller集成(app.requestservices/src/{name}/__tests__/
Service单元(mock Repository)同上
前端 Controller单元(mock deps)views/{module}/__tests__/
<type>(<scope>): <subject>

type: feat · fix · refactor · chore · docs · test · style · perf · ci