@agile-team/wl-skills-kit 1.0.0

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.
Files changed (112) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +328 -0
  3. package/bin/wl-skills.js +104 -0
  4. package/files/.github/copilot-instructions.md +211 -0
  5. package/files/.github/docs/SYS_MENU_INFO.md +247 -0
  6. package/files/.github/docs/menu-sync-design.md +265 -0
  7. package/files/.github/docs/use-skill.md +379 -0
  8. package/files/.github/docs/wl-skills-kit.md +266 -0
  9. package/files/.github/skills/api-contract/SKILL.md +247 -0
  10. package/files/.github/skills/convention-extract/SKILL.md +355 -0
  11. package/files/.github/skills/menu-sync/SKILL.md +255 -0
  12. package/files/.github/skills/menu-sync/env/guide.md +73 -0
  13. package/files/.github/skills/page-codegen/SKILL.md +825 -0
  14. package/files/.github/skills/page-codegen/TPL-CHANGE-HISTORY.md +281 -0
  15. package/files/.github/skills/page-codegen/TPL-DETAIL-TABS.md +1112 -0
  16. package/files/.github/skills/page-codegen/TPL-DRIVEN.md +124 -0
  17. package/files/.github/skills/page-codegen/TPL-FORM-ROUTE.md +441 -0
  18. package/files/.github/skills/page-codegen/TPL-LIST.md +196 -0
  19. package/files/.github/skills/page-codegen/TPL-MASTER-DETAIL.md +153 -0
  20. package/files/.github/skills/page-codegen/TPL-OPERATION-STATION.md +442 -0
  21. package/files/.github/skills/page-codegen/TPL-RECORD-FORM.md +376 -0
  22. package/files/.github/skills/page-codegen/TPL-TREE-LIST.md +191 -0
  23. package/files/.github/skills/prototype-scan/SKILL.md +414 -0
  24. package/files/demo/README.md +44 -0
  25. package/files/demo/produce/aiflow/mmwr-customer-apply-add/api.md +54 -0
  26. package/files/demo/produce/aiflow/mmwr-customer-apply-add/data.ts +346 -0
  27. package/files/demo/produce/aiflow/mmwr-customer-apply-add/index.scss +1 -0
  28. package/files/demo/produce/aiflow/mmwr-customer-apply-add/index.vue +28 -0
  29. package/files/demo/produce/aiflow/mmwr-customer-apply-add-form/data.ts +115 -0
  30. package/files/demo/produce/aiflow/mmwr-customer-apply-add-form/index.scss +44 -0
  31. package/files/demo/produce/aiflow/mmwr-customer-apply-add-form/index.vue +43 -0
  32. package/files/demo/produce/aiflow/mmwr-customer-apply-change/data.ts +338 -0
  33. package/files/demo/produce/aiflow/mmwr-customer-apply-change/index.scss +1 -0
  34. package/files/demo/produce/aiflow/mmwr-customer-apply-change/index.vue +28 -0
  35. package/files/demo/produce/aiflow/mmwr-customer-apply-change-form/data.ts +115 -0
  36. package/files/demo/produce/aiflow/mmwr-customer-apply-change-form/index.scss +44 -0
  37. package/files/demo/produce/aiflow/mmwr-customer-apply-change-form/index.vue +43 -0
  38. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/data.ts +196 -0
  39. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.scss +150 -0
  40. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.vue +79 -0
  41. package/files/demo/produce/aiflow/mmwr-customer-archive/api.md +88 -0
  42. package/files/demo/produce/aiflow/mmwr-customer-archive/data.ts +601 -0
  43. package/files/demo/produce/aiflow/mmwr-customer-archive/index.scss +1 -0
  44. package/files/demo/produce/aiflow/mmwr-customer-archive/index.vue +64 -0
  45. package/files/demo/produce/aiflow/mmwr-customer-detail/api.md +67 -0
  46. package/files/demo/produce/aiflow/mmwr-customer-detail/data.ts +286 -0
  47. package/files/demo/produce/aiflow/mmwr-customer-detail/index.scss +139 -0
  48. package/files/demo/produce/aiflow/mmwr-customer-detail/index.vue +318 -0
  49. package/files/demo/produce/aiflow/mmwr-temp-customer-archive/api.md +98 -0
  50. package/files/demo/produce/aiflow/mmwr-temp-customer-archive/data.ts +543 -0
  51. package/files/demo/produce/aiflow/mmwr-temp-customer-archive/index.scss +1 -0
  52. package/files/demo/produce/aiflow/mmwr-temp-customer-archive/index.vue +52 -0
  53. package/files/demo/sale/demo/add-demo/data.ts +518 -0
  54. package/files/demo/sale/demo/add-demo/index.scss +207 -0
  55. package/files/demo/sale/demo/add-demo/index.vue +167 -0
  56. package/files/demo/sale/demo/billet-flame-cut-plan/data.ts +524 -0
  57. package/files/demo/sale/demo/billet-flame-cut-plan/index.scss +155 -0
  58. package/files/demo/sale/demo/billet-flame-cut-plan/index.vue +117 -0
  59. package/files/demo/sale/demo/domestic-trade-order/data.ts +308 -0
  60. package/files/demo/sale/demo/domestic-trade-order/index.scss +99 -0
  61. package/files/demo/sale/demo/domestic-trade-order/index.vue +77 -0
  62. package/files/demo/sale/demo/heat-batch-return/data.ts +367 -0
  63. package/files/demo/sale/demo/heat-batch-return/index.scss +100 -0
  64. package/files/demo/sale/demo/heat-batch-return/index.vue +170 -0
  65. package/files/demo/sale/demo/heat-batch-return/meltDialog.vue +320 -0
  66. package/files/demo/sale/demo/metallurgical-spec/data.ts +825 -0
  67. package/files/demo/sale/demo/metallurgical-spec/index.scss +264 -0
  68. package/files/demo/sale/demo/metallurgical-spec/index.vue +309 -0
  69. package/files/docs/jh-date-range.md +257 -0
  70. package/files/docs/jh-date.md +222 -0
  71. package/files/docs/jh-dept-picker.md +190 -0
  72. package/files/docs/jh-drag-row.md +590 -0
  73. package/files/docs/jh-file-upload.md +216 -0
  74. package/files/docs/jh-pagination.md +505 -0
  75. package/files/docs/jh-picker.md +218 -0
  76. package/files/docs/jh-select.md +148 -0
  77. package/files/docs/jh-text.md +248 -0
  78. package/files/docs/jh-user-picker.md +197 -0
  79. package/files/docs/page-query-hook-best-practices.md +362 -0
  80. package/files/docs/request.md +925 -0
  81. package/files/src/components/global/C_ParentView/index.vue +3 -0
  82. package/files/src/components/global/C_RightToolbar/index.vue +459 -0
  83. package/files/src/components/global/C_Splitter/index.vue +195 -0
  84. package/files/src/components/global/C_SvgIcon/index.vue +61 -0
  85. package/files/src/components/global/C_SvgIcon/svgicon.js +10 -0
  86. package/files/src/components/global/C_TagStatus/README.md +264 -0
  87. package/files/src/components/global/C_TagStatus/config.ts +192 -0
  88. package/files/src/components/global/C_TagStatus/index.vue +127 -0
  89. package/files/src/components/global/C_TagStatus/types.ts +64 -0
  90. package/files/src/components/global/C_Tree/README.md +153 -0
  91. package/files/src/components/global/C_Tree/index.scss +42 -0
  92. package/files/src/components/global/C_Tree/index.vue +119 -0
  93. package/files/src/components/global/C_Tree/types.ts +59 -0
  94. package/files/src/components/local/c_formModal/README.md +235 -0
  95. package/files/src/components/local/c_formModal/data.ts +95 -0
  96. package/files/src/components/local/c_formModal/index.scss +8 -0
  97. package/files/src/components/local/c_formModal/index.vue +107 -0
  98. package/files/src/components/local/c_formSections/README.md +496 -0
  99. package/files/src/components/local/c_formSections/data.ts +175 -0
  100. package/files/src/components/local/c_formSections/index.scss +280 -0
  101. package/files/src/components/local/c_formSections/index.vue +429 -0
  102. package/files/src/components/local/c_listModal/data.ts +41 -0
  103. package/files/src/components/local/c_listModal/index.vue +136 -0
  104. package/files/src/components/local/c_spliterTitle/index.scss +25 -0
  105. package/files/src/components/local/c_spliterTitle/index.vue +21 -0
  106. package/files/src/components/remote/AGGrid/README.md +530 -0
  107. package/files/src/components/remote/BaseForm/README.md +508 -0
  108. package/files/src/components/remote/BaseQuery/README.md +865 -0
  109. package/files/src/components/remote/BaseTable/README.md +941 -0
  110. package/files/src/components/remote/BaseToolbar/README.md +496 -0
  111. package/files/src/types/page.ts +24 -0
  112. package/package.json +31 -0
@@ -0,0 +1,196 @@
1
+ # LIST:标准列表页
2
+
3
+ > 见 SKILL.md 主文件(约束 + 按钮规则 + Mock 规范等共用规则)。
4
+
5
+
6
+ #### data.ts
7
+
8
+ ```typescript
9
+ // 实际项目中统一从桶文件导入(src/types/page.ts)
10
+ import {
11
+ AbstractPageQueryHook,
12
+ BaseQueryItemDesc,
13
+ ActionButtonDesc,
14
+ TableColumnDesc,
15
+ BusLogicDataType
16
+ } from "@/types/page";
17
+ import { getAction, postAction } from "@jhlc/common-core/src/api/action";
18
+
19
+ export const API_CONFIG = {
20
+ list: "/[服务缩写]/[资源名]/list",
21
+ remove: "/[服务缩写]/[资源名]/remove",
22
+ getById: "/[服务缩写]/[资源名]/getById",
23
+ save: "/[服务缩写]/[资源名]/save",
24
+ update: "/[服务缩写]/[资源名]/update",
25
+ export: "/[服务缩写]/[资源名]/export"
26
+ } as const;
27
+
28
+ /** 静态下拉选项(无字典 code 时在前端定义) */
29
+ const OPTS = {
30
+ [optionKey]: [
31
+ { label: "选项1", value: "value1" },
32
+ { label: "选项2", value: "value2" }
33
+ ]
34
+ };
35
+
36
+ export function createPage(editModalRef?: any) {
37
+ let Page = new (class extends AbstractPageQueryHook {
38
+ constructor() {
39
+ super({ url: { list: API_CONFIG.list, remove: API_CONFIG.remove } });
40
+ }
41
+
42
+ queryDef(): BaseQueryItemDesc<any>[] {
43
+ return [
44
+ // 普通输入框
45
+ {
46
+ name: "[fieldName]",
47
+ label: "[中文名]",
48
+ placeholder: "请输入[中文名]"
49
+ },
50
+ // 字典下拉(后端字典表)
51
+ {
52
+ name: "[statusField]",
53
+ label: "[状态名]",
54
+ placeholder: "请选择",
55
+ logicType: BusLogicDataType.dict,
56
+ logicValue: "[dictCode]"
57
+ },
58
+ // 静态下拉(前端定义选项,无字典 code 时使用)
59
+ {
60
+ name: "[selectField]",
61
+ label: "[下拉名]",
62
+ component: () => ({ tag: "jh-select", items: OPTS.[optionKey] })
63
+ },
64
+ // 日期范围(需要 startName/endName)
65
+ {
66
+ name: "[dateField]",
67
+ startName: "[startDate]",
68
+ endName: "[endDate]",
69
+ label: "[日期名]",
70
+ placeholder: "请选择",
71
+ component: () => ({
72
+ tag: "jh-date",
73
+ type: "daterange",
74
+ rangeSeparator: "至",
75
+ showFormat: "YYYY-MM-DD",
76
+ valueFormat: "YYYY-MM-DD"
77
+ })
78
+ }
79
+ ];
80
+ }
81
+
82
+ toolbarDef(): ActionButtonDesc[] {
83
+ return [
84
+ // name 决定按钮颜色:primary=蓝底, danger=红色, warning=橙色; plain=true 为线框风格
85
+ // 按钮顺序必须与 page-spec toolbar 数组顺序严格一致
86
+ {
87
+ name: "primary",
88
+ label: "新增",
89
+ plain: true,
90
+ onClick: () => editModalRef?.value?.open()
91
+ }
92
+ ];
93
+ }
94
+
95
+ columnsDef(): TableColumnDesc<any>[] {
96
+ return [
97
+ { type: "selection" },
98
+ { type: "index" },
99
+ // 普通列
100
+ {
101
+ label: "[列名]",
102
+ name: "[fieldName]",
103
+ minWidth: 120,
104
+ sortable: true,
105
+ filterable: true
106
+ },
107
+ // 字典列(自动翻译)
108
+ {
109
+ label: "[状态名]",
110
+ name: "[statusField]",
111
+ minWidth: 120,
112
+ logicType: BusLogicDataType.dict,
113
+ logicValue: "[dictCode]",
114
+ sortable: true,
115
+ filterable: true
116
+ },
117
+ // 操作列(如需要行内编辑/删除按钮)
118
+ {
119
+ label: "操作",
120
+ width: 150,
121
+ fixed: "right",
122
+ operations: [
123
+ {
124
+ name: "edit",
125
+ label: "编辑",
126
+ onClick: (row: any) => editModalRef?.value?.open(row.id)
127
+ },
128
+ {
129
+ name: "remove",
130
+ label: "删除",
131
+ onClick: (row: any) => this.remove(row.id)
132
+ }
133
+ ]
134
+ }
135
+ ];
136
+ }
137
+ })();
138
+
139
+ return (Page as any).create() as any;
140
+ }
141
+ ```
142
+
143
+ #### index.vue
144
+
145
+ ```vue
146
+ <template>
147
+ <div class="app-container app-page-container">
148
+ <BaseQuery
149
+ :form="queryParam"
150
+ :items="queryItems"
151
+ @select="select"
152
+ @reset="select"
153
+ />
154
+ <BaseToolbar :items="toolbars" />
155
+ <BaseTable ref="tableRef" :data="list" :columns="columns" showToolbar />
156
+ <jh-pagination
157
+ v-show="page.total && page.total > 0"
158
+ :total="page.total || 0"
159
+ v-model:currentPage="page.current"
160
+ v-model:pageSize="page.size"
161
+ @current-change="select"
162
+ @size-change="select"
163
+ />
164
+ </div>
165
+ </template>
166
+
167
+ <script setup lang="ts">
168
+ import { createPage } from "./data";
169
+
170
+ const Page = createPage();
171
+ const {
172
+ tableRef,
173
+ page,
174
+ queryParam,
175
+ list,
176
+ queryItems,
177
+ columns,
178
+ toolbars,
179
+ select
180
+ } = Page;
181
+
182
+ onMounted(() => select());
183
+ </script>
184
+
185
+ <style scoped lang="scss">
186
+ @import "./index.scss";
187
+ </style>
188
+ ```
189
+
190
+ #### index.scss
191
+
192
+ ```scss
193
+ // 页面特有样式(无特殊需求可留空)
194
+ ```
195
+
196
+ ---
@@ -0,0 +1,153 @@
1
+ # MASTER_DETAIL:主从表页
2
+
3
+ > 见 SKILL.md 主文件(约束 + 按钮规则 + Mock 规范等共用规则)。
4
+
5
+
6
+ #### data.ts(额外部分)
7
+
8
+ 在标准 createPage 基础上,增加 createBottomPage:
9
+
10
+ ```typescript
11
+ // ... 同模板 A 的 imports 和 API_CONFIG(增加从表相关 URL)
12
+ export const API_CONFIG = {
13
+ list: "/[服务缩写]/[主资源]/list",
14
+ remove: "/[服务缩写]/[主资源]/remove",
15
+ // ...标准 CRUD
16
+ bottomList: "/[服务缩写]/[从资源]/list" // 从表查询
17
+ } as const;
18
+
19
+ export function createPage(/* refs */) {
20
+ // ... 主表同模板 A
21
+ }
22
+
23
+ // 双击主表行 → 加载从表数据
24
+ export function handleRowDblclick(
25
+ row: any,
26
+ bottomSelect: Function,
27
+ BottomPage: any
28
+ ) {
29
+ BottomPage.queryParam.value.mainId = row.id;
30
+ BottomPage.tableRef.value.loading();
31
+ getAction(API_CONFIG.bottomList, BottomPage.queryParam.value)
32
+ .then((res) => {
33
+ BottomPage.list.value = res.data;
34
+ BottomPage.tableRef.value.clearSelection();
35
+ })
36
+ .finally(() => {
37
+ BottomPage.tableRef.value.closeLoading();
38
+ });
39
+ }
40
+
41
+ // 从表 Hook
42
+ export function createBottomPage() {
43
+ let Page = new (class extends AbstractPageQueryHook {
44
+ constructor() {
45
+ super({ url: { list: API_CONFIG.bottomList } });
46
+ }
47
+ queryDef(): BaseQueryItemDesc<any>[] {
48
+ return [];
49
+ }
50
+ toolbarDef(): ActionButtonDesc[] {
51
+ return [];
52
+ }
53
+ columnsDef(): TableColumnDesc<any>[] {
54
+ return [
55
+ { type: "index" }
56
+ // 从表字段
57
+ ];
58
+ }
59
+ })();
60
+ return (Page as any).create() as any;
61
+ }
62
+ ```
63
+
64
+ #### index.vue
65
+
66
+ ```vue
67
+ <template>
68
+ <div class="app-container app-page-container">
69
+ <jh-drag-row :top-height="350">
70
+ <template #top>
71
+ <BaseQuery
72
+ :form="queryParam"
73
+ :items="queryItems"
74
+ @select="select"
75
+ @reset="select"
76
+ />
77
+ <BaseToolbar :items="toolbars" />
78
+ <BaseTable
79
+ ref="tableRef"
80
+ :data="list"
81
+ :columns="columns"
82
+ showToolbar
83
+ @row-dblclick="
84
+ (row) => handleRowDblclick(row, bottomSelect, BottomPage)
85
+ "
86
+ />
87
+ <jh-pagination
88
+ v-show="page.total && page.total > 0"
89
+ :total="page.total || 0"
90
+ v-model:currentPage="page.current"
91
+ v-model:pageSize="page.size"
92
+ @current-change="select"
93
+ @size-change="select"
94
+ />
95
+ </template>
96
+ <template #bottom>
97
+ <BaseToolbar :items="bottomToolbars" />
98
+ <BaseTable
99
+ ref="bottomTableRef"
100
+ :data="bottomList"
101
+ :columns="bottomColumns"
102
+ showToolbar
103
+ />
104
+ </template>
105
+ </jh-drag-row>
106
+ </div>
107
+ </template>
108
+
109
+ <script setup lang="ts">
110
+ import { createPage, createBottomPage, handleRowDblclick } from "./data";
111
+
112
+ const Page = createPage();
113
+ const {
114
+ tableRef,
115
+ page,
116
+ queryParam,
117
+ list,
118
+ queryItems,
119
+ columns,
120
+ toolbars,
121
+ select
122
+ } = Page;
123
+
124
+ const BottomPage = createBottomPage();
125
+ const {
126
+ tableRef: bottomTableRef,
127
+ list: bottomList,
128
+ columns: bottomColumns,
129
+ select: bottomSelect,
130
+ toolbars: bottomToolbars
131
+ } = BottomPage;
132
+
133
+ onMounted(() => select());
134
+ </script>
135
+
136
+ <style scoped lang="scss">
137
+ @import "./index.scss";
138
+ </style>
139
+ ```
140
+
141
+ #### index.scss
142
+
143
+ ```scss
144
+ .app-page-container .drager_row {
145
+ height: 100%;
146
+ }
147
+
148
+ .base-toolbar-box {
149
+ margin-bottom: 4px;
150
+ }
151
+ ```
152
+
153
+ ---