--- name: tofly-memory-system description: AI 记忆系统配置入口 — 3层架构动态加载 + rules 系统注入,按任务类型精确路由,安全红线只读不可覆盖 --- # AI 记忆系统 — 配置入口 > **这是 AI 每次对话首先加载的唯一配置文件。** 其余配置按需动态加载。 > > 设计目标:**默认只消耗 ~40 行 token**(规则已由 rules/ 注入不计入),根据任务类型按需加载其余配置。 --- ## 一、始终生效的底线规则(Tier 0) > 核心行为与安全规则已由 `rules/always-on-rule.md` 系统自动注入,**每次对话始终生效,无需 AI 主动读取**。 > 此处仅保留与路由相关的项目级入口和用户习惯指引。 ### 1.0 当前项目情况(严格执行) - **必读**:仓库根目录下的 [current_project_config.md](../../../current_project_config.md)(勿与 `.cursor/` 下模板混淆)。任何代码任务须先解析其中的 **「项目标签(路由)」** 单行,再按 §2.1 映射加载;禁止仅凭 L2 通用技术栈表猜测框架。 - **项目事实优先级**(与安全红线无关的技术栈/UI/库/目录):根目录 `current_project_config.md` **优先于** [L2 §一](./warehouse_shared_config.md#L9-L47) 与 L1 非安全章节;**不得**用 L2 中的通用组件库/框架表述覆盖本项目已声明事实。 - **「项目标签(路由)」格式**(须为单独一行,便于解析):`项目标签(路由):/[/...]`,token 为下表关键字,全小写,例如 `vben3/java1`、`vue3/java3`、`vben3/java1/uniapp`。该行可与下方的自然语言「补充说明」并存,**路由仅以本行 token 为准**。 - **目录与命名(强制)**:**后端、PC 前端、移动端**的**顶层放置位置、子应用划分、微服务/模块目录名**一律以 [L1 §七 项目目录与命名规范](./company_unified_config.md#L446-L680) 为准(§7.1 总则、§7.2 根目录、§7.3 后端、§7.4 前端、§7.5 移动端含 UniApp、§7.6–7.8)。须落实:**小写 + 短横线**的微服务名(§7.3)、`backend/` / `frontend/` / `mobile/` 一级约定、`frontend` 下 `admin`/`client` 等子应用划分、`mobile` 下全小写 app 名、§7.4 `src/` 下目录与组件 **PascalCase / kebab-case** 等规则。[L2 §二](./warehouse_shared_config.md#L49-L113) 中的 `java/`、`web/`、`app/` **不得**作为**新建**目录或**新服务命名**的依据,仅用于描述与 L1 不一致的**存量物理路径**;**新建骨架、新微服务、新前端应用、新 App 子目录**必须按 L1 字面创建(空仓库禁止用 L2 字面替代 L1 公司树)。**L1 ↔ L2 ↔ 实际** 三方对照须在 **§2.0** 当轮回复中以四列表交付;存量路径与 L1 不一致时须在表中标注 **`待用户确认迁移`** 或 **`存量仅修补`**,不得默认可长期新建在违规路径下。 ### 1.1 用户习惯记录 - 每次对话开始时,应读取 [L3 §五 用户习惯记录](./local_private_config.md#L129-L172),了解用户的历史偏好和纠正 - 用户说"记住这个""以后都这样"时,必须更新该节 --- ## 二、动态加载路由表(Tier 1+) > 收到用户问题后,AI 先判断**任务类型**,再从下表决定需要额外读取哪些配置。 > 使用 Read 工具**精确读取指定文件的对应章节**,不要全量加载。 ### 路由决策流程 ``` 用户提问 │ ├─→ 判断任务类型(可多选匹配) │ │ │ ├─ 【项目初始化 / 整体目录对齐】? ──→ 见 §2.0(回复内四列表交付) │ ├─ 【代码编写】? ──→ 见 §2.1(含 §2.1.1 DDL 深度审查) │ ├─ 【技术选型/架构】? ──→ 见 §2.2 │ ├─ 【Git 操作】? ──→ 见 §2.3 │ ├─ 【调试/排错】? ──→ 见 §2.4 │ ├─ 【构建/运行/部署】? ──→ 见 §2.5 │ ├─ 【测试】? ──→ 见 §2.6 │ ├─ 【纯问答/解释】? ──→ 无需额外加载 ✅ │ └─ 【文档生成】? ──→ 仅当用户明确要求时处理 │ └─→ 根据匹配的类型,读取对应的配置片段 ``` > 用户习惯读取已在 §1.1 声明,此处不重复。 ### 2.0 项目整体目录对齐(执行前置 · L1 §七 命名强制) 触发关键词:`新建项目` `初始化` `脚手架` `目录对齐` `Monorepo` `仓库结构` `整体搭建` `拉齐目录` `项目骨架` #### L1 §七、L2 §二 与物理目录的关系(必读) | 概念 | 文件与范围 | 含义 | |---|---|---| | **公司规范树(唯一命名准绳)** | [L1 §七](./company_unified_config.md#L446-L680) 全文 | **后端 / PC 前端 / 移动端** 目录**怎么起名、放哪一层**只认本节:根级 `backend/`、`frontend/`、`mobile/`、`shared/`、`docs/`、`scripts/` 等(§7.2),微服务 `backend/{业务域}-{角色}/`(§7.3),前端 `frontend/admin|client|shared` 与 §7.4 `src/` 结构,移动 `mobile/{app}/` 与 UniApp 树(§7.5) | | **技能示例树(L2)** | [L2 §二](./warehouse_shared_config.md#L49-L113) | **非命名规范**:`java/`、`web/`、`app/` 等仅为文档中的示例物理布局;**新建**服务/应用/目录时 **禁止**以 L2 字面作为合规依据 | | **物理树** | Glob 结果 | **存量事实**;在路径与 L1 不一致时,允许在**不扩大违规命名范围**的前提下做最小修补;**新增**业务目录、新微服务、新前端子应用须在 **L1 规定路径** 下创建(空仓库 **必须** 直接按 L1 §7.2 起目录) | **对照表(须在 §2.0 本轮回复中输出的四列表骨架;列名不变,内容须体现 L1 为强制目标)**: | L1 §七(规范路径 · 新建须用) | L2 示例(非规范 · 勿用于新命名) | 备注 | |---|---|---| | `backend/{service}/`(§7.3,短横线全小写) | `java/`、`java/{service}/` | 新服务 **必须** 落在 `backend/` 下并满足 §7.3;存量 `java/` 仅记录为差异,新代码优先新路径或经用户确认迁移 | | `frontend/admin/`、`frontend/client/`(§7.4) | `web/`、`app/` | 新 PC 前端应用 **必须** 在 `frontend/` 下建子目录;存量 `web/`/`app/` 内 **新建业务模块** 仍须遵守 §7.4 `src/` 下命名(api、views、components 等) | | `mobile/{app}/` 及 `uniapp/` 子树(§7.5) | 同左 | App 名 **全小写**(如 `manage`、`meter`);UniApp 子目录与 §7.5 一致 | | `shared/openapi/` 等(§7.6) | — | 契约文件落点按 §7.6 | | `docs/`、`scripts/`(§7.7) | 同左 | 文档与脚本目录按 §7.7 | #### 强制执行顺序 1. **读规范**:精确 Read [L1 §七 项目目录与命名规范](./company_unified_config.md#L446-L680)(**全文**,含 §7.2–7.8:根目录、后端、前端、移动、共享模块、文档与脚本、`.gitignore`);叠加 [L2 §二 目录与架构](./warehouse_shared_config.md#L49-L113);再读根目录 `current_project_config.md` §二(本项目实际路径与 UniApp 根)。 2. **扫实际**:用 Glob / 目录列举核对仓库顶层及 `java/`、`web/`、`app/`、`frontend/`、`backend/`、`mobile/`、`shared/`、`docs/`、`scripts/` 等**真实存在**的路径,禁止假设尚未创建的目录。 3. **差异表**:在思考或回复中输出 **「L1 规范树 ↔ L2 示例树 ↔ 本仓库实际树」** 三方对照,标出与 **L1 §七 命名与层级** 不符的项;凡将**新建**目录、微服务、前端子应用或 `mobile` 下 app,须逐条引用 L1 条款号(§7.x)说明命名与放置。 4. **目录说明(必交付,仅对话内)**:在本轮**回复正文**中输出一张 **「L1 路径 | L2 示例路径 | 本仓库实际路径 | 对齐策略」** Markdown 四列表格(对齐策略填:`保持` / `本次新建(按 L1)` / `待用户确认迁移` / `存量仅修补` 等),并辅以简短文字说明: - 根目录一级结构须对照 **L1 §7.2**;**空仓库** 下 **对齐策略** 对新建一级目录应为 **「本次新建(按 L1)」**,不得优先建 `java/`/`web/` 替代 `backend/`/`frontend/`; - 后端、PC 前端、UniApp 根路径须标明是否符合 **§7.3 / §7.4 / §7.5**;**新建**路径必须与 L1 **字面一致**(含微服务短横线命名、前端 `frontend/admin` 等); - 接口契约目录(如 `shared/openapi/`)若存在则注明;若不存在且需联调,注明计划落点(§7.6)。 > **禁止**因本 SKILL 在仓库内主动新建「目录结构说明」类 Markdown 文件;若用户**显式要求**落盘到某路径,仅允许该用户指定的**单一路径**,且仍须遵守 always-on「未点名不主动建 md」。 5. **与 L1 不一致时的处置**: - **空仓库 / 全新骨架**:**必须**按 **L1 §7.2** 创建 `backend/`、`frontend/`、`mobile/`、`shared/`、`docs/`、`scripts/` 等一级目录;**禁止**以 L2 的 `java/`+`web/` 作为公司规范替代品起盘。 - **已有非 L1 字面路径**(如已有 `java/`、`web/`):**禁止**在未获用户明确指令下批量重命名或移动整个业务树;**新增**微服务、新前端应用、新 `mobile` 子 app **须**在 L1 规定路径下创建(例如在 `backend/new-service/`、`frontend/admin/` 新建模块);若用户仅要求在旧路径内修补,须在四列表标 **`存量仅修补`**,且**不得**在旧根下新增与 §7.3/§7.4 **命名规则相违**的子目录(如含大写、无短横线的服务文件夹名等)。 - **缺项补全**:若缺少 L1 要求的 **`docs/`**、**`scripts/`** 等,可按 §7.7 **创建**(不擅自搬迁已有代码)。 6. **与后续任务衔接**:目录任务完成后,凡涉及库表、接口、页面实现,须再执行 **§2.7 交付前必复查** 中与本仓库已落地结构相关的条目。 ### 2.1 代码编写 触发关键词:`写` `实现` `创建` `新增` `修改` `重构` `开发` `功能` `接口` `组件` `页面` `Activity` `Fragment` `UniApp` `uniapp` `小程序` `表格` `分页` `pageSize` `pageSizeOptions` `条/页` `弹窗` `表单` `查询` `列表` `不换行` `Select` `选择器` `allow-clear` `树` `Tree` `parent_id` `上下级` #### 严格执行清单(代码任务落地前自检) 1. 已用 Read 读取根目录 `current_project_config.md` 中的 **项目标签(路由)** 行并完成 token 拆分。 2. 已按下方「按目标语言」表加载 **全部**「必须加载」列中的文件(可用章节 Read,**禁止**跳过项目独占 UI/数据库声明所在节)。 3. **目录与命名**:凡**新建、重命名或新增**后端/PC 前端/移动端相关目录(含微服务文件夹、`frontend` 子应用、`mobile` 下 app、`src/` 下业务模块目录等),须符合 [L1 §七](./company_unified_config.md#L446-L680) **§7.1–§7.5**(小写短横线微服务名、`backend/`/`frontend/`/`mobile/` 层级、§7.4 组件与目录命名等);**禁止**仅以 L2 的 `java/`、`web/` 字面作为新建依据。若任务仅为存量路径内修补,须在回复中注明并仍遵守 §7.3/§7.4 命名规则。 4. **PC 管理端**:规范落点为 L1 **`frontend/`** 下子应用(如 `admin/`,§7.4);若仓库**存量**为 `web/`、`app/` 等,实现时仍须遵守 §7.4 **`src/`** 内目录与文件命名约定,**非** `mobile/**/uniapp/`。**根目录 `current_project_config.md` 一旦包含 `### 2.2 前端`(本项目为常态)**,凡改动 PC 端 `.vue` / 表格 / 弹窗 / 查询 / 按钮等,**必须**在编码前 **Read 该节全文**(自 **§二 2.2** 起,经 **「#### 5 界面规范」** 至 **「#### 6 常用控件规范」**;其中表格/统计表/按钮/输入/时间/条件查询/表单/删除/无数据/异步加载等见 **约 L69–L125**,常用控件见 **约 L127 起**)。**条件查询**若规定 **「文案与控件不换行」**,须在查询条用 **flex-nowrap** 等落地(见 **§2.1.2**)。**禁止**仅凭 `vben3.md` / `vue3.md` 通用模板省略上述独占 UI 条款。 5. **UniApp / `mobile/**/uniapp/`**:**禁止**加载 [vben3.md](./language/vue/vben3.md)(仅 PC 管理端);必须加载 UniApp 行所列全部引用;`mobile` 下 app 目录须 **全小写**(§7.5)。 6. 涉及数据库表结构/DDL 或 SQL/性能时,必须 Read 仓库内规范正文:`.cursor/rules/db/database-design.mdc` 与/或 `.cursor/rules/db/database-development-performance.mdc`(勿依赖损坏的相对链接猜测路径)。 7. 变更提交前执行 always-on 规定的 `lint` + `typecheck`(前端)或 `mvn compile`(后端)。 8. 若本次变更落入 **§2.7** 任一触发条件,交付前**必须**完成 §2.7 核对,并在回复摘要附带「必复查核对表」(✓ / NA / 待办)。 #### 2.1.1 DDL / 库表深度审查(database-design.mdc 落地) > 触发:`建表` `DDL` `迁移` `COMMENT` `审计字段` `is_delete` `schema.sql` `Liquibase` `Flyway` 或与库表结构相关的评审、重构。 在已 Read `database-design.mdc` 的前提下,对**每张新建/变更表**逐项自检(回复中可摘要,冲突须标 **待办**): | 维度 | 要点 | |------|------| | **注释 §5.3.1** | PostgreSQL:`COMMENT ON TABLE` + **每一列** `COMMENT ON COLUMN`;枚举/状态写明取值;`is_delete` 写明 0/1;非 `w` 后缀表在表注释声明**不含 create_dept** | | **主键 §4.2 / §5.2** | 默认 **单列 `id`** 类型 **BIGINT**(BIGSERIAL / IDENTITY / 雪花等);业务展示用字符串(设备号 `device_id`、登记 `record_uid`、订单号等)须 **单独列 + UNIQUE**,**禁止**用 `VARCHAR` 占位列名 `id` 冒充 §4.2 主键;**禁止**把业务键当 `id` 却让 ORM `@TableId` 与规范 BIGINT 语义长期不一致 | | **审计列 §4.2** | 具有**业务语义**的表:`create_time`、`create_user`、`update_time`、`update_user`、`is_delete` 齐全且列名不可替换为 `create_by`/`del_flag` 等;`create_dept` **仅**分类后缀为 **`w`** 的业务信息表必填 | | **规范例外** | **仅** `database-design.mdc` **§4.2** 已写明的情形可省略审计列:**纯粹多对多关系表**(双外键、无独立语义),且须在 **表注释** 写明省略理由。**序号表、缓存表、Job 控制表、技术中间表**等 **不适用**「多对多」默认可免责;须 **(A)** 按上表补齐 `id` + 审计 + `is_delete`,或 **(B)** 在表注释 + 设计评审中逐条对照规范写明偏离原因并经项目确认——AI 发现 (B) 倾向时须在 §2.7 标 **待办** 或推动改为 (A) | | **双环境 DDL** | 若项目同时维护 **H2 初始化** 与 **PostgreSQL** 脚本(如 `schema.sql` + `schema-postgresql.sql`),**须同步**结构与注释,避免一端合规一端遗漏 | | **实体对齐** | Java/MyBatis-Plus:`@TableId` 仅绑定 **BIGINT `id`**;业务唯一键用 `selectOne(Wrappers.eq(业务列, ...))`;对外 DTO/REST 仍可用字符串业务键作 `id` 字段时,须在注释或 API 文档标明其对应库列名(如 `record_uid`),避免读者误以为数据库主键为 VARCHAR | #### 2.1.2 项目 PC 独占 UI(根目录 `current_project_config.md` §二 2.2) > **触发**:编辑或新增 **`frontend/**`(及存量 `web/`、`app/` 等 PC 管理端)** 的 `.vue` / 表格 / 弹窗 / 抽屉 / 查询区 / 统计块 / 按钮文案等;或用户显式提到「界面规范」「表格规范」「成堪 / vben 列表」等。 **硬要求**: 1. **必须先 Read**:仓库根目录 [`current_project_config.md`](../../../current_project_config.md) 自 **`### 2.2 前端`** 起,**经「#### 5 界面规范」至「#### 6 常用控件规范」** 的**完整**正文(行号会随文件编辑漂移;**不得以「若存在」为由跳过**——凡文件中含 `### 2.2 前端` 即视为存在)。其中 **「#### 5 界面规范」** 内 **表格 / 统计表 / 按钮 / 输入 / 时间 / 条件查询 / 表单 / 删除 / 无数据 / 异步加载** 等条款(用户规范中常见落点 **约 L69–L125**)与 **「#### 6」** 尺寸色值等,须与 **vben2 / vben3 / vue3** 语言包**同时**满足;**禁止**仅用通用 CRUD 模板色替代表格行高、分页默认、序号列、空值展示、删除确认话术、查询「文案 + 中文冒号 + 控件」等独占约定。**条件查询**小节若含 **「文案与控件不换行显示」**,须在 **查询条/筛选项** 用 **`flex` + `flex-wrap: nowrap`**(或等价布局)+ 标签 **`white-space: nowrap`** 等实现,**禁止**在常规视宽下将「标签与控件」拆成上下两行;控件区可用 **`min-width: 0` + `flex: 1`** 避免撑破栅格。**表格分页**若规定 **每页条数控件内仅显示数字、`条/页` 文案紧挨选择框右侧**(如 **约 L72**),须通过 **`pagination.buildOptionText` 仅渲染数字** + **样式后缀(如 `::after`)或等价结构** 实现,**禁止**在条数下拉项与收起态重复堆叠两处「条/页」导致歧义。 2. **根目录 §二 2.2 与 `#### 5` / `#### 6` 字面须逐项落实(与语言包并行,禁止只写「约 Lxx」而不实现)**: - **表格 · 分页(`#### 5`,对应正文如「每页显示条数统一支持…默认 30…数字在控件中…条/页在控件右侧…不换行」)**:列表 **`pageSize` 默认 `30`**;**`pageSizeOptions` 必须且仅能**为 **`10` / `20` / `30` / `50` / `100` / `200` / `300` / `500` / `1000`**(字符串或数字与之一致,**禁止**擅自增删档位);**收起态**条数控件内**仅阿拉伯数字**;**「条/页」** 文案在**选择框收起态外侧、紧贴其右**,并与「跳转」等控件**同一行不换行**(Ant Design Vue 等栈:`buildOptionText` **只返回数字**;`vc-pagination` 默认会把 `items_per_page` 拼进**下拉项**——自定义 `buildOptionText` 后下拉项也须**仅为数字**,**不得**再在 option 文案里拼接第二处「条/页」;整行用 **`flex` + `nowrap`** 等防断行)。**禁止**漏配 `buildOptionText` 却仅用 CSS 遮盖,导致下拉项仍出现「数字 + 条/页」与外侧 `::after` **双重「条/页」**。**Ant Design Vue `a-table`**:`class` 通常落在 **`ant-table-wrapper`**,分页 **`ul.ant-pagination`** 在其下 **`Spin` 容器内与 `div.ant-table` 同级**(样式选择器须写 **`.ant-table-wrapper.{业务类名} .ant-pagination`**,勿误用「仅 `.ant-table` 后代」导致匹配不到分页条)。Table 注入的 **`.ant-table-pagination` 默认 `flex-wrap: wrap`**,与 **不换行**、**L73 左下角与表格左对齐**冲突,须 **`flex-wrap: nowrap !important` + `justify-content: flex-start !important`**(或与 `ant-table-pagination-left` 等效左对齐)覆盖。若 **`a-table` 设 `size="small"` 或 `middle`**,Table 渲染分页时会**覆盖传入的 pagination.size**、强制 **`Pagination` 为 `small`(mini)**,条数控件高度低于 **34px**,与 **#### 6** 及「条/页」与控件**同高对齐**冲突;表格行高若已由项目 CSS 按 §二 2.2 控制,**推荐不使用 `small|middle`**,或在复查表写明例外与补救 CSS。 - **树(组织 / 部门-设备 / 分类树)**:**后端**须按 **`parent_id`(或等价)** 组装 **`children`**,设备/叶子挂在 **所属部门节点**下;**禁止**在存在父子部门关系时仍返回 **平级根列表**(会导致前端无法表达上下级)。**前端(Ant Design Vue `Tree`)**:`treeData` 与接口层级一致;**`show-line`**(如 `{ showLeafIcon: true }`)+ **`block-node`** 强化层级视觉;**`isLeaf`**:仅 **设备/真叶子** 为 `true`,**尚有子部门的部门节点** 须 `false`;关键字过滤时保留 **命中节点的祖先链**(避免子节点与根断开)。若需默认展开,可用 **`default-expand-all`** 或 **`v-model:expandedKeys`**;过滤后重挂载可用 **`:key`** 绑定过滤条件摘要。 - **Select(`#### 6`,正文如「可清空单选,高度 34px,圆角 4px,宽度最小 60px」)**:凡 **单选** 且业务允许清空(含查询条件「全部」语义),须 **`allow-clear`**;**必填**单选若产品不允许清空,须在 **`提交/查询` 校验**中明确报错,并在复查表说明例外。**高度 `34px`、圆角 `4px`、`min-width: 60px`** 须在 **`ConfigProvider` token(如 `controlHeight`、`borderRadius`)+ 页面级样式** 对齐;**多选 / `mode="tags"`** 用 **`min-height: 34px`**,允许内容增高不换行策略按查询区规范。 - **Ant Design Vue 4 + `dayjs`(与 `ConfigProvider` 配套,易漏项)**:仅配置 **`a-config-provider :locale="zh_CN"`** 往往**不足以**让 `DatePicker` / `RangePicker` / `Calendar` 面板内的**月份、星期**显示为中文——须在入口(如 `main.ts`)增加 **`import 'dayjs/locale/zh-cn'`** 与 **`dayjs.locale('zh-cn')`**(或等价 `locale` 对象中的 `locale` 字段),并视需要为控件设置 **`format`**。业务要求筛选 **「YYYY-MM」** 时,优先 **`a-date-picker picker="month" format="YYYY-MM"`**(配合已选标签多选),避免仅用 **`a-select mode="tags"`** 手敲月份。**表格/表单内展示上传图**:接口常返回 **`public-base-url` + `/uploads/...`** 的绝对 URL;若开发态 Vite **仅代理同源路径** `/uploads`,列表中应将展示地址规范化为 **`/uploads/...`**(或保证代理覆盖后端完整域名),否则易出现**裂图**;多图预览须使用 **`a-image-preview-group`** 包裹多个 **`a-image`**,以支持预览时左右切换。**`a-tree` 自定义节点字段**(如 `kind`)应挂在 **`treeData` 节点顶层**;`#title` 插槽参数在部分版本下需同时读 **`dataRef`**;若层级线/缩进异常,在业务容器内检查 **`reset.css` / 全局 `ul` 样式** 对 `.ant-tree-indent` 的影响,用窄选择器修正。 3. **交付前**:若命中 **§2.7** 触发条件 3(PC 前端),核对表中 **「PC 前端」** 行须显式勾选已对照 **§二 2.2**(不可仅写「已按 vben3」)。 #### 2.1.3 代码审查与走查(Review · 触发:`/review`、走查、审计、上线前安全核对) > **与 §2.7 关系**:§2.7 偏「规范与契约是否落地」;本节偏「缺陷、回归、安全、测试债」的**审查方法论**。二者可同时命中;审查轮**默认只读**,**除非用户明确要求改代码**,不擅自提交实现性修复。 **输出格式(须按严重度排序,高优先在前)**: 1. **P0 / 严重**:可导致越权、数据泄露、伪造身份、绕过业务不变量的逻辑缺陷。 2. **P1 / 高**:确定或高概率 Bug、行为回归、错误数据写入、破坏幂等/唯一性。 3. **P2 / 中**:边缘条件、性能隐患(如无前缀的 `LIKE %%`、大列表无上限)、可维护性与双端不一致。 4. **P3 / 低**:缺测、文档/注释与实现偏差、演示环境已知债未标注。 **本仓库(tf-ylsw 演示栈)高频核对点**(实现替换后应删除或改写对应审查结论): | 域 | 核对要点 | |---|---| | **数据权限与身份** | `UserContextHolder.authorizedDeptIds()` **空列表 = 不限制(演示全开)**;请求头 **`X-User-Id` / `X-Auth-Depts` / `X-User-Name` 客户端可伪造**。接生产 JWT/会话后须重新定义「空列表」语义(常见:**空=无任何部门权限**),并禁止仅靠前端传头作为信任根。 | | **HTTP 面** | 全局 **CORS** `allowedOriginPatterns("*")` 类宽放、**multipart 大小**、静态 **`/uploads`** 暴露范围;上传接口须有 **服务端** 类型/大小校验(前端校验不能替代)。 | | **Vue 3 生命周期** | `watch` 内 **`setTimeout` 防抖**、轮询、异步 `await` 后 `ref` 赋值:组件卸载时须在 **`onBeforeUnmount`** 清理定时器/置 **取消标记**,避免卸载后改状态告警与幽灵请求。 | | **搜索与正则** | 用户关键字进入 **`RegExp`** 前须 **转义**;超长关键字注意 ReDoS 与请求频率(防抖 + 后端分页上限)。 | | **MP 与并发** | `@TableLogic` 下 **`selectCount`/列表** 是否自动带逻辑删除条件;业务编号若仅靠 **`synchronized`** 分配,集群/多实例下须依赖 **数据库唯一约束**(若 DDL 中唯一索引被注释,须在审查中标为 **待办**)。 | | **测试** | 关键写路径(创建/更新/删除/409 冲突/403 权限)、导出与上传,是否有单测/接口测/手测记录;无则列入 **P3 缺测** 并建议最小用例。 | **补充规则**:若用户指令含 **review、走查、Code Review、`/review`、安全审计**,除已触发的 §2.1.x 外,须执行本节并可在 §2.7 核对表中增加 **「Code Review」** 行(见 §2.7 表)。 #### 加载策略:按目标语言选择 | 目标语言 | 必须加载 | 文件 + 位置 | |---|---|---| | **Java** | 技术栈 + Java 语言约束 + **L1 §7.3 后端目录与微服务命名** | [L2 §一](./warehouse_shared_config.md#L9-L47) + [L1 §7.3](./company_unified_config.md#L504-L539) + [language/java/](./language/java/) | | **Vue 2 / Tofly** | 技术栈 + Vue2 + **L1 §7.4** + **根目录 §二 2.2 PC 独占 UI(若该文件含 `### 2.2 前端` 则强制全文至 #### 6)** | [L2 §一](./warehouse_shared_config.md#L9-L47) + [L1 §7.4](./company_unified_config.md#L541-L590) + [language/vue/vue2.md](./language/vue/vue2.md) + [根目录 `current_project_config.md`](../../../current_project_config.md) **§二 2.2** | | **Vue 3 / Vben 5.0** | 技术栈 + Vue3 + **L1 §7.4** + **根目录 §二 2.2 PC 独占 UI(同上)** | [L2 §一](./warehouse_shared_config.md#L9-L47) + [L1 §7.4](./company_unified_config.md#L541-L590) + [language/vue/vue3.md](./language/vue/vue3.md) + [根目录 `current_project_config.md`](../../../current_project_config.md) **§二 2.2** | | **Vben v2 (Vue3)** | 技术栈 + Vben2 + **L1 §7.4** + **根目录 §二 2.2 PC 独占 UI(同上)** | [L2 §一](./warehouse_shared_config.md#L9-L47) + [L1 §7.4](./company_unified_config.md#L541-L590) + [language/vue/vben2.md](./language/vue/vben2.md) + [根目录 `current_project_config.md`](../../../current_project_config.md) **§二 2.2** | | **Vben v3 (成堪数智)** | 技术栈 + Vben3 + **L1 §7.4** + **根目录 §二 2.2 PC 独占 UI(同上,与 vben3 模板联合落地)** | [L2 §一](./warehouse_shared_config.md#L9-L47) + [language/vue/vben3.md](./language/vue/vben3.md) + [L1 §7.4](./company_unified_config.md#L541-L590) + [根目录 `current_project_config.md`](../../../current_project_config.md) **§二 2.2(`### 2.2 前端` → `#### 6 常用控件规范` 全文)** | | **UniApp(Vue 3 移动端)** | 目录约定 + 项目移动端事实 + **L1 §7.5 命名** + 通用 Vue3 语法(**不**套用 Vben 页模板) | [L1 §7.5](./company_unified_config.md#L592-L619) + 根目录 `current_project_config.md` **§二 2.3 移动端(UniApp)**(若存在);可选节选 [language/vue/vue3.md](./language/vue/vue3.md) 中 **组合式 API / setup** 通用段落(**禁止**按其中 Ant Design Vben 管理台模板实现 UniApp 页面) | | **Python** | Python 语言约束 | [language/python/python.md](./language/python/python.md) | | **Android (Ylgs)** | Android 项目约定 + 代码模板 | [language/android/java.md](./language/android/java.md) | | **TypeScript** | TS 类型严格度 | [L3 §三 TypeScript](./local_private_config.md#L86-L92) | | **任意语言** | 个人编码习惯微调 | [L3 §三](./local_private_config.md#L61-L93) | #### 补充规则 - 如果涉及**新建文件或目录结构**:额外加载 [L2 §二 目录结构](./warehouse_shared_config.md#L49-L113)(**仅作物理布局参考**)+ [L1 §七](./company_unified_config.md#L446-L680)(**命名与层级强制**);新建须以 L1 为准 - 如果涉及**新建项目、微服务命名、包名设计**:额外加载 [L1 §七 项目目录与命名规范](./company_unified_config.md#L446-L680)(**全文**,含 §7.6 共享、§7.7 文档与脚本、§7.8 忽略文件);并与 [L2 §二](./warehouse_shared_config.md#L49-L113) 对照,在**当轮回复**中写明 **L1 ↔ L2 ↔ 实际** 映射(可与 §2.0 四列表合并),禁止只读 L2 忽略 L1 - 如果涉及**后端分层架构**(Controller/Service/Repository):额外加载 [L2 §二 架构原则](./warehouse_shared_config.md#L97-L111) - 如果涉及**数据库设计**(建表、字段、索引、DDL):额外加载规范正文 [database-design.mdc](../../rules/db/database-design.mdc);索引入口 [language/database/db-design.md](./language/database/db-design.md);并执行 **§2.1.1 DDL / 库表深度审查** 自检清单 - 如果涉及**数据库 SQL/性能/事务/分页/慢查询**:额外加载规范正文 [database-development-performance.mdc](../../rules/db/database-development-performance.mdc);索引入口 [language/database/database_development_performance_guidelines.md](./language/database/database_development_performance_guidelines.md) - 如果涉及 **PC 管理端界面**(`frontend/**/*.vue` 等,含列表、分页、弹窗表单、查询条、统计表、删除确认):除对应 **vue2 / vue3 / vben2 / vben3** 语言包外,**必须**执行 **§2.1.2**,并 Read 根目录 `current_project_config.md` **§二 2.2 全文**(至 **#### 6**);查询区须落实 **「文案 + 中文冒号 + 控件」且同一行不换行**(见 §2.1.2 第 1 条末段)。 - 如果涉及**接口设计 / REST 契约 / Controller 契约 / OpenAPI**:除 Java 语言包外,额外加载 [L2 §二 架构原则](./warehouse_shared_config.md#L97-L111) 与按需 [rules/java-tf-ylsw-backend.mdc](../../rules/java/java-tf-ylsw-backend.mdc)、[rules/java-crud-common.mdc](../../rules/java/java-crud-common.mdc);前端侧须核对 `api/` 或项目约定请求封装路径与后端 URL 一致。 - 如果用户要求 **Code Review、`/review`、走查、安全审计**:执行 **§2.1.3**;默认**只出结论**、**不改代码**(除非用户明确要求修复)。 #### 语言检测优先级 ``` 用户明确提到语言/框架 > 文件扩展名(.java/.vue/.py/.ts) > 项目上下文 > 默认按项目主栈(Java+Vue) 项目标签优先匹配(来自根目录 `current_project_config.md` 的 **项目标签(路由)** 行): 读取字段:该行中 `/` 分隔的各 token(示例:vben3/java1、vue2/java2、vben3/java1/uniapp) 匹配规则:按 token 映射到 `language///` 或 `language//.md`;**多 token 取并集**(如同时含 vben3 与 java1 则加载两路) 示例映射: java1 -> language/java/java1/ java2 -> language/java/java2/ java3 -> language/java/java3/ java4 -> language/java/java4/ java5 -> language/java/java5/ java6 -> language/java/java6/ vue2 -> language/vue/vue2.md vue3 -> language/vue/vue3.md vben2 -> language/vue/vben2.md vben3 -> language/vue/vben3.md uniapp -> 触发上表「UniApp」行(不映射到单个 vue 文件) android -> language/android/java.md 路径命中 `mobile/**/uniapp/` 的编辑任务:即使未写 uniapp token,也**必须**按「UniApp」行加载,且**禁止**加载 vben3.md 标签无法映射时:回退到对应语言目录的默认加载策略,并向用户确认 Java 子版本判断(当语言已判定为 Java): 当前项目标识包含 java2(如 vue2/java2) → 优先加载 language/java/java2/ 下全部 .md 当前项目标识包含 java1 → 优先加载 language/java/java1/ 下全部 .md 当前项目标识包含 java3 → 优先加载 language/java/java3/ 下全部 .md 当前项目标识包含 java6(如表务 ylsw-bw / water-meter) → 优先加载 language/java/java6/ 下全部 .md 无法判断或子目录缺失 → 回退加载 language/java/ 目录下相关 .md Vue 3 框架版本判断(**在根目录未提供「项目标签(路由)」时**才依赖本节启发式;若已提供该行,**必须以 token 为准**): 项目使用 defineComponent + setup() + /@/ 路径别名 + defHttp → Vben v2 → 加载 vben2.md 项目使用