chore(frontend): 落地 ADS 治理体系并收录前端底座基线代码
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
# Repository Guidelines
|
||||
|
||||
AGENTS.md is the cross-vendor contributor guide (Claude, Codex, and others read it). Keep it in English by convention. It overlaps CLAUDE.md on purpose — this is the canonical version for non-Claude agents.
|
||||
|
||||
## Authority & Required Reading
|
||||
Rules in `.project.agents/CLAUDE.md` apply to every agent working here. Direct user instructions still take precedence.
|
||||
|
||||
The canonical contributor guide is `.project.agents/AGENTS.md`. Do not create or maintain a root-level `AGENTS.md` unless the user explicitly asks for one.
|
||||
|
||||
Before any code-changing task, read `.project.agents/SELF_CONSTRAINTS.md` and `.project.agents/VIBECODING_GUIDE.md`, then run `git status --short`. For product work, also read the relevant sections of `PRD.md`, `ARCHITECTURE.md`, `ROADMAP.md`, and `CONVENTIONS.md` under `.project.agents/docs/context/`. Shared front-backend constraints live in the workspace-level `docs/` (see `../../../docs/coding-standards.md`) — read the referenced sections instead of duplicating them here.
|
||||
|
||||
## Project Structure & Module Organization
|
||||
`abacus-static-framework` is an enterprise Vue 3 + TypeScript microservice front-end base (menu framework) built with Vue 3.5, TypeScript 5, Vite 6, Element Plus, vxe-table, Pinia, axios. Business code lives in `src/subsystem/**` (reference template: the `sms` examples, copy-and-rewrite); `src/framework/**` is READ-ONLY shared framework. No automated tests.
|
||||
|
||||
Target architecture is documented in `ARCHITECTURE.md`: framework (shared, read-only) / subsystem (business writable) / dynamic menu-permission routing.
|
||||
|
||||
## Source-of-Truth Rules
|
||||
`PRD.md` defines behavior and scope.
|
||||
`UIUX.md` defines visual and interaction rules.
|
||||
`ARCHITECTURE.md` is the authority for modules, dependencies, contracts, and directory layout. Derived documents follow upstream changes, not the other way around.
|
||||
|
||||
Feature changes must update `PRD.md`. Module, dependency, entity, or invariant changes must update `ARCHITECTURE.md` in the same commit. Do not let code and architecture drift for more than 24 hours.
|
||||
|
||||
## Build, Test, and Development Commands
|
||||
|
||||
```sh
|
||||
# Build (output goes straight to the target microservice's resources/html/vue/<app>/)
|
||||
npm run build:prod
|
||||
|
||||
# Run
|
||||
npm run dev
|
||||
|
||||
# Test
|
||||
No automated tests (manual smoke only)
|
||||
```
|
||||
|
||||
Environment: Node 18.20.7, npm mirror `https://registry.npmmirror.com`. Before local integration, adjust `vite.config.ts` (`build.outDir` → target service's `resources/html/vue/<app>/`; `server.proxy` → target backend) and `public/data/data.js` (`currentSubsystem`). After a framework upgrade, run `npm install`; never overwrite `public`, `vite.config.ts`, or `src/subsystem`.
|
||||
|
||||
## Architecture & Coding Style
|
||||
Use TypeScript, 2-space indentation. Kebab-case files, PascalCase component names (must equal the route `name`), `getXxx`/`saveXxx` API function names. Do not add modules that are not registered in `ARCHITECTURE.md`. Preserve the dependency DAG; no reverse dependencies and no cross-module private access. Avoid empty names such as `Manager`, `Helper`, `Util`, `Common`, `Misc`, or `Tools`.
|
||||
|
||||
UI/presentation code should consume state and send intents only — business logic goes into hooks/services; keep data-model types thin. Data access must go through the `request` wrapper (`src/framework/utils/request.ts`) — never raw `axios`/`fetch`; the wrapper handles service-alias mapping, token refresh, commonParam header, and response unwrapping (see shared spec §6).
|
||||
|
||||
## Testing Guidelines
|
||||
No automated test framework. Required validation from `ARCHITECTURE.md`: manual smoke per page flow (list / query / create / edit / export). Multi-datasource routing, Kafka consumption, XXL-JOB scheduling, Nacos config pull, and real database migrations require real-environment validation; mock/simulator-only evidence is not enough for those claims.
|
||||
|
||||
## Git, Logs, and PRs
|
||||
Do not pile new work onto unrelated dirty changes without calling it out. Prefer Conventional Commits such as `feat: ...`, `fix: ...`, `docs: ...`. This repository is part of a single git repo rooted at the workspace (`D:\workBuddySpace\member`); commit scope should stay within this subproject unless the change is cross-project (docs/).
|
||||
|
||||
Each independently verifiable feature, milestone, non-trivial fix, or refactor needs an execution log in `.project.agents/log/YYYY-MM-DD-<slug>.md` unless it is only a minor documentation edit. Logs must include what changed, relevant commits (or "uncommitted" with reason), verification performed, and next steps.
|
||||
|
||||
Pull requests should include scope, linked issues, screenshots for UI changes, environment/device coverage, and any documentation updates.
|
||||
|
||||
## Security & Configuration
|
||||
Do not commit secrets, credentials, build output, or personal IDE files. Agent configuration and generated agent notes belong under `.project.agents/`, not the repository root, `.claude/`, or a global home directory.
|
||||
@@ -0,0 +1,59 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file guides Claude Code (and other agents) when working in this repository.
|
||||
**保持本文件最新**:它是项目级入口——项目是什么、怎么构建、门控一切变更的规则。
|
||||
|
||||
## Project
|
||||
|
||||
`abacus-static-framework` 是企业级 **Vue 3 + TypeScript 微服务前端底座**(菜单框架),基于 Vue 3.5 / TypeScript 5 / Vite 6 / Element Plus / vxe-table / Pinia / axios。业务代码位于 `src/subsystem/**`(参考模板:`subsystem` 下的 sms 示例,供复制改写);`src/framework/**` 为**只读共享框架**,业务不得修改。
|
||||
|
||||
- Entry point: `src/main.ts`
|
||||
- **只读/可写分区**:`src/framework/**` 只读;业务开发只写 `src/subsystem/**`(api / router / views / extend 及自建 components / hooks / store / styles / types / utils)。
|
||||
- **接口契约**(统一响应体、服务别名映射、token 自动刷新、commonParam)由 `src/framework/utils/request.ts` 强制实现,业务无感;共享约束详见 `../../../docs/coding-standards.md`(§6 接口契约、§4 前端规范)。
|
||||
- Known environment constraints: Node 18.20.7 + npm 淘宝镜像;`vite.config.ts` 的 `build.outDir` 与 `server.proxy` 需按目标微服务修改后才能联调/发布;`public/data/data.js` 的 `currentSubsystem`/`currentSubsystemName` 声明当前子系统。
|
||||
|
||||
## Common commands
|
||||
|
||||
```sh
|
||||
# Build(产物直出目标微服务 resources/html/vue/<应用名>/)
|
||||
npm run build:prod
|
||||
|
||||
# Run(本地开发,Vite 反代后端)
|
||||
npm run dev
|
||||
|
||||
# Test
|
||||
无自动化测试(人工冒烟验证)
|
||||
```
|
||||
|
||||
环境注意:首次使用需 `npm install --registry=https://registry.npmmirror.com`(或已配置镜像则 `npm install`)。框架升级后需重新 `npm install`;升级**不得覆盖** `public`、`vite.config.ts`、`src/subsystem`。
|
||||
|
||||
## Architecture
|
||||
|
||||
实现遵循 `.project.agents/docs/context/ARCHITECTURE.md` 的模块边界;模块清单(职责一句话):
|
||||
|
||||
- **framework/**(只读共享框架):api(框架级后端接口)、components/standard(标准组件:AbForm/AbQueryForm/vxe 表格等 10 项)、hooks(useVxeTableHandle 等通用组合式函数)、layout(菜单布局)、router(静态路由)、store(settings/permission/user 等 Pinia 状态)、styles、types、utils(standard 5 项 + request 请求管线)、views、directives(v-debounce/v-throttle)。
|
||||
- **subsystem/**(业务可写区):api/<服务别名>(按 Controller 分 ts)、router/dynamicRouter.ts(菜单路由唯一注册点)、views/<一级>/<二级>(页面)、extend(框架扩展钩子)、以及业务自建 components/hooks/store/styles/types/utils。
|
||||
- 动态权限:`permissionStore.filterAsyncRoutes` 按 `url === path` 匹配后端菜单与 dynamicRouter 后 `addRoute`。
|
||||
|
||||
## Project-level rules
|
||||
|
||||
- **动手前必读两文件**——它们编码了本项目所有门控决策的经验:
|
||||
- `.project.agents/VIBECODING_GUIDE.md` — 实践指南(为什么 & 怎么做)
|
||||
- `.project.agents/SELF_CONSTRAINTS.md` — 硬约束(什么禁止、什么必须、何时停下)
|
||||
|
||||
任何非平凡任务,编辑前先跑 `SELF_CONSTRAINTS.md §A`(开工前自检)。
|
||||
|
||||
- **共享约束单一来源**:前后端共享的编码规范/接口契约/命名纪律,**只存在于工作区 `docs/`(`../../../docs/coding-standards.md`、`../../../docs/architecture.md`、`../../../docs/agent-guide.md`)**;本仓库 `.project.agents/docs/context/` 只写本仓库特有内容与指针,**禁止复制 docs/ 正文**。改共享内容先改 docs/ 再同步指针。
|
||||
|
||||
- **Agent 配置**一律写在 `.project.agents/` 下(或子目录),禁止写到仓库根、`.claude/` 或全局目录。
|
||||
|
||||
- **项目文档**位于 `.project.agents/docs/context/`(单层目录):`PRD.md`(行为权威)、`ARCHITECTURE.md`(模块/依赖/契约)、`ROADMAP.md`(里程碑)、`CONVENTIONS.md`(命名/风格/提交)、`UIUX.md`(视觉与交互)。
|
||||
|
||||
- **源真相层级**(冲突时上游优先):
|
||||
```
|
||||
PRD.md > ARCHITECTURE.md > UIUX.md > CONVENTIONS.md > 派生文档
|
||||
仓库级 CONVENTIONS 再下接共享 docs/coding-standards.md(仅作全仓公共约定引用)
|
||||
```
|
||||
上游变更须在同 commit 内回写受影响的派生文档;代码与架构漂移不得超过 24 小时。
|
||||
|
||||
- **路线图执行规则**:按 `.project.agents/docs/context/ROADMAP.md` 顺序推进,勾选与完成同 commit;milestone 级/多文件任务先写 plan/spec 再动手;每个 milestone 后按 `.project.agents/log/` 模板写执行日志。
|
||||
@@ -0,0 +1,130 @@
|
||||
# Agent 自我约束清单(本项目硬规则)
|
||||
|
||||
> 这是 Agent 在本项目工作时必须遵守的硬约束。每次开工前自查本清单,违反任何一条都应**先停下**,与用户对齐后再继续。
|
||||
> 完整背景与原理请见 [`VIBECODING_GUIDE.md`](./VIBECODING_GUIDE.md)。本清单只列"不许做什么 / 必须做什么"。
|
||||
>
|
||||
> 文档约定(本项目):上游文档位于 `.project.agents/docs/context`,依次为
|
||||
> `PRD.md`(行为与范围)、`ARCHITECTURE.md`(模块/依赖/契约/目录)、`CONVENTIONS.md`(命名/风格/提交)。
|
||||
> 派生文档不得反向修改上游。
|
||||
|
||||
---
|
||||
|
||||
## A. 开工前的强制自检(每个新会话开始时执行)
|
||||
|
||||
在进行任何编辑动作之前,必须确认以下事项;任一项不满足则先暂停业务任务,处理掉再继续。
|
||||
|
||||
- [ ] **A1. 仓库是否在版本控制下?** 若否:立即停下,先初始化仓库 + 配置 ignore + 初始 commit。
|
||||
- [ ] **A2. 工作区是否干净?** 有未提交的旧改动?先与用户确认是否要先提交/暂存,**不允许在脏工作区上叠加新改动**。
|
||||
- [ ] **A3. 是否已有 `ARCHITECTURE.md`?**
|
||||
- 若否,且本次任务**涉及写业务代码**:先停下,按 `VIBECODING_GUIDE` 的流程产出架构文档,再写代码。
|
||||
- 若否,且本次任务**只是文档/讨论**:可继续,但应主动提醒用户补架构文档。
|
||||
- [ ] **A4. 任务的归属模块清楚吗?** 我能否在 `ARCHITECTURE.md` 的模块清单里指出"这个改动属于哪个模块"?指不出来则停下补架构。
|
||||
- [ ] **A5. 上游文档是否已读?** `PRD.md` / `ARCHITECTURE.md` / `CONVENTIONS.md` 中与本任务相关的章节是否读过?没读过先读,不要凭印象动手。
|
||||
|
||||
---
|
||||
|
||||
## B. 写代码时的硬约束
|
||||
|
||||
### B1. 模块边界
|
||||
- ❌ 不允许新增**未在 `ARCHITECTURE.md` 中登记**的模块;要新增必须先更新架构文档。
|
||||
- ❌ 不允许引入**反向依赖**(低层模块依赖高层模块)。需要时改为接口/回调倒置。
|
||||
- ❌ 不允许跨模块**直接访问私有实现**;只能走该模块对外暴露的接口。
|
||||
- ❌ 不允许出现 `Manager` / `Helper` / `Util` / `Common` / `Misc` / `Tools` 这类语义为空的新模块名;用动词+名词描述真实职责。
|
||||
|
||||
### B2. 单一职责
|
||||
- ❌ 不允许在 UI/展示层写业务判断或副作用(仅消费状态、发送意图)。
|
||||
- ❌ 不允许在数据模型类里堆业务方法;模型保持瘦,逻辑放 Service / UseCase。
|
||||
- ❌ 不允许"顺手"修改不在任务范围内的模块;越界的改动走单独提交并明确告知用户。
|
||||
|
||||
### B3. 文档同步(与代码改动**同一个 commit** 内)
|
||||
- 加/删/改功能 → 同步更新 `PRD.md`
|
||||
- 加/删/改模块或依赖 → 同步更新 `ARCHITECTURE.md`(模块清单 + 依赖图)
|
||||
- 派生文档发现与上游不一致 → 回去改上游,不能让派生文档自走
|
||||
|
||||
### B4. 注释与命名
|
||||
- 默认不写注释;只在 WHY 不明显时写一行。
|
||||
- 不写解释 WHAT 的注释(命名应自解释)。
|
||||
- 不写"为某 issue/任务而加"这类会随时间失效的注释。
|
||||
- 严格遵守 `CONVENTIONS.md` 中的命名规范(不存在则先补)。
|
||||
|
||||
### B5. 错误处理
|
||||
- 只在系统边界(用户输入、外部 API、文件 IO)做防御;内部模块互相信任。
|
||||
- 不为不可能发生的情况加 fallback。
|
||||
- 不引入向后兼容 shim,除非用户明确要求。
|
||||
|
||||
### B6. 实施日志(execution log)
|
||||
- **每完成一个可独立验收的部分(milestone 或子任务),必须在 `.project.agents/log` 写日志**。格式与时机见 `VIBECODING_GUIDE`。
|
||||
- 日志内必须包含本段的版本控制提交列表;若本段未提交,明确写出"未提交"及原因。
|
||||
- 完成路线图任一 milestone → **必须**写日志,且与该 milestone 的提交同一会话完成。
|
||||
- 单次会话即将结束(用户表示收工 / 上下文将被压缩)→ **必须**写一份兜底日志记录当前状态与下一步。
|
||||
- ❌ 不允许只提交不写日志(除非属于豁免情况:纯文档微调 / 被回滚的实验性探索)。
|
||||
- ❌ 不允许写日志但跳过更新 `ARCHITECTURE.md` —— 若本段触发架构变更,先改架构、再提交、再写日志。
|
||||
|
||||
---
|
||||
|
||||
## C. 改动范围控制
|
||||
|
||||
- ❌ 一次任务一个目的。不要"既加功能又重构又改样式"。
|
||||
- ❌ 不允许在 bug 修复任务中做无关清理。
|
||||
- ❌ 不允许引入"为未来准备"的抽象(YAGNI);三处相似优于一处过度抽象。
|
||||
- ❌ 不允许半完成的实现(要么这次完成,要么不要开始)。
|
||||
|
||||
---
|
||||
|
||||
## D. 出问题时的排查纪律
|
||||
|
||||
bug 处理必须按下列顺序,**严禁跳步**:
|
||||
|
||||
1. 复现现象(明确触发路径)
|
||||
2. 在 `ARCHITECTURE.md` 上**圈出嫌疑模块**
|
||||
3. 检查跨模块**接口契约**
|
||||
4. 缩小到单模块后再读代码
|
||||
5. 修完后:若是架构问题,必须更新 `ARCHITECTURE.md` 或 `CONVENTIONS.md`
|
||||
|
||||
**禁止行为**:bug 一来就全仓 grep、试改一行看效果、连续 try-fail 循环。出现这种倾向立刻停下,回到第 2 步。
|
||||
|
||||
---
|
||||
|
||||
## E. 与用户的协作约束
|
||||
|
||||
- ❌ 不替用户做架构决策。涉及模块拆分、依赖方向、命名规范这类**长期影响**的决定,必须明确询问。
|
||||
- ❌ 不在用户没要求的时候主动创建文档(除非本清单或 `CLAUDE.md` 已要求)。
|
||||
- ❌ 不在没看代码的情况下凭推测回答 "X 是怎么实现的"。
|
||||
- ✅ 每次涉及架构/文档/规范变更,先告知影响面,再动手。
|
||||
- ✅ 用户的明确指示永远高于本清单和任何 skill。冲突时遵循用户。
|
||||
|
||||
---
|
||||
|
||||
## F. 触发"全员停车"的红线
|
||||
|
||||
出现以下任一情况,**立即停止当前任务,与用户对齐后再决定下一步**:
|
||||
|
||||
1. 发现自己在脏工作区上累积了大量未提交改动
|
||||
2. 发现自己正在新增一个"无处归属"的模块/文件
|
||||
3. 发现代码与 `ARCHITECTURE.md` 已经矛盾,且无法用小补丁同步
|
||||
4. 同一个 bug 连续 3 次尝试修复未果
|
||||
5. 用户的请求与本清单 / `CLAUDE.md` / 上游文档存在冲突 —— 必须先澄清,不能默默选边
|
||||
6. 即将做出"难以回滚"的动作(删除文件 / 重命名模块 / 调整目录结构 / 强制 push)
|
||||
|
||||
---
|
||||
|
||||
## G. 文件路径合规
|
||||
|
||||
- Agent 的配置文件**只**写入 `.project.agents` 子树,禁止写入仓库根目录或其他非约定位置。
|
||||
- 项目文档**只**写入 `.project.agents/docs/context`(不允许再分子目录,除非用户明确要求)。
|
||||
- 本清单(`SELF_CONSTRAINTS.md`)与指南(`VIBECODING_GUIDE.md`)位于 `.project.agents` 根,与 `CLAUDE.md` 同级。
|
||||
|
||||
---
|
||||
|
||||
## H. 自查触发器(什么时候重读本清单)
|
||||
|
||||
至少在以下时机重读本清单:
|
||||
|
||||
- 新会话开始,且任务涉及代码改动
|
||||
- 用户要求"加新功能"/"修 bug"/"重构"
|
||||
- 自己感到"差不多可以直接动手了" —— 这种感觉本身就是触发器
|
||||
- 即将创建超过 1 个新文件
|
||||
- 即将修改 3 个以上文件
|
||||
- 即将修改任何 `.project.agents/docs/context` 下的文档
|
||||
- **完成一个路线图 milestone 或子任务前**(确认是否需要按 §B6 写日志)
|
||||
- **会话即将结束前**(确认兜底日志已写)
|
||||
@@ -0,0 +1,252 @@
|
||||
# 项目开发实践指南(VIBECODING GUIDE)
|
||||
|
||||
> 本文档是基于"踩过的坑"沉淀下来的项目工作方式约定,适用于本仓库及后续所有同性质的项目。
|
||||
> 它的姊妹文件是 [`SELF_CONSTRAINTS.md`](./SELF_CONSTRAINTS.md) —— 那是 Agent 每次开工前必须自查的硬约束清单。
|
||||
> 本文回答 "为什么这么做";`SELF_CONSTRAINTS.md` 回答 "具体不许做什么"。
|
||||
|
||||
---
|
||||
|
||||
## 0. 三条核心教训(本指南的来由,优先级严格递减)
|
||||
|
||||
1. **版本控制必须从第 0 天开始。**
|
||||
不是 "等做出点东西再说",是写第一行代码之前先初始化仓库、写好 ignore 规则、提交一个空骨架。
|
||||
理由:高频改动 + 频繁推翻是 AI 协作的常态,没有版本控制兜底就等于在悬崖边裸奔。
|
||||
|
||||
2. **文档必须在写代码之前定下来。**
|
||||
需求、架构、路线图、开发规范、目录结构、命名规范、模块边界 —— 这些不是"做完之后补的",是"做之前定的"。
|
||||
理由:一旦上下文被代码细节占满,后续每个新会话都只能 freestyle,项目会朝不可逆的方向漂移。
|
||||
|
||||
3. **架构 > UI > 用户体验。**
|
||||
最致命的不是界面丑、不是体验差,而是模块互相纠缠到无法定位问题。
|
||||
一个出问题就能立刻指认 "是 X 模块的责任" 的项目,比一个好看但耦合一团的项目,存活率高一个数量级。
|
||||
理由:耦合一旦发生,AI 协作模式会迅速放大它 —— 因为每次新会话都看不全全貌,只会在原有耦合上继续添乱。
|
||||
|
||||
> 这三条的优先级是严格递减的:先有版本控制,再有文档,再谈架构;架构稳了之后才轮到 UI 和体验。
|
||||
|
||||
---
|
||||
|
||||
## 1. 项目启动 Checklist(Day 0)
|
||||
|
||||
下列每一项都必须在写第一行业务代码之前完成。顺序即优先级。
|
||||
|
||||
### 1.1 仓库与版本控制
|
||||
- [ ] 初始化版本控制并立即建立 ignore 规则(语言 / IDE / 系统三类至少齐全)
|
||||
- [ ] 提交一个 **空骨架 commit**(README + ignore 规则 + 空目录结构),作为"零点参照系"
|
||||
- [ ] 约定分支模型(最简:主干 + 短命的功能分支;不要等到分叉时才想)
|
||||
- [ ] 约定 commit message 风格(推荐 Conventional Commits,至少要求动词开头 + 一句话原因)
|
||||
|
||||
### 1.2 文档骨架(必须先于代码存在)
|
||||
在 `.project.agents/docs/context` 下建立以下文件,**哪怕只有大纲也比没有强**:
|
||||
|
||||
| 文件 | 角色 | 上下游关系 |
|
||||
|---|---|---|
|
||||
| `PRD.md` | 产品需求(要做什么) | 上游 |
|
||||
| `ARCHITECTURE.md` | 架构(怎么拆) | 上游 |
|
||||
| `ROADMAP.md` | 路线图(什么时候做哪一块) | 由需求 + 架构推导 |
|
||||
| `CONVENTIONS.md` | 开发规范(命名、目录、提交、风格) | 上游 |
|
||||
| `UIUX.md` | 视觉与交互细节(仅有 UI 的项目需要) | 上游(与需求并列) |
|
||||
| 派生文档(实现 spec / 资产清单等) | 屏幕级实现 / 资产清单 | **派生**,由上游产生 |
|
||||
|
||||
**判断标准**:如果一个新会话的 Agent 只读需求 + 架构 + 开发规范就能正确开始一个任务 —— 文档就算合格。
|
||||
|
||||
### 1.3 Agent 协作配置
|
||||
- [ ] 在 `CLAUDE.md` 写明项目级规则(已有,保持更新)
|
||||
- [ ] 在本文件 + `SELF_CONSTRAINTS.md` 中固化经验
|
||||
- [ ] 在 `.project.agents/settings.json` 中配置必要的 hook / 权限(不要散落到根目录或全局)
|
||||
|
||||
---
|
||||
|
||||
## 2. 架构原则
|
||||
|
||||
### 2.1 三条硬规则
|
||||
|
||||
1. **单一职责到模块级**
|
||||
每个模块只回答一个问题。
|
||||
反例:"一个模块既管数据持久化,又管网络请求,又管 UI 状态" —— 这种模块必须拆。
|
||||
|
||||
2. **依赖方向单向**
|
||||
高层依赖低层,UI 依赖业务,业务依赖数据;**反向依赖一律禁止**,遇到就用接口/事件/回调倒置。
|
||||
依赖关系必须能画成一张**有向无环图(DAG)**,且这张图要在 `ARCHITECTURE.md` 里画出来。
|
||||
|
||||
3. **跨模块只走"接口契约"**
|
||||
模块 A 想用模块 B 的能力,只能通过 B 暴露的接口/协议,不能 reach into B 的内部实现。
|
||||
接口契约必须在 `ARCHITECTURE.md` 中显式声明(哪怕只是函数签名清单)。
|
||||
|
||||
### 2.2 判断架构是否健康的三个问句
|
||||
|
||||
随时可以用这三个问句自检:
|
||||
|
||||
1. **指认问题**:现在出 bug 了,我能否在 30 秒内指出"这是哪个模块的责任"?
|
||||
2. **替换实现**:如果要把模块 X 整体换掉(换数据库、换框架),改动是否能控制在 X 内部 + 一个接口适配层?
|
||||
3. **新增功能归属**:用户要加一个新功能,我能否立刻说出它"属于哪个模块、或需要新增哪个模块"?
|
||||
|
||||
任何一个回答不出来,架构就有问题,**先停下修架构,再写代码**。
|
||||
|
||||
### 2.3 反耦合纪律
|
||||
|
||||
- **不在新功能开发时顺手重构无关模块**(重构走单独 commit + 单独会话)
|
||||
- **不在 UI 层做业务判断**(UI 只接收状态、发送意图)
|
||||
- **不让数据模型自己跑业务逻辑**(模型类保持瘦,业务放 Service / UseCase)
|
||||
- **不要"为了少写一个文件"把两个模块塞进同一个文件**
|
||||
|
||||
---
|
||||
|
||||
## 3. 项目架构文档生成流程
|
||||
|
||||
这是从零到 `ARCHITECTURE.md` 的标准流程。每一步都有产出物,下一步必须基于上一步的产出物。
|
||||
|
||||
### Step 1 — 需求收敛(产出 `PRD.md`)
|
||||
- 列功能清单,按 **核心 / 增强 / 可选** 三档分类
|
||||
- 每个核心功能写一句 "用户故事"("作为 X,我想 Y,以便 Z")
|
||||
- **冻结 MVP 范围**:圈出 MVP 包含哪些核心功能,其余明确标 "Out of MVP"
|
||||
|
||||
### Step 2 — 领域建模(产出 `ARCHITECTURE.md` §1 领域模型)
|
||||
- 列出所有**名词实体**(用户、订单、会话…)
|
||||
- 标注每个实体的字段、关系、生命周期
|
||||
- 标记哪些是**持久化实体**,哪些是**瞬态状态**
|
||||
|
||||
### Step 3 — 模块划分(产出 `ARCHITECTURE.md` §2 模块清单)
|
||||
对照领域模型与需求功能清单,拆分模块。每个模块写一张卡片:
|
||||
|
||||
```
|
||||
## 模块名:<Name>
|
||||
- 职责:一句话
|
||||
- 不负责:明确写出"不做什么"(防止职责蔓延)
|
||||
- 输入:从哪些模块/外部来
|
||||
- 输出:暴露给谁
|
||||
- 关键类型/接口:列签名(不写实现)
|
||||
- 持有状态:有没有自己的状态?
|
||||
```
|
||||
|
||||
**经验**:如果一个模块的"不负责"写不出来,说明它的职责还没想清楚,回到 Step 2。
|
||||
|
||||
### Step 4 — 依赖图(产出 `ARCHITECTURE.md` §3 依赖图)
|
||||
- 画出模块间依赖箭头(推荐 Mermaid,纯文本可 diff)
|
||||
- **手动验证 DAG**:从任一节点 DFS 不应回到自己
|
||||
- 标出"接口边界":哪些依赖是接口注入,哪些是直接调用
|
||||
|
||||
### Step 5 — 路线图(产出 `ROADMAP.md`)
|
||||
按依赖图的拓扑顺序排开发节奏:
|
||||
- 先做被依赖最多的底层模块
|
||||
- 每个 milestone 必须能独立通过编译/构建并跑出某种"可见行为"
|
||||
- 写明每个 milestone 完成的"验收标准"(不是"做完了",是"做完了之后能演示什么")
|
||||
|
||||
### Step 6 — 开发规范(产出 `CONVENTIONS.md`)
|
||||
- 命名(类型 / 文件 / 目录 / 资产)
|
||||
- 代码风格(缩进 / 注释策略 / 错误处理边界)
|
||||
- 提交规范
|
||||
- 测试策略(哪些必须有测试,哪些不要求)
|
||||
|
||||
### Step 7 — 派生文档(产出实现 spec / 资产清单等)
|
||||
**只有上面 6 步都齐了,才能开始写派生文档**。
|
||||
派生文档必须显式引用上游章节("对应 `ARCHITECTURE.md` §2.3 的 XxxService 模块"),方便后续 diff 校验。
|
||||
|
||||
---
|
||||
|
||||
## 4. 文档变更协议
|
||||
|
||||
文档不是写完就锁死的,但变更必须**沿着上下游传播**:
|
||||
|
||||
| 变更点 | 必须同步更新 |
|
||||
|---|---|
|
||||
| 需求加/删/改功能 | 架构模块清单、路线图、派生文档 |
|
||||
| 架构调整模块边界 | 依赖图、开发规范(如有命名调整)、派生文档 |
|
||||
| UI/UX 改视觉 token | 派生文档(实现 spec / 资产清单),不影响架构 |
|
||||
| 加新模块 | 架构 §2 + §3、路线图、开发规范(如新目录) |
|
||||
|
||||
**权威链**:`PRD.md > ARCHITECTURE.md > UIUX.md > CONVENTIONS.md > 派生文档`。
|
||||
派生文档永远不能**反向**修改上游。如果在派生文档中发现矛盾,回去改上游,再让派生文档重新对齐。
|
||||
**代码与架构漂移 > 24 小时即违规。**
|
||||
|
||||
---
|
||||
|
||||
## 5. 实施日志(execution log)
|
||||
|
||||
写代码 / 执行路线图期间,**每完成一个可独立验收的"部分",必须在 `.project.agents/log` 写一份日志**。日志是给"下一个会话的我"看的 —— 让接手的会话能在不读所有代码的情况下知道:刚才完成了什么、哪些提交、下一步是什么。
|
||||
|
||||
### 5.1 何时写日志
|
||||
- 完成一个路线图 milestone
|
||||
- 完成一个 milestone 内独立可验收的子任务
|
||||
- 完成一次非平凡的重构 / bug 修复
|
||||
- 当前会话即将结束时(兜底,把上下文沉淀下来)
|
||||
|
||||
**判断标准**:如果这段工作下一个会话需要知道,就写。
|
||||
|
||||
### 5.2 日志文件命名
|
||||
`.project.agents/log/YYYY-MM-DD-<slug>.md`
|
||||
- `<slug>` = 简短动词 + 范围,kebab-case
|
||||
- 同日多份日志按写作顺序累积(不覆盖、不合并),文件名加序号后缀:`-1`、`-2`…
|
||||
|
||||
### 5.3 日志内容模板
|
||||
```markdown
|
||||
# <一句话标题:完成了什么>
|
||||
|
||||
- **日期**:YYYY-MM-DD
|
||||
- **关联**:路线图 M<N> / 子任务名 / 关联文档
|
||||
- **会话上下文**:(可选)本会话从哪开始接手的
|
||||
|
||||
## 做了什么
|
||||
- bullet 1
|
||||
- bullet 2
|
||||
|
||||
## 提交
|
||||
- `<short hash>` <commit subject>
|
||||
|
||||
(若本段未提交:明确写"未提交,工作树状态:…"并说明原因)
|
||||
|
||||
## 状态变更
|
||||
- 架构文档:是否动过?动了哪一节?
|
||||
- 需求/UI 文档:是否触发回归?
|
||||
- 测试:跑了什么,结果
|
||||
|
||||
## 下一步
|
||||
- 接下来要做的第一件事(具体到任务名)
|
||||
- 已知阻塞 / 待澄清项
|
||||
```
|
||||
|
||||
### 5.4 与提交的关系
|
||||
日志**不替代** commit message,commit message 仍按 `CONVENTIONS.md` 写;日志是提交的**索引与解释**。
|
||||
|
||||
### 5.5 不写日志的情况
|
||||
- 还没完成一个"可独立验收"的部分 —— 不要"写日志凑数"
|
||||
- 纯文档调整 —— commit 自身已足够说明
|
||||
- 实验性探索(最终被回滚的内容)—— 用 commit message 记录即可
|
||||
|
||||
---
|
||||
|
||||
## 6. 出问题时的排查流程
|
||||
|
||||
bug 来了不要直接钻进代码。按下列顺序:
|
||||
|
||||
1. **复现并定位现象**:能在哪个入口 / 哪个调用稳定复现?
|
||||
2. **回到架构图**:这个现象涉及哪些模块?沿着依赖图圈出可能责任方。
|
||||
3. **审查接口契约**:跨模块调用是否符合 `ARCHITECTURE.md` 中声明的接口?输入输出是否符合契约?
|
||||
4. **缩小到单模块**:把嫌疑缩小到一个模块后,再读该模块代码。
|
||||
5. **修复并回写经验**:如果发现是架构层面的漏洞,修完代码后**必须更新 `ARCHITECTURE.md` 或 `CONVENTIONS.md`**。
|
||||
|
||||
**反模式**:bug 一来就 grep 关键字、改一行试一下、再改一行试一下 —— 这是死亡螺旋,必须用流程压下去。
|
||||
|
||||
---
|
||||
|
||||
## 7. 反模式清单("看到这些立刻警觉")
|
||||
|
||||
- 出现语义为空的模块名(`Manager` / `Helper` / `Util` / `Common` / `Misc` / `Tools`)且行数 > 100 行
|
||||
- 一个文件 import 超过 10 个本地模块
|
||||
- 改一个 UI 改动需要动 3 个以上其他模块
|
||||
- 同一份业务逻辑在两个地方各写了一遍
|
||||
- PR 描述写"顺便修了 X"
|
||||
- 新增功能时发现"无处归属",于是塞进入口文件或主组件
|
||||
- 文档与代码不一致超过 24 小时
|
||||
- 出现没有在 `ARCHITECTURE.md` 中登记的新模块/新依赖方向
|
||||
|
||||
任何一条出现,**先停下来回到本指南或架构文档,不要继续往前推**。
|
||||
|
||||
---
|
||||
|
||||
## 8. 本项目当前阶段
|
||||
|
||||
> 本节随项目演进,不是规则的一部分。由 Agent 在每个 milestone 后更新。
|
||||
|
||||
<!-- 由 /ads:init(2026-08-19,Retrofit)填入:本项目为前端底座模板,治理已入位。 -->
|
||||
- 当前状态:前端底座(`abacus-static-framework`)已完成治理落地(Retrofit),`src/framework/**` 只读、业务只写 `src/subsystem/**`;前后端共享约束单源化于工作区 `docs/`(`../../../docs/coding-standards.md`)。
|
||||
- 下一步合规动作:新业务子系统按 `docs/coding-standards.md §7`(AI 生成工作流)开发;任何新增模块、目录或依赖方向先回写本仓库 `ARCHITECTURE.md`,再写代码。
|
||||
@@ -0,0 +1,165 @@
|
||||
# abacus-static-framework — 架构文档(ARCHITECTURE)
|
||||
|
||||
> 模块、依赖、契约、目录布局的**唯一权威**(本仓库视角)。新增/重命名/移动模块或调整依赖方向,必须先改本文,再改代码(同一个 commit)。
|
||||
> 上游:`PRD.md`(行为)。前后端共享约束见工作区 `docs/`(`../../../../docs/coding-standards.md`、`../../../../docs/architecture.md`),本文不复制其正文。
|
||||
|
||||
## 0. 阅读指引
|
||||
|
||||
本文描述前端底座的模块划分与依赖方向;§2 模块清单与 §6 目录一一对应,§3.2 是跨模块接口契约(写代码必须遵守)。新会话先读 §2 + §6 定位任务归属,再动手。
|
||||
|
||||
## 1. 领域模型(Domain Model)
|
||||
|
||||
### 1.1 实体
|
||||
|
||||
前端无持久化实体;领域概念即运行时状态:
|
||||
|
||||
| 实体 | 字段 | 关系 | 持久化? |
|
||||
|---|---|---|---|
|
||||
| 用户会话(userStore) | access_token/refresh_token/expires_dt/user_type | 全局单例 | 否(localStorage) |
|
||||
| 菜单/路由(permissionStore) | routes(过滤后)、menuTree | 依赖后端菜单接口 | 否(内存) |
|
||||
| 应用设置(settingsStore) | backendServices、loginType、loginAddress | 来自 window.frameBaseConfig | 否(运行时注入) |
|
||||
|
||||
### 1.2 派生概念(非持久化)
|
||||
|
||||
- `backendServices` 别名→真实服务名映射(`window.frameBaseConfig` 注入)。
|
||||
- 当前路由上下文(`currentRouter()`)用于组装 commonParam(menuName/moduleId/moduleName)。
|
||||
|
||||
### 1.3 不变量(任何模块都必须维护)
|
||||
|
||||
- I1. `src/framework/**` 只读:业务代码不得 import 后修改框架文件;框架变更只能由框架负责人进行。
|
||||
- I2. 业务请求一律经 `framework/utils/request.ts`,禁止裸 `axios`/`fetch`。
|
||||
- I3. 服务别名首段必须是 `settingsStore.backendServices` 中已注册的键。
|
||||
|
||||
## 2. 模块清单
|
||||
|
||||
按依赖层级从低到高排列。
|
||||
|
||||
### Layer 0 — framework/utils(基础设施)
|
||||
```
|
||||
## 模块名:framework/utils
|
||||
- 职责:请求管线(request.ts)、标准工具(standard/*:vxe、dataHandleUtil、globalHandle、security、baiduMap)
|
||||
- 不负责:业务逻辑、页面状态
|
||||
- 输入:各业务模块的请求配置
|
||||
- 输出:统一响应体解包后的数据 / Blob;标准工具函数
|
||||
- 关键类型/接口:request(config) -> Promise<data>;gridDefaultProps(opts);useQueryParamsHandle(...)
|
||||
- 持有状态:token 刷新队列(模块内闭包)、settingsStore 引用
|
||||
```
|
||||
|
||||
### Layer 0 — framework/components/standard(视觉基座)
|
||||
```
|
||||
## 模块名:framework/components/standard
|
||||
- 职责:标准 UI 组件(AbForm/AbQueryForm/AbSection/ClickCopy/FilePreviewDialog/ImportExcel/LogShow/RealTimeSearchSelect/SensitiveText/Text/BottomFloat)
|
||||
- 不负责:业务特有布局(业务自建 components)
|
||||
- 输入:props/插槽
|
||||
- 输出:统一风格组件
|
||||
- 持有状态:无(受控组件)
|
||||
```
|
||||
|
||||
### Layer 1 — framework/store(有状态服务)
|
||||
```
|
||||
## 模块名:framework/store
|
||||
- 职责:全局 Pinia 状态(settings:backendServices/loginType;permission:菜单生成与过滤;user:token/业务域)
|
||||
- 不负责:页面级状态(业务自建 store)
|
||||
- 输入:window.frameBaseConfig、后端菜单接口
|
||||
- 输出:状态与 actions
|
||||
- 持有状态:是
|
||||
```
|
||||
|
||||
### Layer 2 — framework/router + hooks + directives(路由与通用逻辑)
|
||||
```
|
||||
## 模块名:framework/router + hooks + directives
|
||||
- 职责:静态路由与动态路由装配支持;useVxeTableHandle 等通用组合式函数;v-debounce/v-throttle 指令
|
||||
- 不负责:业务菜单路由(subsystem/router/dynamicRouter.ts)
|
||||
- 输入:permissionStore 过滤后的路由
|
||||
- 输出:可用路由表、表格查询联动能力
|
||||
- 持有状态:路由表(由 permissionStore 维护)
|
||||
```
|
||||
|
||||
### Layer 3 — subsystem(业务可写区)
|
||||
```
|
||||
## 模块名:subsystem
|
||||
- 职责:业务子系统(api 封装、dynamicRouter 菜单路由、views 页面、extend 扩展、自建 components/hooks/store/styles/types/utils)
|
||||
- 不负责:框架能力(一律复用 framework)
|
||||
- 输入:后端接口、用户操作
|
||||
- 输出:业务页面与接口调用
|
||||
- 持有状态:业务自身状态(自建 store)
|
||||
```
|
||||
|
||||
## 3. 依赖图(DAG)
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subsystem --> framework_utils[framework/utils]
|
||||
subsystem --> framework_components[framework/components/standard]
|
||||
subsystem --> framework_hooks[framework/hooks]
|
||||
subsystem --> framework_router[framework/router]
|
||||
framework_router --> framework_store[framework/store]
|
||||
framework_hooks --> framework_utils
|
||||
framework_hooks --> framework_components
|
||||
framework_store --> framework_utils
|
||||
framework_utils --> framework_store
|
||||
```
|
||||
|
||||
### 3.1 依赖方向规则
|
||||
|
||||
- 高层依赖低层;业务(subsystem)依赖框架(framework),框架各层按上图单向;**反向依赖一律禁止**(如 framework 不得 import subsystem)。
|
||||
- 例外:`framework/utils/request.ts` 依赖 `framework/store`(settingsStore)获取别名映射——两者同属 framework 层,允许。
|
||||
|
||||
### 3.2 跨模块接口契约(写代码时必须遵守的签名)
|
||||
|
||||
```
|
||||
// module: framework/utils/request
|
||||
// request(config: {url, method, params|data, headers?, custom?}) -> Promise<data> // status===200 已解包 data;ArrayBuffer 返回整个 response
|
||||
// url 首段 = 服务别名(I3),自动携带 token/commonParam(I2)
|
||||
|
||||
// module: framework/utils/standard/vxe
|
||||
// gridDefaultProps(opts: {params, rowConfig, pagerConfig, proxyConfig, columns}) -> VxeGridProps
|
||||
|
||||
// module: framework/hooks/useVxeTableHandle
|
||||
// useQueryParamsHandle(params, page, sorts, filters) -> query params // 分页契约 {data,total},见共享规范 §6.4
|
||||
// useTableQueryReload(...) / useInVxeGridSearch(...)
|
||||
```
|
||||
|
||||
## 4. 持久化与边界
|
||||
|
||||
- 无后端式持久化;前端持久化仅 token(localStorage,由 userStore 管理)。
|
||||
- 外部边界:所有 HTTP 请求必须经 request.ts;开发期经 vite proxy;运行时经 Nginx 反代;`window.frameBaseConfig` 由宿主页面注入(含 backendServices)。
|
||||
|
||||
## 5. 测试边界
|
||||
|
||||
- 无自动化单测(PRD 已声明);每页面人工冒烟(列表/查询/新增/编辑/导出)。
|
||||
- 真机/真环境必验:多数据源路由、Kafka 消费、XXL-JOB 调度、Nacos 配置拉取、真实数据库迁移(属后端,但前端联调需一并验证)。
|
||||
|
||||
## 6. 目录结构(与 §2 模块清单一一对应)
|
||||
|
||||
```
|
||||
src/
|
||||
├── framework/ # Layer 0~2(只读共享)
|
||||
│ ├── api/ components/ hooks/ layout/ router/ store/ styles/ types/ utils/ views/ directives/
|
||||
│ └── utils/request.ts # 请求管线(契约见 §3.2)
|
||||
├── subsystem/ # Layer 3(业务可写区)
|
||||
│ ├── api/<服务别名>/ # 按 Controller 分 ts(如 sms/{index,applog,abnormal,config}.ts)
|
||||
│ ├── router/dynamicRouter.ts # 菜单路由唯一注册点
|
||||
│ ├── views/<一级菜单>/<二级菜单>/index.vue
|
||||
│ ├── extend/ # 框架扩展钩子
|
||||
│ └── (自建) components/ hooks/ store/ styles/ types/ utils/
|
||||
├── permission.ts # 全局路由守卫(生成/过滤动态路由)
|
||||
└── main.ts # 入口
|
||||
```
|
||||
|
||||
## 7. 自检(架构健康度三问)
|
||||
|
||||
1. 出 bug 了,能否 30 秒内指出是 framework 还是 subsystem、哪个子目录的责任?
|
||||
2. 替换 UI 库/表格库,改动能否控制在 framework/components 与 utils/standard 内 + 适配层?
|
||||
3. 加新业务页面,能否立刻说出落在 `subsystem/views/<一级>/<二级>/` 哪个位置?
|
||||
|
||||
## 8. 待办与已知技术负债
|
||||
|
||||
- 前端 README 引用的 `docs/` 文档中心已补齐(`../../../../docs/`)。
|
||||
- 旧框架兼容入口 `externalOldERPIndex`(data.js)仅在需要兼容历史模块时配置。
|
||||
|
||||
## 9. 文档变更协议
|
||||
|
||||
- 加/删模块或改依赖方向 → 改本文 §2 + §3,同一 commit。
|
||||
- 改对外签名(request/gridDefaultProps 等)→ 先改 §3.2,再改代码。
|
||||
- 与 `PRD.md` 冲突 → 以 `PRD.md` 为准,回改本文;与共享 `docs/coding-standards.md` 冲突 → 以 docs/ 为准并回改本文。
|
||||
@@ -0,0 +1,91 @@
|
||||
# abacus-static-framework — 开发规范(CONVENTIONS)
|
||||
|
||||
> 命名、目录、提交、风格、测试的权威(本仓库视角)。前后端共享约束见工作区 `docs/coding-standards.md`(`../../../../docs/coding-standards.md`),本文只写前端特有内容 + 指针,**禁止复制 docs/ 正文**。
|
||||
|
||||
## 0. 阅读指引
|
||||
|
||||
- 适用范围:`src/subsystem/**` 业务开发(`src/framework/**` 只读)。
|
||||
- 分工:ARCHITECTURE 管"拆成什么模块";本文管"怎么命名/写";共享编码规范、接口契约、AI 生成工作流在 `docs/coding-standards.md`。
|
||||
|
||||
## 1. 命名
|
||||
|
||||
### 1.1 标识符
|
||||
|
||||
- 组件名:PascalCase,且**必须与路由 `name` 一致**(`<script lang="ts">export default { name: 'Xxx' }</script>`)。
|
||||
- 文件/目录:kebab-case(如 `operationLog/index.vue`);views 目录按一级/二级菜单名组织。
|
||||
- API 函数:`getXxx` / `saveXxx` / `deleteXxx` / `exportXxx`。
|
||||
- Pinia store:`use<Xxx>Store`。
|
||||
|
||||
### 1.2 模块命名(语义禁区)
|
||||
|
||||
- 禁止 `Manager` / `Helper` / `Util` / `Common` / `Misc` / `Tools` 这类语义为空的名字;用"动词+名词"(如 `useTableQueryReload`、`gridDefaultProps`)。
|
||||
|
||||
### 1.3 文件 / 1.4 目录 / 1.5 资产命名
|
||||
|
||||
- 文件按主类型命名:页面 `index.vue`(views 目录内)、API 按 Controller 分 `api/<服务别名>/<模块>.ts`、组合式函数 `use<Xxx>.ts`。
|
||||
- 目录:`api/<服务别名>/`、`views/<一级菜单>/<二级菜单>/`、`router/`、`extend/`;业务自建 `components/ hooks/ store/ styles/ types/ utils/`。
|
||||
- 资产:图标/图片放 `src/assets/` 或 `public/`(按是否需编译/保持原名选择)。
|
||||
|
||||
### 1.6 字符串与本地化
|
||||
|
||||
- 用户可见文案用中文;菜单标题在路由 `meta.title` 与后端菜单保持一致。
|
||||
|
||||
## 2. 代码风格
|
||||
|
||||
### 2.1 排版
|
||||
|
||||
- TypeScript / Vue:2 空格缩进;单行 ≤ 120 字符;`<script setup>` + 选项式 `name`。
|
||||
- 已配置 `unplugin-auto-import`(vue/vue-router/@vueuse/core + Element Plus resolver):**禁止**手动 import 这些自动导入项。
|
||||
|
||||
### 2.2 分层纪律
|
||||
|
||||
- 页面组件只消费状态/发请求(经 `api/` 封装),不直接拼 URL、不裸 axios(见共享规范 §4.3/§6)。
|
||||
- 业务通用逻辑抽 `hooks/`;跨页面共享状态抽 `store/`;数据模型类型保持薄。
|
||||
|
||||
### 2.3 并发 / 2.4 错误处理
|
||||
|
||||
- 并发:请求层已处理 token 刷新并发队列;页面不自行管理并发刷新。
|
||||
- 错误:由 request.ts 统一弹窗(9xx 业务 / 5xx 系统 / 401/429/503);页面只需处理成功分支与局部提示。
|
||||
|
||||
### 2.5 注释
|
||||
|
||||
- 默认不写注释;只在 WHY 不明显时写一行;不写解释 WHAT 的注释。
|
||||
|
||||
## 3. 提交规范
|
||||
|
||||
### 3.1 Commit message 风格
|
||||
|
||||
Conventional Commits:`type(scope): subject`。允许 type:`feat` / `fix` / `docs` / `refactor` / `test` / `chore`。例:`feat(sms): 新增操作日志查询页面`。
|
||||
|
||||
### 3.2 提交粒度 / 3.3 工作区纪律 / 3.4 分支模型
|
||||
|
||||
- 一次提交一个目的;不在脏工作区叠加不相关改动。
|
||||
- 分支模型:主干 + 短命功能分支(按需,单人开发可直推主干)。
|
||||
- 本仓库属于工作区单一 git 仓库(`D:\workBuddySpace\member`);纯前端改动 commit 限定本目录,跨项目改动(docs/)单独 commit。
|
||||
|
||||
### 3.5 实施日志
|
||||
|
||||
- 规则见 `VIBECODING_GUIDE §5`:每个可独立验收的部分写 `.project.agents/log/YYYY-MM-DD-<slug>.md`。
|
||||
|
||||
## 4. 测试策略
|
||||
|
||||
### 4.1 框架 / 4.2 必须有测试的模块
|
||||
|
||||
- 无自动化测试框架(PRD 决策);人工冒烟覆盖:列表查询、表单增改、导出、权限路由。
|
||||
|
||||
### 4.3 必须真机/真环境验证
|
||||
|
||||
- 涉及后端联动的场景:多数据源路由、Kafka 消费、XXL-JOB 调度、Nacos 配置拉取、真实数据库迁移——mock/模拟器不算数。
|
||||
|
||||
## 5. 与上游文档的同步矩阵
|
||||
|
||||
| 变更点 | 必须同步更新 |
|
||||
|---|---|
|
||||
| 新增/改动页面功能 | `PRD.md`(功能定义);共享规范如有涉及先改 `docs/coding-standards.md` |
|
||||
| 新增模块/目录/依赖方向 | 本仓库 `ARCHITECTURE.md` §2+§3 |
|
||||
| 改 request/gridDefaultProps 等对外签名 | `ARCHITECTURE.md` §3.2 + `docs/coding-standards.md` §6 |
|
||||
| UI/视觉 token | 本仓库 `UIUX.md` |
|
||||
|
||||
## 6. 不在本文范围(明确划清)
|
||||
|
||||
- 模块拆分归 `ARCHITECTURE.md`;行为/范围归 `PRD.md`;前后端共享约束(接口契约/异常码/分页/APP_NAME)归 `docs/coding-standards.md`;视觉细节归 `UIUX.md`。
|
||||
@@ -0,0 +1,84 @@
|
||||
# abacus-static-framework — 产品需求文档(PRD)
|
||||
|
||||
> 行为与范围的**唯一权威**。功能的加/删/改必须先改本文,再动代码与下游文档。
|
||||
> 本文回答"做什么 / 给谁 / 为什么",不回答"怎么实现"(那是 `ARCHITECTURE.md`)。
|
||||
|
||||
## 1. 产品愿景
|
||||
|
||||
为 abacus 微服务体系提供**可复用的企业级 Vue 3 前端底座**:业务团队(人 + AI)只需在 `src/subsystem/**` 编写业务页面与接口封装,即可获得统一的菜单框架、权限路由、请求管线(统一响应体/服务别名/token 刷新)与标准 UI 组件,实现跨系统一致的前端体验与低成本复制开发。
|
||||
|
||||
## 2. 目标用户与典型场景
|
||||
|
||||
- 用户画像:公司内部业务系统开发团队(前端开发、全栈、AI 辅助开发人员)。
|
||||
- 场景 1:作为业务开发,我想在底座上复制 `subsystem` 示例新建一个业务子系统,以便快速产出与既有系统风格一致的页面。
|
||||
- 场景 2:作为 AI 助手,我想依据 `docs/coding-standards.md` 把用户给出的界面直接生成前后端代码,以便无需逐条追问技术细节。
|
||||
- 场景 3:作为框架负责人,我想保证所有子系统的 UI 组件与交互模式统一,以便降低维护成本与学习成本。
|
||||
|
||||
## 3. 范围(Scope)
|
||||
|
||||
### 3.1 MVP 必含(In Scope)
|
||||
- 菜单框架与动态路由/权限(后端菜单 → `filterAsyncRoutes` 匹配 → `addRoute`)。
|
||||
- 请求管线:统一响应体解包、URL 服务别名映射、token 自动刷新(并发队列)、commonParam 审计头、Excel ArrayBuffer 分支。
|
||||
- 标准组件与工具(`framework/components/standard` 10 项、`framework/utils/standard` 5 项)。
|
||||
- `src/subsystem` 业务开发模板(sms 示例:api / dynamicRouter / views / extend)。
|
||||
- 治理体系:`.project.agents/`(CLAUDE/AGENTS/SELF_CONSTRAINTS/VIBECODING_GUIDE + context 文档)。
|
||||
|
||||
### 3.2 明确不做(Out of Scope)
|
||||
- 不包含具体业务功能(业务只存在于 `src/subsystem/**` 的复制改写)。
|
||||
- 不提供单元测试框架与 CI 流水线(人工冒烟验证)。
|
||||
- 不维护后端逻辑(后端属 `abacus.springboot.example` 仓库)。
|
||||
|
||||
## 4. 核心功能定义
|
||||
|
||||
### 4.1 菜单框架与权限路由(【核心】)
|
||||
- **用户故事**:作为业务用户,我想登录后只看到有权限的菜单并直达页面,以便安全高效地工作。
|
||||
- **行为**:`permissionStore.generateRoutes` 拉取后端菜单,按 `url === path` 与 `subsystem/router/dynamicRouter.ts` 匹配,过滤后 `router.addRoute`。
|
||||
- **边界 / 异常**:菜单数据未注册 → 页面不可见;`public/data/data.js` 的 `currentSubsystem` 决定当前子系统。
|
||||
|
||||
### 4.2 请求管线(【核心】)
|
||||
- **用户故事**:作为业务开发者,我想只写 URL 与参数就能完成带鉴权、带审计的接口调用,以便不重复处理公共逻辑。
|
||||
- **行为**:`framework/utils/request.ts` 强制:服务别名映射(`settingsStore.backendServices`)、`status===200` 自动解包 `data`、token 剩余 <10 分钟自动刷新并重放并发请求、自动携带 `commonParam`。
|
||||
- **边界 / 异常**:业务异常码首位 9、系统异常码首位 5 统一弹窗提示;ArrayBuffer(Excel)不解包返回整个 response;HTTP 401 跳登录。
|
||||
|
||||
### 4.3 标准组件与工具(【核心】)
|
||||
- **用户故事**:作为业务开发,我想优先使用框架标准件,以便页面风格统一且少写重复代码。
|
||||
- **行为**:UI 优先级 standard 组件 > vxe-table(仅表格)> Element Plus > 自研(泛用性高需提交框架负责人);工具同理。
|
||||
- **边界 / 异常**:自研组件不得长期只存在于单个业务内。
|
||||
|
||||
## 5. 信息架构与导航
|
||||
|
||||
顶层为菜单框架(一级菜单 → 二级菜单 → `views/<一级>/<二级>/index.vue`);`dynamicRouter.ts` 是业务路由唯一注册点;子系统编码由 `public/data/data.js` 声明;开发期经 `vite.config.ts server.proxy` 反代后端。
|
||||
|
||||
## 6. 数据模型(概念级)
|
||||
|
||||
前端无持久化业务实体;运行时状态:用户登录信息(token/user)、菜单与路由(permissionStore)、服务别名映射(settingsStore.backendServices)、业务域(getCurrentBusinessDomain)。
|
||||
|
||||
## 7. 非功能性需求
|
||||
|
||||
- 构建产物直接输出到后端微服务 `resources/html/vue/<应用名>/`,随 `*-bin.zip` 一起发布(动静分离)。
|
||||
- 请求超时 50s;上传限制由后端 multipart 控制(50MB)。
|
||||
- 框架升级不覆盖 `public`、`vite.config.ts`、`src/subsystem`。
|
||||
|
||||
## 8. 国际化与文案语气
|
||||
|
||||
中文为主;用户可见文案使用统一中文,保持简洁、操作导向;禁止硬编码无意义字符串。
|
||||
|
||||
## 9. 隐私与合规
|
||||
|
||||
前端不收集个人数据;仅透传后端鉴权与业务域信息(commonParam);无上报逻辑。
|
||||
|
||||
## 10. 风险与缓解
|
||||
|
||||
- **APP_NAME 四处漏配静默失败**:按共享规范 §3 四联检(`bootstrap.yml`/扫描包/URL 首段/outDir)。
|
||||
- **框架升级覆盖业务**:升级前备份 `public`、`vite.config.ts`、`src/subsystem`。
|
||||
- **自研组件碎片化**:泛用组件必须走框架评审入库。
|
||||
|
||||
## 11. 发布里程碑(建议,待路线图细化)
|
||||
|
||||
- M0:治理与规范落地(本次已完成)。
|
||||
- M1+:按 `ROADMAP.md` 以第一个业务子系统复制改写验证模板可复制性。
|
||||
|
||||
## 12. 假设与待澄清项(复核时请逐条回应)
|
||||
|
||||
- Q1. 是否所有新业务子系统都采用"复制 sms 示例 + 改写"的方式起步?(默认:是)
|
||||
- Q2. 是否引入前端单元测试(如 Vitest)?(默认:否,人工冒烟)
|
||||
@@ -0,0 +1,54 @@
|
||||
# abacus-static-framework — 实施路线图(ROADMAP)
|
||||
|
||||
> 由 `PRD.md` + `ARCHITECTURE.md` 推导。按依赖图拓扑顺序排开发节奏。每完成一个复选框,在**同一个 commit**里打勾;每完成一个 milestone,按 `.project.agents/log/` 模板写日志。
|
||||
|
||||
## 0. 排序原则
|
||||
|
||||
- 先底层(framework 只读,不轻易动)后业务(subsystem)。
|
||||
- 本仓库为**底座模板**:里程碑以"验证模板可复制性 + 治理可持续性"为主线,而非业务功能交付。
|
||||
|
||||
## 1. 里程碑总览
|
||||
|
||||
| Milestone | 目标 | 验收(能演示什么) |
|
||||
|---|---|---|
|
||||
| M0 | 治理落地(本次):git 单一仓库、docs/ 文档中心、.project.agents 全套、共享规范 | 克隆仓库 → `npm install` → `npm run dev` 可起;治理文档无残留 token |
|
||||
| M1 | 模板可复制性验证:按 `docs/coding-standards.md §7` 用第一个业务子系统(界面→代码)跑通全流程 | 新业务子系统页面可访问、接口联调通 |
|
||||
| M2 | 沉淀与回写:业务中发现的共性需求回写 framework/standard 或 docs/ | 标准件/规范有增量,框架评审入库 |
|
||||
|
||||
## 2. 里程碑详细
|
||||
|
||||
### M0 — 治理与规范落地(已完成)
|
||||
- [x] 版本控制 + ignore + 骨架提交(工作区单一仓库 `D:\workBuddySpace\member`)
|
||||
- [x] docs/ 文档中心(README / architecture / coding-standards / agent-guide)
|
||||
- [x] 本仓库 .project.agents 治理文件(CLAUDE / AGENTS / SELF_CONSTRAINTS / VIBECODING_GUIDE / settings / context 五文档)
|
||||
- [x] 完成门禁(治理文档无残留模板 token / FILL 标记)
|
||||
- **验收**:克隆仓库 → `npm install` → `npm run dev` 可起;治理文档无残留 token。
|
||||
|
||||
### M1 — 模板可复制性验证(首个业务子系统)
|
||||
- **依赖**:M0
|
||||
- [ ] 选定/新建业务子系统(复制 `subsystem` sms 示例改写)
|
||||
- [ ] 按 `docs/coding-standards.md §7`:界面 → views + api → dynamicRouter → 后端接口 → SQL → APP_NAME 四联检 → 联调冒烟
|
||||
- [ ] 后端菜单数据注册(`sql/data/`),前端菜单可见
|
||||
- **验收**:新子系统在 dev 环境跑通列表/查询/新增/编辑/导出全链路。
|
||||
|
||||
### M2 — 沉淀与回写
|
||||
- **依赖**:M1
|
||||
- [ ] 收集业务开发中的共性需求(组件/工具/规范盲点)
|
||||
- [ ] 泛用组件走框架评审纳入 `framework/components/standard`(或 standard utils)
|
||||
- [ ] 规范盲点回写 `docs/coding-standards.md`(先改 docs/ 再同步各仓库指针)
|
||||
- **验收**:标准件与规范有可见增量,且新业务直接复用。
|
||||
|
||||
## 3. 并行轨道(与代码 milestone 解耦)
|
||||
|
||||
- 无(CI/资产生成等暂不纳入;如团队需要可补充构建门禁脚本到 `.project.agents/scripts/`)。
|
||||
|
||||
## 4. 完成定义(DoD)
|
||||
|
||||
- 构建通过(`npm run build:prod` 无错);涉及后端联动场景需后端启动联调。
|
||||
- 触及的架构变更已回写 `ARCHITECTURE.md`;共享约束变更先改 `docs/coding-standards.md`。
|
||||
- 已写执行日志(`.project.agents/log/YYYY-MM-DD-<slug>.md`)。
|
||||
|
||||
## 5. 跨 milestone 不变量
|
||||
|
||||
- I1~I3(ARCHITECTURE §1.3):framework 只读、请求走 request.ts、别名已注册。
|
||||
- 任何新模块/目录先登记 `ARCHITECTURE.md` 再写代码。
|
||||
@@ -0,0 +1,68 @@
|
||||
# abacus-static-framework — UI/UX 设计指南
|
||||
|
||||
> 视觉与交互细节的权威(与 `PRD.md` 并列上游)。视觉/交互改动先改本文,再让派生实现对齐。
|
||||
> 本文面向业务子系统开发:**页面模式与标准组件是唯一推荐路径**(共享规范 `docs/coding-standards.md §4.4~4.7` 为强制约束,此处给设计视角的说明)。
|
||||
|
||||
## 1. 设计原则(优先级递减)
|
||||
|
||||
1. **复用优先**:先标准组件(`framework/components/standard`),再 vxe-table(仅表格),再 Element Plus,最后才自研。
|
||||
2. **模式一致**:查询+列表页用同一套骨架(AbQueryForm + vxe-grid),让所有子系统页面观感统一。
|
||||
3. **配置驱动**:表单/查询表单用 fieldConfigs 配置式,少写模板代码。
|
||||
4. **表格是主角**:业务数据以表格呈现,列字段名与后端响应字段对齐。
|
||||
|
||||
## 2. 视觉身份
|
||||
|
||||
- 无独立品牌视觉;跟随公司菜单框架既有主题;不引入自定义品牌色(见 §3 语义色)。
|
||||
|
||||
## 3. 色板与字体
|
||||
|
||||
- 色板:使用 Element Plus 主题变量与 `framework/styles/variables.scss` 中定义的语义变量(禁止在业务内散落硬编码 hex)。
|
||||
- 字体:沿用框架全局样式;字号层级用 Element Plus 默认(14px 正文 / 标题层级)。
|
||||
|
||||
## 4. 间距与栅格
|
||||
|
||||
- 页面骨架固定:`<Title>` 页头 → `.form-container`(查询区,AbQueryForm)→ `.table-container`(vxe-grid);间距沿用框架示例(sms 示例页面)的既有值。
|
||||
- 弹窗内表单用 AbForm 的布局配置(默认 label 左对齐)。
|
||||
|
||||
## 5. 动效与触觉
|
||||
|
||||
- 无自定义动效需求;使用 Element Plus 默认过渡;表格行编辑为双击进入(`editConfig trigger:'dblclick', mode:'row'`)。
|
||||
|
||||
## 6. 状态系统
|
||||
|
||||
- 空态:vxe-grid 空数据默认展示;查询无结果提示由表格空态承担。
|
||||
- 加载:`loading` 状态由 vxe-grid/按钮统一管理。
|
||||
- 错误:接口错误由 request.ts 统一弹窗(业务 9xx / 系统 5xx),页面不重复提示。
|
||||
- 成功:新增/保存成功用 `ElMessage.success`(框架既有约定)。
|
||||
|
||||
## 7. 屏幕规范
|
||||
|
||||
### 7.1 查询+列表页(标准模式)
|
||||
```
|
||||
Title 页头
|
||||
AbQueryForm(fieldConfigs: input/daterange/select/radio + slot 自定义)
|
||||
vxe-grid(gridDefaultProps + proxyConfig.ajax.query;clientPage 按数据量选)
|
||||
el-dialog(新增/编辑,AbForm) / el-drawer(详情/日志)
|
||||
```
|
||||
### 7.2 可编辑表格页
|
||||
- `editConfig: { trigger: 'dblclick', mode: 'row' }` + `editRender: { name: 'input' }` + `@edit-closed` 保存(参考 `views/config/business/index.vue`)。
|
||||
### 7.3 容器页(List/Detail 切换)
|
||||
- 容器 `index.vue` 用 `:is` 动态切换 `list.vue` / `detail.vue`(参考 `views/document/interfacedoc/`)。
|
||||
|
||||
## 8. 可访问性
|
||||
|
||||
- 表单字段 label 必填;操作按钮带语义化文字;表格 `seq` 序号列保留。
|
||||
|
||||
## 9. 文案语气
|
||||
|
||||
- 按钮:动词短语(新增/编辑/删除/导出/查询/重置)。
|
||||
- 错误提示:简短、可直接行动的句子(由后端 message 提供,前端原样展示)。
|
||||
|
||||
## 10. 性能预算
|
||||
|
||||
- 列表默认服务端分页(`clientPage:false`),避免一次拉全量;大数据量禁客户端分页。
|
||||
- 查询表单默认收起多余条件(按需扩展)。
|
||||
|
||||
## 11. 视觉资产清单
|
||||
|
||||
- 一般业务无需产出视觉资产;如确需图标,放入 `src/assets/` 由构建处理(或 `public/` 保持原名),命名 kebab-case。
|
||||
@@ -0,0 +1,28 @@
|
||||
# 治理体系落地(ADS Retrofit)
|
||||
|
||||
- **日期**:2026-08-19
|
||||
- **关联**:ROADMAP M0
|
||||
- **会话上下文**:工作区两个参考模板(前端 abacus-static-framework、后端 abacus.springboot.example)此前无 git、无 docs/ 文档中心、无 .project.agents 治理。
|
||||
|
||||
## 做了什么
|
||||
|
||||
- 工作区根 `D:\workBuddySpace\member` 建单一 git 仓库 + `.gitignore`(node_modules/target/dist/.workbuddy 等)。
|
||||
- 创建 `docs/` 文档中心(单源化):`README.md`(索引+映射表)、`architecture.md`(动静分离架构)、`coding-standards.md`(★前后端开发约束规范,约 4.5k 字)、`agent-guide.md`(AI 生成代码工作流与提示词协议)。
|
||||
- 本仓库落地 `.project.agents/`:CLAUDE.md / AGENTS.md / SELF_CONSTRAINTS.md / VIBECODING_GUIDE.md / settings.json / log/README.md + `docs/context/{PRD,ARCHITECTURE,ROADMAP,CONVENTIONS,UIUX}.md`,全部填充无残留 token。
|
||||
- 共享内容以指针引用 `../../../../docs/`(如 CONVENTIONS 引用 `coding-standards.md`),未复制正文。
|
||||
- 分析过程使用 CodeGraph MCP 索引后端(82 文件)与前端 subsystem(7 文件),符号级上下文工具受限,降级为关键文件定向读取(request.ts / vite.config / yml / pom / assembly / JcBillController 等)。
|
||||
|
||||
## 提交
|
||||
|
||||
- 见工作区根 git 提交(docs/ 文档中心、前端治理、后端治理三个原子提交)。
|
||||
|
||||
## 状态变更
|
||||
|
||||
- ARCHITECTURE:本仓库 ARCHITECTURE.md 已按实际结构(framework 只读 + subsystem 业务)编写;不变量 I1~I3。
|
||||
- PRD / UIUX:PRD、UIUX 均已填充;UIUX 面向业务子系统页面模式。
|
||||
- 测试:无代码改动,未触发。
|
||||
|
||||
## 下一步
|
||||
|
||||
- 按 ROADMAP M1 用第一个业务子系统(界面→代码)验证模板可复制性。
|
||||
- 待澄清项见 PRD §12(新业务复制起步方式 / 是否引入前端单测)。
|
||||
@@ -0,0 +1,54 @@
|
||||
# 实施日志(execution log)
|
||||
|
||||
本目录沉淀"做了什么 + 哪些提交 + 下一步",供下一个会话接手用。
|
||||
规则与时机见 `../VIBECODING_GUIDE.md §5`;硬约束见 `../SELF_CONSTRAINTS.md §B6`。
|
||||
|
||||
---
|
||||
|
||||
## 文件命名
|
||||
|
||||
`YYYY-MM-DD-<slug>.md`
|
||||
|
||||
- `<slug>` = 简短动词 + 范围,kebab-case
|
||||
- 同日多份按写作顺序加 `-1`、`-2` 后缀
|
||||
|
||||
## 模板
|
||||
|
||||
```markdown
|
||||
# <一句话标题:完成了什么>
|
||||
|
||||
- **日期**:YYYY-MM-DD
|
||||
- **关联**:ROADMAP M<N> / 子任务名 / 关联文档
|
||||
- **会话上下文**:(可选)本会话从哪开始接手的
|
||||
|
||||
## 做了什么
|
||||
- bullet 1
|
||||
- bullet 2
|
||||
|
||||
## 提交
|
||||
- `<short hash>` <commit subject>
|
||||
|
||||
(若本段未提交:明确写"未提交,工作树状态:…"并说明原因)
|
||||
|
||||
## 状态变更
|
||||
- ARCHITECTURE:是否动过?动了哪一节?
|
||||
- PRD / UIUX:是否触发回归?
|
||||
- 测试:跑了什么,结果
|
||||
|
||||
## 下一步
|
||||
- 接下来要做的第一件事(具体到任务名)
|
||||
- 已知阻塞 / 待澄清项
|
||||
```
|
||||
|
||||
## 何时写
|
||||
|
||||
- 完成一个 ROADMAP milestone
|
||||
- 完成一个独立可验收的子任务
|
||||
- 完成非平凡的重构 / bug 修复
|
||||
- 会话即将结束(兜底)
|
||||
|
||||
## 何时不写
|
||||
|
||||
- 还没完成一个"可独立验收"的部分(别凑数)
|
||||
- 纯文档微调(commit 自身已够说明)
|
||||
- 实验性探索且最终 revert(commit 即可)
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"permissions": {
|
||||
"allow": [],
|
||||
"deny": []
|
||||
},
|
||||
"hooks": {}
|
||||
}
|
||||
Reference in New Issue
Block a user