同一功能或缺陷修复的代码变更 SHALL 仅包含完成任务所必需的修改;不得在同一提交中进行无关重构、大范围格式化或与需求无关的文件挪动。
web-admin SHALL 遵循 AGENTS.md 中的栈与工具约定:包管理使用 pnpm;格式化以 Prettier(单引号、无分号、2 空格等)为准;ESLint/Stylelint 规则与仓库配置一致;Vue 与 Element Plus 依赖自动导入策略时,新增全局组件 SHALL 遵循既有 unplugin 配置而非随意手写重复导入(除非文件类型要求)。
web-admin 源码backend SHALL 使用 Python 3.9 与既有 FastAPI、SQLAlchemy、Pydantic v2 模式;新增领域逻辑 SHALL 优先落在 app/services/ 与 app/crud/,路由层保持薄;配置 SHALL 通过 pydantic-settings 与 .env 系列文件管理。
app/api/ 合适模块,schema 放入 app/schemas/,数据库访问放入 app/crud/ 或复用基类涉及表结构变更时,维护者 SHALL 在 docs/sql/ 中维护或更新与需求一致的 SQL 说明(全量基线导出为 zkxw.sql;增量变更可补充同目录下其他 .sql),并评估 Alembic/脚本与运行环境的同步(与 AGENTS.md 数据库变更约定一致)。
database-conventions 中的公共字段规则一致前端(web-admin)与后端(backend)的单个源码文件 SHALL 不超过 500 行。当文件因功能增长接近或超过此限制时,SHALL 将其拆分为多个职责单一的小文件(如:前端提取子组件、composable 或工具函数;后端按领域拆分 service、crud 模块或辅助函数)。配置文件、类型声明文件、SQL 脚本与自动生成文件不在此限制范围内。
crud/production_task.py → crud/production_task.py + crud/production_task_step.py),确保单个文件在 500 行以内提交信息 SHALL 使用完整句子说明「改了什么、为何」,并符合仓库 Conventional Commits / commitlint 类型约束。
web-admin 的 axios 拦截器(src/utils/http/index.ts)已对响应做两层解包:res.data.data → 返回值即为后端 data 字段的内容。因此页面组件中消费 API 函数返回值时,SHALL NOT 再做 { data } 解构或 .data 取值,SHALL 直接从返回值中读取业务字段。
{"code": 200, "data": {"list": [...], "total": 12}}const result = await fetchXxxList(params)result 已经是 {"list": [...], "total": 12},SHALL 使用 result.list、result.total,SHALL NOT 写 const { data } = await fetchXxxList() 再从 data.list 取值{"code": 200, "data": {"smsContent": "..."}}const result = await fetchGenerateSms(id)result 已经是 {"smsContent": "..."},SHALL 使用 result.smsContent,SHALL NOT 写 const { data } = await fetchGenerateSms() 再从 data.smsContent 取值src/utils/http/index.ts 第 420 行的 return res.data.data as T,确认拦截器已剥离 {code, data} 外层包装,消费端直接拿返回值即可前端 API 函数的 HTTP 方法(GET / POST / PUT / DELETE)SHALL 与后端路由装饰器(@router.get / @router.post / @router.put / @router.delete)严格一致。有副作用的操作(创建、更新、状态变更、内容生成)SHALL 使用 POST 或 PUT。
@router.post("/generate-sms")fetchGenerateSms SHALL 使用 request.post(),SHALL NOT 使用 request.get()request.get/post/put/delete 与后端 @router.get/post/put/delete 的方法一一匹配