ai-engineering-init 1.4.3 → 1.6.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 (131) hide show
  1. package/.cursor/skills/bug-detective/SKILL.md +19 -19
  2. package/.cursor/skills/project-navigator/SKILL.md +164 -258
  3. package/README.md +20 -236
  4. package/bin/index.js +437 -7
  5. package/package.json +7 -1
  6. package/scripts/build-skills.js +180 -0
  7. package/src/platform-map.json +56 -0
  8. package/src/skills/add-skill/SKILL.md +488 -0
  9. package/src/skills/add-todo/SKILL.md +269 -0
  10. package/src/skills/api-development/SKILL.md +266 -0
  11. package/src/skills/architecture-design/SKILL.md +262 -0
  12. package/src/skills/backend-annotations/SKILL.md +302 -0
  13. package/src/skills/banana-image/CHANGELOG.md +37 -0
  14. package/src/skills/banana-image/README.md +146 -0
  15. package/src/skills/banana-image/SKILL.md +171 -0
  16. package/src/skills/banana-image/assets/logo.png +0 -0
  17. package/src/skills/banana-image/references/advanced-usage.md +189 -0
  18. package/src/skills/banana-image/scripts/apply_template.py +125 -0
  19. package/src/skills/banana-image/scripts/banana_image_exec.ts +412 -0
  20. package/src/skills/banana-image/scripts/batch_prep.py +82 -0
  21. package/src/skills/banana-image/scripts/package-lock.json +1437 -0
  22. package/src/skills/banana-image/scripts/package.json +18 -0
  23. package/src/skills/banana-image/scripts/requirements.txt +10 -0
  24. package/src/skills/banana-image/templates/poster.json +22 -0
  25. package/src/skills/banana-image/templates/product.json +17 -0
  26. package/src/skills/banana-image/templates/social.json +22 -0
  27. package/src/skills/banana-image/templates/thumbnail.json +17 -0
  28. package/src/skills/brainstorm/SKILL.md +216 -0
  29. package/src/skills/bug-detective/SKILL.md +256 -0
  30. package/src/skills/bug-detective/references/error-patterns.md +242 -0
  31. package/src/skills/check/SKILL.md +367 -0
  32. package/src/skills/code-patterns/SKILL.md +280 -0
  33. package/src/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  34. package/src/skills/codex-code-review/SKILL.md +135 -0
  35. package/src/skills/collaborating-with-codex/SKILL.md +174 -0
  36. package/src/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
  37. package/src/skills/collaborating-with-gemini/SKILL.md +194 -0
  38. package/src/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
  39. package/src/skills/crud/SKILL.md +265 -0
  40. package/src/skills/crud-development/SKILL.md +409 -0
  41. package/src/skills/data-permission/SKILL.md +292 -0
  42. package/src/skills/data-permission/references/custom-data-scope.md +90 -0
  43. package/src/skills/database-ops/SKILL.md +407 -0
  44. package/src/skills/dev/SKILL.md +187 -0
  45. package/src/skills/error-handler/SKILL.md +371 -0
  46. package/src/skills/file-oss-management/SKILL.md +255 -0
  47. package/src/skills/file-oss-management/references/entities.md +105 -0
  48. package/src/skills/file-oss-management/references/service-impl.md +104 -0
  49. package/src/skills/git-workflow/SKILL.md +397 -0
  50. package/src/skills/init-docs/SKILL.md +194 -0
  51. package/src/skills/json-serialization/SKILL.md +357 -0
  52. package/src/skills/leniu-api-development/SKILL.md +319 -0
  53. package/src/skills/leniu-api-development/references/real-examples.md +273 -0
  54. package/src/skills/leniu-architecture-design/SKILL.md +383 -0
  55. package/src/skills/leniu-backend-annotations/SKILL.md +277 -0
  56. package/src/skills/leniu-brainstorm/SKILL.md +242 -0
  57. package/src/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  58. package/src/skills/leniu-code-patterns/SKILL.md +411 -0
  59. package/src/skills/leniu-crud-development/SKILL.md +404 -0
  60. package/src/skills/leniu-crud-development/references/templates.md +597 -0
  61. package/src/skills/leniu-customization-location/SKILL.md +410 -0
  62. package/src/skills/leniu-data-permission/SKILL.md +341 -0
  63. package/src/skills/leniu-database-ops/SKILL.md +426 -0
  64. package/src/skills/leniu-error-handler/SKILL.md +462 -0
  65. package/src/skills/leniu-java-amount-handling/SKILL.md +461 -0
  66. package/src/skills/leniu-java-code-style/SKILL.md +510 -0
  67. package/src/skills/leniu-java-concurrent/SKILL.md +400 -0
  68. package/src/skills/leniu-java-entity/SKILL.md +237 -0
  69. package/src/skills/leniu-java-entity/references/templates.md +237 -0
  70. package/src/skills/leniu-java-export/SKILL.md +570 -0
  71. package/src/skills/leniu-java-logging/SKILL.md +229 -0
  72. package/src/skills/leniu-java-logging/references/data-mask.md +46 -0
  73. package/src/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  74. package/src/skills/leniu-java-mq/SKILL.md +338 -0
  75. package/src/skills/leniu-java-mybatis/SKILL.md +267 -0
  76. package/src/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  77. package/src/skills/leniu-java-report-query-param/SKILL.md +291 -0
  78. package/src/skills/leniu-java-task/SKILL.md +367 -0
  79. package/src/skills/leniu-java-total-line/SKILL.md +196 -0
  80. package/src/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
  81. package/src/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
  82. package/src/skills/leniu-mealtime/SKILL.md +215 -0
  83. package/src/skills/leniu-redis-cache/SKILL.md +331 -0
  84. package/src/skills/leniu-report-customization/SKILL.md +335 -0
  85. package/src/skills/leniu-report-customization/references/table-fields.md +93 -0
  86. package/src/skills/leniu-report-standard-customization/SKILL.md +328 -0
  87. package/src/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  88. package/src/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  89. package/src/skills/leniu-security-guard/SKILL.md +306 -0
  90. package/src/skills/leniu-utils-toolkit/SKILL.md +380 -0
  91. package/src/skills/mysql-debug/SKILL.md +364 -0
  92. package/src/skills/next/SKILL.md +137 -0
  93. package/src/skills/openspec-apply-change/SKILL.md +165 -0
  94. package/src/skills/openspec-archive-change/SKILL.md +122 -0
  95. package/src/skills/openspec-bulk-archive-change/SKILL.md +254 -0
  96. package/src/skills/openspec-continue-change/SKILL.md +126 -0
  97. package/src/skills/openspec-explore/SKILL.md +299 -0
  98. package/src/skills/openspec-ff-change/SKILL.md +109 -0
  99. package/src/skills/openspec-new-change/SKILL.md +82 -0
  100. package/src/skills/openspec-onboard/SKILL.md +414 -0
  101. package/src/skills/openspec-sync-specs/SKILL.md +146 -0
  102. package/src/skills/openspec-verify-change/SKILL.md +176 -0
  103. package/src/skills/performance-doctor/SKILL.md +303 -0
  104. package/src/skills/progress/SKILL.md +193 -0
  105. package/src/skills/project-navigator/SKILL.md +211 -0
  106. package/src/skills/redis-cache/SKILL.md +333 -0
  107. package/src/skills/redis-cache/references/listeners.md +23 -0
  108. package/src/skills/scheduled-jobs/SKILL.md +314 -0
  109. package/src/skills/security-guard/SKILL.md +353 -0
  110. package/src/skills/security-guard/references/encrypt-config.md +103 -0
  111. package/src/skills/security-guard/references/sensitive-strategies.md +42 -0
  112. package/src/skills/sms-mail/SKILL.md +308 -0
  113. package/src/skills/sms-mail/references/mail-config.md +88 -0
  114. package/src/skills/sms-mail/references/sms-config.md +74 -0
  115. package/src/skills/social-login/SKILL.md +266 -0
  116. package/src/skills/social-login/references/provider-configs.md +118 -0
  117. package/src/skills/start/SKILL.md +154 -0
  118. package/src/skills/store-pc/SKILL.md +366 -0
  119. package/src/skills/sync/SKILL.md +149 -0
  120. package/src/skills/task-tracker/SKILL.md +307 -0
  121. package/src/skills/tech-decision/SKILL.md +393 -0
  122. package/src/skills/tenant-management/SKILL.md +288 -0
  123. package/src/skills/tenant-management/references/tenant-scenarios.md +91 -0
  124. package/src/skills/test-development/SKILL.md +301 -0
  125. package/src/skills/test-development/references/parameterized-examples.md +119 -0
  126. package/src/skills/ui-pc/SKILL.md +438 -0
  127. package/src/skills/update-status/SKILL.md +159 -0
  128. package/src/skills/utils-toolkit/SKILL.md +362 -0
  129. package/src/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  130. package/src/skills/websocket-sse/SKILL.md +271 -0
  131. package/src/skills/workflow-engine/SKILL.md +321 -0
@@ -0,0 +1,119 @@
1
+ # 参数化测试完整示例
2
+
3
+ ## @ValueSource
4
+
5
+ ```java
6
+ @ParameterizedTest
7
+ @ValueSource(strings = {"t1", "t2", "t3"})
8
+ public void testStringValues(String str) {
9
+ Assertions.assertNotNull(str);
10
+ }
11
+
12
+ @ParameterizedTest
13
+ @ValueSource(ints = {1, 2, 3, 4, 5})
14
+ public void testIntValues(int num) {
15
+ Assertions.assertTrue(num > 0);
16
+ }
17
+ ```
18
+
19
+ ## @NullSource / @NullAndEmptySource
20
+
21
+ ```java
22
+ @ParameterizedTest
23
+ @NullSource
24
+ public void testNullSource(String str) {
25
+ Assertions.assertNull(str);
26
+ }
27
+
28
+ @ParameterizedTest
29
+ @NullAndEmptySource
30
+ @ValueSource(strings = {" ", "\t", "\n"})
31
+ public void testBlankStrings(String input) {
32
+ Assertions.assertTrue(input == null || input.isBlank());
33
+ }
34
+ ```
35
+
36
+ ## @EnumSource
37
+
38
+ ```java
39
+ @ParameterizedTest
40
+ @EnumSource(UserType.class)
41
+ public void testEnumSource(UserType type) {
42
+ Assertions.assertNotNull(type.getUserType());
43
+ }
44
+ ```
45
+
46
+ ## @CsvSource
47
+
48
+ ```java
49
+ @ParameterizedTest
50
+ @CsvSource({
51
+ "1, Banner, 横幅广告",
52
+ "2, Popup, 弹窗广告"
53
+ })
54
+ public void testCsvData(String code, String name, String desc) {
55
+ Assertions.assertNotNull(code);
56
+ Assertions.assertNotNull(name);
57
+ }
58
+ ```
59
+
60
+ ## @MethodSource
61
+
62
+ ```java
63
+ @ParameterizedTest
64
+ @MethodSource("getParam")
65
+ public void testMethodSource(String str) {
66
+ Assertions.assertNotNull(str);
67
+ }
68
+
69
+ public static Stream<String> getParam() {
70
+ return Stream.of("t1", "t2", "t3");
71
+ }
72
+ ```
73
+
74
+ ## 生命周期注解
75
+
76
+ ```java
77
+ @BeforeAll static void beforeAll() { } // 所有测试前执行一次
78
+ @BeforeEach void beforeEach() { } // 每个测试前执行
79
+ @AfterEach void afterEach() { } // 每个测试后执行
80
+ @AfterAll static void afterAll() { } // 所有测试后执行一次
81
+ ```
82
+
83
+ ## 标签分组完整示例
84
+
85
+ ```java
86
+ @SpringBootTest
87
+ @DisplayName("标签单元测试")
88
+ public class TagUnitTest {
89
+
90
+ @Test @Tag("dev")
91
+ @DisplayName("dev 环境测试")
92
+ public void testTagDev() { }
93
+
94
+ @Test @Tag("prod")
95
+ @DisplayName("prod 环境测试")
96
+ public void testTagProd() { }
97
+
98
+ @Test @Tag("local")
99
+ @DisplayName("local 环境测试")
100
+ public void testTagLocal() { }
101
+ }
102
+ ```
103
+
104
+ 运行指定标签:
105
+ ```bash
106
+ mvn test -Dgroups=dev
107
+ mvn test -DexcludedGroups=exclude
108
+ ```
109
+
110
+ ## Spring 集成测试注解速查
111
+
112
+ ```java
113
+ @SpringBootTest // 启动完整 Spring 容器
114
+ @Transactional // 测试后自动回滚
115
+ @AutoConfigureMockMvc // 自动配置 MockMvc
116
+ @Disabled // 禁用测试
117
+ @Timeout(value = 2, unit = SECONDS) // 超时限制
118
+ @RepeatedTest(3) // 重复执行 3 次
119
+ ```
@@ -0,0 +1,438 @@
1
+ ---
2
+ name: ui-pc
3
+ description: |
4
+ 前端组件库指南。包含公共组件、业务组件、Element UI 组件使用。
5
+
6
+ 触发场景:
7
+ - 开发前端后台管理页面
8
+ - 使用 Element UI 组件
9
+ - 表格、表单、弹窗、图表等前端 UI
10
+ - 使用 leniu-components 业务组件
11
+ - 前端权限控制、国际化
12
+
13
+ 触发词:el-、el-table、el-form、el-dialog、leniu-page、leniu-table、前端组件、后台页面、v-hasPerm
14
+
15
+ 适用目录:/Users/xujiajun/Developer/frontProj/web/src/**
16
+ ---
17
+
18
+ # 前端组件库指南
19
+
20
+ > **适用于**: 腾云智慧食堂管理系统前端项目(Vue 2.7.16 + Element UI 2.15.9)
21
+ >
22
+ > **前端项目路径**: `/Users/xujiajun/Developer/frontProj/web`
23
+
24
+ ---
25
+
26
+ ## 目录结构
27
+
28
+ ```
29
+ src/
30
+ ├── components/ # 公共组件(~87个)
31
+ ├── leniu-components/ # 业务组件(10个核心组件)
32
+ ├── layout/ # 布局组件(Navbar/Sidebar/AppMain)
33
+ ├── directive/ # 自定义指令(11个)
34
+ └── mixins/ # 全局混入(5个)
35
+ ```
36
+
37
+ ---
38
+
39
+ ## 业务组件(leniu-components)
40
+
41
+ | 组件 | 路径 | 用途 |
42
+ |------|------|------|
43
+ | `leniu-page` | `leniu-components/leniu-page` | 页面布局容器(所有业务页面必用) |
44
+ | `leniu-search` | `leniu-components/leniu-search` | 搜索组件(列表页搜索) |
45
+ | `leniu-table` | `leniu-components/leniu-table` | 增强表格组件 |
46
+ | `leniu-form` | `leniu-components/leniu-form` | 表单组件 |
47
+ | `leniu-form-item` | `leniu-components/leniu-form-item` | 表单项组件 |
48
+ | `leniu-form-dialog` | `leniu-components/leniu-form-dialog` | 弹窗表单(新增/编辑) |
49
+ | `leniu-form-panel` | `leniu-components/leniu-form-panel` | 面板表单(详情展示) |
50
+ | `leniu-button-list` | `leniu-components/leniu-button-list` | 按钮组 |
51
+ | `leniu-table-toolbar` | `leniu-components/leniu-table-toolbar` | 表格工具栏 |
52
+
53
+ ---
54
+
55
+ ## 常用公共组件(components)
56
+
57
+ | 组件 | 用途 |
58
+ |------|------|
59
+ | `Pagination` | 分页组件 |
60
+ | `CollapseSearch` | 折叠搜索区域 |
61
+ | `Breadcrumb` | 面包屑导航 |
62
+ | `Dropzone` | 文件拖拽上传 |
63
+ | `ImageCropper` | 图片裁剪 |
64
+ | `Tinymce` | 富文本编辑器 |
65
+ | `UploadImageList` | 图片上传列表 |
66
+
67
+ ---
68
+
69
+ ## 全局原型方法(main.js 挂载)
70
+
71
+ 在任意组件中可直接使用:
72
+
73
+ | 方法/属性 | 说明 | 示例 |
74
+ |----------|------|------|
75
+ | `this.money(fen)` | 分转元(保留2位小数) | `this.money(100)` → `'1.00'` |
76
+ | `this.accMul(val, 100)` | 精确乘法(元转分) | `this.accMul(1.5, 100)` → `150` |
77
+ | `this.parseTime(time, fmt)` | 格式化时间 | `this.parseTime(new Date(), '{y}-{m}-{d}')` |
78
+ | `this.$echarts` | ECharts 实例 | `this.$echarts.init(el)` |
79
+ | `this.$hasPerm(['xxx:add'])` | 权限判断(JS中) | 返回 true/false |
80
+ | `this.isDevEnv` | 是否纯本地开发环境 | true/false |
81
+ | `this.isDevTestEnv` | 是否开发测试环境 | 含 dev/test 域名 |
82
+ | `this._` | Lodash 工具库 | `this._.debounce(fn, 300)` |
83
+ | `this.validators` | 表单校验规则集 | `this.validators.required()` |
84
+ | `this.inputRules` | 输入过滤规则 | `this.inputRules.number(val)` |
85
+ | `this.CNEN` | 中英文拼接工具 | 根据 i18n 拼接 |
86
+
87
+ ---
88
+
89
+ ## 自定义指令(directive)
90
+
91
+ ```vue
92
+ <!-- 按钮权限(最常用)-->
93
+ <el-button v-hasPerm="['xxx:add']">新增</el-button>
94
+ <el-button v-hasPerm="['xxx:edit']">修改</el-button>
95
+ <el-button v-hasPerm="['xxx:remove']">删除</el-button>
96
+
97
+ <!-- 角色权限 -->
98
+ <el-button v-hasRole="['admin']">管理员按钮</el-button>
99
+ ```
100
+
101
+ ---
102
+
103
+ ## 国际化(i18n)
104
+
105
+ ```vue
106
+ <template>
107
+ <!-- 使用翻译 -->
108
+ <span>{{ $t('规则名称') }}</span>
109
+ <el-button>{{ $t('action.query') }}</el-button>
110
+ <el-button>{{ $t('新增') }}</el-button>
111
+ </template>
112
+ ```
113
+
114
+ > **注意**:语言文件在 `src/lang/` 目录,支持中文(zh)和英文(en)
115
+
116
+ ---
117
+
118
+ ## 全局 Mixin(mixins/index.js)
119
+
120
+ 所有组件自动混入,提供以下方法:
121
+
122
+ ```javascript
123
+ // 金额输入过滤(只允许数字和小数点)
124
+ this.oninput(value, decimalLimit, maxLength, maxValue)
125
+
126
+ // 只允许字母和数字
127
+ this.LetterAndNum(value, maxLength)
128
+
129
+ // 只允许数字
130
+ this.Num(value, maxLength)
131
+
132
+ // 获取当前时间戳字符串
133
+ this.getTimestamp()
134
+
135
+ // 获取图片完整URL
136
+ this.getUrl1(path) // 自动拼接 baseUrl
137
+ ```
138
+
139
+ ---
140
+
141
+ ## 标准列表页结构
142
+
143
+ ```vue
144
+ <template>
145
+ <page-slot>
146
+ <!-- 搜索区域 -->
147
+ <collapse-search slot="search">
148
+ <template v-slot:outerCol>
149
+ <el-col :span="6">
150
+ <el-form-item :label="$t('名称')">
151
+ <el-input v-model="listQuery.name" clearable />
152
+ </el-form-item>
153
+ </el-col>
154
+ <el-col :span="6">
155
+ <el-form-item :label="$t('状态')">
156
+ <el-select v-model="listQuery.status" clearable>
157
+ <el-option label="正常" value="1" />
158
+ <el-option label="停用" value="0" />
159
+ </el-select>
160
+ </el-form-item>
161
+ </el-col>
162
+ </template>
163
+ <el-button
164
+ slot="operate"
165
+ type="primary"
166
+ icon="el-icon-search"
167
+ @click="() => (page.current = 1) && getData()"
168
+ >
169
+ {{ $t('action.query') }}
170
+ </el-button>
171
+ </collapse-search>
172
+
173
+ <!-- 操作按钮 -->
174
+ <el-button
175
+ slot="tableTopLeft"
176
+ type="primary"
177
+ plain
178
+ icon="el-icon-plus"
179
+ v-hasPerm="['xxx:add']"
180
+ @click="handleAdd"
181
+ >
182
+ {{ $t('新增') }}
183
+ </el-button>
184
+
185
+ <!-- 表格 -->
186
+ <el-table
187
+ slot="table"
188
+ height="100%"
189
+ stripe
190
+ :data="tableData"
191
+ v-loading="loading"
192
+ >
193
+ <el-table-column prop="name" :label="$t('名称')" min-width="150" />
194
+ <el-table-column prop="status" :label="$t('状态')">
195
+ <template slot-scope="{ row }">
196
+ <el-tag :type="row.status === '1' ? 'success' : 'danger'">
197
+ {{ row.status === '1' ? '正常' : '停用' }}
198
+ </el-tag>
199
+ </template>
200
+ </el-table-column>
201
+ <el-table-column :label="$t('操作')" width="180" align="center">
202
+ <template slot-scope="{ row }">
203
+ <el-button type="text" @click="handleEdit(row)" v-hasPerm="['xxx:edit']">
204
+ {{ $t('修改') }}
205
+ </el-button>
206
+ <el-button type="text" @click="handleDelete(row)" v-hasPerm="['xxx:remove']">
207
+ {{ $t('删除') }}
208
+ </el-button>
209
+ </template>
210
+ </el-table-column>
211
+ </el-table>
212
+ </page-slot>
213
+ </template>
214
+
215
+ <script>
216
+ import { getList, del } from '@/api/xxx'
217
+
218
+ export default {
219
+ name: 'XxxList',
220
+ data() {
221
+ return {
222
+ loading: false,
223
+ tableData: [],
224
+ total: 0,
225
+ page: { current: 1, size: 20 },
226
+ listQuery: {
227
+ name: '',
228
+ status: ''
229
+ }
230
+ }
231
+ },
232
+ mounted() {
233
+ this.getData()
234
+ },
235
+ methods: {
236
+ async getData() {
237
+ this.loading = true
238
+ try {
239
+ const res = await getList({
240
+ page: this.page,
241
+ object: this.listQuery
242
+ })
243
+ this.tableData = res.records || []
244
+ this.total = res.total || 0
245
+ } finally {
246
+ this.loading = false
247
+ }
248
+ },
249
+ handleAdd() {
250
+ this.visible = true
251
+ this.form = {}
252
+ },
253
+ handleEdit(row) {
254
+ this.visible = true
255
+ this.form = { ...row }
256
+ },
257
+ handleDelete(row) {
258
+ this.$confirm('确定删除?', '提示', {
259
+ type: 'warning'
260
+ }).then(async () => {
261
+ await del(row.id)
262
+ this.$message.success('删除成功')
263
+ this.getData()
264
+ })
265
+ }
266
+ }
267
+ }
268
+ </script>
269
+ ```
270
+
271
+ ---
272
+
273
+ ## 标准表单弹窗
274
+
275
+ ```vue
276
+ <template>
277
+ <el-dialog
278
+ :title="form.id ? '编辑' : '新增'"
279
+ :visible.sync="visible"
280
+ width="600px"
281
+ @close="handleClose"
282
+ >
283
+ <el-form ref="form" :model="form" :rules="rules" label-width="100px">
284
+ <el-form-item label="名称" prop="name">
285
+ <el-input v-model="form.name" placeholder="请输入名称" />
286
+ </el-form-item>
287
+ <el-form-item label="状态" prop="status">
288
+ <el-radio-group v-model="form.status">
289
+ <el-radio label="1">正常</el-radio>
290
+ <el-radio label="0">停用</el-radio>
291
+ </el-radio-group>
292
+ </el-form-item>
293
+ </el-form>
294
+ <div slot="footer">
295
+ <el-button @click="visible = false">取消</el-button>
296
+ <el-button type="primary" :loading="submitting" @click="handleSubmit">
297
+ 确定
298
+ </el-button>
299
+ </div>
300
+ </el-dialog>
301
+ </template>
302
+
303
+ <script>
304
+ import { add, update } from '@/api/xxx'
305
+
306
+ export default {
307
+ name: 'XxxForm',
308
+ props: {
309
+ visible: Boolean,
310
+ data: Object
311
+ },
312
+ data() {
313
+ return {
314
+ form: {},
315
+ rules: {
316
+ name: [{ required: true, message: '请输入名称', trigger: 'blur' }]
317
+ },
318
+ submitting: false
319
+ }
320
+ },
321
+ watch: {
322
+ data: {
323
+ immediate: true,
324
+ handler(val) {
325
+ this.form = val ? { ...val } : {}
326
+ }
327
+ }
328
+ },
329
+ methods: {
330
+ handleClose() {
331
+ this.$refs.form.resetFields()
332
+ this.$emit('update:visible', false)
333
+ },
334
+ async handleSubmit() {
335
+ this.$refs.form.validate(async (valid) => {
336
+ if (!valid) return
337
+ this.submitting = true
338
+ try {
339
+ const api = this.form.id ? update : add
340
+ await api(this.form)
341
+ this.$message.success('保存成功')
342
+ this.$emit('success')
343
+ this.handleClose()
344
+ } finally {
345
+ this.submitting = false
346
+ }
347
+ })
348
+ }
349
+ }
350
+ }
351
+ </script>
352
+ ```
353
+
354
+ ---
355
+
356
+ ## API 接口定义规范
357
+
358
+ 所有 API 调用通过 `src/utils/request.js` 封装,请求格式有两种:
359
+
360
+ ### 标准请求格式(带 content 包裹)
361
+
362
+ ```javascript
363
+ // src/api/xxx.js
364
+ import request from '@/utils/request'
365
+
366
+ // 分页查询
367
+ export function getList(data) {
368
+ return request({
369
+ url: '/api/v1/xxx/list',
370
+ method: 'post',
371
+ data: {
372
+ version: '1.0',
373
+ nonceStr: '1212fsadf',
374
+ timestamp: '2020-4-21',
375
+ signType: 'md5',
376
+ content: data, // 业务数据放在 content 中
377
+ sign: 'xxx'
378
+ }
379
+ })
380
+ }
381
+
382
+ // GET 请求
383
+ export function getDetail(id) {
384
+ return request({
385
+ url: `/api/v1/xxx/detail/${id}`,
386
+ method: 'get',
387
+ params: { version: '1.0', content: { id } }
388
+ })
389
+ }
390
+
391
+ // 删除
392
+ export function del(id) {
393
+ return request({
394
+ url: `/api/v1/xxx/delete`,
395
+ method: 'post',
396
+ data: { version: '1.0', content: { id } }
397
+ })
398
+ }
399
+ ```
400
+
401
+ > **注意**:
402
+ > - 请求拦截器会自动添加签名(MD5)
403
+ > - 所有接口都走 SM4 国密加密(`/security/` 前缀)
404
+ > - 响应 `code == 10000` 为成功,返回 `res.data`
405
+ > - 响应 `code == 20001` 为登录失效,自动跳转登录
406
+
407
+ ---
408
+
409
+ ## 金额处理规范
410
+
411
+ ```javascript
412
+ // ✅ 前端展示:分转元(使用全局 money 方法)
413
+ this.money(10000) // → '100.00'
414
+ this.money(null) // → ''
415
+
416
+ // ✅ 后端传参:元转分(使用全局 accMul 方法)
417
+ this.accMul(100, 100) // → 10000
418
+
419
+ // ❌ 禁止直接 / 100 或 * 100(精度问题)
420
+ amount / 100 // 禁止
421
+ amount * 100 // 禁止
422
+ ```
423
+
424
+ ---
425
+
426
+ ## 参考文件位置
427
+
428
+ | 用途 | 路径 |
429
+ |------|------|
430
+ | 业务组件 | `/Users/xujiajun/Developer/frontProj/web/src/leniu-components/` |
431
+ | 公共组件 | `/Users/xujiajun/Developer/frontProj/web/src/components/` |
432
+ | 标准列表页 | `/Users/xujiajun/Developer/frontProj/web/src/leniuview/marketing/` |
433
+ | API 定义示例 | `/Users/xujiajun/Developer/frontProj/web/src/api/marketing.js` |
434
+ | 请求封装 | `/Users/xujiajun/Developer/frontProj/web/src/utils/request.js` |
435
+ | Token/租户工具 | `/Users/xujiajun/Developer/frontProj/web/src/utils/auth.js` |
436
+ | 全局工具函数 | `/Users/xujiajun/Developer/frontProj/web/src/utils/index.js` |
437
+ | 权限守卫 | `/Users/xujiajun/Developer/frontProj/web/src/permission.js` |
438
+ | 主入口 | `/Users/xujiajun/Developer/frontProj/web/src/main.js` |
@@ -0,0 +1,159 @@
1
+ ---
2
+ name: update-status
3
+ description: |
4
+ 当需要增量更新项目状态、同步最近代码变更时自动使用此 Skill。
5
+
6
+ 触发场景:
7
+ - 完成一个功能或任务后更新状态
8
+ - 每天开始或结束时同步代码变更
9
+ - 代码审查完成后更新文档
10
+ - 日常维护项目状态
11
+
12
+ 触发词:更新状态、update-status、状态更新、增量更新、日常同步、更新进度
13
+ ---
14
+
15
+ # /update-status - 项目状态智能更新
16
+
17
+ 日常使用的增量更新命令。自动扫描最近的代码变更,智能更新项目文档,保持文档与代码同步。
18
+
19
+ ---
20
+
21
+ ## 🎯 适用场景
22
+
23
+ | 场景 | 说明 | 频率 |
24
+ |------|------|------|
25
+ | **功能完成** | 完成一个功能或任务后更新状态 | 实时 |
26
+ | **日常同步** | 每天开始或结束时同步代码变更 | 每天1-2次 |
27
+ | **代码审查后** | 审查完成后更新文档 | 按需 |
28
+ | **周期回顾** | 本周末更新本周的工作成果 | 每周1次 |
29
+
30
+ ---
31
+
32
+ ## 📊 与 /sync 的区别
33
+
34
+ | 对比项 | `/update-status`(增量)| `/sync`(全量)|
35
+ |--------|----------------------|----------------|
36
+ | **执行速度** | ⚡ 快速 | 🐢 较慢 |
37
+ | **扫描范围** | 最近 N 条提交 | 整个项目 |
38
+ | **处理方式** | 增量更新 | 全量重建 |
39
+ | **使用频率** | 日常频繁使用 | 每周一次 |
40
+
41
+ ---
42
+
43
+ ## 🚀 执行流程
44
+
45
+ ### 第一步:检查和初始化文档(强制执行)
46
+
47
+ ```bash
48
+ # 检查文档目录
49
+ Glob pattern: "docs/*.md"
50
+
51
+ # 必要的文档文件
52
+ docs/README.md # 项目简介
53
+ docs/PROJECT_STATUS.md # 项目进度
54
+ docs/TODO.md # 待办清单
55
+ ```
56
+
57
+ ### 第二步:分析最近的代码变更
58
+
59
+ ```bash
60
+ # 获取最近 20 条提交
61
+ git log -20 --oneline --format="%h|%s|%aI" --all
62
+
63
+ # 扫描业务模块变更
64
+ Glob pattern: "ruoyi-modules/ruoyi-*/src/main/java/**/controller/*Controller.java"
65
+
66
+ # 扫描代码中的待办标记
67
+ Grep pattern: "TODO:|FIXME:|XXX:" path: ruoyi-modules/ glob: "*.java" output_mode: content -B 1
68
+ ```
69
+
70
+ ### 第三步:更新项目进度文档
71
+
72
+ 分析功能完整性,更新 PROJECT_STATUS.md:
73
+ - 新增已完成功能
74
+ - 更新进行中功能的完成度
75
+ - 更新统计信息
76
+
77
+ ### 第四步:更新待办清单文档
78
+
79
+ 同步 TODO.md:
80
+ - 将完成的功能移到已完成区域
81
+ - 添加新发现的 TODO/FIXME
82
+
83
+ ---
84
+
85
+ ## 输出格式
86
+
87
+ ```markdown
88
+ # 📝 项目状态更新报告
89
+
90
+ **更新时间**:YYYY-MM-DD HH:mm
91
+ **扫描范围**:最近 20 条 Git 提交
92
+
93
+ ---
94
+
95
+ ## 📂 文档状态
96
+
97
+ | 文档 | 操作 | 状态 |
98
+ |------|------|------|
99
+ | PROJECT_STATUS.md | 已更新 | ✅ |
100
+ | TODO.md | 已同步 | ✅ |
101
+
102
+ ---
103
+
104
+ ## 📊 本次变更统计
105
+
106
+ ### PROJECT_STATUS.md 更新
107
+ - ✅ 新增已完成:X 项
108
+ - 🔄 更新进行中:X 项
109
+
110
+ ### TODO.md 联动更新
111
+ - ✅ 移至已完成:X 项
112
+ - 📋 新增待办:X 项
113
+
114
+ ---
115
+
116
+ ## 💡 下一步建议
117
+
118
+ ### 立即处理
119
+ \`/check\` # 检查代码规范
120
+ \`/progress\` # 查看详细进度
121
+
122
+ ### 日常操作
123
+ \`/dev 新功能名称\` # 继续开发新功能
124
+ \`/crud 表名\` # 为表生成代码
125
+ \`/add-todo 任务描述\` # 添加新的待办
126
+ ```
127
+
128
+ ---
129
+
130
+ ## 🔗 相关命令
131
+
132
+ | 命令 | 用途 | 何时使用 |
133
+ |------|------|---------|
134
+ | `/update-status` | 增量更新(当前) | 功能完成后立即使用 |
135
+ | `/sync` | 全量同步 | 每周一次定期整理 |
136
+ | `/progress` | 项目进度分析 | 了解完成情况 |
137
+ | `/check` | 代码规范检查 | 代码审查前 |
138
+ | `/add-todo` | 添加单个待办 | 临时添加任务 |
139
+
140
+ ---
141
+
142
+ ## 📌 最佳实践
143
+
144
+ ### ✅ 推荐做法
145
+
146
+ 1. **功能完成后立即更新**
147
+ ```bash
148
+ git push
149
+ /update-status
150
+ ```
151
+
152
+ 2. **利用每天的开始或结束**
153
+ - 早晨:`/update-status` 了解最新状态
154
+ - 下午:`/update-status` 汇总今天的工作
155
+
156
+ 3. **每周末进行全量同步**
157
+ ```bash
158
+ /sync
159
+ ```