@agile-team/wl-skills-kit 2.3.4 → 2.3.6

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 (96) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +16 -10
  3. package/files/.cursor/mcp.json +8 -8
  4. package/files/.github/guides/README.md +13 -13
  5. package/files/.github/guides/architecture.md +555 -555
  6. package/files/.github/guides/mcp-setup.md +109 -109
  7. package/files/.github/guides/usage.md +184 -184
  8. package/files/.github/reports/README.md +65 -65
  9. package/files/.github/reports/SYS_DICT_INFO.md +50 -50
  10. package/files/.github/reports/SYS_MENU_INFO.md +247 -247
  11. package/files/.github/reports/SYS_PERMISSION_INFO.md +20 -20
  12. 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
  13. 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
  14. package/files/.github/skills/_compat/README.md +108 -108
  15. package/files/.github/skills/_compat/headers/agents.txt +8 -8
  16. package/files/.github/skills/_compat/headers/claude-code.txt +7 -7
  17. package/files/.github/skills/_compat/headers/cline.txt +7 -7
  18. package/files/.github/skills/_compat/headers/cursor-mdc.txt +16 -16
  19. package/files/.github/skills/_compat/headers/cursor-rules.txt +7 -7
  20. package/files/.github/skills/_compat/headers/github-copilot.txt +1 -1
  21. package/files/.github/skills/_compat/headers/kiro.txt +10 -10
  22. package/files/.github/skills/_compat/headers/qoder.txt +8 -8
  23. package/files/.github/skills/_compat/headers/trae.txt +11 -11
  24. package/files/.github/skills/_compat/headers/windsurf.txt +7 -7
  25. package/files/.github/skills/_registry.md +81 -81
  26. package/files/.github/skills/core/api-contract/SKILL.md +344 -344
  27. package/files/.github/skills/core/api-contract/USAGE.md +110 -110
  28. package/files/.github/skills/core/convention-audit/SKILL.md +189 -189
  29. package/files/.github/skills/core/convention-audit/USAGE.md +99 -99
  30. package/files/.github/skills/core/page-codegen/SKILL.md +973 -973
  31. package/files/.github/skills/core/page-codegen/USAGE.md +102 -102
  32. package/files/.github/skills/core/page-codegen/templates/_index.md +46 -46
  33. package/files/.github/skills/core/page-codegen/templates/domains/_CONTRIBUTING.md +107 -107
  34. package/files/.github/skills/core/page-codegen/templates/domains/produce/TPL-OPERATION-STATION.md +442 -442
  35. package/files/.github/skills/core/page-codegen/templates/domains/sale/README.md +26 -26
  36. package/files/.github/skills/core/page-codegen/templates/universal/TPL-CHANGE-HISTORY.md +276 -276
  37. package/files/.github/skills/core/page-codegen/templates/universal/TPL-DETAIL-TABS.md +1145 -1145
  38. package/files/.github/skills/core/page-codegen/templates/universal/TPL-DRIVEN.md +309 -309
  39. package/files/.github/skills/core/page-codegen/templates/universal/TPL-FORM-ROUTE.md +436 -436
  40. package/files/.github/skills/core/page-codegen/templates/universal/TPL-LIST.md +191 -191
  41. package/files/.github/skills/core/page-codegen/templates/universal/TPL-MASTER-DETAIL.md +148 -148
  42. package/files/.github/skills/core/page-codegen/templates/universal/TPL-RECORD-FORM.md +376 -376
  43. package/files/.github/skills/core/page-codegen/templates/universal/TPL-TREE-LIST.md +186 -186
  44. package/files/.github/skills/core/prototype-scan/SKILL.md +498 -498
  45. package/files/.github/skills/core/prototype-scan/USAGE.md +95 -95
  46. package/files/.github/skills/core/template-extract/SKILL.md +139 -139
  47. package/files/.github/skills/core/template-extract/USAGE.md +93 -93
  48. package/files/.github/skills/domain/README.md +51 -51
  49. package/files/.github/skills/sync/env.local.json +0 -5
  50. package/files/.github/skills/sync/menu-sync/SKILL.md +263 -263
  51. package/files/.github/skills/sync/menu-sync/USAGE.md +104 -104
  52. package/files/.github/skills/sync/menu-sync/env/env.local.json +7 -7
  53. package/files/.github/skills/sync/menu-sync/env/guide.md +99 -99
  54. package/files/.github/skills/sync/permission-sync/SKILL.md +239 -0
  55. package/files/.github/skills/sync/permission-sync/USAGE.md +93 -0
  56. package/files/.github/standards/01-toolchain.md +57 -57
  57. package/files/.github/standards/02-code-structure.md +111 -111
  58. package/files/.github/standards/03-comments.md +53 -53
  59. package/files/.github/standards/04-coding-basics.md +33 -33
  60. package/files/.github/standards/05-logging.md +38 -38
  61. package/files/.github/standards/06-security.md +44 -44
  62. package/files/.github/standards/07-config.md +52 -52
  63. package/files/.github/standards/08-git.md +60 -60
  64. package/files/.github/standards/09-typescript.md +71 -71
  65. package/files/.github/standards/10-pinia.md +57 -57
  66. package/files/.github/standards/11-form-validation.md +81 -81
  67. package/files/.github/standards/12-base-table.md +153 -153
  68. package/files/.github/standards/13-platform-components.md +123 -123
  69. package/files/.github/standards/index.md +89 -89
  70. package/files/.kiro/settings/mcp.json +8 -8
  71. package/files/.mcp.json +8 -8
  72. package/files/.vscode/mcp.json +9 -9
  73. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/data.ts +196 -196
  74. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.scss +150 -150
  75. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.vue +79 -79
  76. package/files/docs/jh-date-range.md +257 -257
  77. package/files/docs/jh-date.md +222 -222
  78. package/files/docs/jh-dept-picker.md +190 -190
  79. package/files/docs/jh-drag-row.md +590 -590
  80. package/files/docs/jh-file-upload.md +216 -216
  81. package/files/docs/jh-picker.md +218 -218
  82. package/files/docs/jh-select.md +148 -148
  83. package/files/docs/jh-text.md +248 -248
  84. package/files/docs/jh-user-picker.md +197 -197
  85. package/files/src/components/global/C_RightToolbar/data.ts +228 -228
  86. package/files/src/components/global/C_RightToolbar/index.scss +44 -44
  87. package/files/src/components/global/C_Splitter/index.scss +61 -61
  88. package/files/src/components/global/C_SvgIcon/index.scss +15 -15
  89. package/files/src/components/global/C_TagStatus/index.scss +20 -20
  90. package/files/src/components/global/C_Tree/data.ts +61 -61
  91. package/files/src/components/local/c_listModal/index.scss +4 -4
  92. package/mcp/api/roleApi.js +60 -0
  93. package/mcp/server.js +125 -5
  94. package/mcp/tools/permissionSync.js +321 -0
  95. package/package.json +1 -1
  96. package/files/.github/skills/sync/permission-sync/SKILL.draft.md +0 -91
@@ -0,0 +1,93 @@
1
+ # permission-sync · 使用示例
2
+
3
+ > 给团队成员看的快速上手文档。AI 触发协议见 `SKILL.md`。
4
+
5
+ ---
6
+
7
+ ## 一句话理解
8
+
9
+ **permission-sync = 角色管理 + 角色授权 + 挂动作 + 加 v-permission**
10
+
11
+ 整条链路覆盖"页面建好后,怎么让指定角色的人能看见、能点按钮"的全过程。
12
+
13
+ ---
14
+
15
+ ## 三种典型对话
16
+
17
+ ### 1. 创建角色
18
+
19
+ ```
20
+ 用户:创建一个测试角色,code 是 test_qa
21
+ AI : [触发 permission-sync]
22
+ [Pre-flight] 模式 = role-manage
23
+ 调用 wls_role_query 检查 → code=test_qa 不存在
24
+ 调用 wls_role_upsert
25
+ ✅ 创建成功
26
+ ```
27
+
28
+ ### 2. 给角色分配菜单
29
+
30
+ ```
31
+ 用户:给『档案普通人员』分配『客户档案』和『客户申请』两个菜单
32
+ AI : [触发 permission-sync]
33
+ [Pre-flight] 模式 = role-assign
34
+ ⚠️ 注意:saveRoleMenus 是全量覆盖,原有菜单会被替换
35
+ 是否继续?(yes/no)
36
+ 用户:yes
37
+ AI : 调用 wls_role_assign_menus
38
+ ✅ 角色授权成功
39
+ ```
40
+
41
+ ### 3. 给页面挂动作 + 加 v-permission
42
+
43
+ ```
44
+ 用户:给『客户档案』页面加上 新增/编辑/删除 三个按钮
45
+ AI : [触发 permission-sync]
46
+ [Pre-flight] 模式 = action-attach
47
+ 1. wls_action_query 查询已有动作 → 无
48
+ 2. wls_action_upsert 创建 customer_add / customer_edit / customer_remove
49
+ 3. 改造 src/views/customer/list/index.vue toolbar,加 v-permission
50
+ ✅ 完成(已写报告 reports/PERMISSION_SYNC_20260429.md)
51
+ ```
52
+
53
+ ---
54
+
55
+ ## 常见问题
56
+
57
+ ### Q1:角色授权时,为什么 menuIds 要传完整列表?
58
+
59
+ 后端 `saveRoleMenus` 是**全量覆盖**接口。你传 `[A, B]`,原先 `[A, B, C]` 就会变成 `[A, B]`,C 丢失。
60
+
61
+ **正确做法**:先查角色现有菜单 → 合并新菜单 → 一起传。
62
+
63
+ ### Q2:v-permission 指令在哪里实现?
64
+
65
+ 通常由项目基座(`@jhlc/common-core` 或登录 store)注册全局指令。检查方式:
66
+ ```bash
67
+ grep -r "v-permission\|app.directive('permission'" src/
68
+ ```
69
+ 如未找到,请联系架构组确认。
70
+
71
+ ### Q3:权限码用短形式还是长形式?
72
+
73
+ 参照项目既有用法。新项目建议短形式(`customer_add`),与平台示例数据一致。
74
+
75
+ ### Q4:能批量删除角色/动作吗?
76
+
77
+ **不能**。permission-sync 仅新增不删除(防误删)。删除请走后端管理界面手动操作。
78
+
79
+ ---
80
+
81
+ ## 配置要点
82
+
83
+ 只需 `.github/skills/sync/env.local.json` 的根字段:
84
+
85
+ ```json
86
+ {
87
+ "gatewayPath": "http://你的网关:端口",
88
+ "sysAppNo": "应用编码",
89
+ "token": "Bearer Token"
90
+ }
91
+ ```
92
+
93
+ 不需要额外配置 `parentRoleId` / `parentPermissionId` 之类——所有父级 id 由 AI 在执行流程中通过查询接口动态获取。
@@ -1,57 +1,57 @@
1
- # 01 — 工具链前置检测
2
-
3
- > **强制度**:🔴 阻断式。检测未通过 → AI 必须暂停代码生成。
4
-
5
- ---
6
-
7
- ## 检测目标
8
-
9
- 确认项目已正确安装 `@robot-admin/git-standards`,工具链有效。
10
-
11
- ## 检测项
12
-
13
- AI 在执行任何代码生成任务**之前**,必须检查以下三个特征文件是否存在于项目根目录:
14
-
15
- ```
16
- ✓ .prettierrc.js
17
- ✓ eslint.config.ts
18
- ✓ .husky/ (目录)
19
- ```
20
-
21
- ## 判定规则
22
-
23
- | 状态 | 处理 |
24
- | ------------ | --------------------------- |
25
- | 三者全部存在 | ✅ 工具链就绪,继续执行任务 |
26
- | 缺任意一个 | ❌ 暂停任务,输出下方提示 |
27
-
28
- ## 暂停提示标准格式
29
-
30
- ```
31
- ❌ 工具链检测失败:未找到 .prettierrc.js / eslint.config.ts / .husky/
32
- → 请执行:npx @robot-admin/git-standards init
33
- → 或联系 CHENY(工号 409322)解决
34
- → ⛔ 代码生成已暂停,修复后重新触发
35
- ```
36
-
37
- ## Pre-flight 声明示例
38
-
39
- 工具链就绪:
40
-
41
- ```
42
- ✅ 工具链检测:.prettierrc.js ✓ eslint.config.ts ✓ .husky/ ✓ [全部就绪]
43
- ```
44
-
45
- 工具链缺失:
46
-
47
- ```
48
- ❌ 工具链检测:未检测到 .husky/ → 已暂停,提醒已发出
49
- ```
50
-
51
- ---
52
-
53
- ## 为什么必须前置
54
-
55
- - `eslint.config.ts` 缺失 → 代码风格无法约束,AI 生成代码可能不通过 lint
56
- - `.prettierrc.js` 缺失 → 格式不统一,团队协作冲突
57
- - `.husky/` 缺失 → 提交前钩子失效,console.log / 死代码会进入仓库
1
+ # 01 — 工具链前置检测
2
+
3
+ > **强制度**:🔴 阻断式。检测未通过 → AI 必须暂停代码生成。
4
+
5
+ ---
6
+
7
+ ## 检测目标
8
+
9
+ 确认项目已正确安装 `@robot-admin/git-standards`,工具链有效。
10
+
11
+ ## 检测项
12
+
13
+ AI 在执行任何代码生成任务**之前**,必须检查以下三个特征文件是否存在于项目根目录:
14
+
15
+ ```
16
+ ✓ .prettierrc.js
17
+ ✓ eslint.config.ts
18
+ ✓ .husky/ (目录)
19
+ ```
20
+
21
+ ## 判定规则
22
+
23
+ | 状态 | 处理 |
24
+ | ------------ | --------------------------- |
25
+ | 三者全部存在 | ✅ 工具链就绪,继续执行任务 |
26
+ | 缺任意一个 | ❌ 暂停任务,输出下方提示 |
27
+
28
+ ## 暂停提示标准格式
29
+
30
+ ```
31
+ ❌ 工具链检测失败:未找到 .prettierrc.js / eslint.config.ts / .husky/
32
+ → 请执行:npx @robot-admin/git-standards init
33
+ → 或联系 CHENY(工号 409322)解决
34
+ → ⛔ 代码生成已暂停,修复后重新触发
35
+ ```
36
+
37
+ ## Pre-flight 声明示例
38
+
39
+ 工具链就绪:
40
+
41
+ ```
42
+ ✅ 工具链检测:.prettierrc.js ✓ eslint.config.ts ✓ .husky/ ✓ [全部就绪]
43
+ ```
44
+
45
+ 工具链缺失:
46
+
47
+ ```
48
+ ❌ 工具链检测:未检测到 .husky/ → 已暂停,提醒已发出
49
+ ```
50
+
51
+ ---
52
+
53
+ ## 为什么必须前置
54
+
55
+ - `eslint.config.ts` 缺失 → 代码风格无法约束,AI 生成代码可能不通过 lint
56
+ - `.prettierrc.js` 缺失 → 格式不统一,团队协作冲突
57
+ - `.husky/` 缺失 → 提交前钩子失效,console.log / 死代码会进入仓库
@@ -1,111 +1,111 @@
1
- # 02 — 代码结构与顺序规范
2
-
3
- > **强制度**:🔴 必遵。AI 生成代码必须严格按下列顺序输出。
4
-
5
- ---
6
-
7
- ## 4 文件原则(页面目录强制结构)
8
-
9
- ```
10
- src/views/[域]/[模块]/[子模块]/[kebab-case目录]/
11
- ├── index.vue ← 纯模板 + 解构,不写业务逻辑
12
- ├── data.ts ← AbstractPageQueryHook 类 + API_CONFIG
13
- ├── index.scss ← 页面样式(可为空)
14
- └── api.md ← 接口约定文档
15
- ```
16
-
17
- **禁止**:把业务逻辑写在 index.vue;缺少 data.ts;缺少 api.md。
18
-
19
- ## 弹窗组件归属
20
-
21
- | 场景 | 位置 |
22
- | ----------------------- | ------------------------------------ |
23
- | 通用弹窗(2+ 页面复用) | `src/components/local/c_xxxModal/` |
24
- | 极个性弹窗(仅单页面) | 页面目录下 `components/xxxModal.vue` |
25
-
26
- ---
27
-
28
- ## index.vue 三段式(顺序固定,不可调换)
29
-
30
- ```vue
31
- <template>
32
- <!-- 纯模板 + 组件组合 -->
33
- </template>
34
-
35
- <script setup lang="ts">
36
- /* 业务逻辑全部从 data.ts 导入,按下方 9 段式 */
37
- </script>
38
-
39
- <style scoped lang="scss">
40
- @import "./index.scss";
41
- /* 仅允许这一行 import,全部样式写在 index.scss */
42
- </style>
43
- ```
44
-
45
- ---
46
-
47
- ## `<script setup>` 9 段式(按需使用,用到的必须遵守此顺序)
48
-
49
- ```typescript
50
- // ===== 1. import 语句(外部库 → 内部模块 → 类型)=====
51
- import { ref, computed, onMounted } from "vue";
52
- import { createPage } from "./data";
53
-
54
- // ===== 2. 组件宏(defineOptions / defineProps / defineEmits)=====
55
- defineOptions({ name: "PageName" });
56
-
57
- // ===== 3. 路由 & Store =====
58
- const route = useRoute();
59
-
60
- // ===== 4. createPage() 调用 + 解构(核心模式)=====
61
- const Page = createPage();
62
- const {
63
- tableRef,
64
- page,
65
- queryParam,
66
- list,
67
- queryItems,
68
- columns,
69
- toolbars,
70
- select,
71
- } = Page;
72
-
73
- // ===== 5. 页面补充状态(ref / reactive / computed)=====
74
- const loading = ref(false);
75
-
76
- // ===== 6. watch / watchEffect =====
77
-
78
- // ===== 7. 业务方法(API 调用 / 事件处理)=====
79
- async function handleSubmit() {}
80
-
81
- // ===== 8. 生命周期 =====
82
- onMounted(() => select());
83
-
84
- // ===== 9. defineExpose =====
85
- defineExpose({ select });
86
- ```
87
-
88
- ---
89
-
90
- ## data.ts 内部顺序(强制)
91
-
92
- ```typescript
93
- // 1. import(类型 → 基类 → API 工具 → 工具函数)
94
- // 2. API_CONFIG(接口路径集中声明,as const)
95
- // 3. createPage()(constructor → queryDef → toolbarDef → columnsDef → 业务方法)
96
- // 4. 页面共用辅助函数(可选,纯函数)
97
- ```
98
-
99
- ---
100
-
101
- ## index.scss 顺序(建议)
102
-
103
- ```scss
104
- // 1. 变量覆盖
105
- // 2. 容器级样式 (.app-page-container)
106
- // 3. 区域级样式 (.search-area / .table-area)
107
- // 4. 组件深层覆盖 (:deep(.el-table))
108
- // 5. 响应式 (@media)
109
- ```
110
-
111
- > 禁止 `::v-deep` / `/deep/`,统一使用 `:deep()`。
1
+ # 02 — 代码结构与顺序规范
2
+
3
+ > **强制度**:🔴 必遵。AI 生成代码必须严格按下列顺序输出。
4
+
5
+ ---
6
+
7
+ ## 4 文件原则(页面目录强制结构)
8
+
9
+ ```
10
+ src/views/[域]/[模块]/[子模块]/[kebab-case目录]/
11
+ ├── index.vue ← 纯模板 + 解构,不写业务逻辑
12
+ ├── data.ts ← AbstractPageQueryHook 类 + API_CONFIG
13
+ ├── index.scss ← 页面样式(可为空)
14
+ └── api.md ← 接口约定文档
15
+ ```
16
+
17
+ **禁止**:把业务逻辑写在 index.vue;缺少 data.ts;缺少 api.md。
18
+
19
+ ## 弹窗组件归属
20
+
21
+ | 场景 | 位置 |
22
+ | ----------------------- | ------------------------------------ |
23
+ | 通用弹窗(2+ 页面复用) | `src/components/local/c_xxxModal/` |
24
+ | 极个性弹窗(仅单页面) | 页面目录下 `components/xxxModal.vue` |
25
+
26
+ ---
27
+
28
+ ## index.vue 三段式(顺序固定,不可调换)
29
+
30
+ ```vue
31
+ <template>
32
+ <!-- 纯模板 + 组件组合 -->
33
+ </template>
34
+
35
+ <script setup lang="ts">
36
+ /* 业务逻辑全部从 data.ts 导入,按下方 9 段式 */
37
+ </script>
38
+
39
+ <style scoped lang="scss">
40
+ @import "./index.scss";
41
+ /* 仅允许这一行 import,全部样式写在 index.scss */
42
+ </style>
43
+ ```
44
+
45
+ ---
46
+
47
+ ## `<script setup>` 9 段式(按需使用,用到的必须遵守此顺序)
48
+
49
+ ```typescript
50
+ // ===== 1. import 语句(外部库 → 内部模块 → 类型)=====
51
+ import { ref, computed, onMounted } from "vue";
52
+ import { createPage } from "./data";
53
+
54
+ // ===== 2. 组件宏(defineOptions / defineProps / defineEmits)=====
55
+ defineOptions({ name: "PageName" });
56
+
57
+ // ===== 3. 路由 & Store =====
58
+ const route = useRoute();
59
+
60
+ // ===== 4. createPage() 调用 + 解构(核心模式)=====
61
+ const Page = createPage();
62
+ const {
63
+ tableRef,
64
+ page,
65
+ queryParam,
66
+ list,
67
+ queryItems,
68
+ columns,
69
+ toolbars,
70
+ select,
71
+ } = Page;
72
+
73
+ // ===== 5. 页面补充状态(ref / reactive / computed)=====
74
+ const loading = ref(false);
75
+
76
+ // ===== 6. watch / watchEffect =====
77
+
78
+ // ===== 7. 业务方法(API 调用 / 事件处理)=====
79
+ async function handleSubmit() {}
80
+
81
+ // ===== 8. 生命周期 =====
82
+ onMounted(() => select());
83
+
84
+ // ===== 9. defineExpose =====
85
+ defineExpose({ select });
86
+ ```
87
+
88
+ ---
89
+
90
+ ## data.ts 内部顺序(强制)
91
+
92
+ ```typescript
93
+ // 1. import(类型 → 基类 → API 工具 → 工具函数)
94
+ // 2. API_CONFIG(接口路径集中声明,as const)
95
+ // 3. createPage()(constructor → queryDef → toolbarDef → columnsDef → 业务方法)
96
+ // 4. 页面共用辅助函数(可选,纯函数)
97
+ ```
98
+
99
+ ---
100
+
101
+ ## index.scss 顺序(建议)
102
+
103
+ ```scss
104
+ // 1. 变量覆盖
105
+ // 2. 容器级样式 (.app-page-container)
106
+ // 3. 区域级样式 (.search-area / .table-area)
107
+ // 4. 组件深层覆盖 (:deep(.el-table))
108
+ // 5. 响应式 (@media)
109
+ ```
110
+
111
+ > 禁止 `::v-deep` / `/deep/`,统一使用 `:deep()`。
@@ -1,53 +1,53 @@
1
- # 03 — 注释规范
2
-
3
- > **强制度**:🟡 建议。
4
-
5
- ---
6
-
7
- ## 文件头注释
8
-
9
- 由 VS Code 插件 **koroFileHeader** 自动生成,不手写。
10
- 项目根有 `.fileheader` 配置文件。
11
-
12
- **插件缺失提示**:
13
-
14
- ```
15
- ⚠️ 未检测到 koroFileHeader 配置生效
16
- → 请安装插件:VS Code 扩展商店搜索 "koroFileHeader"
17
- → 或联系 CHENY(工号 409322)获取一键安装指引
18
- ```
19
-
20
- ---
21
-
22
- ## 函数注释
23
-
24
- 仅复杂业务逻辑需要:
25
-
26
- ```typescript
27
- /**
28
- * @description 批量提交客户档案
29
- * @param ids 选中的客户 ID 列表
30
- * @returns 后端响应结果
31
- */
32
- async function batchSubmit(ids: string[]) { ... }
33
- ```
34
-
35
- ---
36
-
37
- ## 行内注释
38
-
39
- - 解释「**为什么**」而非「是什么」
40
- - 统一使用 `//`,不使用 `/* */`
41
-
42
- ```typescript
43
- // 后端要求 status 必须先转字符串再传(接口字段类型不一致历史遗留)
44
- params.status = String(params.status);
45
- ```
46
-
47
- ---
48
-
49
- ## 禁止事项
50
-
51
- - ❌ 提交注释掉的死代码(直接删除,git 可追溯历史)
52
- - ❌ 显而易见的注释,如 `// 声明变量`、`// 调用接口`
53
- - ❌ TODO 不带责任人或日期,如 `// TODO: 待优化`,应写为 `// TODO(cheny, 2026-04): 接口字段后端确认中`
1
+ # 03 — 注释规范
2
+
3
+ > **强制度**:🟡 建议。
4
+
5
+ ---
6
+
7
+ ## 文件头注释
8
+
9
+ 由 VS Code 插件 **koroFileHeader** 自动生成,不手写。
10
+ 项目根有 `.fileheader` 配置文件。
11
+
12
+ **插件缺失提示**:
13
+
14
+ ```
15
+ ⚠️ 未检测到 koroFileHeader 配置生效
16
+ → 请安装插件:VS Code 扩展商店搜索 "koroFileHeader"
17
+ → 或联系 CHENY(工号 409322)获取一键安装指引
18
+ ```
19
+
20
+ ---
21
+
22
+ ## 函数注释
23
+
24
+ 仅复杂业务逻辑需要:
25
+
26
+ ```typescript
27
+ /**
28
+ * @description 批量提交客户档案
29
+ * @param ids 选中的客户 ID 列表
30
+ * @returns 后端响应结果
31
+ */
32
+ async function batchSubmit(ids: string[]) { ... }
33
+ ```
34
+
35
+ ---
36
+
37
+ ## 行内注释
38
+
39
+ - 解释「**为什么**」而非「是什么」
40
+ - 统一使用 `//`,不使用 `/* */`
41
+
42
+ ```typescript
43
+ // 后端要求 status 必须先转字符串再传(接口字段类型不一致历史遗留)
44
+ params.status = String(params.status);
45
+ ```
46
+
47
+ ---
48
+
49
+ ## 禁止事项
50
+
51
+ - ❌ 提交注释掉的死代码(直接删除,git 可追溯历史)
52
+ - ❌ 显而易见的注释,如 `// 声明变量`、`// 调用接口`
53
+ - ❌ TODO 不带责任人或日期,如 `// TODO: 待优化`,应写为 `// TODO(cheny, 2026-04): 接口字段后端确认中`
@@ -1,33 +1,33 @@
1
- # 04 — 基础编码规范
2
-
3
- > **强制度**:🔴 必遵。
4
- > 参考 jhat.tech 开发规范 + Robot_Admin 实践。
5
-
6
- ---
7
-
8
- ## 13 条核心约定
9
-
10
- 1. **变量声明**:优先 `const`,必须重新赋值时用 `let`,禁止 `var`
11
- 2. **解构赋值**:优先使用 `const { a, b } = obj`,而非 `obj.a` / `obj.b`
12
- 3. **异步处理**:统一 `async/await`,禁止 `.then()` 链式调用
13
- 4. **字符串引号**:统一单引号(以 `.prettierrc.js` 为准)
14
- 5. **模板字符串**:替代字符串拼接,`` `Hello ${name}` `` 而非 `'Hello ' + name`
15
- 6. **大括号**:所有代码块必须使用大括号包裹,即使只有一行
16
- 7. **条件层级**:最多三层,超过三层必须抽成函数
17
- 8. **模板表达式**:`<template>` 中只写简单表达式,复杂逻辑提取为 `computed` 或方法
18
- 9. **对象遍历**:禁止 `for...in`,使用 `Object.keys(obj).forEach()`
19
- 10. **undefined 判断**:使用 `typeof variable !== 'undefined'`
20
- 11. **v-for**:必须设置 `:key`,优先用业务主键 id 而非 index
21
- 12. **指令缩写**:统一 `:`(v-bind)、`@`(v-on)、`#`(v-slot)
22
- 13. **this 别名**:`<script setup>` 中无 `this`;旧 Options API 中的 `this` 别名用 `self`
23
-
24
- ---
25
-
26
- ## 全局禁止事项
27
-
28
- - ❌ index.vue 中写业务逻辑(逻辑全在 data.ts)
29
- - ❌ 使用 Vuex(本项目用 Pinia)
30
- - ❌ `::v-deep` / `/deep/`(用 `:deep()`)
31
- - ❌ 直接用 axios(用 getAction/postAction,详见 13-platform-components.md)
32
- - ❌ 手写查询表单/工具栏/分页(用 BaseQuery/BaseToolbar/jh-pagination)
33
- - ❌ 每个页面重复写弹窗(优先用 `c_modal` / `c_formModal` 等局部公共组件)
1
+ # 04 — 基础编码规范
2
+
3
+ > **强制度**:🔴 必遵。
4
+ > 参考 jhat.tech 开发规范 + Robot_Admin 实践。
5
+
6
+ ---
7
+
8
+ ## 13 条核心约定
9
+
10
+ 1. **变量声明**:优先 `const`,必须重新赋值时用 `let`,禁止 `var`
11
+ 2. **解构赋值**:优先使用 `const { a, b } = obj`,而非 `obj.a` / `obj.b`
12
+ 3. **异步处理**:统一 `async/await`,禁止 `.then()` 链式调用
13
+ 4. **字符串引号**:统一单引号(以 `.prettierrc.js` 为准)
14
+ 5. **模板字符串**:替代字符串拼接,`` `Hello ${name}` `` 而非 `'Hello ' + name`
15
+ 6. **大括号**:所有代码块必须使用大括号包裹,即使只有一行
16
+ 7. **条件层级**:最多三层,超过三层必须抽成函数
17
+ 8. **模板表达式**:`<template>` 中只写简单表达式,复杂逻辑提取为 `computed` 或方法
18
+ 9. **对象遍历**:禁止 `for...in`,使用 `Object.keys(obj).forEach()`
19
+ 10. **undefined 判断**:使用 `typeof variable !== 'undefined'`
20
+ 11. **v-for**:必须设置 `:key`,优先用业务主键 id 而非 index
21
+ 12. **指令缩写**:统一 `:`(v-bind)、`@`(v-on)、`#`(v-slot)
22
+ 13. **this 别名**:`<script setup>` 中无 `this`;旧 Options API 中的 `this` 别名用 `self`
23
+
24
+ ---
25
+
26
+ ## 全局禁止事项
27
+
28
+ - ❌ index.vue 中写业务逻辑(逻辑全在 data.ts)
29
+ - ❌ 使用 Vuex(本项目用 Pinia)
30
+ - ❌ `::v-deep` / `/deep/`(用 `:deep()`)
31
+ - ❌ 直接用 axios(用 getAction/postAction,详见 13-platform-components.md)
32
+ - ❌ 手写查询表单/工具栏/分页(用 BaseQuery/BaseToolbar/jh-pagination)
33
+ - ❌ 每个页面重复写弹窗(优先用 `c_modal` / `c_formModal` 等局部公共组件)