@agile-team/wl-skills-kit 2.1.2 → 2.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +6 -5
- package/bin/wl-skills.js +35 -1
- package/files/.github/guides/README.md +13 -13
- package/files/.github/guides/architecture.md +555 -555
- package/files/.github/guides/usage.md +166 -166
- package/files/.github/reports/README.md +65 -65
- package/files/.github/reports/SYS_DICT_INFO.md +19 -19
- package/files/.github/reports/SYS_MENU_INFO.md +247 -247
- package/files/.github/reports/SYS_PERMISSION_INFO.md +20 -20
- package/files/.github/reports//347/273/204/344/273/266/346/217/220/345/217/226/345/273/272/350/256/256.md +33 -33
- package/files/.github/reports//350/247/204/350/214/203/345/256/241/346/237/245/346/212/245/345/221/212.md +44 -44
- package/files/.github/skills/_compat/README.md +108 -108
- package/files/.github/skills/_compat/headers/agents.txt +8 -8
- package/files/.github/skills/_compat/headers/claude-code.txt +7 -7
- package/files/.github/skills/_compat/headers/cline.txt +7 -7
- package/files/.github/skills/_compat/headers/cursor-mdc.txt +16 -16
- package/files/.github/skills/_compat/headers/cursor-rules.txt +7 -7
- package/files/.github/skills/_compat/headers/github-copilot.txt +1 -1
- package/files/.github/skills/_compat/headers/kiro.txt +10 -10
- package/files/.github/skills/_compat/headers/trae.txt +11 -11
- package/files/.github/skills/_compat/headers/windsurf.txt +7 -7
- package/files/.github/skills/_registry.md +81 -81
- package/files/.github/skills/core/api-contract/SKILL.md +344 -344
- package/files/.github/skills/core/api-contract/USAGE.md +110 -110
- package/files/.github/skills/core/convention-audit/SKILL.md +189 -189
- package/files/.github/skills/core/convention-audit/USAGE.md +99 -99
- package/files/.github/skills/core/page-codegen/SKILL.md +973 -973
- package/files/.github/skills/core/page-codegen/USAGE.md +102 -102
- package/files/.github/skills/core/page-codegen/templates/_index.md +46 -46
- package/files/.github/skills/core/page-codegen/templates/domains/_CONTRIBUTING.md +107 -107
- package/files/.github/skills/core/page-codegen/templates/domains/produce/TPL-OPERATION-STATION.md +442 -442
- package/files/.github/skills/core/page-codegen/templates/domains/sale/README.md +26 -26
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-CHANGE-HISTORY.md +276 -276
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-DETAIL-TABS.md +1145 -1145
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-DRIVEN.md +124 -124
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-FORM-ROUTE.md +436 -436
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-LIST.md +191 -191
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-MASTER-DETAIL.md +148 -148
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-RECORD-FORM.md +371 -371
- package/files/.github/skills/core/page-codegen/templates/universal/TPL-TREE-LIST.md +186 -186
- package/files/.github/skills/core/prototype-scan/SKILL.md +498 -498
- package/files/.github/skills/core/prototype-scan/USAGE.md +95 -95
- package/files/.github/skills/core/template-extract/SKILL.md +139 -139
- package/files/.github/skills/core/template-extract/USAGE.md +93 -93
- package/files/.github/skills/domain/README.md +51 -51
- package/files/.github/skills/ops/code-fix/SKILL.draft.md +108 -108
- package/files/.github/skills/sync/dict-sync/SKILL.draft.md +100 -100
- package/files/.github/skills/sync/menu-sync/SKILL.md +258 -258
- package/files/.github/skills/sync/menu-sync/USAGE.md +104 -104
- package/files/.github/skills/sync/menu-sync/env/env.local.json +6 -6
- package/files/.github/skills/sync/menu-sync/env/guide.md +83 -83
- package/files/.github/skills/sync/permission-sync/SKILL.draft.md +91 -91
- package/files/.github/standards/01-toolchain.md +57 -57
- package/files/.github/standards/02-code-structure.md +111 -111
- package/files/.github/standards/03-comments.md +53 -53
- package/files/.github/standards/04-coding-basics.md +33 -33
- package/files/.github/standards/05-logging.md +38 -38
- package/files/.github/standards/06-security.md +44 -44
- package/files/.github/standards/07-config.md +52 -52
- package/files/.github/standards/08-git.md +60 -60
- package/files/.github/standards/09-typescript.md +71 -71
- package/files/.github/standards/10-pinia.md +57 -57
- package/files/.github/standards/11-form-validation.md +81 -81
- package/files/.github/standards/12-base-table.md +116 -116
- package/files/.github/standards/13-platform-components.md +123 -123
- package/files/.github/standards/index.md +89 -89
- package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/data.ts +196 -196
- package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.scss +150 -150
- package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.vue +79 -79
- package/files/docs/jh-date-range.md +257 -257
- package/files/docs/jh-date.md +222 -222
- package/files/docs/jh-dept-picker.md +190 -190
- package/files/docs/jh-drag-row.md +590 -590
- package/files/docs/jh-file-upload.md +216 -216
- package/files/docs/jh-picker.md +218 -218
- package/files/docs/jh-select.md +148 -148
- package/files/docs/jh-text.md +248 -248
- package/files/docs/jh-user-picker.md +197 -197
- package/package.json +2 -4
|
@@ -1,498 +1,498 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: prototype-scan
|
|
3
|
-
description: "Use when: analyzing Axure exported HTML prototype files to extract page inventory, classify interaction patterns, identify reusable components, and produce a structured page checklist for Vue development. Also supports detailed design documents (MD/Word) or natural language descriptions as input. Triggers on: prototype analysis, axure scan, page inventory, 原型解析, 页面清单, axure转vue, 详设文档, design doc, 详细设计, 口述需求, 自然语言建页面, natural language page request, 建个页面, 写个页面, 口头描述页面."
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Skill: 原型解析(prototype-scan)
|
|
7
|
-
|
|
8
|
-
将 **Axure 导出的 HTML 原型包** 或 **详细设计文档(MD/Word/表格)** 解析为结构化的 **page-spec JSON 页面清单**,作为后续接口约定和代码生成的输入。
|
|
9
|
-
|
|
10
|
-
> **两种输入,同一输出**:输出格式完全相同(page-spec JSON),消费方(page-codegen)无需感知来源。
|
|
11
|
-
|
|
12
|
-
## 触发
|
|
13
|
-
|
|
14
|
-
| 模式 | 输入 | 典型场景 |
|
|
15
|
-
|------|------|----------|
|
|
16
|
-
| **模式 0(自然语言)** | 用户口述需求,无文件 | 日常对话:"帮我建一个客户管理页面,有XX字段" |
|
|
17
|
-
| **模式 A(Axure)** | Axure HTML 文件包目录 | 已有原型设计,AI 全量扫描 HTML |
|
|
18
|
-
| **模式 B(详设文档)** | MD/Word/表格格式的详细设计文档 | 已有详细设计文档,AI 解析结构化字段 |
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## 模式 0 — 自然语言转 page-spec(内部步骤)
|
|
23
|
-
|
|
24
|
-
> **核心原则**:模式 0 是 AI 的**内部推导流程**,不输出中间 JSON 给用户。
|
|
25
|
-
> AI 从口述中提取信息 → 内部构建 page-spec JSON → 直接传递给 page-codegen 消费。
|
|
26
|
-
> **不向用户索要文件**,用注释标注不确定项即可。
|
|
27
|
-
|
|
28
|
-
### 1. 提取关键信息
|
|
29
|
-
|
|
30
|
-
从用户口述中识别以下实体(缺省则用默认值):
|
|
31
|
-
|
|
32
|
-
| 实体 | 识别关键词示例 | 默认值 |
|
|
33
|
-
|------|---------------|--------|
|
|
34
|
-
| 页面中文名 | "XX页面" / "XX管理" / "XX档案" | 必须由用户提供 |
|
|
35
|
-
| 交互模式 | 见下方映射表 | `LIST` |
|
|
36
|
-
| 服务缩写 | "生产"→pm, "精整"→mmwr, "销售"→sale, "人力"→hrms, "基础"→base | 从目标路径推断 |
|
|
37
|
-
| 资源名 | 从中文名推断 CamelCase | 自动推断 |
|
|
38
|
-
| 目录名 | 从中文名推断 kebab-case | 自动推断 |
|
|
39
|
-
|
|
40
|
-
### 2. 关键词 → 交互模式映射
|
|
41
|
-
|
|
42
|
-
| 用户关键词 | 推断模式 |
|
|
43
|
-
|-----------|----------|
|
|
44
|
-
| "列表" / "查询" / "管理页" / 无特殊说明 | `LIST` |
|
|
45
|
-
| "主从" / "明细" / "上下表" | `MASTER_DETAIL` |
|
|
46
|
-
| "树形" / "左树右表" | `TREE_LIST` |
|
|
47
|
-
| "表单" / "详情" / "多Tab表单" | `DETAIL_TABS` |
|
|
48
|
-
| "独立表单" / "路由表单" / "复杂表单" | `FORM_ROUTE` |
|
|
49
|
-
| "变更历史" / "变更记录" | `CHANGE_HISTORY` |
|
|
50
|
-
| "记录表单" / "无分页" | `RECORD_FORM` |
|
|
51
|
-
| "工位" / "操作站" | `OPERATION_STATION` |
|
|
52
|
-
|
|
53
|
-
### 3. 内部构建 page-spec 骨架
|
|
54
|
-
|
|
55
|
-
AI 根据提取的信息,内部构建 page-spec JSON(**不输出给用户**):
|
|
56
|
-
|
|
57
|
-
```jsonc
|
|
58
|
-
{
|
|
59
|
-
"pageName": "[用户说的中文名]",
|
|
60
|
-
"kebabName": "[推断的kebab-case]",
|
|
61
|
-
"pattern": "[推断的交互模式,默认LIST]",
|
|
62
|
-
"path": "views/[域]/[模块]/[子模块]/[kebab-name]/",
|
|
63
|
-
"query": [
|
|
64
|
-
// 从用户描述中提取;未提及 → 基于资源名推断 1-2 个(如"名称"、"编码")
|
|
65
|
-
],
|
|
66
|
-
"toolbar": [
|
|
67
|
-
// 默认: 新增(primary) + 删除(danger);用户提及"导出""导入"等则追加
|
|
68
|
-
],
|
|
69
|
-
"columns": [
|
|
70
|
-
// 从用户描述中提取;未逐一列举 → 基于资源语义推断 5-8 个常见字段
|
|
71
|
-
],
|
|
72
|
-
"operations": [
|
|
73
|
-
// 默认: 编辑 + 删除;用户提及"查看""审批"等则调整
|
|
74
|
-
],
|
|
75
|
-
"features": {
|
|
76
|
-
"tabSwitch": false, "viewSwitch": false, "hiddenMenu": false
|
|
77
|
-
},
|
|
78
|
-
"notes": [
|
|
79
|
-
"[模式0] 字段英文名为AI推断值,请确认",
|
|
80
|
-
"[模式0] dictCode 为推断值,请后端确认"
|
|
81
|
-
]
|
|
82
|
-
}
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
### 4. 降级与默认值原则
|
|
86
|
-
|
|
87
|
-
| 信息缺失项 | 默认策略 |
|
|
88
|
-
|-----------|----------|
|
|
89
|
-
| 交互模式 | `LIST`(最常见的列表查询页) |
|
|
90
|
-
| 查询字段 | 基于业务资源名推断 1-2 个("名称"、"编码") |
|
|
91
|
-
| 工具栏按钮 | `[新增(primary), 删除(danger)]` |
|
|
92
|
-
| 表格列 | 基于资源语义推断 5-8 个常见字段(编码、名称、类型、状态、创建时间等) |
|
|
93
|
-
| 操作列 | `[编辑, 删除]` |
|
|
94
|
-
| 字段英文名 | AI 推断 camelCase,notes 标注"字段名为推断值" |
|
|
95
|
-
| 字典 code | 状态类字段自动标注推断 dictCode,notes 标注"dictCode 为推断值" |
|
|
96
|
-
| 子表 | 不生成(用户未提及则不推断) |
|
|
97
|
-
| Tab/视角切换 | 关闭(`false`) |
|
|
98
|
-
|
|
99
|
-
> 构建完成后,直接进入输出流程(同模式 A/B),为 page-codegen 提供标准 page-spec JSON。
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
## 输入模式 A:Axure HTML 扫描
|
|
104
|
-
|
|
105
|
-
---
|
|
106
|
-
|
|
107
|
-
## 步骤
|
|
108
|
-
|
|
109
|
-
## 步骤
|
|
110
|
-
|
|
111
|
-
### 1. 全量扫描 HTML
|
|
112
|
-
|
|
113
|
-
遍历所有 `.html` 文件,提取:
|
|
114
|
-
|
|
115
|
-
| 区域 | 提取内容 |
|
|
116
|
-
| ---- | ------------------------------------------------------ |
|
|
117
|
-
| 标题 | `<title>` / 标题文本 → 页面名称 |
|
|
118
|
-
| 表格 | `<table>` / 网格布局 → 表格列定义 |
|
|
119
|
-
| 表单 | `<input>` / `<select>` / 标签文本 → 查询条件和表单字段 |
|
|
120
|
-
| 按钮 | `<button>` / 链接文本 → 操作按钮列表 |
|
|
121
|
-
| 弹窗 | 遮罩层 / 弹出层 → 弹窗组件 |
|
|
122
|
-
| 树形 | 侧边栏 / 树形导航 → 树形结构 |
|
|
123
|
-
| 注释 | Axure 注解 → 业务说明 |
|
|
124
|
-
|
|
125
|
-
### 2. 交互模式分类
|
|
126
|
-
|
|
127
|
-
| 模式 | 特征 | 前端组件 |
|
|
128
|
-
| --------------- | --------------------- | ------------------------------------------------ |
|
|
129
|
-
| `LIST` | 查询区 + 表格 + 分页 | BaseQuery + BaseTable + jh-pagination |
|
|
130
|
-
| `MASTER_DETAIL` | 上方主表 + 下方明细表 | jh-drag-row(需 `.drager_row { height: 100% }`) |
|
|
131
|
-
| `TREE_LIST` | 左侧树 + 右侧表格 | C_Splitter + C_Tree |
|
|
132
|
-
| `FORM_MODAL` | 弹窗中的表单 | el-dialog + el-form |
|
|
133
|
-
| `COMPOSITE` | 多种组合 | 组合使用 |
|
|
134
|
-
|
|
135
|
-
### 3. 字段提取
|
|
136
|
-
|
|
137
|
-
对每个页面提取 3 类字段(字段名用 camelCase,与 data.ts 直接对应):
|
|
138
|
-
|
|
139
|
-
**查询字段:**
|
|
140
|
-
|
|
141
|
-
```
|
|
142
|
-
中文名 | 建议英文名(camelCase) | 组件类型 | dictCode(如有)
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
组件类型对照(查询项 `queryDef()` 中使用):
|
|
146
|
-
|
|
147
|
-
| 原型表现 | 组件配置 |
|
|
148
|
-
| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
149
|
-
| 普通输入框 | 默认 input(无需 component 属性) |
|
|
150
|
-
| 下拉选择 | `logicType: BusLogicDataType.dict, logicValue: "dictCode"` |
|
|
151
|
-
| 单日期 | `component: () => ({ tag: "jh-date", type: "date" })` |
|
|
152
|
-
| 月份选择 | `component: () => ({ tag: "jh-date", type: "month", showFormat: "YYYY-MM", format: "YYYYMM" })` |
|
|
153
|
-
| 日期范围 | `component: () => ({ tag: "jh-date", type: "daterange", rangeSeparator: "至", showFormat: "YYYY-MM-DD", valueFormat: "YYYY-MM-DD" })`,需额外配 `startName`/`endName` |
|
|
154
|
-
| 用户选择 | `component: () => ({ tag: "jh-user-picker" })` |
|
|
155
|
-
| 部门选择 | `component: () => ({ tag: "jh-dept-picker" })` |
|
|
156
|
-
|
|
157
|
-
**表格列:**
|
|
158
|
-
|
|
159
|
-
```
|
|
160
|
-
列名(中文) | 字段名(camelCase) | 宽度建议 | 是否字典列(logicType/logicValue)
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
字典列配置参考:`{ label: "状态", name: "status", minWidth: 120, logicType: BusLogicDataType.dict, logicValue: "dictCode", sortable: true, filterable: true }`
|
|
164
|
-
|
|
165
|
-
**表单字段(弹窗):**
|
|
166
|
-
|
|
167
|
-
```
|
|
168
|
-
中文名 | 英文名(camelCase) | 类型 | 是否必填 | 组件类型 | dictCode
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
### 4. 组件匹配
|
|
172
|
-
|
|
173
|
-
对照平台已有组件(详细 API 见 `docs/jh-*.md`):
|
|
174
|
-
|
|
175
|
-
| 功能区 | 组件 | 说明 |
|
|
176
|
-
| -------- | ----------------------- | ------------------------------------ |
|
|
177
|
-
| 查询区 | BaseQuery | 通过 `queryDef()` 声明式配置 |
|
|
178
|
-
| 工具栏 | BaseToolbar | 通过 `toolbarDef()` 声明式配置 |
|
|
179
|
-
| 表格 | BaseTable | 通过 `columnsDef()` 声明式配置 |
|
|
180
|
-
| 分页 | jh-pagination | 固定用法,见 copilot-instructions.md |
|
|
181
|
-
| 上下分栏 | jh-drag-row | 主从表必备,需设 `:top-height` |
|
|
182
|
-
| 左右分割 | C_Splitter | 树形+列表必备,设 `:left-width` |
|
|
183
|
-
| 树形面板 | C_Tree | 含搜索+Tab 切换 |
|
|
184
|
-
| 下拉选择 | jh-select | dict 属性自动加载字典数据 |
|
|
185
|
-
| 日期选择 | jh-date / jh-date-range | 参见 `docs/jh-date.md` |
|
|
186
|
-
| 用户选择 | jh-user-picker | 参见 `docs/jh-user-picker.md` |
|
|
187
|
-
| 部门选择 | jh-dept-picker | 参见 `docs/jh-dept-picker.md` |
|
|
188
|
-
| 文件上传 | jh-file-upload | 参见 `docs/jh-file-upload.md` |
|
|
189
|
-
|
|
190
|
-
**新建组件判断:**
|
|
191
|
-
|
|
192
|
-
- 3+ 页面相同逻辑 → `src/components/global/C_PascalCase/`
|
|
193
|
-
- 同模块 2 页面共用 → `src/components/local/c_camelCase/`
|
|
194
|
-
- 业务强耦合 → 页面 `components/` 目录下
|
|
195
|
-
|
|
196
|
-
### 5. pages.ts 注册名推断
|
|
197
|
-
|
|
198
|
-
根据 `vite/plugins/shared/pages.ts` 的 `gProd` / `gSale` 函数格式:
|
|
199
|
-
|
|
200
|
-
```typescript
|
|
201
|
-
// ["kebab-case-目录名", "中文label"]
|
|
202
|
-
// 路径: views/[域]/[模块]/[子模块]/[目录]/index.vue
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
---
|
|
206
|
-
|
|
207
|
-
## 输出格式:page-spec JSON
|
|
208
|
-
|
|
209
|
-
> **核心原则:结构化 JSON 确保字段不遗漏(可机器 diff),notes 保留复杂语境。**
|
|
210
|
-
> 每个页面输出一个 page-spec JSON 对象,所有页面汇总为数组。
|
|
211
|
-
> **禁止在 JSON 中用"等"、"..."省略任何字段**,必须逐个列出。
|
|
212
|
-
|
|
213
|
-
### page-spec 结构定义
|
|
214
|
-
|
|
215
|
-
```jsonc
|
|
216
|
-
{
|
|
217
|
-
// ===== 页面基本信息 =====
|
|
218
|
-
"pageName": "客户档案", // 中文名
|
|
219
|
-
"kebabName": "customer-archive", // kebab-case 目录名
|
|
220
|
-
"pattern": "LIST", // LIST | MASTER_DETAIL | TREE_LIST | FORM_TAB | COMPOSITE
|
|
221
|
-
"path": "views/sale/demo/khda/customer-archive/",
|
|
222
|
-
"pagesTs": ["customer-archive", "客户档案"], // pages.ts 注册项
|
|
223
|
-
"platformComponents": ["BaseQuery", "BaseTable", "jh-pagination"],
|
|
224
|
-
"newComponents": [], // 需要新建的组件名(空数组=不需要新建)
|
|
225
|
-
|
|
226
|
-
// ===== 查询区字段(逐个列出,禁止省略) =====
|
|
227
|
-
"query": [
|
|
228
|
-
{ "field": "customerName", "label": "客户名称", "type": "input" },
|
|
229
|
-
{ "field": "customerType", "label": "客户类型", "type": "dict", "dictCode": "customer_type" },
|
|
230
|
-
{
|
|
231
|
-
"field": "createDate", "label": "建立日期", "type": "dateRange",
|
|
232
|
-
"startName": "createDateStart", "endName": "createDateEnd"
|
|
233
|
-
}
|
|
234
|
-
],
|
|
235
|
-
|
|
236
|
-
// ===== 工具栏按钮(逐个列出,与原型顺序严格一致) =====
|
|
237
|
-
"toolbar": [
|
|
238
|
-
{ "label": "新增", "type": "primary", "action": "openModal" },
|
|
239
|
-
{ "label": "删除", "type": "danger", "action": "batchDelete" },
|
|
240
|
-
{ "label": "导出", "type": "plain", "action": "export" }
|
|
241
|
-
],
|
|
242
|
-
// toolbar.type 映射:蓝底填充="primary",线框/白底="plain",红色="danger",灰色="default"
|
|
243
|
-
|
|
244
|
-
// ===== 表格列(逐列列出,禁止省略) =====
|
|
245
|
-
"columns": [
|
|
246
|
-
{ "field": "customerName", "label": "客户名称", "width": 180 },
|
|
247
|
-
{ "field": "customerType", "label": "客户类型", "width": 120, "dict": "customer_type" }
|
|
248
|
-
],
|
|
249
|
-
|
|
250
|
-
// ===== 操作列按钮 =====
|
|
251
|
-
"operations": [
|
|
252
|
-
{ "label": "编辑", "action": "edit" },
|
|
253
|
-
{ "label": "删除", "action": "delete" }
|
|
254
|
-
],
|
|
255
|
-
|
|
256
|
-
// ===== 内嵌子表(关键!必须标注交互属性) =====
|
|
257
|
-
"subTables": [
|
|
258
|
-
{
|
|
259
|
-
"name": "businessInfo",
|
|
260
|
-
"label": "业务信息",
|
|
261
|
-
"editable": true, // 是否可增删行
|
|
262
|
-
"inlineEdit": false, // 是否行内编辑(双击单元格编辑)
|
|
263
|
-
"columns": [
|
|
264
|
-
{ "field": "salesType", "label": "销售别", "width": 80 }
|
|
265
|
-
],
|
|
266
|
-
"operations": [ // 子表的操作按钮
|
|
267
|
-
{ "label": "删除", "action": "removeRow" }
|
|
268
|
-
]
|
|
269
|
-
}
|
|
270
|
-
],
|
|
271
|
-
|
|
272
|
-
// ===== 表单字段(FORM_TAB / 弹窗 页面使用) =====
|
|
273
|
-
"formSections": [
|
|
274
|
-
{
|
|
275
|
-
"name": "basicInfo",
|
|
276
|
-
"label": "基本信息",
|
|
277
|
-
"fields": [
|
|
278
|
-
{ "field": "customerName", "label": "客户名称", "type": "input", "required": true },
|
|
279
|
-
{ "field": "customerType", "label": "客户类型", "type": "dict", "dictCode": "customer_type", "required": true }
|
|
280
|
-
]
|
|
281
|
-
}
|
|
282
|
-
],
|
|
283
|
-
|
|
284
|
-
// ===== 页面级特殊交互开关 =====
|
|
285
|
-
"features": {
|
|
286
|
-
"tabSwitch": false, // 是否有 Tab 切换(如临时/正式客户)
|
|
287
|
-
"tabItems": [], // Tab 项:[{ "label": "临时客户", "value": "temp" }]
|
|
288
|
-
"viewSwitch": false, // 是否有视图/视角切换(如管理视角/使用视角 Radio)
|
|
289
|
-
"viewItems": [], // 视图项:[{ "label": "管理视角", "value": "management" }]
|
|
290
|
-
"hiddenMenu": false // 是否隐藏菜单(从列表跳转进入的子页面)
|
|
291
|
-
},
|
|
292
|
-
|
|
293
|
-
// ===== 非结构化补充说明 =====
|
|
294
|
-
"notes": [
|
|
295
|
-
"客户分类/客户级别的下拉选项按产品线动态变化",
|
|
296
|
-
"状态信息区(创建时间、核实状态等)为只读展示"
|
|
297
|
-
]
|
|
298
|
-
}
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
### 子表交互判断规则
|
|
302
|
-
|
|
303
|
-
| 原型特征 | editable | inlineEdit |
|
|
304
|
-
|---------|----------|------------|
|
|
305
|
-
| 表格上方有"新增"按钮,行内有"删除"链接 | `true` | `false` |
|
|
306
|
-
| 表格单元格可直接编辑(输入框/下拉) | `true` | `true` |
|
|
307
|
-
| 纯展示表格,无任何编辑入口 | `false` | `false` |
|
|
308
|
-
| 表格仅有外部"导入"按钮填充数据 | `false` | `false` |
|
|
309
|
-
|
|
310
|
-
### 完整输出模板
|
|
311
|
-
|
|
312
|
-
````markdown
|
|
313
|
-
# 页面清单 - [模块名称]
|
|
314
|
-
|
|
315
|
-
> 原型来源:[文件名/版本]
|
|
316
|
-
> 业务说明:[一句话描述]
|
|
317
|
-
|
|
318
|
-
## 页面总表
|
|
319
|
-
|
|
320
|
-
| # | 页面名称 | 交互模式 | kebab 目录名 | 是否隐藏菜单 |
|
|
321
|
-
|---|---------|---------|-------------|-------------|
|
|
322
|
-
|
|
323
|
-
## page-spec
|
|
324
|
-
|
|
325
|
-
```json
|
|
326
|
-
[
|
|
327
|
-
{ /* 页面1 完整 page-spec */ },
|
|
328
|
-
{ /* 页面2 完整 page-spec */ }
|
|
329
|
-
]
|
|
330
|
-
```
|
|
331
|
-
|
|
332
|
-
## 共享组件识别
|
|
333
|
-
|
|
334
|
-
| 组件 | 位置 | 复用页面 | 说明 |
|
|
335
|
-
|-----|------|---------|------|
|
|
336
|
-
|
|
337
|
-
## 数据字典汇总
|
|
338
|
-
|
|
339
|
-
| dictCode | 中文名 | 可选值 | 出现页面 |
|
|
340
|
-
|----------|-------|--------|---------|
|
|
341
|
-
|
|
342
|
-
## pages.ts 注册片段
|
|
343
|
-
|
|
344
|
-
```typescript
|
|
345
|
-
const [模块名]Module = gProd("[base-path]", {
|
|
346
|
-
[子模块]: [
|
|
347
|
-
["[kebab-目录名]", "[中文名]"],
|
|
348
|
-
],
|
|
349
|
-
});
|
|
350
|
-
```
|
|
351
|
-
|
|
352
|
-
> ⚠️ 注册后还需在系统管理平台配置菜单路由
|
|
353
|
-
````
|
|
354
|
-
|
|
355
|
-
### 自检清单(输出前必须逐项确认)
|
|
356
|
-
|
|
357
|
-
```
|
|
358
|
-
□ 每个页面的 query 数组 — 数量与原型查询区字段一一对应?
|
|
359
|
-
□ 每个页面的 query 数组 — 顺序与原型一致(从左到右、从上到下)?
|
|
360
|
-
□ 每个页面的 columns 数组 — 数量与原型表头一一对应?
|
|
361
|
-
□ 每个页面的 columns 数组 — 顺序与原型表头从左到右完全一致?
|
|
362
|
-
□ 每个页面的 toolbar 数组 — 数量与原型按钮一一对应?
|
|
363
|
-
□ 每个页面的 toolbar 数组 — 顺序与原型按钮从左到右完全一致?
|
|
364
|
-
□ 每个页面的 toolbar 数组 — 按钮 type 与原型颜色对应(蓝底=primary, 线框=plain, 红色=danger)?
|
|
365
|
-
□ 每个页面的 operations 数组 — 数量与原型操作列按钮一一对应?
|
|
366
|
-
□ 每个页面的 operations 数组 — 顺序与原型一致?
|
|
367
|
-
□ 所有 subTables 都标注了 editable + inlineEdit?
|
|
368
|
-
□ 所有 dict 字段都提取了 dictCode?
|
|
369
|
-
□ features.tabSwitch / tabItems — 原型中的小 Tab 标签是否全部提取?
|
|
370
|
-
□ features.viewSwitch / viewItems — 原型中的视角切换(Radio/RadioButton)是否提取?
|
|
371
|
-
□ viewSwitch 为 true 时,是否为每个视角分别提取了 columns 数组?
|
|
372
|
-
□ features.hiddenMenu 已正确标注?
|
|
373
|
-
□ notes 中补充了无法结构化的特殊逻辑?
|
|
374
|
-
```
|
|
375
|
-
|
|
376
|
-
### 精度细节要求(必读)
|
|
377
|
-
|
|
378
|
-
> **顺序即规范**:原型设计师精心安排了查询区、按钮栏、表格列的顺序,AI 输出必须严格保持一致。
|
|
379
|
-
|
|
380
|
-
1. **查询区字段**:按原型从左到右、从上到下逐个提取,不可调换顺序,不可遗漏
|
|
381
|
-
2. **工具栏按钮**:按原型从左到右逐个提取,标注颜色类型(蓝底填充 = `primary`,线框 = `plain`,红色 = `danger`,灰色/默认 = `default`)
|
|
382
|
-
3. **Tab 标签**:原型中所有 Tab(如"临时客户"/"正式客户"/"公海池")必须提取到 `features.tabItems`,标注 label 和 value
|
|
383
|
-
4. **视图/视角切换**:原型中 Radio/RadioButton 组(如"管理视角"/"使用视角")必须提取到 `features.viewItems`。当 viewSwitch 为 true 时,须为**每个视角分别提取 columns 数组**(因不同视角列定义不同),page-spec 中使用 `viewColumns: { "management": [...], "usage": [...] }` 结构
|
|
384
|
-
5. **表格列**:按原型表头从左到右逐列提取(不含复选框列和序号列,这两列在代码模板中自动添加),不可遗漏任何一列
|
|
385
|
-
5. **操作列按钮**:表格最后一列的操作按钮(查看/编辑/删除/启用等),逐个提取到 `operations`,保持原型中的文字和顺序
|
|
386
|
-
6. **按钮文字**:必须使用原型中的**原始文字**(如原型写"新增申请"不可简化为"新增")
|
|
387
|
-
|
|
388
|
-
---
|
|
389
|
-
|
|
390
|
-
## 输入模式 B:详细设计文档
|
|
391
|
-
|
|
392
|
-
> 详设文档输入比 Axure HTML **精度更高(95-100%)**,因为字段名和类型是明确写出的,不需要从视觉推断。
|
|
393
|
-
> 输出格式与模式 A 完全一致(page-spec JSON),page-codegen 无感知。
|
|
394
|
-
|
|
395
|
-
### 为什么详设比 Axure 更精确
|
|
396
|
-
|
|
397
|
-
| 信息类型 | Axure 提供 | 详设文档提供 |
|
|
398
|
-
|---------|-----------|------------|
|
|
399
|
-
| 字段中文名 | ✅(原型标签) | ✅(明确写出) |
|
|
400
|
-
| 字段英文名 | ❌(需推断) | ✅(直接写出) |
|
|
401
|
-
| 字段类型 | ⚠️(视觉判断) | ✅(明确标注) |
|
|
402
|
-
| 字典 code | ❌(需猜测) | ✅(可直接对应) |
|
|
403
|
-
| 必填规则 | ⚠️(看 * 号) | ✅(明确写出) |
|
|
404
|
-
| 子表可编辑 | ⚠️(看有无按钮) | ✅(明确标注) |
|
|
405
|
-
| 接口字段名 | ❌(无) | ✅(可直接写入) |
|
|
406
|
-
|
|
407
|
-
### 推荐的详设文档格式(最大化精度)
|
|
408
|
-
|
|
409
|
-
提供文档时,**建议按以下格式**(AI 可直接映射到 page-spec JSON,无需猜测):
|
|
410
|
-
|
|
411
|
-
````markdown
|
|
412
|
-
## [页面名称]
|
|
413
|
-
|
|
414
|
-
**基本信息**
|
|
415
|
-
- 交互模式:LIST / MASTER_DETAIL / TREE_LIST / FORM_TAB
|
|
416
|
-
- 目录名:kebab-case(如 customer-archive)
|
|
417
|
-
- 服务缩写:sale(如 pm / mmwr / sale / hrms / base)
|
|
418
|
-
- 是否隐藏菜单:否
|
|
419
|
-
|
|
420
|
-
---
|
|
421
|
-
|
|
422
|
-
### 查询条件
|
|
423
|
-
|
|
424
|
-
| 字段名(camelCase) | 中文名 | 类型 | 字典code | 起止字段名 |
|
|
425
|
-
|------------------|--------|------|---------|-----------|
|
|
426
|
-
| customerName | 客户名称 | input | - | - |
|
|
427
|
-
| enableStatus | 启用状态 | dict | enable_status | - |
|
|
428
|
-
| createDate | 建立日期 | dateRange | - | createDateStart / createDateEnd |
|
|
429
|
-
|
|
430
|
-
---
|
|
431
|
-
|
|
432
|
-
### 工具栏按钮
|
|
433
|
-
|
|
434
|
-
| 按钮名 | 类型 | 行为 |
|
|
435
|
-
|--------|------|------|
|
|
436
|
-
| 新增 | primary | openModal |
|
|
437
|
-
| 导出 | plain | export |
|
|
438
|
-
|
|
439
|
-
---
|
|
440
|
-
|
|
441
|
-
### 表格列(按顺序)
|
|
442
|
-
|
|
443
|
-
| 字段名(camelCase) | 中文名 | 宽度 | 字典code | 说明 |
|
|
444
|
-
|------------------|--------|------|---------|------|
|
|
445
|
-
| customerName | 客户名称 | 180 | - | |
|
|
446
|
-
| customerType | 客户类型 | 120 | customer_type | |
|
|
447
|
-
| enableStatus | 启用状态 | 100 | enable_status | |
|
|
448
|
-
|
|
449
|
-
### 操作列
|
|
450
|
-
|
|
451
|
-
| 按钮 | 行为 |
|
|
452
|
-
|------|------|
|
|
453
|
-
| 编辑 | edit |
|
|
454
|
-
| 删除 | delete |
|
|
455
|
-
|
|
456
|
-
---
|
|
457
|
-
|
|
458
|
-
### 子表(如有)
|
|
459
|
-
|
|
460
|
-
**子表名称**: 业务信息(businessInfo)
|
|
461
|
-
- 可增删行: 是
|
|
462
|
-
- 行内编辑: 否
|
|
463
|
-
|
|
464
|
-
| 字段名 | 中文名 | 类型 |
|
|
465
|
-
|--------|--------|------|
|
|
466
|
-
| salesType | 销售别 | input |
|
|
467
|
-
|
|
468
|
-
---
|
|
469
|
-
|
|
470
|
-
### 特殊说明(notes)
|
|
471
|
-
|
|
472
|
-
- 客户分类下拉选项按产品线动态变化
|
|
473
|
-
- 状态信息区为只读展示
|
|
474
|
-
````
|
|
475
|
-
|
|
476
|
-
> **不强制要求此格式** —— AI 可以解析任何常见格式(普通表格、Word、自由段落)。
|
|
477
|
-
> 但**字段英文名和字典 code 如果没有明确提供**,AI 会基于中文名推断,精度略降。
|
|
478
|
-
|
|
479
|
-
### 模式 B 的执行步骤
|
|
480
|
-
|
|
481
|
-
遵循与模式 A 相同的步骤 2-5(分类 → 提取 → 组件匹配 → 输出 page-spec JSON),差异仅在步骤 1:
|
|
482
|
-
|
|
483
|
-
**步骤 1B:解析文档结构**
|
|
484
|
-
|
|
485
|
-
1. 识别文档中的页面边界(标题层级、分隔线)
|
|
486
|
-
2. 逐页提取:查询条件表 → query[]、表格列表 → columns[]、按钮列表 → toolbar[]、操作列 → operations[]、子表 → subTables[]
|
|
487
|
-
3. **如文档中已有字段英文名** → 直接使用;**如没有** → 基于中文名推断 camelCase,并在 notes 中注明"英文名为推断值,请确认"
|
|
488
|
-
4. **如文档中已有字典 code** → 直接使用;**如没有** → 基于中文名推断,在 notes 注明"dictCode 为推断值,请后端确认"
|
|
489
|
-
5. 继续执行步骤 2-5,输出完整 page-spec JSON
|
|
490
|
-
|
|
491
|
-
### 精度对比
|
|
492
|
-
|
|
493
|
-
| 输入来源 | 字段不遗漏 | 英文名准确 | 字典code准确 | 综合精度 |
|
|
494
|
-
|---------|-----------|-----------|------------|---------|
|
|
495
|
-
| Axure HTML(推荐格式) | ✅ | ⚠️ 推断 | ⚠️ 推断 | 90-95% |
|
|
496
|
-
| 详设文档(推荐格式) | ✅ | ✅ 直接读 | ✅ 直接读 | **95-100%** |
|
|
497
|
-
| 详设文档(自由格式) | ✅ | ⚠️ 推断 | ⚠️ 推断 | 85-95% |
|
|
498
|
-
| 截图/非结构化 | ⚠️ 可能漏 | ❌ 推断 | ❌ 推断 | 70-80% |
|
|
1
|
+
---
|
|
2
|
+
name: prototype-scan
|
|
3
|
+
description: "Use when: analyzing Axure exported HTML prototype files to extract page inventory, classify interaction patterns, identify reusable components, and produce a structured page checklist for Vue development. Also supports detailed design documents (MD/Word) or natural language descriptions as input. Triggers on: prototype analysis, axure scan, page inventory, 原型解析, 页面清单, axure转vue, 详设文档, design doc, 详细设计, 口述需求, 自然语言建页面, natural language page request, 建个页面, 写个页面, 口头描述页面."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill: 原型解析(prototype-scan)
|
|
7
|
+
|
|
8
|
+
将 **Axure 导出的 HTML 原型包** 或 **详细设计文档(MD/Word/表格)** 解析为结构化的 **page-spec JSON 页面清单**,作为后续接口约定和代码生成的输入。
|
|
9
|
+
|
|
10
|
+
> **两种输入,同一输出**:输出格式完全相同(page-spec JSON),消费方(page-codegen)无需感知来源。
|
|
11
|
+
|
|
12
|
+
## 触发
|
|
13
|
+
|
|
14
|
+
| 模式 | 输入 | 典型场景 |
|
|
15
|
+
|------|------|----------|
|
|
16
|
+
| **模式 0(自然语言)** | 用户口述需求,无文件 | 日常对话:"帮我建一个客户管理页面,有XX字段" |
|
|
17
|
+
| **模式 A(Axure)** | Axure HTML 文件包目录 | 已有原型设计,AI 全量扫描 HTML |
|
|
18
|
+
| **模式 B(详设文档)** | MD/Word/表格格式的详细设计文档 | 已有详细设计文档,AI 解析结构化字段 |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 模式 0 — 自然语言转 page-spec(内部步骤)
|
|
23
|
+
|
|
24
|
+
> **核心原则**:模式 0 是 AI 的**内部推导流程**,不输出中间 JSON 给用户。
|
|
25
|
+
> AI 从口述中提取信息 → 内部构建 page-spec JSON → 直接传递给 page-codegen 消费。
|
|
26
|
+
> **不向用户索要文件**,用注释标注不确定项即可。
|
|
27
|
+
|
|
28
|
+
### 1. 提取关键信息
|
|
29
|
+
|
|
30
|
+
从用户口述中识别以下实体(缺省则用默认值):
|
|
31
|
+
|
|
32
|
+
| 实体 | 识别关键词示例 | 默认值 |
|
|
33
|
+
|------|---------------|--------|
|
|
34
|
+
| 页面中文名 | "XX页面" / "XX管理" / "XX档案" | 必须由用户提供 |
|
|
35
|
+
| 交互模式 | 见下方映射表 | `LIST` |
|
|
36
|
+
| 服务缩写 | "生产"→pm, "精整"→mmwr, "销售"→sale, "人力"→hrms, "基础"→base | 从目标路径推断 |
|
|
37
|
+
| 资源名 | 从中文名推断 CamelCase | 自动推断 |
|
|
38
|
+
| 目录名 | 从中文名推断 kebab-case | 自动推断 |
|
|
39
|
+
|
|
40
|
+
### 2. 关键词 → 交互模式映射
|
|
41
|
+
|
|
42
|
+
| 用户关键词 | 推断模式 |
|
|
43
|
+
|-----------|----------|
|
|
44
|
+
| "列表" / "查询" / "管理页" / 无特殊说明 | `LIST` |
|
|
45
|
+
| "主从" / "明细" / "上下表" | `MASTER_DETAIL` |
|
|
46
|
+
| "树形" / "左树右表" | `TREE_LIST` |
|
|
47
|
+
| "表单" / "详情" / "多Tab表单" | `DETAIL_TABS` |
|
|
48
|
+
| "独立表单" / "路由表单" / "复杂表单" | `FORM_ROUTE` |
|
|
49
|
+
| "变更历史" / "变更记录" | `CHANGE_HISTORY` |
|
|
50
|
+
| "记录表单" / "无分页" | `RECORD_FORM` |
|
|
51
|
+
| "工位" / "操作站" | `OPERATION_STATION` |
|
|
52
|
+
|
|
53
|
+
### 3. 内部构建 page-spec 骨架
|
|
54
|
+
|
|
55
|
+
AI 根据提取的信息,内部构建 page-spec JSON(**不输出给用户**):
|
|
56
|
+
|
|
57
|
+
```jsonc
|
|
58
|
+
{
|
|
59
|
+
"pageName": "[用户说的中文名]",
|
|
60
|
+
"kebabName": "[推断的kebab-case]",
|
|
61
|
+
"pattern": "[推断的交互模式,默认LIST]",
|
|
62
|
+
"path": "views/[域]/[模块]/[子模块]/[kebab-name]/",
|
|
63
|
+
"query": [
|
|
64
|
+
// 从用户描述中提取;未提及 → 基于资源名推断 1-2 个(如"名称"、"编码")
|
|
65
|
+
],
|
|
66
|
+
"toolbar": [
|
|
67
|
+
// 默认: 新增(primary) + 删除(danger);用户提及"导出""导入"等则追加
|
|
68
|
+
],
|
|
69
|
+
"columns": [
|
|
70
|
+
// 从用户描述中提取;未逐一列举 → 基于资源语义推断 5-8 个常见字段
|
|
71
|
+
],
|
|
72
|
+
"operations": [
|
|
73
|
+
// 默认: 编辑 + 删除;用户提及"查看""审批"等则调整
|
|
74
|
+
],
|
|
75
|
+
"features": {
|
|
76
|
+
"tabSwitch": false, "viewSwitch": false, "hiddenMenu": false
|
|
77
|
+
},
|
|
78
|
+
"notes": [
|
|
79
|
+
"[模式0] 字段英文名为AI推断值,请确认",
|
|
80
|
+
"[模式0] dictCode 为推断值,请后端确认"
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 4. 降级与默认值原则
|
|
86
|
+
|
|
87
|
+
| 信息缺失项 | 默认策略 |
|
|
88
|
+
|-----------|----------|
|
|
89
|
+
| 交互模式 | `LIST`(最常见的列表查询页) |
|
|
90
|
+
| 查询字段 | 基于业务资源名推断 1-2 个("名称"、"编码") |
|
|
91
|
+
| 工具栏按钮 | `[新增(primary), 删除(danger)]` |
|
|
92
|
+
| 表格列 | 基于资源语义推断 5-8 个常见字段(编码、名称、类型、状态、创建时间等) |
|
|
93
|
+
| 操作列 | `[编辑, 删除]` |
|
|
94
|
+
| 字段英文名 | AI 推断 camelCase,notes 标注"字段名为推断值" |
|
|
95
|
+
| 字典 code | 状态类字段自动标注推断 dictCode,notes 标注"dictCode 为推断值" |
|
|
96
|
+
| 子表 | 不生成(用户未提及则不推断) |
|
|
97
|
+
| Tab/视角切换 | 关闭(`false`) |
|
|
98
|
+
|
|
99
|
+
> 构建完成后,直接进入输出流程(同模式 A/B),为 page-codegen 提供标准 page-spec JSON。
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 输入模式 A:Axure HTML 扫描
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 步骤
|
|
108
|
+
|
|
109
|
+
## 步骤
|
|
110
|
+
|
|
111
|
+
### 1. 全量扫描 HTML
|
|
112
|
+
|
|
113
|
+
遍历所有 `.html` 文件,提取:
|
|
114
|
+
|
|
115
|
+
| 区域 | 提取内容 |
|
|
116
|
+
| ---- | ------------------------------------------------------ |
|
|
117
|
+
| 标题 | `<title>` / 标题文本 → 页面名称 |
|
|
118
|
+
| 表格 | `<table>` / 网格布局 → 表格列定义 |
|
|
119
|
+
| 表单 | `<input>` / `<select>` / 标签文本 → 查询条件和表单字段 |
|
|
120
|
+
| 按钮 | `<button>` / 链接文本 → 操作按钮列表 |
|
|
121
|
+
| 弹窗 | 遮罩层 / 弹出层 → 弹窗组件 |
|
|
122
|
+
| 树形 | 侧边栏 / 树形导航 → 树形结构 |
|
|
123
|
+
| 注释 | Axure 注解 → 业务说明 |
|
|
124
|
+
|
|
125
|
+
### 2. 交互模式分类
|
|
126
|
+
|
|
127
|
+
| 模式 | 特征 | 前端组件 |
|
|
128
|
+
| --------------- | --------------------- | ------------------------------------------------ |
|
|
129
|
+
| `LIST` | 查询区 + 表格 + 分页 | BaseQuery + BaseTable + jh-pagination |
|
|
130
|
+
| `MASTER_DETAIL` | 上方主表 + 下方明细表 | jh-drag-row(需 `.drager_row { height: 100% }`) |
|
|
131
|
+
| `TREE_LIST` | 左侧树 + 右侧表格 | C_Splitter + C_Tree |
|
|
132
|
+
| `FORM_MODAL` | 弹窗中的表单 | el-dialog + el-form |
|
|
133
|
+
| `COMPOSITE` | 多种组合 | 组合使用 |
|
|
134
|
+
|
|
135
|
+
### 3. 字段提取
|
|
136
|
+
|
|
137
|
+
对每个页面提取 3 类字段(字段名用 camelCase,与 data.ts 直接对应):
|
|
138
|
+
|
|
139
|
+
**查询字段:**
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
中文名 | 建议英文名(camelCase) | 组件类型 | dictCode(如有)
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
组件类型对照(查询项 `queryDef()` 中使用):
|
|
146
|
+
|
|
147
|
+
| 原型表现 | 组件配置 |
|
|
148
|
+
| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
149
|
+
| 普通输入框 | 默认 input(无需 component 属性) |
|
|
150
|
+
| 下拉选择 | `logicType: BusLogicDataType.dict, logicValue: "dictCode"` |
|
|
151
|
+
| 单日期 | `component: () => ({ tag: "jh-date", type: "date" })` |
|
|
152
|
+
| 月份选择 | `component: () => ({ tag: "jh-date", type: "month", showFormat: "YYYY-MM", format: "YYYYMM" })` |
|
|
153
|
+
| 日期范围 | `component: () => ({ tag: "jh-date", type: "daterange", rangeSeparator: "至", showFormat: "YYYY-MM-DD", valueFormat: "YYYY-MM-DD" })`,需额外配 `startName`/`endName` |
|
|
154
|
+
| 用户选择 | `component: () => ({ tag: "jh-user-picker" })` |
|
|
155
|
+
| 部门选择 | `component: () => ({ tag: "jh-dept-picker" })` |
|
|
156
|
+
|
|
157
|
+
**表格列:**
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
列名(中文) | 字段名(camelCase) | 宽度建议 | 是否字典列(logicType/logicValue)
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
字典列配置参考:`{ label: "状态", name: "status", minWidth: 120, logicType: BusLogicDataType.dict, logicValue: "dictCode", sortable: true, filterable: true }`
|
|
164
|
+
|
|
165
|
+
**表单字段(弹窗):**
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
中文名 | 英文名(camelCase) | 类型 | 是否必填 | 组件类型 | dictCode
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### 4. 组件匹配
|
|
172
|
+
|
|
173
|
+
对照平台已有组件(详细 API 见 `docs/jh-*.md`):
|
|
174
|
+
|
|
175
|
+
| 功能区 | 组件 | 说明 |
|
|
176
|
+
| -------- | ----------------------- | ------------------------------------ |
|
|
177
|
+
| 查询区 | BaseQuery | 通过 `queryDef()` 声明式配置 |
|
|
178
|
+
| 工具栏 | BaseToolbar | 通过 `toolbarDef()` 声明式配置 |
|
|
179
|
+
| 表格 | BaseTable | 通过 `columnsDef()` 声明式配置 |
|
|
180
|
+
| 分页 | jh-pagination | 固定用法,见 copilot-instructions.md |
|
|
181
|
+
| 上下分栏 | jh-drag-row | 主从表必备,需设 `:top-height` |
|
|
182
|
+
| 左右分割 | C_Splitter | 树形+列表必备,设 `:left-width` |
|
|
183
|
+
| 树形面板 | C_Tree | 含搜索+Tab 切换 |
|
|
184
|
+
| 下拉选择 | jh-select | dict 属性自动加载字典数据 |
|
|
185
|
+
| 日期选择 | jh-date / jh-date-range | 参见 `docs/jh-date.md` |
|
|
186
|
+
| 用户选择 | jh-user-picker | 参见 `docs/jh-user-picker.md` |
|
|
187
|
+
| 部门选择 | jh-dept-picker | 参见 `docs/jh-dept-picker.md` |
|
|
188
|
+
| 文件上传 | jh-file-upload | 参见 `docs/jh-file-upload.md` |
|
|
189
|
+
|
|
190
|
+
**新建组件判断:**
|
|
191
|
+
|
|
192
|
+
- 3+ 页面相同逻辑 → `src/components/global/C_PascalCase/`
|
|
193
|
+
- 同模块 2 页面共用 → `src/components/local/c_camelCase/`
|
|
194
|
+
- 业务强耦合 → 页面 `components/` 目录下
|
|
195
|
+
|
|
196
|
+
### 5. pages.ts 注册名推断
|
|
197
|
+
|
|
198
|
+
根据 `vite/plugins/shared/pages.ts` 的 `gProd` / `gSale` 函数格式:
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
// ["kebab-case-目录名", "中文label"]
|
|
202
|
+
// 路径: views/[域]/[模块]/[子模块]/[目录]/index.vue
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## 输出格式:page-spec JSON
|
|
208
|
+
|
|
209
|
+
> **核心原则:结构化 JSON 确保字段不遗漏(可机器 diff),notes 保留复杂语境。**
|
|
210
|
+
> 每个页面输出一个 page-spec JSON 对象,所有页面汇总为数组。
|
|
211
|
+
> **禁止在 JSON 中用"等"、"..."省略任何字段**,必须逐个列出。
|
|
212
|
+
|
|
213
|
+
### page-spec 结构定义
|
|
214
|
+
|
|
215
|
+
```jsonc
|
|
216
|
+
{
|
|
217
|
+
// ===== 页面基本信息 =====
|
|
218
|
+
"pageName": "客户档案", // 中文名
|
|
219
|
+
"kebabName": "customer-archive", // kebab-case 目录名
|
|
220
|
+
"pattern": "LIST", // LIST | MASTER_DETAIL | TREE_LIST | FORM_TAB | COMPOSITE
|
|
221
|
+
"path": "views/sale/demo/khda/customer-archive/",
|
|
222
|
+
"pagesTs": ["customer-archive", "客户档案"], // pages.ts 注册项
|
|
223
|
+
"platformComponents": ["BaseQuery", "BaseTable", "jh-pagination"],
|
|
224
|
+
"newComponents": [], // 需要新建的组件名(空数组=不需要新建)
|
|
225
|
+
|
|
226
|
+
// ===== 查询区字段(逐个列出,禁止省略) =====
|
|
227
|
+
"query": [
|
|
228
|
+
{ "field": "customerName", "label": "客户名称", "type": "input" },
|
|
229
|
+
{ "field": "customerType", "label": "客户类型", "type": "dict", "dictCode": "customer_type" },
|
|
230
|
+
{
|
|
231
|
+
"field": "createDate", "label": "建立日期", "type": "dateRange",
|
|
232
|
+
"startName": "createDateStart", "endName": "createDateEnd"
|
|
233
|
+
}
|
|
234
|
+
],
|
|
235
|
+
|
|
236
|
+
// ===== 工具栏按钮(逐个列出,与原型顺序严格一致) =====
|
|
237
|
+
"toolbar": [
|
|
238
|
+
{ "label": "新增", "type": "primary", "action": "openModal" },
|
|
239
|
+
{ "label": "删除", "type": "danger", "action": "batchDelete" },
|
|
240
|
+
{ "label": "导出", "type": "plain", "action": "export" }
|
|
241
|
+
],
|
|
242
|
+
// toolbar.type 映射:蓝底填充="primary",线框/白底="plain",红色="danger",灰色="default"
|
|
243
|
+
|
|
244
|
+
// ===== 表格列(逐列列出,禁止省略) =====
|
|
245
|
+
"columns": [
|
|
246
|
+
{ "field": "customerName", "label": "客户名称", "width": 180 },
|
|
247
|
+
{ "field": "customerType", "label": "客户类型", "width": 120, "dict": "customer_type" }
|
|
248
|
+
],
|
|
249
|
+
|
|
250
|
+
// ===== 操作列按钮 =====
|
|
251
|
+
"operations": [
|
|
252
|
+
{ "label": "编辑", "action": "edit" },
|
|
253
|
+
{ "label": "删除", "action": "delete" }
|
|
254
|
+
],
|
|
255
|
+
|
|
256
|
+
// ===== 内嵌子表(关键!必须标注交互属性) =====
|
|
257
|
+
"subTables": [
|
|
258
|
+
{
|
|
259
|
+
"name": "businessInfo",
|
|
260
|
+
"label": "业务信息",
|
|
261
|
+
"editable": true, // 是否可增删行
|
|
262
|
+
"inlineEdit": false, // 是否行内编辑(双击单元格编辑)
|
|
263
|
+
"columns": [
|
|
264
|
+
{ "field": "salesType", "label": "销售别", "width": 80 }
|
|
265
|
+
],
|
|
266
|
+
"operations": [ // 子表的操作按钮
|
|
267
|
+
{ "label": "删除", "action": "removeRow" }
|
|
268
|
+
]
|
|
269
|
+
}
|
|
270
|
+
],
|
|
271
|
+
|
|
272
|
+
// ===== 表单字段(FORM_TAB / 弹窗 页面使用) =====
|
|
273
|
+
"formSections": [
|
|
274
|
+
{
|
|
275
|
+
"name": "basicInfo",
|
|
276
|
+
"label": "基本信息",
|
|
277
|
+
"fields": [
|
|
278
|
+
{ "field": "customerName", "label": "客户名称", "type": "input", "required": true },
|
|
279
|
+
{ "field": "customerType", "label": "客户类型", "type": "dict", "dictCode": "customer_type", "required": true }
|
|
280
|
+
]
|
|
281
|
+
}
|
|
282
|
+
],
|
|
283
|
+
|
|
284
|
+
// ===== 页面级特殊交互开关 =====
|
|
285
|
+
"features": {
|
|
286
|
+
"tabSwitch": false, // 是否有 Tab 切换(如临时/正式客户)
|
|
287
|
+
"tabItems": [], // Tab 项:[{ "label": "临时客户", "value": "temp" }]
|
|
288
|
+
"viewSwitch": false, // 是否有视图/视角切换(如管理视角/使用视角 Radio)
|
|
289
|
+
"viewItems": [], // 视图项:[{ "label": "管理视角", "value": "management" }]
|
|
290
|
+
"hiddenMenu": false // 是否隐藏菜单(从列表跳转进入的子页面)
|
|
291
|
+
},
|
|
292
|
+
|
|
293
|
+
// ===== 非结构化补充说明 =====
|
|
294
|
+
"notes": [
|
|
295
|
+
"客户分类/客户级别的下拉选项按产品线动态变化",
|
|
296
|
+
"状态信息区(创建时间、核实状态等)为只读展示"
|
|
297
|
+
]
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### 子表交互判断规则
|
|
302
|
+
|
|
303
|
+
| 原型特征 | editable | inlineEdit |
|
|
304
|
+
|---------|----------|------------|
|
|
305
|
+
| 表格上方有"新增"按钮,行内有"删除"链接 | `true` | `false` |
|
|
306
|
+
| 表格单元格可直接编辑(输入框/下拉) | `true` | `true` |
|
|
307
|
+
| 纯展示表格,无任何编辑入口 | `false` | `false` |
|
|
308
|
+
| 表格仅有外部"导入"按钮填充数据 | `false` | `false` |
|
|
309
|
+
|
|
310
|
+
### 完整输出模板
|
|
311
|
+
|
|
312
|
+
````markdown
|
|
313
|
+
# 页面清单 - [模块名称]
|
|
314
|
+
|
|
315
|
+
> 原型来源:[文件名/版本]
|
|
316
|
+
> 业务说明:[一句话描述]
|
|
317
|
+
|
|
318
|
+
## 页面总表
|
|
319
|
+
|
|
320
|
+
| # | 页面名称 | 交互模式 | kebab 目录名 | 是否隐藏菜单 |
|
|
321
|
+
|---|---------|---------|-------------|-------------|
|
|
322
|
+
|
|
323
|
+
## page-spec
|
|
324
|
+
|
|
325
|
+
```json
|
|
326
|
+
[
|
|
327
|
+
{ /* 页面1 完整 page-spec */ },
|
|
328
|
+
{ /* 页面2 完整 page-spec */ }
|
|
329
|
+
]
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
## 共享组件识别
|
|
333
|
+
|
|
334
|
+
| 组件 | 位置 | 复用页面 | 说明 |
|
|
335
|
+
|-----|------|---------|------|
|
|
336
|
+
|
|
337
|
+
## 数据字典汇总
|
|
338
|
+
|
|
339
|
+
| dictCode | 中文名 | 可选值 | 出现页面 |
|
|
340
|
+
|----------|-------|--------|---------|
|
|
341
|
+
|
|
342
|
+
## pages.ts 注册片段
|
|
343
|
+
|
|
344
|
+
```typescript
|
|
345
|
+
const [模块名]Module = gProd("[base-path]", {
|
|
346
|
+
[子模块]: [
|
|
347
|
+
["[kebab-目录名]", "[中文名]"],
|
|
348
|
+
],
|
|
349
|
+
});
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
> ⚠️ 注册后还需在系统管理平台配置菜单路由
|
|
353
|
+
````
|
|
354
|
+
|
|
355
|
+
### 自检清单(输出前必须逐项确认)
|
|
356
|
+
|
|
357
|
+
```
|
|
358
|
+
□ 每个页面的 query 数组 — 数量与原型查询区字段一一对应?
|
|
359
|
+
□ 每个页面的 query 数组 — 顺序与原型一致(从左到右、从上到下)?
|
|
360
|
+
□ 每个页面的 columns 数组 — 数量与原型表头一一对应?
|
|
361
|
+
□ 每个页面的 columns 数组 — 顺序与原型表头从左到右完全一致?
|
|
362
|
+
□ 每个页面的 toolbar 数组 — 数量与原型按钮一一对应?
|
|
363
|
+
□ 每个页面的 toolbar 数组 — 顺序与原型按钮从左到右完全一致?
|
|
364
|
+
□ 每个页面的 toolbar 数组 — 按钮 type 与原型颜色对应(蓝底=primary, 线框=plain, 红色=danger)?
|
|
365
|
+
□ 每个页面的 operations 数组 — 数量与原型操作列按钮一一对应?
|
|
366
|
+
□ 每个页面的 operations 数组 — 顺序与原型一致?
|
|
367
|
+
□ 所有 subTables 都标注了 editable + inlineEdit?
|
|
368
|
+
□ 所有 dict 字段都提取了 dictCode?
|
|
369
|
+
□ features.tabSwitch / tabItems — 原型中的小 Tab 标签是否全部提取?
|
|
370
|
+
□ features.viewSwitch / viewItems — 原型中的视角切换(Radio/RadioButton)是否提取?
|
|
371
|
+
□ viewSwitch 为 true 时,是否为每个视角分别提取了 columns 数组?
|
|
372
|
+
□ features.hiddenMenu 已正确标注?
|
|
373
|
+
□ notes 中补充了无法结构化的特殊逻辑?
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
### 精度细节要求(必读)
|
|
377
|
+
|
|
378
|
+
> **顺序即规范**:原型设计师精心安排了查询区、按钮栏、表格列的顺序,AI 输出必须严格保持一致。
|
|
379
|
+
|
|
380
|
+
1. **查询区字段**:按原型从左到右、从上到下逐个提取,不可调换顺序,不可遗漏
|
|
381
|
+
2. **工具栏按钮**:按原型从左到右逐个提取,标注颜色类型(蓝底填充 = `primary`,线框 = `plain`,红色 = `danger`,灰色/默认 = `default`)
|
|
382
|
+
3. **Tab 标签**:原型中所有 Tab(如"临时客户"/"正式客户"/"公海池")必须提取到 `features.tabItems`,标注 label 和 value
|
|
383
|
+
4. **视图/视角切换**:原型中 Radio/RadioButton 组(如"管理视角"/"使用视角")必须提取到 `features.viewItems`。当 viewSwitch 为 true 时,须为**每个视角分别提取 columns 数组**(因不同视角列定义不同),page-spec 中使用 `viewColumns: { "management": [...], "usage": [...] }` 结构
|
|
384
|
+
5. **表格列**:按原型表头从左到右逐列提取(不含复选框列和序号列,这两列在代码模板中自动添加),不可遗漏任何一列
|
|
385
|
+
5. **操作列按钮**:表格最后一列的操作按钮(查看/编辑/删除/启用等),逐个提取到 `operations`,保持原型中的文字和顺序
|
|
386
|
+
6. **按钮文字**:必须使用原型中的**原始文字**(如原型写"新增申请"不可简化为"新增")
|
|
387
|
+
|
|
388
|
+
---
|
|
389
|
+
|
|
390
|
+
## 输入模式 B:详细设计文档
|
|
391
|
+
|
|
392
|
+
> 详设文档输入比 Axure HTML **精度更高(95-100%)**,因为字段名和类型是明确写出的,不需要从视觉推断。
|
|
393
|
+
> 输出格式与模式 A 完全一致(page-spec JSON),page-codegen 无感知。
|
|
394
|
+
|
|
395
|
+
### 为什么详设比 Axure 更精确
|
|
396
|
+
|
|
397
|
+
| 信息类型 | Axure 提供 | 详设文档提供 |
|
|
398
|
+
|---------|-----------|------------|
|
|
399
|
+
| 字段中文名 | ✅(原型标签) | ✅(明确写出) |
|
|
400
|
+
| 字段英文名 | ❌(需推断) | ✅(直接写出) |
|
|
401
|
+
| 字段类型 | ⚠️(视觉判断) | ✅(明确标注) |
|
|
402
|
+
| 字典 code | ❌(需猜测) | ✅(可直接对应) |
|
|
403
|
+
| 必填规则 | ⚠️(看 * 号) | ✅(明确写出) |
|
|
404
|
+
| 子表可编辑 | ⚠️(看有无按钮) | ✅(明确标注) |
|
|
405
|
+
| 接口字段名 | ❌(无) | ✅(可直接写入) |
|
|
406
|
+
|
|
407
|
+
### 推荐的详设文档格式(最大化精度)
|
|
408
|
+
|
|
409
|
+
提供文档时,**建议按以下格式**(AI 可直接映射到 page-spec JSON,无需猜测):
|
|
410
|
+
|
|
411
|
+
````markdown
|
|
412
|
+
## [页面名称]
|
|
413
|
+
|
|
414
|
+
**基本信息**
|
|
415
|
+
- 交互模式:LIST / MASTER_DETAIL / TREE_LIST / FORM_TAB
|
|
416
|
+
- 目录名:kebab-case(如 customer-archive)
|
|
417
|
+
- 服务缩写:sale(如 pm / mmwr / sale / hrms / base)
|
|
418
|
+
- 是否隐藏菜单:否
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
### 查询条件
|
|
423
|
+
|
|
424
|
+
| 字段名(camelCase) | 中文名 | 类型 | 字典code | 起止字段名 |
|
|
425
|
+
|------------------|--------|------|---------|-----------|
|
|
426
|
+
| customerName | 客户名称 | input | - | - |
|
|
427
|
+
| enableStatus | 启用状态 | dict | enable_status | - |
|
|
428
|
+
| createDate | 建立日期 | dateRange | - | createDateStart / createDateEnd |
|
|
429
|
+
|
|
430
|
+
---
|
|
431
|
+
|
|
432
|
+
### 工具栏按钮
|
|
433
|
+
|
|
434
|
+
| 按钮名 | 类型 | 行为 |
|
|
435
|
+
|--------|------|------|
|
|
436
|
+
| 新增 | primary | openModal |
|
|
437
|
+
| 导出 | plain | export |
|
|
438
|
+
|
|
439
|
+
---
|
|
440
|
+
|
|
441
|
+
### 表格列(按顺序)
|
|
442
|
+
|
|
443
|
+
| 字段名(camelCase) | 中文名 | 宽度 | 字典code | 说明 |
|
|
444
|
+
|------------------|--------|------|---------|------|
|
|
445
|
+
| customerName | 客户名称 | 180 | - | |
|
|
446
|
+
| customerType | 客户类型 | 120 | customer_type | |
|
|
447
|
+
| enableStatus | 启用状态 | 100 | enable_status | |
|
|
448
|
+
|
|
449
|
+
### 操作列
|
|
450
|
+
|
|
451
|
+
| 按钮 | 行为 |
|
|
452
|
+
|------|------|
|
|
453
|
+
| 编辑 | edit |
|
|
454
|
+
| 删除 | delete |
|
|
455
|
+
|
|
456
|
+
---
|
|
457
|
+
|
|
458
|
+
### 子表(如有)
|
|
459
|
+
|
|
460
|
+
**子表名称**: 业务信息(businessInfo)
|
|
461
|
+
- 可增删行: 是
|
|
462
|
+
- 行内编辑: 否
|
|
463
|
+
|
|
464
|
+
| 字段名 | 中文名 | 类型 |
|
|
465
|
+
|--------|--------|------|
|
|
466
|
+
| salesType | 销售别 | input |
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
### 特殊说明(notes)
|
|
471
|
+
|
|
472
|
+
- 客户分类下拉选项按产品线动态变化
|
|
473
|
+
- 状态信息区为只读展示
|
|
474
|
+
````
|
|
475
|
+
|
|
476
|
+
> **不强制要求此格式** —— AI 可以解析任何常见格式(普通表格、Word、自由段落)。
|
|
477
|
+
> 但**字段英文名和字典 code 如果没有明确提供**,AI 会基于中文名推断,精度略降。
|
|
478
|
+
|
|
479
|
+
### 模式 B 的执行步骤
|
|
480
|
+
|
|
481
|
+
遵循与模式 A 相同的步骤 2-5(分类 → 提取 → 组件匹配 → 输出 page-spec JSON),差异仅在步骤 1:
|
|
482
|
+
|
|
483
|
+
**步骤 1B:解析文档结构**
|
|
484
|
+
|
|
485
|
+
1. 识别文档中的页面边界(标题层级、分隔线)
|
|
486
|
+
2. 逐页提取:查询条件表 → query[]、表格列表 → columns[]、按钮列表 → toolbar[]、操作列 → operations[]、子表 → subTables[]
|
|
487
|
+
3. **如文档中已有字段英文名** → 直接使用;**如没有** → 基于中文名推断 camelCase,并在 notes 中注明"英文名为推断值,请确认"
|
|
488
|
+
4. **如文档中已有字典 code** → 直接使用;**如没有** → 基于中文名推断,在 notes 注明"dictCode 为推断值,请后端确认"
|
|
489
|
+
5. 继续执行步骤 2-5,输出完整 page-spec JSON
|
|
490
|
+
|
|
491
|
+
### 精度对比
|
|
492
|
+
|
|
493
|
+
| 输入来源 | 字段不遗漏 | 英文名准确 | 字典code准确 | 综合精度 |
|
|
494
|
+
|---------|-----------|-----------|------------|---------|
|
|
495
|
+
| Axure HTML(推荐格式) | ✅ | ⚠️ 推断 | ⚠️ 推断 | 90-95% |
|
|
496
|
+
| 详设文档(推荐格式) | ✅ | ✅ 直接读 | ✅ 直接读 | **95-100%** |
|
|
497
|
+
| 详设文档(自由格式) | ✅ | ⚠️ 推断 | ⚠️ 推断 | 85-95% |
|
|
498
|
+
| 截图/非结构化 | ⚠️ 可能漏 | ❌ 推断 | ❌ 推断 | 70-80% |
|