chore(frontend): 落地 ADS 治理体系并收录前端底座基线代码

This commit is contained in:
zhoulei
2026-08-19 14:39:02 +08:00
parent 775e075495
commit 1f84456421
177 changed files with 18574 additions and 0 deletions
@@ -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()`)用于组装 commonParammenuName/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 状态(settingsbackendServices/loginTypepermission:菜单生成与过滤;usertoken/业务域)
- 不负责:页面级状态(业务自建 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 已解包 dataArrayBuffer 返回整个 response
// url 首段 = 服务别名(I3),自动携带 token/commonParamI2
// 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. 持久化与边界
- 无后端式持久化;前端持久化仅 tokenlocalStorage,由 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 / Vue2 空格缩进;单行 ≤ 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 统一弹窗提示;ArrayBufferExcel)不解包返回整个 responseHTTP 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~I3ARCHITECTURE §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 页头
AbQueryFormfieldConfigs: input/daterange/select/radio + slot 自定义)
vxe-gridgridDefaultProps + proxyConfig.ajax.queryclientPage 按数据量选)
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。