Files
medical-mall/docs/AGENT_PROJECT_SPEC.md

13 KiB
Raw Blame History

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/:历史/废弃(只读,不再作为引用口径)

对象拆分规则(入库必选一类)

  • 表/类型/索引:只放 DDLCREATE/ALTER TABLE/TYPE/INDEX),归入 10_schema
  • RLS 策略:只放 ALTER TABLE ... ENABLE ROW LEVEL SECURITYCREATE 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命名与归档路径确定

    • 表/DDLdocs/sql/10_schema/<domain>/<object>_v<version>.sql
    • RLSdocs/sql/20_rls/<domain>/<table>_rls_v<version>.sql
    • RPCdocs/sql/30_rpc/<domain>/<rpc_name>_v<version>.sql
    • Grantsdocs/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.jsonmanifest.jsonpackage.jsontsconfig.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 或对应评审报告