Ant Design 列表页生成工作流
本 skill 定义列表页的生成流程,不包含组件 API 或代码规范细节。规范和模板由项目文件和组件 skill 承载。
触发词
生成列表页、新建表格页、增删改查页面、列表页开发
依赖
| 来源 | 内容 | 位置 |
|---|---|---|
| 项目规范 | 列表页代码规范 + 完整模板 | docs/list-page-convention.md |
pro-table skill |
ProTable 组件 API | skill |
modal-form skill |
ModalForm + BetaSchemaForm 组件 API | skill |
api-doc-scraper skill |
YApi 接口文档采集 | skill |
> 若依赖 skill 未安装,仅按项目规范文件生成,不猜测未知的组件属性。
文件位置约定
所有工作流产生的临时文件统一存放在项目根目录 .aicode/tmp/ 下,按类型分目录:
| 目录/文件 | 用途 | 产出阶段 |
|---|---|---|
.aicode/tmp/workflow-registry.json |
工作流注册表(全局唯一) | 工作流启动时创建,每步更新 |
.aicode/tmp/page-specs/ |
页面描述文件(策划 + 接口信息) | Step 1 产出,Step 2 更新 |
.aicode/tmp/api-docs/ |
YApi 原始接口文档 | api-doc-scraper skill 产出 |
> .aicode/ 目录已在 .gitignore 中,不会提交到仓库。所有临时文件集中在 .aicode/tmp/ 下,方便整体清理。
工作流注册表
为什么需要注册表
.aicode/ 是隐藏目录,ExactSearch 和 RepoStruct 对隐藏目录索引支持差,无法可靠搜索其中的文件。因此需要一个已知路径的注册表文件,断点续接时直接用 ReadFile 读取,不依赖文件搜索。
此外,多个工作流可能同时运行(如列表页工作流、详情页工作流),注册表可以统一追踪所有工作流的进度。
注册表结构
文件路径:.aicode/tmp/workflow-registry.json
{
"workflows": [
{
"id": "antd-list-page",
"name": "Ant Design 列表页生成",
"pages": [
{
"pageName": "DeptManagement",
"displayName": "部门管理",
"specPath": ".aicode/tmp/page-specs/DeptManagement.md",
"step": 2,
"stepStatus": "done",
"updatedAt": "2026-05-11"
}
]
}
]
}
字段说明:
| 字段 | 层级 | 类型 | 含义 |
|---|---|---|---|
id |
workflow | string | 工作流唯一标识,本工作流固定为 antd-list-page |
name |
workflow | string | 工作流显示名称 |
pages |
workflow | array | 该工作流下的所有页面实例 |
pageName |
page | string | 页面英文标识(文件名,如 DeptManagement) |
displayName |
page | string | 页面中文显示名(如"部门管理"),用于用户识别 |
specPath |
page | string | spec 文件相对路径(相对于项目根目录) |
step |
page | number | 当前步骤编号(1/2/3) |
stepStatus |
page | string | 当前步骤状态:in-progress / done |
updatedAt |
page | string | 最后更新日期 |
注册表操作规则
读取注册表:断点续接时,直接用 ReadFile 读取 .aicode/tmp/workflow-registry.json。
⚠️ 重要:由于 .aicode/ 是隐藏目录,禁止使用 ExactSearch 或 RepoStruct 搜索其中的文件。必须使用以下方式之一:
1. ReadFile 直接读取已知路径的文件(首选)
2. RunCommand + find 命令搜索(路径不确定时使用)
创建/更新注册表:
- 工作流首次启动时,若注册表文件不存在,创建并写入初始数据
- 若注册表已存在但无本工作流条目,追加到 workflows 数组
- 若注册表已存在且已有本工作流条目,更新对应 page 的 step、stepStatus、updatedAt
- 每次更新 spec 文件的 frontmatter 时,必须同步更新注册表
删除页面:当用户要求删除某个页面时,从注册表中移除对应 page 条目,同时删除对应的 spec 文件。
临时文件清理
所有临时文件集中在 .aicode/tmp/ 下,支持以下清理方式:
| 清理场景 | 操作 | 命令 |
|---|---|---|
| 清理单个页面 | 删除 spec 文件 + 从注册表移除 page 条目 | 手动操作 |
| 清理已完成的工作流 | 删除该工作流下所有 page 的 spec 文件 + 从注册表移除 workflow 条目 | 手动操作 |
| 清理全部临时文件 | 直接删除 .aicode/tmp/ 目录 |
rm -rf .aicode/tmp |
自动清理规则:
- 当工作流 Step 3 完成(代码已生成)后,spec 文件仍保留,作为代码生成的记录和回溯依据
- 用户可随时要求清理已完成或废弃的工作流文件
- 清理注册表条目时,必须同步删除对应的 spec 文件,避免孤儿文件
断点续接
Spec 文件元数据
每个页面描述文件(.aicode/tmp/page-specs/{PageName}.md)必须包含 YAML frontmatter 元数据,记录工作流状态:
---
workflow: antd-list-page
pageName: DeptManagement
displayName: 部门管理
step: 1
stepStatus: done
updatedAt: 2026-05-11
---
# {页面名称}
## 页面信息
...
字段说明:
| 字段 | 类型 | 含义 |
|---|---|---|
workflow |
string | 所属工作流标识,固定为 antd-list-page |
pageName |
string | 页面英文标识,与注册表中的 pageName 一致 |
displayName |
string | 页面中文显示名,与注册表中的 displayName 一致 |
step |
number | 当前步骤编号(1/2/3) |
stepStatus |
string | 当前步骤状态:in-progress / done |
updatedAt |
string | 最后更新日期 |
状态流转:
| step | stepStatus | 含义 | 续接动作 |
|---|---|---|---|
| 1 | in-progress |
需求解析进行中 | 继续完善 Step 1 |
| 1 | done |
需求解析已完成 | 从 Step 2(接口采集)开始 |
| 2 | in-progress |
接口采集进行中 | 继续完善 Step 2 |
| 2 | done |
接口采集已完成 | 从 Step 3(代码生成)开始 |
| 3 | done |
代码已生成 | 工作流已完成 |
续接触发规则
当用户提到某个页面名称时:
1. 用 ReadFile 读取 .aicode/tmp/workflow-registry.json
2. 在注册表中按 displayName 或 pageName 匹配页面
3. 根据 id 字段确认属于哪个工作流
4. 根据 step + stepStatus 判断续接点
5. 用 ReadFile 读取 specPath 指向的 spec 文件,获取完整页面描述
6. 向用户确认当前状态后继续执行
多工作流场景:如果注册表中有多个工作流的页面与用户描述匹配,列出所有匹配项让用户选择。
注册表不存在或页面未找到:视为新任务,从 Step 1 开始。
元数据更新规则
- Step 完成时:同步更新 spec 文件的 frontmatter 和注册表中对应 page 的
step、stepStatus、updatedAt - Step 开始时:将
stepStatus设为in-progress,同步更新两处 - 用户确认后:将
stepStatus设为done,step推进到下一步,同步更新两处 - 原则:spec frontmatter 和注册表必须保持一致,任何状态变更都双写
工作流
Step 1:需求解析
将产品策划/需求文档转为结构化的页面描述,输出为 Markdown 文件。
输入:用户提供的策划内容(文字、截图、文档链接等)
输出:.aicode/tmp/page-specs/{PageName}.md,包含以下结构:
> ⚠️ Spec 格式权威声明:下方模板定义的 spec 格式为本工作流的权威格式。page-spec-parser skill 的 page-spec-schema.md 仅作为解析阶段的参考(字段语义、推断规则、标注规范等),最终产出物的表格结构、列定义必须严格对齐下方模板,不得混用其他格式。
---
workflow: antd-list-page
pageName: {PageName}
displayName: {页面中文名}
step: 1
stepStatus: in-progress
updatedAt: 2026-05-11
---
# {页面名称}
## 页面信息
- 模块:
- 路由路径:
- 主键字段:
## 表格列
| 字段 | 标题 | valueType | 搜索 | width | 备注 |
|------|------|-----------|------|-------|------|
## 弹窗字段
| 字段 | 标题 | valueType | 必填 | width | 备注 |
|------|------|-----------|------|-------|------|
## 操作
| 类型 | 操作名 | 触发位置 | 关联接口 |
|------|--------|---------|---------|
## 接口
| 操作 | 接口路径 | 请求方式 | 备注 |
|------|---------|---------|------|
规则:
- valueType 根据字段语义推断(文本→text,状态→select,时间→dateTime,数字→digit 等)
- 搜索列标记 ✅ 或 ❌
- 弹窗字段与表格列有重叠时,分别描述,可能搜索可见性不同
- 输出后必须让用户确认,确认后将 stepStatus 更新为 done,再进入下一步
Step 2:接口采集
从 YApi 采集接口定义,补充 Step 1 中的接口信息。
核心原则:接口信息以 YApi 采集结果为准,覆盖 Step 1 中的推断内容。
Step 1(策划解析)的输出完全以策划文档为主,接口路径等可能为空或标注"待接口采集"。
Step 2(接口采集)的输出完全以 YApi 实际接口为准,用真实数据替换所有推断和占位内容。
输入:Step 1 输出的页面描述 + YApi 接口 URL 或关键词
输出:更新 .aicode/tmp/page-specs/{PageName}.md 中的接口表、字段名、操作关联等
2.1 接口清单推导
根据 spec 中的字段和操作,推导页面所需的完整接口清单,包含显式接口和隐式接口。
显式接口:spec 接口表中已列出的接口(如列表、保存、状态切换)。
隐式接口推导决策清单:
按以下顺序逐项检查 spec,每项命中则执行对应动作:
清单 A:弹窗字段检查(遍历每个弹窗字段)
对于每个弹窗字段:
if valueType == 'select' 或 'radio':
if 备注含"远程请求"或"数据来源":
→ 推导下拉数据源接口,备注记录来源(如"负责人 → 用户列表下拉接口")
elif 备注含明确枚举值(如"0-禁用,1-启用"):
→ 无需额外接口,枚举前端写死
else:
→ 标记「需确认」:枚举前端写死 or 拉字典接口?
if valueType == 'select' 且 fieldProps 含 mode: 'multiple':
→ 同上 select 逻辑,不影响推导规则
if 字段有联动说明(如"选择省后加载市"):
→ 推导每级联动的数据源接口
清单 B:操作检查(遍历每个操作)
对于每个操作:
if 操作名 == '编辑':
if 列表接口响应字段已包含弹窗所需全部字段:
→ 不需要详情接口
else:
→ 推导详情接口(编辑回填用)
if 操作名 == '删除' 且 接口表中无删除接口:
→ 推导删除接口
if 操作名 == '导出' 且 接口表中无导出接口:
→ 推导导出接口
if 操作名 == '导入' 且 接口表中无导入接口:
→ 推导导入接口 + 模板下载接口
清单 C:表格列检查(遍历每个表格列)
对于每个表格列:
if valueType == 'select' 或 'radio':
if 备注含明确枚举值:
→ 无需额外接口
elif 弹窗字段中已有同字段的下拉数据源推导:
→ 复用,不重复推导
else:
→ 标记「需确认」:枚举前端写死 or 拉字典接口?
推导边界:
- 只推导列表页自身需要的接口,不推导关联页面的接口
- 已在清单 A 推导过的下拉数据源,清单 C 中复用,不重复推导
输出:一份完整的接口清单,标注每个接口的来源(显式/隐式推导),供用户确认。
2.2 用户确认清单
将推导出的接口清单展示给用户,包含:
- 显式接口(来自 spec 接口表)
- 隐式接口(来自推导规则)
- 需要用户确认的歧义项(如枚举前端写死 or 字典接口)
用户确认后才能继续。用户可以:
- 删除不需要的接口
- 补充遗漏的接口
- 确认歧义项的处理方式
2.3 检查本地已有接口文档
在搜索 YApi 之前,先检查 .aicode/tmp/api-docs/ 下是否已有相关接口文档。
检查方式:
1. 列出 .aicode/tmp/api-docs/ 下所有 .md 文件
2. 读取文件内容,检查是否包含清单中的接口(按接口路径或标题匹配)
3. 已存在的接口标记为"已采集",跳过 YApi 搜索
复用规则:
- 已采集的接口直接复用,不重新采集
- 若用户要求刷新,则重新采集覆盖
2.4 YApi 搜索采集
按接口清单逐个搜索 YApi,使用 api-doc-scraper skill 的 yapi-search.js 脚本。
搜索关键词推导:
每个接口需要推导一组搜索关键词,按优先级排列:
| 优先级 | 关键词来源 | 示例(部门管理) |
|---|---|---|
| 1 | 页面业务名(中文) | "部门" |
| 2 | 接口操作名(中文) | "部门列表"、"部门保存"、"部门状态" |
| 3 | 接口路径关键词(英文,从 spec 推断路径提取) | "dept"、"dept/list"、"dept/save" |
| 4 | 字段名关键词(英文,从 spec 字段名提取) | "leader"、"user"(用户下拉接口) |
| 5 | 模块名(中文) | "系统"、"权限" |
搜索策略(单接口最多 3 轮):
第 1 轮:优先级 1+2 的中文关键词
→ 搜到唯一结果 → 直接使用
→ 搜到多个结果 → 进入歧义消解
→ 搜到 0 个结果 → 进入第 2 轮
第 2 轮:优先级 3 的路径关键词
→ 搜到唯一结果 → 直接使用
→ 搜到多个结果 → 进入歧义消解
→ 搜到 0 个结果 → 进入第 3 轮
第 3 轮:优先级 4+5 的补充关键词
→ 搜到结果 → 使用
→ 搜到 0 个结果 → 标记为"未找到",不再搜索
歧义消解:
当搜索返回多个候选接口时,按以下规则排序选择:
| 排序依据 | 优先级 | 说明 |
|---|---|---|
| 路径匹配度 | 最高 | 接口路径包含 spec 中推断的路径关键词 |
| 标题匹配度 | 高 | 接口标题包含操作名(如"列表"、"保存"、"切换状态") |
| 请求方式匹配 | 中 | 请求方式与 spec 推断一致(如列表→GET/POST,保存→POST) |
| 分类匹配度 | 低 | 接口所属分类与页面模块名接近 |
歧义消解后仍无法确定唯一接口时,列出 Top 3 候选供用户选择。
跨项目依赖处理:
当接口在当前 YApi 项目中搜不到时(如用户下拉接口可能在用户管理项目中):
1. 在搜索结果中标注"当前项目未找到"
2. 询问用户:该接口是否在其他 YApi 项目中?如果是,提供项目 ID
3. 如果用户无法提供,标记为"待确认",继续后续流程
2.5 汇总报告
所有接口搜索完成后,输出汇总报告:
| 接口 | 状态 | YApi ID | 备注 |
|---|---|---|---|
| 部门列表 | ✅ 已找到 | 70473 | — |
| 部门保存 | ✅ 已找到 | 70474 | — |
| 状态切换 | ✅ 已找到 | 70475 | — |
| 用户下拉列表 | ⚠️ 当前项目未找到 | — | 可能在用户管理项目中 |
| 部门详情 | ❌ 未找到 | — | 3 轮搜索均无结果 |
状态说明:
- ✅ 已找到:唯一匹配或歧义消解后确定
- ⚠️ 歧义/跨项目:需要用户确认
- ❌ 未找到:3 轮搜索均无结果
2.6 用户确认差异
将汇总报告展示给用户,用户可以:
- 为 ⚠️ 状态的接口选择正确候选或提供其他项目信息
- 为 ❌ 状态的接口提供 YApi URL 或手动补充接口信息
- 确认缺失接口可以暂不处理(代码生成时按 spec 推断处理)
2.7 更新 spec 文件
根据采集结果更新 .aicode/tmp/page-specs/{PageName}.md:
对齐规则(接口信息覆盖策划推断):
1. 接口路径:以 YApi 实际路径为准,替换 Step 1 中的推断路径或空值
2. 字段名:以 YApi 请求/响应中的字段名为准,替换 Step 1 中的推断字段名(如 memberCount → userCount)
3. 请求方式:以 YApi 定义为准
4. 请求参数:以 YApi 定义为准,补充 Step 1 中缺失的参数
5. 响应字段:以 YApi 定义为准,补充 Step 1 中缺失的字段
6. 操作关联:将作表中关联接口列填入接口表中该接口的 YApi 编号(ID),作为两张表的精确交叉引用;禁止填写 service 函数名,函数名在代码生成阶段按项目规范生成
7. 必填/选填:以 YApi 定义为准,覆盖 Step 1 中留空的必填标注
8. 枚举值:以 YApi 定义为准,覆盖 Step 1 中的推断枚举
差异处理:
- 当 YApi 字段与 Step 1 推断不一致时,以 YApi 为准,在备注中记录差异(如"YApi 字段名为 userCount(非 memberCount)")
- 当 YApi 缺少 Step 1 中策划明确要求的字段时,保留策划字段,备注"YApi 未定义,保留策划需求"
- 当 YApi 有 Step 1 中未提及的接口(如下拉数据源),新增到接口表
YApi 信息不完整的备注规则:
YApi 接口文档经常信息不完整(字段类型为 null、缺少参数、接口状态为"未完成"等),不视为阻断问题。YApi 没有定义的内容不加、不补、不猜,只做备注:
| 缺失情况 | 处理方式 | 备注示例 |
|---|---|---|
| 字段类型为 null | 保留字段,按策划语义推断类型 | "YApi 类型为 null,按策划推断为 text" |
| 缺少分页参数 | 不补充,只备注 | "YApi 未定义分页参数" |
| 接口状态为"未完成" | 正常使用,标注接口状态 | "YApi 状态:未完成,字段可能变更" |
| 请求参数缺失 | 不补充,只备注 | "YApi 未定义请求参数" |
| 响应字段缺失 | 不补充,只备注 | "YApi 未定义响应字段" |
| 枚举值缺失 | 按策划描述补充,标注来源 | "YApi 未定义枚举,按策划补充:0-禁用,1-启用" |
> 原则:信息不完整不阻断流程,YApi 没有的不加,策划有的保留,备注清楚即可。具体代码生成时结合项目规范和模板处理。
更新元数据:将 step 更新为 2,stepStatus 更新为 done,updatedAt 更新为当前日期。
> 此步骤可选。若用户跳过,直接使用 Step 1 的描述生成代码(接口信息可能不完整)。
Step 3:代码生成
根据页面描述 + 项目规范 + 组件 API 生成列表页代码。
输入:
- Step 1/2 输出的页面描述
- docs/list-page-convention.md(项目规范)
- pro-table / modal-form skill(组件 API)
输出:
- src/pages/{Module}/{PageName}/index.jsx(页面代码)
- src/services/{module}.js(接口函数,追加到已有文件)
- src/routes/index.jsx(路由配置,追加到已有文件)
流程:
阶段一:读取规范
1. 读取 docs/list-page-convention.md 获取规范和模板
2. 读取 docs/route-convention.md 获取路由规范
3. 读取 docs/service-convention.md 获取接口定义规范
4. 检查 available_skills 中是否有 pro-table 和 modal-form skill,有则必须在同一轮对话中依次激活(先 pro-table 再 modal-form),获取组件 API 和字段使用技巧。激活后 skill 内容会在上下文中累积,无需分两轮加载
阶段二:接口函数(先于页面生成)
5. 读取 src/services/{module}.js,根据 spec 接口表 + docs/service-convention.md 规范,追加接口函数
6. 向用户输出追加的接口函数清单,等待确认
阶段三:路由配置
7. 读取 src/routes/index.jsx,根据 docs/route-convention.md 规范,追加路由配置
8. 向用户输出路由变更,等待确认
阶段四:页面代码
9. 根据页面描述填充模板,生成页面代码
10. 向用户输出页面代码 + 问题清单(需要补充的细节、拿不准的点),等待确认后再写入文件
问题清单格式:
使用编号表格,用户按编号回复即可:
| # | 类别 | 问题 | 选项 / 说明 |
|---|---|---|---|
| 1 | 字段 | status 字段用 valueEnum 还是 options? | A) valueEnum(带状态色) B) options(保持顺序) |
| 2 | 接口 | 列表接口未定义分页参数,是否按项目规范补充? | 是 / 否,手动指定参数名 |
| 3 | 交互 | 编辑时是否需要请求详情接口回填? | A) 需要(列表数据可能不完整) B) 不需要(列表已返回全部字段) |
- 类别:字段 / 接口 / 交互 / 样式 / 其他,方便用户快速定位
- 选项 / 说明:提供可选方案时列出选项,开放性问题写说明
- 用户回复格式:
1-A, 2-是, 3-需要,因为...
阶段五:规范合规检查
- 代码写入文件后,对照以下检查清单逐项验证,输出合规报告:
ProTable 检查:
| # | 检查项 | 规范来源 |
|---|---|---|
| 1 | ProTable 直接作为最外层返回,无多余容器包裹 | list-page-convention §2 |
| 2 | 设置了 scroll={{ width: '100%' }} |
list-page-convention §2 |
| 3 | 每个 column 都设置了 width | list-page-convention §2 |
| 4 | 操作列 key: 'action',valueType: 'option' |
list-page-convention §2 |
| 5 | 单条删除用了 Popconfirm 确认 |
list-page-convention §2 |
| 6 | 批量删除用了 Modal.confirm 并展示选中数量 |
list-page-convention §2 |
| 7 | 危险操作按钮用 <Button type="link" danger style={{ padding: 0 }}> |
list-page-convention §2 |
| 8 | rowSelection 设置了 preserveSelectedRowKeys: true |
list-page-convention §2 |
| 9 | 分页参数映射:params.current → pageNum,不传 current |
list-page-convention §2 |
| 10 | 无搜索字段时设置了 search={false} |
pro-table skill |
| 11 | rowKey 已指定,使用后端返回的主键字段名 |
list-page-convention §8 |
ModalForm 检查:
| # | 检查项 | 规范来源 |
|---|---|---|
| 12 | 使用 trigger 触发,非 open/onOpenChange 手动控制 |
list-page-convention §3 |
| 13 | 设置了 layout="horizontal" |
list-page-convention §3 |
| 14 | 弹窗组件抽离到主函数外部 | list-page-convention §3 |
| 15 | BetaSchemaForm 设置了 layoutType="Embed" |
modal-form skill |
| 16 | 每个 BetaSchemaForm column 设置了 width | list-page-convention §3 |
| 17 | 新建/编辑通过 initialValues?.id 判断 |
list-page-convention §3 |
| 18 | 枚举字段使用 request 属性(非手动 useEffect + useState) |
list-page-convention §3 |
Service 检查:
| # | 检查项 | 规范来源 |
|---|---|---|
| 19 | 接口路径加了 /api 前缀 |
service-convention §2 |
| 20 | 函数命名符合 {verb}{Module}{Business} 格式 |
service-convention §3 |
| 21 | POST 请求用 { data },GET 请求用 { params } |
service-convention §4 |
| 22 | 导出接口设置了 responseType: 'blob' + getResponse: true + blobData2File |
service-convention §4.4 |
| 23 | 上传接口使用了 jsonToFormData 或 postFormData |
service-convention §4.3 |
路由检查:
| # | 检查项 | 规范来源 |
|---|---|---|
| 24 | 一级分组 path 以 / 开头,二级路由 path 不加 / |
route-convention §7 |
| 25 | component 路径使用 @/pages/ 别名,无扩展名 |
route-convention §7 |
| 26 | 设置了 exact: true |
route-convention §4 |
导入路径检查:
| # | 检查项 | 规范来源 |
|---|---|---|
| 27 | 页面中 service 导入路径为 @/services/{module},与文件按路径首段拆分一致 |
service-convention §1 |
| 28 | 无未使用的导入 | 通用 |
输出格式:
| # | 检查项 | 结果 | 说明 |
|---|---|---|---|
| 1 | scroll 设置 | ✅ / ❌ | 如 ❌:缺少 scroll={{ width: '100%' }} |
| ... | ... | ... | ... |
- 全部 ✅ → 直接进入阶段六
- 有 ❌ → 修复后重新检查,最多 3 轮;3 轮后仍有问题则列出剩余项让用户决定
阶段六:收尾
12. 用户确认所有代码后,将 spec 文件的 step 更新为 3,stepStatus 更新为 done,同步更新注册表
> 核心原则:每个阶段输出后都向用户反馈,遇到问题不闷头自己找方案,而是列出问题让用户决定。
代码生成参考策略:
- 直接用模板 + 规范 + skill 生成代码,不主动去读项目中已有的页面作为参考
- 遇到拿不准的点(模板未覆盖的模式、规范未明确的细节),列在问题清单中让用户拿主意,不自行翻老页面找答案
- 若认为参考某个已有页面会有帮助,向用户提出建议,由用户决定是否提供参考页面及参考哪个页面
- 禁止自行选择参考页面:已有页面的实现质量未知,参考不当反而引入错误模式
路由配置规则:
- 必须读取 docs/route-convention.md,按规范确定路由归属和配置格式
- 根据 spec 中的模块和路由路径,判断页面归属哪个一级分组
- 若一级分组已存在,在其 routes 下追加;若不存在,按规范新建一级分组
- 禁止自行推断一级分组归属,无法确定时必须向用户确认
Skill 使用策略(有则必用,无则降级):
| 情况 | 处理方式 |
|---|---|
pro-table + modal-form 均已安装 |
必须激活,结合 skill 中的组件 API 和字段技巧编写代码 |
| 仅安装其中一个 | 激活已安装的 skill,未安装的按项目规范和模板处理 |
| 均未安装 | 仅按项目规范 + 模板生成,不猜测未知的组件属性 |
为什么已安装时必须激活:
- Skill 中包含组件 API 的细节和字段使用技巧(如 search={false} 关闭搜索栏、valueEnum 与 options 的选择、fieldProps 配置等),仅参考项目规范和模板可能遗漏
- 激活 skill 后,以 skill 中的 API 为准,项目规范为框架约束,模板为结构参考,三者结合生成代码