Files
medical-mall/docs/project_spec/AGENT_PROJECT_SPEC.md
2026-02-05 10:11:09 +08:00

326 lines
13 KiB
Markdown
Raw Permalink 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.
# Agent 项目规范文档uni-app / uvue / uts
## 0. 文档目标与适用范围
- **目标**统一项目目录、命名、依赖边界、数据库SQL/RLS/RPC安全策略与准入流程使 Agent 在改动代码/SQL 时遵循一致的工程约束与安全基线。
- **适用范围**
- 前端:`pages/``components/``layouts/``services/``utils/``types/``uni_modules/``static/`
- 文档与数据库:`docs/``docs/sql/`、模块内 `test/` SQL
---
## 1. 项目核心结构与职责边界
### 1.1 页面与路由
- **权威路由配置**:根目录 `pages.json`
- **分包规则**
- `tabBar`:主入口页面(消费者端)
- `subPackages`按模块分包consumer 非 tab 页、delivery、analytics、admin、merchant、service 等模块)
- **页面目录**`pages/`
- `pages/user/`:登录/注册/用户中心等公共页面
- `pages/mall/<module>/`各业务模块consumer/delivery/analytics/admin/merchant/service...
- **规则**
- `pages/` 内只放页面(路由入口)与页面级组合逻辑
- 可复用 UI/逻辑必须下沉到 `components/` / `services/` / `utils/` / `types/`
### 1.2 布局
- **目录**`layouts/`
- **规则**
- layout 只负责结构与 slot/容器
- layout 不直接写重业务数据请求(可触发初始化但不承担领域逻辑)
### 1.3 组件
- **目录**`components/`
- **推荐分层(可渐进迁移)**
- `components/base/`:无业务语义基础组件(按钮、弹窗、表单控件、空状态等)
- `components/biz/<domain>/`带业务语义组件订单卡片、SKU 选择器等)
- `components/integration/<vendor>/`:第三方/平台集成组件(如 supabase、analytics SDK 外观层)
- **规则**
- 组件不得直接读写数据库或拼接 SQL
- 网络/数据访问必须通过 `services/`(数据访问唯一入口)
### 1.4 服务层(数据访问唯一入口)
- **目录**`services/`
- **职责**
- RPC/API 调用封装
- 鉴权、token 注入、错误标准化处理
- 数据转换DTO -> ViewModel 允许在这里或页面层,但必须统一口径)
- **规则**
- 页面/组件不得直接访问底层 client如 supabase client必须经 `services/` 统一出口
### 1.5 工具与类型
- **目录**
- `utils/`:纯工具函数(尽量无 IO、无全局状态
- `types/`全局类型、领域模型、DTO、服务返回类型
- **规则**
- `utils/` 不反向依赖业务模块目录
- `types/` 不依赖运行时代码(保持纯类型)
### 1.6 插件/可替换模块
- **目录**`uni_modules/`
- **定位**:可独立发布/可替换的插件能力组件、uts sdk、集成适配等
- **规则**
- 不把所有业务通用代码塞到 `uni_modules/`;业务通用优先 `services/utils/components`
---
## 2. 路径别名与引用规范
### 2.1 当前事实
- `tsconfig.json` 已配置:`@/* -> ./*`
### 2.2 统一引用建议Agent 必须遵循)
- 默认使用 `@/` 前缀引用项目内代码(例如 `@/services/...``@/components/...`
- 不强制引入 `@components``@uni_modules` 这类新 alias除非后续明确要落地到配置文件当前以目录语义规范为准
---
## 3. 依赖方向(强约束)
为避免循环依赖与业务污染,依赖方向必须满足:
- `pages` -> 可依赖 `components/services/utils/types/layouts`
- `components` -> 可依赖 `services/utils/types`
- `layouts` -> 可依赖 `components/utils/types`(避免重业务)
- `services` -> 只依赖 `utils/types`(不得依赖 pages/components
- `utils` -> 不依赖业务目录
- `types` -> 不依赖运行时代码
---
## 4. 命名与文件组织规范
- **目录名**:全小写,必要时用连字符(全仓统一一种风格)
- **组件文件**`PascalCase.uvue`
- **服务文件**:统一 `xxxService.uts`
- **SQL 文件**
- 测试阶段:模块 `test/` 下自由命名,但必须含用途前缀
- 权威阶段:进入 `docs/sql/` 后必须按分层目录 + 版本号命名(见第 6 节)
---
## 5. 数据库/权限权威口径(与前端联动)
本项目数据库权限与前端路由/页面访问形成闭环。以下为强制口径:
- **角色字段唯一权威**`public.ak_users.role`
- **analytics/admin 的全局数据访问**:必须通过 RPC 完成,避免直接开放业务表全局权限
- **前端必须做客户端守卫**
- 访问 analytics/admin 页面入口时,必须校验登录与角色(例如 `ensureRole(['admin','analytics'])`
- 客户端守卫只用于“快速失败”,最终权限以数据库侧为准
---
## 6. SQL 两阶段工作流(模块测试 -> 权威入库)
### 6.1 阶段 A模块内测试 SQL非权威
- **位置**:各模块目录 `test/`
- 例:`pages/mall/analytics/test/*.sql`
- **允许**:快速迭代、验证思路、临时脚本
- **禁止**:高危破坏性操作(见 7.3
### 6.2 阶段 B入库到 `docs/sql/`(权威)
- **位置**`docs/sql/`
- **入库准入条件**
- 必须通过 Agent 安全评估(输出评审报告)
- 必须符合本项目角色/RLS/RPC 安全口径(见 7.2;并强制对照 `docs/sql/11_roles_and_permissions_strategy.md`
- 建议至少 1 人人工确认后再合并
### 6.3 `docs/sql/` 分层(权威目录结构)
为保证可审计、可复用与最小风险暴露,进入权威目录的 SQL 必须按“对象类型”拆分归档,禁止将多种对象(表 + RLS + RPC + GRANT 等)长期混放在同一个文件中。
- `docs/sql/00_meta/`:规范/策略/说明类(如角色与权限策略)
- `docs/sql/10_schema/`:表/类型/索引等 DDL
- 建议进一步按域分组:`docs/sql/10_schema/<domain>/...`
- `docs/sql/20_rls/`RLS enable + policies按表/域拆分)
- 建议进一步按域分组:`docs/sql/20_rls/<domain>/...`
- `docs/sql/30_rpc/`RPC/函数(尤其 analytics
- 建议进一步按域分组:`docs/sql/30_rpc/<domain>/...`
- `docs/sql/40_grants/`显式授权GRANT/REVOKE
- 仅允许最小权限;对 `anon/authenticated` 的任何授权必须附带评审结论
- `docs/sql/90_archive/`:历史/废弃(只读,不再作为引用口径)
**对象拆分规则(入库必选一类)**
- **表/类型/索引**:只放 DDL`CREATE/ALTER TABLE/TYPE/INDEX`),归入 `10_schema`
- **RLS 策略**:只放 `ALTER TABLE ... ENABLE ROW LEVEL SECURITY``CREATE POLICY/ALTER POLICY/DROP POLICY`,归入 `20_rls`
- **函数/RPC**:只放 `CREATE OR REPLACE FUNCTION ...`(含 `SECURITY DEFINER` 等),归入 `30_rpc`
- **授权**:只放 `GRANT/REVOKE`,归入 `40_grants`
**例外(允许同文件)**
- 同一对象的“紧耦合小变更”可以同文件(例如同一个函数的创建 + 注释/owner 设置),但不得混入其他对象类型。
### 6.4 权威 SQL 入库步骤(从模块 test/ 迁移)
当模块内 `test/` SQL 验证通过、准备进入 `docs/sql/` 时,必须按以下步骤执行:
- **步骤 0目录存在性检查必须**
- 若以下目录不存在Agent 必须创建;若已存在则复用,禁止新建“近似重复目录”。
- 目录清单:
- `docs/sql/00_meta/`
- `docs/sql/10_schema/`
- `docs/sql/20_rls/`
- `docs/sql/30_rpc/`
- `docs/sql/40_grants/`
- `docs/sql/90_archive/`
- 如采用域分组(`<domain>`),对应的 `docs/sql/<layer>/<domain>/` 目录同样遵循“无则创建,有则复用”。
- **步骤 1对象识别与拆分**
- 将 SQL 按对象类型拆分为schema / rls / rpc / grants必要时再细分 domain
- **步骤 2命名与归档路径确定**
- 表/DDL`docs/sql/10_schema/<domain>/<object>_v<version>.sql`
- RLS`docs/sql/20_rls/<domain>/<table>_rls_v<version>.sql`
- RPC`docs/sql/30_rpc/<domain>/<rpc_name>_v<version>.sql`
- Grants`docs/sql/40_grants/<domain>/<scope>_grants_v<version>.sql`
- **步骤 3安全评审Agent 必须输出评审报告)**
- 评审必须强制对照 `docs/sql/11_roles_and_permissions_strategy.md`
- 结论为 `OK` 方可入库
- **步骤 4入库与引用口径**
- 入库后,模块 `test/` 中对应脚本仅保留为测试/回归用途(不得再作为权威引用)
---
## 7. Agent SQL 安全评估制度(准入制)
### 7.1 评估结论(必须输出其一)
- `Reject`:拒绝入库
- `High`:高风险,必须整改后复评
- `OK`:可入库
### 7.2 项目强制安全要求RPC/analytics
所有 `rpc_analytics_*`(及类似特权 RPC必须满足
- `SECURITY DEFINER`
- `SET search_path = public`(固定 search_path
- 函数入口显式鉴权:
- `get_current_user_role() IN ('admin','analytics')` 才允许执行
- 返回字段最小化(只返回统计必要字段/聚合结果)
**强制参照文档**:所有 SQL 评审必须对照并满足 `docs/sql/11_roles_and_permissions_strategy.md` 中的角色定义、RLS 分层、RPC 安全闭环要求。
### 7.3 硬阻断出现任意一条Reject
- **裸放权**:对 `anon/authenticated` 大范围 `GRANT` 且无等价约束
- **破坏性操作**
- `DROP TABLE/SCHEMA/ROLE/EXTENSION`
- `TRUNCATE`
- 大范围 `DELETE/UPDATE` 无可靠 `WHERE`
- **不安全的 SECURITY DEFINER**
- 无入口鉴权
- 未固定 `search_path`
- **绕过 RLS 的不透明入口**:绕过后无角色校验/无最小返回字段
### 7.4 高风险需整改High
- RLS 覆盖不全(业务需要写但未覆盖 `INSERT/UPDATE/DELETE`
- policy 条件过宽(如 `USING (true)`
- RPC 返回敏感字段
- 无分页/无 LIMIT 约束造成全量泄露或性能风险
---
## 8. Agent SQL 评审报告模板(固定输出)
### SQL 安全评审报告
- **对象**`<文件路径>`
- **目标**`<此 SQL 的目的>`
- **结论**`Reject | High | OK`
- **涉及对象**
- 表/视图/函数:`...`
- 角色/权限:`...`
- RLS是否启用/修改;覆盖哪些操作
- `SECURITY DEFINER`:是/否;入口鉴权:是/否;`search_path` 固定:是/否
- **与项目口径一致性(强制对照 docs/sql/11**
- admin/analytics 是否仅通过 RPC 获取全局数据:是/否
- **风险点列表**
- `等级` + `定位(片段/行号)` + `原因`
- **整改建议**
- 可执行修改建议清单
- **准入建议**
- 是否允许进入 `docs/sql/`:是/否;若否:进入条件
---
## 9. 与现有 SQL/文档目录的边界(避免双真相)
仓库存在多处 SQL/迁移相关目录(如 `mall_sql/``doc_mall/`)。必须明确:
- **权威策略/权威脚本口径**:以 `docs/sql/` 为准
- 其他目录若属于迁移脚本仓/历史产物:
- 必须标注用途(迁移工具、一次性脚本、报告存档)
- 不允许出现与 `docs/sql/` 并行的“第二份权威定义”
---
## 10. 操作文档(强制)
任何会对项目产生可观察影响的操作Agent 必须同步编写“操作文档”,将操作过程与结果可描述化、可审计化。
### 10.1 何时必须写操作文档
- 修改/新增/删除任何代码文件(`.uvue/.uts/.ts/.js/.json/.scss` 等)
- 修改 `pages.json``manifest.json``package.json``tsconfig.json` 等配置
- 新增/调整 SQL包括模块 `test/``docs/sql` 权威入库)
- 任何涉及权限/鉴权/RLS/RPC/GRANT 的变更
### 10.2 操作文档存放位置(从当前操作目录向上查找)
存放规则:从“当前正在操作的目录”开始,逐层向上寻找 `docs/` 目录,直到“当前模块根目录”为止。
- 若在某一层找到 `docs/`:将操作文档写入该 `docs/` 下的 `ops/` 子目录。
- 若一路向上直到模块根目录仍未找到 `docs/`Agent 必须在模块根目录创建 `docs/ops/` 并写入。
- 若目标 `docs/ops/` 不存在Agent 必须创建;若存在则复用。
**模块根目录判定**(满足任一即可认为到达模块根):
- 存在 `pages.json`(项目根)
- 或进入了业务模块目录(例如 `pages/mall/analytics/``pages/mall/admin/``pages/user/`)的顶层
- 或进入了公共模块目录(例如 `services/``components/``utils/``types/``uni_modules/<name>/`)的顶层
### 10.3 公共模块 vs 业务模块 的归档规则
- **业务模块操作**:文档归档到该业务模块自己的 `docs/ops/`
- 例:操作发生在 `pages/mall/analytics/...`,则优先归档到 `pages/mall/analytics/docs/ops/`
- **公共模块操作**:文档归档到对应公共模块自己的 `docs/ops/`
- 例:操作发生在 `services/...`,则归档到 `services/docs/ops/`
- 例:操作发生在 `uni_modules/<name>/...`,则归档到 `uni_modules/<name>/docs/ops/`
### 10.4 操作文档命名规范
- 文件名:`YYYY-MM-DD__<scope>__<short-title>.md`
- `scope` 建议值:
- `analytics` / `admin` / `consumer` / `merchant` / `delivery` / `user`
- `services` / `components` / `utils` / `types` / `uni_modules-<name>`
### 10.5 操作文档最小内容模板
- **摘要**:做了什么
- **动机**:为什么要做
- **影响范围**:涉及哪些模块/页面/接口/权限
- **变更清单**
- 新增文件:...
- 修改文件:...
- 删除文件:...
- **兼容性与风险**:可能的副作用、回滚风险
- **回滚方案**:如何撤销、恢复到原状态
- **验证方式**:如何验证改动正确(手工步骤/测试点)
- **关联文档**:例如 `docs/sql/11_roles_and_permissions_strategy.md` 或对应评审报告