Skip to main content 首页 创作者 chenychenyu wl-skills-kit page-codegen
page-codegen Use when: generating complete Vue 3 page code (index.vue + data.ts + modal components + api.md + pages.ts registration) from a prototype page inventory and API contract, strictly following the cx-ui-produce project conventions. Read SKILL.md first (rules+constraints), then read the matching TPL-*.md for the template code. Triggers on: generate page, create page, code generation, 生成页面, 页面代码, 代码生成, vue页面, 帮我生成, natural language page generation. NOTE: 口述需求/建个页面/写个页面/按原型生成 belong to prototype-scan first (page-codegen chains from it via 模式 0).
跳到安装 Skills Marketplace 发现并探索由社区构建的 Agent Skills
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/ChenyCHENYU/wl-skills-kit --skill page-codegen命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
下载 Zip 下载中... 同仓库更多 Skills Use when: extracting domain-specific page scenarios from existing project pages into wl-scenario JSON templates (with Page Blueprint low-token retrieval as the discovery front-end). Triggers on: 提取模板, 抽取模板, 沉淀模板, 模板贡献, 提取场景, extract template, extract scenario.
Use when: auditing project source code against the 14 modular standards in .wl-skills/standards/. Outputs deviation report and component-extraction suggestions to reports/. Triggers on: 规范审计, 规范检查, 代码审计, 对齐规范, 规范偏差, 接手新项目, 存量代码分析, 项目体检, audit code, check conventions, onboard project.
Use when: auditing list pages for dict-rendered columns still shown as plain text and upgrading them to semantic auto-color tags (renderAutoTag/dictAutoTag). Triggers on: 状态列审计, 字典列Tag, 状态tag补齐, 列表彩色化, dict column audit, status tag scan, 存量改造.
name page-codegen description Use when: generating complete Vue 3 page code (index.vue + data.ts + modal components + api.md + pages.ts registration) from a prototype page inventory and API contract, strictly following the cx-ui-produce project conventions. Read SKILL.md first (rules+constraints), then read the matching TPL-*.md for the template code. Triggers on: generate page, create page, code generation, 生成页面, 页面代码, 代码生成, vue页面, 帮我生成, natural language page generation. NOTE: 口述需求/建个页面/写个页面/按原型生成 belong to prototype-scan first (page-codegen chains from it via 模式 0).
Skill: 页面代码生成(page-codegen)
基于《页面清单》+ 原型信息,生成符合项目规范的完整 Vue 3 页面代码。
Pre-flight 规范声明(执行前必须输出)
🚀 已触发技能 page-codegen/SKILL.md → 页面代码生成:骨架文件 + 模板调度 + 前置检查
✅ 已读取 templates/_index.md → 模板注册表,匹配 → {TPL路径}
✅ 已读取 templates/{universal|domains/xxx}/TPL-XXX.md → {当前模板说明}
✅ 已读取 standards/index.md → 规范门控(任务类型 A:生成新页面)
✅ 已读取 standards/02-code-structure.md → 三文件分离+接口契约 + 三段式 + script 9段顺序
✅ 已读取 standards/12-base-table.md → AGGrid必用 + cid命名规范
✅ 已读取 standards/13-platform-components.md → 平台组件对照表 + docs前置读取清单
✅ 已读取 standards/14-layout-containers.md → 布局容器(必须用 jh-drag-row/jh-drag-col)
✅ 已读取 standards/11-form-validation.md → 表单校验库 + 契约边界(页面含表单时)
✅ 已读取 .wl-skills/docs/{涉及的jh-*文档} → 当前页涉及组件的使用规范
✅ 已读取 references/component-materialization.md(使用标准业务组件时)→ 按需落盘与契约防护
✅ 已读取 references/form-validation-library.md(页面含表单时)→ Element/RuleSpec API 选择
✅ 工具链检测:.prettierrc.js ✓ eslint.config.ts ✓ .husky/ ✓ [全部就绪]
✅ 表单校验库:@robot-admin/form-validate {版本/不适用}
✅ cid 已生成:{value}({首字母缩写说明})
工具链失败时(红叉 + 暂停) :
❌ 工具链检测失败:未找到 .prettierrc.js / eslint.config.ts / .husky/
→ 请执行:npx @robot-admin/git-standards init
→ 或联系 CHENY(工号 409322)解决
→ ⛔ 代码生成已暂停,修复后重新触发
生成完成摘要(生成结束后输出) :
📦 本次生成完成
────────────────────────────────────────────────
✅ src/views/.../{页面}/index.vue
✅ src/views/.../{页面}/data.ts
✅ src/views/.../{页面}/index.scss
✅ src/views/.../{页面}/api.md
✅ src/views/.../{页面}/page-spec.json → 约定真值(供 S1~S6 比对)
✅ src/views/{域}/{模块}/dicts.ts → 模块字典发布真值(页面有字典时)
✅ src/components/{local|global}/{组件}/ → 本页需要且原项目缺失时按需落盘
✅ reports/SYS_MENU_INFO.md → 已追加菜单条目
────────────────────────────────────────────────
🔍 强制自检(不可跳过):
wl-skills validate src/views/{生成的页面目录}
→ 同时执行 K1~K19(AST 语义)+ S1~S6(page-spec/机器契约比对)+ C1~C4(组件契约)
→ 结果:{0 error / N warn} 或列出 error 待修复
────────────────────────────────────────────────
📌 后续步骤:
1. 在 router/pages.ts 注册路由
2. 若本页 hiddenMenu=true → 在 src/util/navigate-hidden.ts 的 HIDDEN_ROUTE_MAP 追加一行
3. 提交:git cz(禁止直接 git commit,pre-commit 会自动检测规范)
────────────────────────────────────────────────
生成后强制自检(不可跳过,不可标记为"可选")
v2.10.0+ 硬约束 :生成页面代码后,AI 必须 立即执行规范自检,不可跳过。
调用 MCP 工具 wls_validate_page,path 参数为本次生成的页面目录 (精确到具体页面,不传 src/views 全局)
如有 error :
仅修复本次生成的文件 中的 error(index.vue / data.ts / index.scss / api.md)
如 error 来自同目录下的旧文件 (非本次生成),不要修改,在摘要中标注"已跳过 N 个旧文件 error"
修复后重新自检直到本次生成的文件 0 error
如有 warn → 尝试修复,确实无法修复的在摘要中说明原因
自检结果(error 数 / warn 数 / 跳过的旧文件数)写入上方"生成完成摘要"
自检范围为本次生成的单个页面目录 ,不对无关页面负责
这条规则确保 AI 不会"写完就跑"——生成和验证形成闭环。
作用域隔离原则 :AI 只对自己本次生成的文件负责,不强制修复历史遗留偏差。
git commit 时 pre-commit hook 会再次拦截,但 AI 应在生成阶段就消除本次生成的 error。
前置检查
□ 页面中文名:
□ 交互模式:LIST / MASTER_DETAIL / TREE_LIST / DETAIL_TABS / FORM_ROUTE / CHANGE_HISTORY / RECORD_FORM / OPERATION_STATION / TEMPLATE_DRIVEN
□ page-spec JSON:(必须存在,由 prototype-scan 输出)
□ 文件路径:src/views/[域]/[模块]/[子模块]/[kebab-case-目录名]/
□ pages.ts 注册名:["kebab-目录名", "中文名"]
□ 服务缩写:[pm / mmwr / sale / ...]
□ 资源名(CamelCase):
重要 :查询字段、表格列、按钮列表不再手动罗列,直接从 page-spec JSON 中读取。
如果没有 page-spec JSON,必须先执行 prototype-scan Skill 生成。
模式 0 快捷路径 :当用户直接口述需求(如"帮我生成一个客户管理页面")而未提供 page-spec JSON 时,AI 内部自动调用 prototype-scan 模式 0 构建 page-spec JSON,然后继续执行代码生成,无需用户提供任何文件。
生成产物(标准页面文件)
src/views/[域]/[模块]/[子模块]/[kebab-case-目录名]/
├── index.vue ← 页面入口(纯模板 + 解构)
├── data.ts ← 业务逻辑(AbstractPageQueryHook 类 / 直接导出 ref+函数)
├── index.scss ← 页面样式
├── api.md ← 接口约定(按 api-contract Skill 模板生成)
└── page-spec.json ← ★ 原型约定真值(查询/列/按钮/操作列 顺序+颜色),供 validate S1~S6 确定性比对
页面使用字典时,在模块根目录额外维护 dicts.ts:
src/views/[域]/[模块]/dicts.ts
先在页面 api.md 写完整 dict-contract,再合并到 dicts.ts;读取 .wl-skills/docs/dictionary-contract.md。不得仅在 data.ts 写 logicValue 而缺少字典定义。
page-spec.json 是"精准实现"的真值锚点 :把 page-spec(查询字段顺序、列顺序、按钮顺序与颜色、操作列)固化到页面目录,wl-skills validate 据此比对 data.ts 实际实现,偏差即报(详见 .wl-skills/docs/page-spec-schema.md)。不可省略 ——没有它,"按约定实现"无法被验证,只能靠 AI 自觉。
弹窗组件处理策略:
kit 标准组件 → 按 references/component-materialization.md 预览并按需落盘到 src/components/local/;.wl-skills 仅为模板源
项目通用弹窗 (新增/编辑表单,2+ 页面复用)→ 提取到 src/components/local/c_xxxModal/
极个性弹窗 (仅单页面使用,c_modal 无法满足)→ 放在页面 components/xxxModal.vue
附加输出:
pages.ts 注册片段
reports/SYS_MENU_INFO.md — 集中式菜单配置,追加写入 (见下方 §SYS_MENU_INFO 生成规则)
mock/[业务域]/[模块].ts(仅当 .wl-skills-validate.json.mockPolicy 为 required,或 optional 且需求明确需要 mock 时生成;disabled 时禁止生成。详见 .wl-skills/docs/mock-architecture.md)
wl-skills-ui 生成闭环契约
生成代码应直接遵守 @agile-team/wl-skills-ui 的控件几何和列表布局契约,避免让业务页再用 CSS 补救:
所有直接生成的 el-input、el-input-number、jh-select、jh-date 等输入控件显式使用 size="small"(或等价的 size 配置),保留标准 placeholder;不得在页面样式中把 .el-input__inner、.el-input__wrapper 的 padding 清零。展示值、只读值与 placeholder 必须复用同一控件结构和间距。
数字输入框只声明业务语义(controls、textAlign 等);不得在页面中隐藏步进按钮、重写箭头的绝对定位或高度。UI 包统一负责右侧上下箭头的几何。
复杂表单控件在表单列中统一 width: 100%,避免选择器、日期、数字框宽度漂移。
列表分页必须位于表格之后的独立 .list-page__pager 容器,并右对齐;不要把分页器塞进表格或工具栏布局。
操作列必须 fixed: "right"、align: "center",使用 renderOps 图标语义;宽度按同时可见按钮最大数量确定(2 个约 140px,3 个约 200px),查看/编辑/删除不得生成裸文字按钮。
状态/字典列必须使用 logicType: BusLogicDataType.dict 或 runtime Tag 渲染,不生成无语义的纯文本状态列。
生成完成后的页面自检除既有 K1K19/S1S6/C1~C4 外,还必须确认:分页器容器和位置、操作列固定/对齐/宽度、状态 Tag、输入控件 size/placeholder/间距,以及数字框未被业务 CSS 改写。
约束(严格遵守)
必须
data.ts 使用 class extends AbstractPageQueryHook,通过 queryDef() / toolbarDef() / columnsDef() 配置。仅适用于 LIST / MASTER_DETAIL / TREE_LIST 三种列表型页面 。其余模板不用此基类:DETAIL_TABS(直接导出 reactive+ref)、FORM_ROUTE(useXxx composable)、CHANGE_HISTORY(composable+mock)、RECORD_FORM(直接 ref+函数)、OPERATION_STATION(多个 createXxxPage)、TEMPLATE_DRIVEN(仅 config 对象)
index.vue 只有模板 + createPage() 解构 + onMounted,不写业务逻辑。例外 :DETAIL_TABS / FORM_ROUTE / CHANGE_HISTORY 的 index.vue 可包含表单状态管理;OPERATION_STATION 包含 computed/watch/多列表协调逻辑
最外层 class:app-container app-page-container
样式用 @import "./index.scss"
API 用 getAction / postAction from @jhlc/common-core/src/api/action
字典字段用 logicType: BusLogicDataType.dict, logicValue: "dictCode"
同时生成 api.md(基于 api-contract Skill 模板);有字典时写 dict-contract 并更新模块 dicts.ts
提供 pages.ts 注册片段
Mock 遵循项目策略 :读取 .wl-skills-validate.json.mockPolicy。disabled 不生成、不安装、不校验 mock;optional(默认)仅在用户明确需要时生成;required 必须生成。启用时放在 mock/[业务域]/,URL/字段/方法/载荷与 api.md 及生效 Delivery Profile 一致,并复用 ../_utils
查询字段顺序 :queryDef() 中字段顺序必须与 page-spec query 数组顺序严格一致(即原型从左到右、从上到下)
表格列顺序 :columnsDef() 中列顺序必须与 page-spec columns 数组顺序严格一致(selection + index 在最前,其余按原型表头从左到右)
按钮顺序与颜色 :toolbarDef() 中按钮顺序、name(颜色)和 plain(填充/线框)必须与 page-spec toolbar 数组严格一致(primary=蓝底, danger=红色, warning=橙色, default=灰色; plain: true=线框)。"新增/新建/添加/创建"类主按钮永远排第一,并强制 name: "primary" 且不得设置 plain: true ;生成后 S3 必须同时校验颜色和 plain 形态。
长文本列 :普通文本列统一声明 showOverflowTooltip: true,列宽不足时显示省略号,悬停展示完整内容;selection/index/操作列、自定义 Tag 渲染列以及 wrapText/autoHeight 列不得机械添加。
禁止事项(严格遵守)
❌ 禁止手写弹窗 :不可在页面 components/ 下用 el-dialog + el-form + el-row/col 手写弹窗。必须使用按需落盘到 src/components/local/c_formModal/ 的 c_formModal,通过 modalConfig 配置驱动;禁止运行时引用 .wl-skills。例外 :纯只读详情弹窗(jh-dialog + BaseForm :disabled="true")可不用 c_formModal,如工艺参数查看(参考 mmwr-process-parameters)
❌ 禁止在弹窗中使用原生 Element Plus 组件 :不可使用 el-select、el-input、el-date-picker 等原生组件,必须使用 jh-select、jh-date、jh-user-picker 等平台组件(通过 BaseFormItemDesc 的 component 属性配置)
❌ 禁止在 BaseToolbar 内使用 slot :BaseToolbar 组件不支持任何 slot (源码中无 <slot> 标签),放入的内容会被丢弃不渲染。Tab/视角切换等额外 UI 必须放在 BaseToolbar 外部
❌ 禁止用 el-radio-group 做 Tab/视角切换 :所有 Tab 式切换(视角切换、数据过滤 Tab、功能 Tab)必须使用 el-tabs (参考 mmwr-steel-stripping-operations)。不可用 el-radio-group + 手动 handleViewChange / handleTabChange
❌ 禁止 Mock 端点只返回成功不修改数据 :mock 文件中每个端点的 response 必须实际修改 dataPool(splice/assign/修改字段),否则 this.select() 刷新后数据不变。详见 §Mock 端点最佳实践
❌ 禁止遗留未使用的 import :data.ts 中不要导入未使用的模块(如仅用 postAction 时不导入 getAction)
❌ 禁止操作列自编按钮 :操作列的 operations 数组必须与原型操作列按钮严格一致 ,不可凭空添加原型中不存在的按钮(如原型只有"编辑"+"删除",不可自行加"查看")
❌ 状态类列必须 fixed: "right" + 色块渲染 :启用状态、停用时间、转化状态、客户状态、审批状态、核实状态等靠近操作列的状态类列必须设置 fixed: "right",与操作列一起固定在表格右侧。且状态列必须用 defaultSlot + h(ElTag) 渲染彩色标签 ,不可纯文本显示(详见 §状态列色块渲染模式)
❌ 禁止操作按钮标签自编 :操作列按钮 label 必须与原型严格一致(如原型写"修改"不可改成"编辑",写"作废"不可改成"删除"),且 onClick 逻辑必须匹配语义("作废"调 cancel API,不是 remove)
❌ 禁止平台组件遗漏 :在 el-form-item 内使用 、 、 时, 隐藏组件自身标签(否则会渲染"下拉选择框:"、"日期:"等多余文字)
场景化实现规则(按需读取)
命中场景 必读 reference pattern 已实现且规格能落进 scenario JSON(确定性渲染前置层) references/scenario-templates.mdCRUD 弹窗、蓝色链接列或 FORM_ROUTE 隐藏路由 references/modal-and-navigation.md按钮交互、条件操作列、状态标签或视角/Tab references/table-interactions.mdExcel 导入导出或 Mock 写操作 references/import-export-and-mock.mdFORM_TAB / FORM_ROUTE / 独立路由表单页 references/form-ui.md新增/编辑表单、可编辑明细或提交前批量校验 references/form-validation-library.md写入 pages.ts 或 SYS_MENU_INFO.md 前 references/registration-and-menu.md
只读取本次页面命中的 reference;模板代码仍按下方模板索引读取一个匹配文件。
禁止
以下为精简速查清单,详细说明见上方 §禁止事项(严格遵守)。
❌ index.vue 中写业务逻辑(逻辑全在 data.ts)
❌ 使用 Vuex(用 Pinia)
❌ ::v-deep / /deep/(用 :deep())
❌ 直接用 axios(用 getAction/postAction)
❌ 手写查询表单/工具栏/分页(用 BaseQuery/BaseToolbar/jh-pagination)
❌ 使用 useTableDelete(用 this.remove(row.id))
❌ 用 { ...instance } 展开 create() 返回值
❌ Mock 端点不修改 dataPool、字段名不对齐 columnsDef
❌ data.ts 导入未使用的模块
❌ 用 el-radio-group 做 Tab/视角切换(统一用 el-tabs)
表单页 UI 路由
FORM_TAB、FORM_ROUTE 或独立路由表单页必须读取 references/form-ui.md;列表页不加载。
api.md 生成时序
api.md 在页面代码之前生成 (Step 2: api-contract → Step 3: page-codegen)。
page-codegen 读取已生成的 api.md 中的 URL 和字段定义,确保 API_CONFIG、mock、data.ts 与接口约定一致。
未来使用真实 API 设计文档时,api.md 由后端提供或 api-contract Skill 从设计文档提取,page-codegen 直接消费。
页面含字典时,在生成 data.ts 前先完成 api.md dict-contract → 模块 dicts.ts 合并,生成结束后由 validate D1 复核。
页面注册与菜单报告
生成 pages.ts 注册片段和追加 reports/SYS_MENU_INFO.md 前,必须读取 references/registration-and-menu.md,确保 component 路径、菜单层级和追加策略一致。
代码模板索引
各模板完整代码见对应独立文件,按需读取。主文件(SKILL.md)包含前置检查、约束、按钮规则、Mock规范等所有共用规则。
交互模式 文件 适用场景 典型参考页面 LIST templates/universal/TPL-LIST.md 标准查询+工具栏+表格+分页 mmwr-customer-archive MASTER_DETAIL templates/universal/TPL-MASTER-DETAIL.md jh-drag-row 主从表,双击联动 ompt-ht-plan-order TREE_LIST templates/universal/TPL-TREE-LIST.md 左侧 C_Tree + 右侧列表 — DETAIL_TABS templates/universal/TPL-DETAIL-TABS.md jh-drag-row 上Tab表单+下子表 add-demo / domestic-trade-order FORM_ROUTE templates/universal/TPL-FORM-ROUTE.md 复杂表单独立路由(非弹窗) mmwr-customer-apply-add-form CHANGE_HISTORY templates/universal/TPL-CHANGE-HISTORY.md 左历史时间线+右变更详情 mmwr-customer-apply-change-history RECORD_FORM templates/universal/TPL-RECORD-FORM.md BaseQuery选主记录+Form+Table无分页 mmsm-convert-progress OPERATION_STATION templates/domains/produce/TPL-OPERATION-STATION.md 工序站点操作(待处理↔已处理+操作表单) mmwr-rolling-management
配置驱动模板页 (ResultQueryTemplate / FinishingAchievementTemplate 等):见 templates/universal/TPL-DRIVEN.md,仅需生成 config 对象,不套用以上模板。
领域模板查询 :完整路径以 templates/_index.md 注册表为准,新增领域模板见 templates/domains/_CONTRIBUTING.md。
操作列按钮 :columnsDef() 操作列的 operations 数组必须与 page-spec operations 数组严格一一对应 ,不可遗漏也不可自行添加 (如原型没有"查看"按钮就不能加"查看")
Tab 标签 :当 page-spec features.tabSwitch === true 时,必须在 index.vue 中生成 Tab 组件,tabs 与 features.tabItems 一一对应
按钮文字保真 :使用原型中的原始文字(如"新增申请"不可简化为"新增","变更申请"不可简化为"变更")
可点击列(蓝色链接列) :原型中蓝色凸显的列(如客户编码、申请编码等编码/编号类字段)必须实现为可点击链接,使用 defaultSlot + h() 渲染蓝色链接样式,点击后查看详情(调 getById 后展示或路由跳转)
按钮颜色映射 :按钮的 type 属性决定颜色,须根据原型按钮颜色或按钮语义映射(见下方 §按钮颜色映射表)
按钮必须可交互 :所有按钮的 onClick 必须有真实处理逻辑,禁止空函数 () => {}。通用交互实现见下方 §按钮交互实现规则
未知交互阻断 :原型/需求未提供交互细节且无法由已确认契约确定时,写入 openQuestions 并停止生成该操作;禁止用提示消息伪装已实现功能
生成后依赖自检 :只检查本次生成代码真实使用的依赖(如 lodash-es、xlsx);页面含新增/编辑/独立表单或可编辑明细时检查 @robot-admin/form-validate 的声明范围与可解析安装版本均满足 3.4.1+。缺少依赖必须在 Pre-flight 提示安装并暂停,不得生成悬空 import;不得静默安装。仅在 mock 策略启用且本次生成 mock 时检查 mockjs、vite-plugin-mock、viteMockServe 和 mock/_utils.ts。标准业务组件必须先执行 component ensure 预览/确认闭环
Contract First,Mock 可选 :先通过 wl-api-contract 建立真实 method/path/request/response。需求明确需要前端并行开发时再生成 mock/[业务域]/[模块].ts;mock 必须复用同一契约,关闭后不得修改业务 URL。
Mock URL 必须匹配真实请求 :API_CONFIG 保持真实接口路径(如 /mdata/mdataModel/queryPage),mock 文件端点必须带 Vite 代理前缀(如 /dev-api/mdata/mdataModel/queryPage),这样关闭 mock 后无需修改业务代码。
列表首次加载必须真实执行查询 :列表页 onMounted(() => select()) 调用同一 API_CONFIG;mock 启用时由 mock 返回契约数据,mock 禁用时直接访问真实后端。不得为了展示初始数据在页面内硬编码假数据
必须使用 wl-skills-ui runtime 风格 :当项目安装了 @agile-team/wl-skills-ui 时,列表列定义必须使用 defineColumns(),操作列必须使用 renderOps(),状态/字典列优先使用 runtime 渲染器或 logicType=dict 自动映射;不可退回默认纯文本/空函数风格。
wl-skills-ui 接入自检 :生成页面前检查项目是否已接入 @agile-team/wl-skills-ui 样式与 runtime。若未接入,先提示并补齐:@use '@agile-team/wl-skills-ui/styles' as *;、installCommonPreset()、必要的 design tokens 引入;否则页面风格不会自动生效。
pages.ts 分组注册 :多页面模块必须按当前业务目录分组写入 vite/plugins/shared/pages.ts,使用 gProd(module, { subModule: [[page, label]] }) 结构,不允许把所有页面扁平追加到一个数组。
BaseTable 强制 AGGrid :所有业务主列表/台账/主从表/树表/详情子表的 BaseTable 必须显式写 render-type="agGrid",并绑定全局唯一 cid。弹窗小表格可豁免,但必须在生成摘要中说明理由。
cid 必须可追踪 :每个页面导出 TABLE_CID = "{pageAbbr}-{base36Timestamp}";多表页面使用 BOTTOM_TABLE_CID / ITEM_TABLE_CID,列级 cid 必须使用 ${TABLE_CID}-fieldName 前缀。
skills-ui 只能融合,不可生搬硬套 :不得照搬 wl-skills-ui/templates/list-page 中的原生 el-form/usePageHook/el-pagination 通用写法;本项目必须保留 AbstractPageQueryHook + BaseQuery + BaseToolbar + BaseTable + jh-pagination 平台骨架,只融合 defineColumns/renderOps/tokens/preset。
必须落盘 page-spec.json :生成页面时,把 page-spec(page 中文名 + query + columns + toolbar + operations)按 .wl-skills/docs/page-spec-schema.md 写入页面目录的 page-spec.json。字段 name/label/顺序必须与 data.ts、原型及机器 API 契约严格一致——这是 validate 做 S1~S6 比对的真值。生成后自检若出现 S2/S3/S4/S6 error,必须修正到 0 error。
字典契约闭环 :页面出现 logicType: BusLogicDataType.dict 时,api.md 必须包含完整 dict-contract,模块 dicts.ts 必须汇总该定义;wl-skills validate D1 未通过时禁止建议 dict-sync。
字段边界契约闭环 :创建/更新表单的字符串长度、格式和数值范围/精度必须从已确认的 API/数据库/需求契约写入 page-spec constraints + constraintSource;实现时同步生成控件属性与 @robot-admin/form-validate 规则,后端校验仍是最终边界。UI-only 使用 ELEMENT_RULES/ELEMENT_COMBOS;需与提交/明细校验复用时以 SPEC_RULES 为唯一事实源并用 toElementRules 适配。无来源时进入 openQuestions,禁止按字段名、标签或经验值猜测。
字典实际引用闭环 :生成结束后除 D1 外必须通过 D2;代码中的 dictCode/logicValue/useDictOpts/jh-select dict 字面量必须已在模块 dicts.ts 登记。状态机枚举不因名称含 status/type/flag 被强制改成平台字典。
分页边界闭环 :以项目 .wl-skills/contracts/wl-delivery-profile.v1.json 为唯一事实源;无项目配置时才使用包基线 current: 1, size: 10, maxSize: 200。项目显式采用 20/1000 等合理口径时允许并报告覆盖基线,不得误判;只有代码与生效 Profile 不一致或请求越界才阻断。查询、重置、页大小变化和保存成功后回第一页,删除末页最后一条时回退上一页。
上下文闭环 :新页面使用 features.contextFields 区分 client/server。客户端上下文仅进入显式 operations;服务端租户/公司上下文由鉴权注入,禁止由前端请求携带。旧 fixedQueryFields 兼容为客户端 page/create/update 上下文。只显示默认值但提交时丢失属于生成失败。
查询触发与列表生命周期 :标准列表首次进入查询;检索条件由“搜索/重置”显式触发,普通输入失焦不得自动查询(BaseQuery :auto-select="false");保存成功回第一页刷新;删除导致当前页为空时回退上一页。特殊实时联想页须在 page-spec 显式声明 queryTrigger=auto。
字段边界只认契约证据 :必填、长度、正则、数值范围/精度和开始/结束时间必须来自 page-spec + wl-api-contract;字符串字段不得按名称猜成数字,查询 DTO 不得机械继承数据库写入长度,拿不准时只保留明确必填或形成 openQuestion。
请求字段白名单 :表单提交只从 wl-api-contract.models.createRequest/updateRequest 构造 DTO;禁止把整份响应式页面状态或通用宽 DTO 原样发送。页面字段多于契约会被后端拒绝,少于必填契约会造成数据丢失。
可序列化与可理解异常 :不得直接 structuredClone Vue Proxy/组件实例;使用项目验证过的 cloneDeep/toRaw 或显式 DTO 构造。不得把 error.message 原样弹给用户,优先后端业务 message,失败时给中文动作型兜底并记录技术日志。
大量表单快速填写闭环 :page-spec 中表单字段 ≥10 且混合必填/非必填时必须生成有效“全部/仅必填”切换。弹窗用 show-required-toggle,分区页面用 show-required-filter,页面 BaseForm 用 useFormRequiredOnly + visibleItems,多 Tab 页由父级传递受控状态且每个子表单真实过滤。禁止只生成开关或 prop 而未改变渲染 items;完整实现只读 references/form-ui.md。
按钮尺寸显式稳定 :生成的直接 el-button / ElButton 与 BaseToolbar 默认必须显式写 size="small",避免项目 ConfigProvider 或部署环境默认值不同造成视觉漂移;原型或既有代码已明确设置 default、large 或动态 :size 时保留其业务意图,不得强改。label=""
jh-select
jh-date
jh-file-upload
必须传 label=""
❌ 禁止表单控件宽度不统一 :jh-select、jh-date、el-input-number、jh-file-upload 默认宽度可能与 el-input 不一致,必须在 scoped style 中用 :deep() 统一设为 width: 100%(详见 §表单页 UI 细节规范)
❌ 禁止表单页无滚动 :独立路由表单页内容超出视口时必须可滚动,.app-page-container 须设 overflow-y: auto(不要加 height: 100%,全局已有 height: calc(100vh - 100px),叠加会导致双滚动条 )
❌ 禁止内联 style 散落 :所有页面/组件样式统一写在 index.scss 中(便于复用和移动),不可在 template 中大量使用内联 style="..."
❌ 禁止违反项目 Mock 策略 :disabled 时不得生成 mock;required 时不得遗漏;optional 时只有需求明确才生成。生成的 mock 必须按域分目录并复用 _utils,不生成 mock 本身不是缺陷
❌ 禁止生成空或占位 onClick :onClick: () => {} 和仅提示“待确认”的处理都属于生成失败;未知逻辑必须阻断并进入 openQuestions。
❌ 禁止忽略 wl-skills-ui :项目已安装 @agile-team/wl-skills-ui 时,不使用 defineColumns/renderOps 属于生成失败。
❌ 禁止 BaseTable 非 AGGrid :业务列表中 <BaseTable> 未写 render-type="agGrid" 或缺少 cid/:cid 属于生成失败。
❌ 禁止列缺 cid :AGGrid 表格的数据列/操作列缺少列级 cid 属于生成失败。
❌ 禁止新页面手写通用表单规则 :不得重复写 { required, message, trigger }、通用格式正则和数值 callback validator;使用 @robot-admin/form-validate。业务特有且无法等价映射的规则可保留,但必须说明契约来源。
❌ 禁止 Element Plus 页面使用 Naive API :不得使用 PRESET_RULES、RULE_COMBOS、NAIVE_COMBOS 或 toNaiveRule(s);改用 ELEMENT_RULES/ELEMENT_COMBOS 或 RuleSpec 适配。