ai-engineering-init 1.4.2 → 1.5.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.
- package/.claude/skills/leniu-java-export/SKILL.md +389 -95
- package/.codex/skills/leniu-java-export/SKILL.md +389 -95
- package/.cursor/skills/bug-detective/SKILL.md +19 -19
- package/.cursor/skills/leniu-java-export/SKILL.md +389 -95
- package/.cursor/skills/project-navigator/SKILL.md +164 -258
- package/package.json +7 -1
- package/scripts/build-skills.js +180 -0
- package/src/platform-map.json +56 -0
- package/src/skills/add-skill/SKILL.md +488 -0
- package/src/skills/add-todo/SKILL.md +269 -0
- package/src/skills/api-development/SKILL.md +266 -0
- package/src/skills/architecture-design/SKILL.md +262 -0
- package/src/skills/backend-annotations/SKILL.md +302 -0
- package/src/skills/banana-image/CHANGELOG.md +37 -0
- package/src/skills/banana-image/README.md +146 -0
- package/src/skills/banana-image/SKILL.md +171 -0
- package/src/skills/banana-image/assets/logo.png +0 -0
- package/src/skills/banana-image/references/advanced-usage.md +189 -0
- package/src/skills/banana-image/scripts/apply_template.py +125 -0
- package/src/skills/banana-image/scripts/banana_image_exec.ts +412 -0
- package/src/skills/banana-image/scripts/batch_prep.py +82 -0
- package/src/skills/banana-image/scripts/package-lock.json +1437 -0
- package/src/skills/banana-image/scripts/package.json +18 -0
- package/src/skills/banana-image/scripts/requirements.txt +10 -0
- package/src/skills/banana-image/templates/poster.json +22 -0
- package/src/skills/banana-image/templates/product.json +17 -0
- package/src/skills/banana-image/templates/social.json +22 -0
- package/src/skills/banana-image/templates/thumbnail.json +17 -0
- package/src/skills/brainstorm/SKILL.md +216 -0
- package/src/skills/bug-detective/SKILL.md +256 -0
- package/src/skills/bug-detective/references/error-patterns.md +242 -0
- package/src/skills/check/SKILL.md +367 -0
- package/src/skills/code-patterns/SKILL.md +280 -0
- package/src/skills/code-patterns/references/leniu-code-patterns.md +87 -0
- package/src/skills/codex-code-review/SKILL.md +135 -0
- package/src/skills/collaborating-with-codex/SKILL.md +174 -0
- package/src/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
- package/src/skills/collaborating-with-gemini/SKILL.md +194 -0
- package/src/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
- package/src/skills/crud/SKILL.md +265 -0
- package/src/skills/crud-development/SKILL.md +409 -0
- package/src/skills/data-permission/SKILL.md +292 -0
- package/src/skills/data-permission/references/custom-data-scope.md +90 -0
- package/src/skills/database-ops/SKILL.md +407 -0
- package/src/skills/dev/SKILL.md +187 -0
- package/src/skills/error-handler/SKILL.md +371 -0
- package/src/skills/file-oss-management/SKILL.md +255 -0
- package/src/skills/file-oss-management/references/entities.md +105 -0
- package/src/skills/file-oss-management/references/service-impl.md +104 -0
- package/src/skills/git-workflow/SKILL.md +397 -0
- package/src/skills/init-docs/SKILL.md +194 -0
- package/src/skills/json-serialization/SKILL.md +357 -0
- package/src/skills/leniu-api-development/SKILL.md +319 -0
- package/src/skills/leniu-api-development/references/real-examples.md +273 -0
- package/src/skills/leniu-architecture-design/SKILL.md +383 -0
- package/src/skills/leniu-backend-annotations/SKILL.md +277 -0
- package/src/skills/leniu-brainstorm/SKILL.md +242 -0
- package/src/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
- package/src/skills/leniu-code-patterns/SKILL.md +411 -0
- package/src/skills/leniu-crud-development/SKILL.md +404 -0
- package/src/skills/leniu-crud-development/references/templates.md +597 -0
- package/src/skills/leniu-customization-location/SKILL.md +410 -0
- package/src/skills/leniu-data-permission/SKILL.md +341 -0
- package/src/skills/leniu-database-ops/SKILL.md +426 -0
- package/src/skills/leniu-error-handler/SKILL.md +462 -0
- package/src/skills/leniu-java-amount-handling/SKILL.md +461 -0
- package/src/skills/leniu-java-code-style/SKILL.md +510 -0
- package/src/skills/leniu-java-concurrent/SKILL.md +400 -0
- package/src/skills/leniu-java-entity/SKILL.md +237 -0
- package/src/skills/leniu-java-entity/references/templates.md +237 -0
- package/src/skills/leniu-java-export/SKILL.md +570 -0
- package/src/skills/leniu-java-logging/SKILL.md +229 -0
- package/src/skills/leniu-java-logging/references/data-mask.md +46 -0
- package/src/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
- package/src/skills/leniu-java-mq/SKILL.md +338 -0
- package/src/skills/leniu-java-mybatis/SKILL.md +267 -0
- package/src/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
- package/src/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/src/skills/leniu-java-task/SKILL.md +367 -0
- package/src/skills/leniu-java-total-line/SKILL.md +196 -0
- package/src/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/src/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/src/skills/leniu-mealtime/SKILL.md +215 -0
- package/src/skills/leniu-redis-cache/SKILL.md +331 -0
- package/src/skills/leniu-report-customization/SKILL.md +335 -0
- package/src/skills/leniu-report-customization/references/table-fields.md +93 -0
- package/src/skills/leniu-report-standard-customization/SKILL.md +328 -0
- package/src/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
- package/src/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
- package/src/skills/leniu-security-guard/SKILL.md +306 -0
- package/src/skills/leniu-utils-toolkit/SKILL.md +380 -0
- package/src/skills/mysql-debug/SKILL.md +364 -0
- package/src/skills/next/SKILL.md +137 -0
- package/src/skills/openspec-apply-change/SKILL.md +165 -0
- package/src/skills/openspec-archive-change/SKILL.md +122 -0
- package/src/skills/openspec-bulk-archive-change/SKILL.md +254 -0
- package/src/skills/openspec-continue-change/SKILL.md +126 -0
- package/src/skills/openspec-explore/SKILL.md +299 -0
- package/src/skills/openspec-ff-change/SKILL.md +109 -0
- package/src/skills/openspec-new-change/SKILL.md +82 -0
- package/src/skills/openspec-onboard/SKILL.md +414 -0
- package/src/skills/openspec-sync-specs/SKILL.md +146 -0
- package/src/skills/openspec-verify-change/SKILL.md +176 -0
- package/src/skills/performance-doctor/SKILL.md +303 -0
- package/src/skills/progress/SKILL.md +193 -0
- package/src/skills/project-navigator/SKILL.md +211 -0
- package/src/skills/redis-cache/SKILL.md +333 -0
- package/src/skills/redis-cache/references/listeners.md +23 -0
- package/src/skills/scheduled-jobs/SKILL.md +314 -0
- package/src/skills/security-guard/SKILL.md +353 -0
- package/src/skills/security-guard/references/encrypt-config.md +103 -0
- package/src/skills/security-guard/references/sensitive-strategies.md +42 -0
- package/src/skills/sms-mail/SKILL.md +308 -0
- package/src/skills/sms-mail/references/mail-config.md +88 -0
- package/src/skills/sms-mail/references/sms-config.md +74 -0
- package/src/skills/social-login/SKILL.md +266 -0
- package/src/skills/social-login/references/provider-configs.md +118 -0
- package/src/skills/start/SKILL.md +154 -0
- package/src/skills/store-pc/SKILL.md +366 -0
- package/src/skills/sync/SKILL.md +149 -0
- package/src/skills/task-tracker/SKILL.md +307 -0
- package/src/skills/tech-decision/SKILL.md +393 -0
- package/src/skills/tenant-management/SKILL.md +288 -0
- package/src/skills/tenant-management/references/tenant-scenarios.md +91 -0
- package/src/skills/test-development/SKILL.md +301 -0
- package/src/skills/test-development/references/parameterized-examples.md +119 -0
- package/src/skills/ui-pc/SKILL.md +438 -0
- package/src/skills/update-status/SKILL.md +159 -0
- package/src/skills/utils-toolkit/SKILL.md +362 -0
- package/src/skills/utils-toolkit/references/redis-utils-api.md +56 -0
- package/src/skills/websocket-sse/SKILL.md +271 -0
- package/src/skills/workflow-engine/SKILL.md +321 -0
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: add-todo
|
|
3
|
+
description: |
|
|
4
|
+
当需要快速添加待办任务、记录开发事项时自动使用此 Skill。
|
|
5
|
+
|
|
6
|
+
触发场景:
|
|
7
|
+
- 需要快速添加一个待办任务
|
|
8
|
+
- 需要记录开发中发现的问题
|
|
9
|
+
- 需要批量添加多个待办事项
|
|
10
|
+
- 需要为特定模块添加任务
|
|
11
|
+
|
|
12
|
+
触发词:添加待办、add-todo、待办事项、任务添加、记录任务、新增待办、快速待办
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# /add-todo - 快速添加待办事项
|
|
16
|
+
|
|
17
|
+
作为待办事项管理助手,帮我快速添加待办任务。支持自动创建缺失文档、联动项目状态。
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 使用方式
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
/add-todo 实现用户权限管理
|
|
25
|
+
/add-todo 修复登录bug,优先级高
|
|
26
|
+
/add-todo 优化接口性能,3天,中等优先级
|
|
27
|
+
/add-todo ruoyi-demo 实现测试功能
|
|
28
|
+
/add-todo ruoyi-system 修复缓存问题,高,截止1月30号
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 第一步:智能检测文档状态
|
|
34
|
+
|
|
35
|
+
### 检查待办清单.md
|
|
36
|
+
|
|
37
|
+
如果 `docs/待办清单.md` 不存在:
|
|
38
|
+
1. 读取模板 `.claude/templates/待办清单模板.md`
|
|
39
|
+
2. 替换时间占位符为当前时间
|
|
40
|
+
3. 创建 `docs/待办清单.md`
|
|
41
|
+
4. 输出提示:`📝 已自动创建 docs/待办清单.md`
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 第二步:解析任务信息
|
|
46
|
+
|
|
47
|
+
### 从用户输入中提取
|
|
48
|
+
|
|
49
|
+
| 信息 | 解析方式 | 默认值 |
|
|
50
|
+
|------|---------|--------|
|
|
51
|
+
| 任务名称 | 必填,主体内容 | - |
|
|
52
|
+
| 优先级 | "高"/"中"/"低",或"紧急"/"重要" | 中 |
|
|
53
|
+
| 预计时间 | "X天"/"X周" | 待定 |
|
|
54
|
+
| 所属模块 | 模块名前缀如"ruoyi-demo"、"ruoyi-system" | 通用 |
|
|
55
|
+
| 截止日期 | "截止XX"或"deadline XX" | 待定 |
|
|
56
|
+
|
|
57
|
+
### 优先级映射
|
|
58
|
+
|
|
59
|
+
| 用户输入 | 映射到 |
|
|
60
|
+
|---------|--------|
|
|
61
|
+
| 高、紧急、urgent、critical、ASAP | 🔥 高优先级 |
|
|
62
|
+
| 中、一般、normal、默认 | 📌 中优先级 |
|
|
63
|
+
| 低、可延后、optional、nice-to-have | 💡 低优先级 |
|
|
64
|
+
|
|
65
|
+
### 模块识别
|
|
66
|
+
|
|
67
|
+
| 用户输入 | 识别结果 |
|
|
68
|
+
|---------|---------|
|
|
69
|
+
| `ruoyi-demo 测试功能` | 模块: ruoyi-demo |
|
|
70
|
+
| `ruoyi-system 用户管理` | 模块: ruoyi-system |
|
|
71
|
+
| `后端 权限管理` | 模块: 后端 |
|
|
72
|
+
| `权限管理` | 模块: 通用(无前缀) |
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 第三步:添加到待办清单.md
|
|
77
|
+
|
|
78
|
+
### 读取现有内容
|
|
79
|
+
- 读取 `docs/待办清单.md`
|
|
80
|
+
- 解析各优先级区域的位置
|
|
81
|
+
|
|
82
|
+
### 添加任务
|
|
83
|
+
|
|
84
|
+
根据优先级添加到对应区域:
|
|
85
|
+
|
|
86
|
+
```markdown
|
|
87
|
+
## 🔥 高优先级(紧急重要)
|
|
88
|
+
- [ ] [任务名称]
|
|
89
|
+
- 截止日期: YYYY-MM-DD(如果有)
|
|
90
|
+
- 描述: [任务描述](如果有)
|
|
91
|
+
- 所属模块: ruoyi-xxx(如果识别到)
|
|
92
|
+
- 预计工作量: X天(如果有)
|
|
93
|
+
- 添加时间: YYYY-MM-DD HH:MM
|
|
94
|
+
|
|
95
|
+
## 📌 中优先级(重要不紧急)
|
|
96
|
+
...
|
|
97
|
+
|
|
98
|
+
## 💡 低优先级(可延后)
|
|
99
|
+
...
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 更新统计信息
|
|
103
|
+
- 更新"待办总数": X 项
|
|
104
|
+
- 更新"最后更新": 当前时间
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## 第四步:联动更新项目状态.md(如果存在)
|
|
109
|
+
|
|
110
|
+
### 检查项目状态.md
|
|
111
|
+
|
|
112
|
+
如果 `docs/项目状态.md` 存在:
|
|
113
|
+
1. 读取项目状态文档
|
|
114
|
+
2. 将新任务添加到"待办"区域
|
|
115
|
+
3. 格式与待办清单保持一致
|
|
116
|
+
|
|
117
|
+
### 添加格式
|
|
118
|
+
|
|
119
|
+
```markdown
|
|
120
|
+
## 📋 待办
|
|
121
|
+
- [ ] [任务名称]
|
|
122
|
+
- 优先级: 高/中/低
|
|
123
|
+
- 预计工作量: X天
|
|
124
|
+
- 所属模块: ruoyi-xxx
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 第五步:输出确认信息
|
|
130
|
+
|
|
131
|
+
```markdown
|
|
132
|
+
✅ 已添加待办任务:
|
|
133
|
+
|
|
134
|
+
📌 **[任务名称]**
|
|
135
|
+
- 优先级: 高/中/低
|
|
136
|
+
- 预计时间: X天
|
|
137
|
+
- 所属模块: ruoyi-xxx(如果有)
|
|
138
|
+
- 截止日期: YYYY-MM-DD(如果有)
|
|
139
|
+
|
|
140
|
+
📁 已更新文件:
|
|
141
|
+
- docs/待办清单.md
|
|
142
|
+
- docs/项目状态.md(如果存在)
|
|
143
|
+
|
|
144
|
+
📊 当前待办总数: X 项
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 批量添加支持
|
|
150
|
+
|
|
151
|
+
### 多任务添加
|
|
152
|
+
|
|
153
|
+
用户可以一次添加多个任务:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
/add-todo 实现用户登录;实现用户注册;实现密码重置
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
或分行:
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
/add-todo
|
|
163
|
+
1. 实现用户登录,高优先级
|
|
164
|
+
2. 实现用户注册,中优先级
|
|
165
|
+
3. 实现密码重置,低优先级
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### 处理方式
|
|
169
|
+
- 按分号、换行、数字编号分割
|
|
170
|
+
- 依次解析每个任务
|
|
171
|
+
- 批量添加并汇总报告
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## 智能建议
|
|
176
|
+
|
|
177
|
+
### 添加后提示
|
|
178
|
+
|
|
179
|
+
添加任务后,根据情况给出建议:
|
|
180
|
+
|
|
181
|
+
**待办过多时(>15项)**:
|
|
182
|
+
```
|
|
183
|
+
💡 提示:当前待办已有 18 项,建议:
|
|
184
|
+
- 运行 /progress 梳理优先级
|
|
185
|
+
- 考虑将低优先级任务归档
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**高优先级过多时(>5项)**:
|
|
189
|
+
```
|
|
190
|
+
⚠️ 提示:高优先级任务已有 6 项
|
|
191
|
+
建议重新评估优先级,确保"紧急"真正紧急
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**相似任务检测**:
|
|
195
|
+
```
|
|
196
|
+
💡 提示:检测到相似待办:
|
|
197
|
+
- 已有: "实现用户登录功能"
|
|
198
|
+
- 新增: "用户登录"
|
|
199
|
+
是否为同一任务?
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## 示例
|
|
205
|
+
|
|
206
|
+
### 示例 1:简单添加
|
|
207
|
+
|
|
208
|
+
```
|
|
209
|
+
用户: /add-todo 修复通知发送错误
|
|
210
|
+
|
|
211
|
+
AI: ✅ 已添加待办任务:
|
|
212
|
+
|
|
213
|
+
📌 **修复通知发送错误**
|
|
214
|
+
- 优先级: 中
|
|
215
|
+
- 预计时间: 待定
|
|
216
|
+
- 添加时间: 2025-12-25 14:30
|
|
217
|
+
|
|
218
|
+
📁 已更新: docs/待办清单.md
|
|
219
|
+
📊 当前待办总数: 8 项
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### 示例 2:带参数添加
|
|
223
|
+
|
|
224
|
+
```
|
|
225
|
+
用户: /add-todo ruoyi-demo 实现导出功能,高优先级,2天
|
|
226
|
+
|
|
227
|
+
AI: ✅ 已添加待办任务:
|
|
228
|
+
|
|
229
|
+
🔥 **实现导出功能**
|
|
230
|
+
- 优先级: 高
|
|
231
|
+
- 预计时间: 2天
|
|
232
|
+
- 所属模块: ruoyi-demo
|
|
233
|
+
- 添加时间: 2025-12-25 14:30
|
|
234
|
+
|
|
235
|
+
📁 已更新:
|
|
236
|
+
- docs/待办清单.md
|
|
237
|
+
- docs/项目状态.md
|
|
238
|
+
|
|
239
|
+
📊 当前待办总数: 9 项
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### 示例 3:自动创建文档
|
|
243
|
+
|
|
244
|
+
```
|
|
245
|
+
用户: /add-todo 开发后端接口文档
|
|
246
|
+
|
|
247
|
+
AI: 📝 已自动创建 docs/待办清单.md
|
|
248
|
+
|
|
249
|
+
✅ 已添加待办任务:
|
|
250
|
+
|
|
251
|
+
📌 **开发后端接口文档**
|
|
252
|
+
- 优先级: 中
|
|
253
|
+
- 预计时间: 待定
|
|
254
|
+
- 添加时间: 2025-12-25 14:30
|
|
255
|
+
|
|
256
|
+
📁 已更新: docs/待办清单.md
|
|
257
|
+
📊 当前待办总数: 1 项
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## 与其他命令的关系
|
|
263
|
+
|
|
264
|
+
| 命令 | 关系 |
|
|
265
|
+
|------|------|
|
|
266
|
+
| `/update-status` | 批量同步 TODO,/add-todo 是单个添加 |
|
|
267
|
+
| `/init-docs` | 初始化文档,/add-todo 可自动补充创建 |
|
|
268
|
+
| `/progress` | 查看进度,包含待办统计 |
|
|
269
|
+
| `/sync` | 全量同步,确保数据一致 |
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-development
|
|
3
|
+
description: |
|
|
4
|
+
后端 API 接口设计规范。基于三层架构的 RESTful API 开发指南。
|
|
5
|
+
|
|
6
|
+
触发场景:
|
|
7
|
+
- 设计 RESTful API 接口
|
|
8
|
+
- 编写 Controller 层代码
|
|
9
|
+
- 配置接口权限、日志、防重复提交注解
|
|
10
|
+
- 接口返回值类型选择
|
|
11
|
+
- 数据验证和参数校验
|
|
12
|
+
|
|
13
|
+
触发词:API、接口、RESTful、Controller、GetMapping、PostMapping、权限注解、日志注解、分页查询、接口规范
|
|
14
|
+
|
|
15
|
+
注意:
|
|
16
|
+
- 本项目是三层架构:Controller -> Service -> Mapper
|
|
17
|
+
- 参考 java-controller 技能获取更详细的 Controller 层规范
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# API 接口设计规范
|
|
21
|
+
|
|
22
|
+
## 核心规范
|
|
23
|
+
|
|
24
|
+
| 原则 | 说明 |
|
|
25
|
+
|------|------|
|
|
26
|
+
| 统一入口 | 所有接口使用 POST 或 RESTful 风格 |
|
|
27
|
+
| 认证保护 | 所有业务接口必须添加认证注解 |
|
|
28
|
+
| 参数校验 | 使用分组校验区分新增/修改场景 |
|
|
29
|
+
| 统一响应 | 使用统一的响应格式包装返回数据 |
|
|
30
|
+
|
|
31
|
+
### HTTP 方法规范
|
|
32
|
+
|
|
33
|
+
| 操作 | 方法 | 路径 |
|
|
34
|
+
|------|------|------|
|
|
35
|
+
| 列表查询 | POST/GET | `/query` 或 `/list` |
|
|
36
|
+
| 获取详情 | POST/GET | `/{id}` 或 `/detail` |
|
|
37
|
+
| 新增 | POST | `/add` |
|
|
38
|
+
| 修改 | POST/PUT | `/update` |
|
|
39
|
+
| 删除 | POST/DELETE | `/delete` 或 `/batch/delete` |
|
|
40
|
+
| 导出 | POST | `/export` |
|
|
41
|
+
| 导入 | POST | `/import-excel` |
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Controller 标准模板
|
|
46
|
+
|
|
47
|
+
```java
|
|
48
|
+
@Slf4j
|
|
49
|
+
@RestController
|
|
50
|
+
@RequiresAuthentication
|
|
51
|
+
@RequestMapping("/module/feature")
|
|
52
|
+
@Api(value = "模块/功能", tags = "模块/功能")
|
|
53
|
+
public class XxxController {
|
|
54
|
+
|
|
55
|
+
@Resource @Lazy
|
|
56
|
+
private XxxService xxxService;
|
|
57
|
+
|
|
58
|
+
@PostMapping("/add")
|
|
59
|
+
@ApiOperation(value = "功能描述-新增")
|
|
60
|
+
public Long add(@Validated(InsertGroup.class) @RequestBody LeRequest<XxxDTO> request) {
|
|
61
|
+
return xxxService.add(request.getContent());
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@PostMapping("/update")
|
|
65
|
+
@ApiOperation(value = "功能描述-修改")
|
|
66
|
+
public void update(@Validated(UpdateGroup.class) @RequestBody LeRequest<XxxDTO> request) {
|
|
67
|
+
xxxService.update(request.getContent());
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@PostMapping("/query")
|
|
71
|
+
@ApiOperation(value = "功能描述-分页查询")
|
|
72
|
+
public Page<XxxVO> query(@Validated @RequestBody LeRequest<XxxQueryParam> request) {
|
|
73
|
+
return xxxService.pageList(request.getContent());
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@PostMapping("/delete")
|
|
77
|
+
@ApiOperation(value = "功能描述-删除")
|
|
78
|
+
public void delete(@RequestBody LeRequest<Long> request) {
|
|
79
|
+
xxxService.delete(request.getContent());
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 参数封装规范
|
|
87
|
+
|
|
88
|
+
### 请求参数用 LeRequest 包装
|
|
89
|
+
|
|
90
|
+
```java
|
|
91
|
+
@PostMapping("/query")
|
|
92
|
+
public Page<XxxVO> query(@RequestBody LeRequest<XxxQueryParam> request) {
|
|
93
|
+
return xxxService.pageList(request.getContent());
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 分页参数
|
|
98
|
+
|
|
99
|
+
```java
|
|
100
|
+
@Data
|
|
101
|
+
public class XxxPageParam implements Serializable {
|
|
102
|
+
@NotNull(message = "分页参数不能为空")
|
|
103
|
+
private PageDTO page;
|
|
104
|
+
private String keyword;
|
|
105
|
+
private Integer status;
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 分组校验
|
|
110
|
+
|
|
111
|
+
```java
|
|
112
|
+
// DTO 中使用分组
|
|
113
|
+
@Data
|
|
114
|
+
public class XxxDTO {
|
|
115
|
+
@NotNull(message = "ID不能为空", groups = {UpdateGroup.class})
|
|
116
|
+
private Long id;
|
|
117
|
+
|
|
118
|
+
@NotBlank(message = "名称不能为空", groups = {InsertGroup.class, UpdateGroup.class})
|
|
119
|
+
private String name;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Controller 中应用
|
|
123
|
+
@PostMapping("/add")
|
|
124
|
+
public Long add(@Validated(InsertGroup.class) @RequestBody LeRequest<XxxDTO> request)
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
> Jakarta Validation: 项目用 JDK 21,必须 `import jakarta.validation.constraints.*`
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 响应格式
|
|
132
|
+
|
|
133
|
+
```java
|
|
134
|
+
// 分页响应
|
|
135
|
+
@PostMapping("/query")
|
|
136
|
+
public Page<XxxVO> query(@RequestBody LeRequest<XxxQueryParam> request) { ... }
|
|
137
|
+
|
|
138
|
+
// 单条数据
|
|
139
|
+
@GetMapping("/{id}")
|
|
140
|
+
public XxxVO getById(@PathVariable Long id) { ... }
|
|
141
|
+
|
|
142
|
+
// 新增返回 ID / 修改删除返回 void
|
|
143
|
+
@PostMapping("/add")
|
|
144
|
+
public Long add(@RequestBody LeRequest<XxxDTO> request) { ... }
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 常见场景
|
|
150
|
+
|
|
151
|
+
### 带 Redisson 分布式锁的导入
|
|
152
|
+
|
|
153
|
+
```java
|
|
154
|
+
@PostMapping("/import-excel")
|
|
155
|
+
@ApiOperation(value = "Excel导入")
|
|
156
|
+
public void importExcel(@RequestParam(value = "file") MultipartFile file) {
|
|
157
|
+
if (Objects.isNull(file) || file.isEmpty()) {
|
|
158
|
+
throw new LeException("文件不能为空");
|
|
159
|
+
}
|
|
160
|
+
RLock lock = redissonClient.getLock("import:lock:" + TenantContextHolder.getTenantId());
|
|
161
|
+
if (!lock.tryLock(5, 60, TimeUnit.SECONDS)) {
|
|
162
|
+
throw new LeException("正在处理中,请稍后再试");
|
|
163
|
+
}
|
|
164
|
+
try {
|
|
165
|
+
xxxService.importExcel(file);
|
|
166
|
+
} finally {
|
|
167
|
+
if (lock.isLocked() && lock.isHeldByCurrentThread()) {
|
|
168
|
+
lock.unlock();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### 批量删除
|
|
175
|
+
|
|
176
|
+
```java
|
|
177
|
+
@RequestMapping(value = "/batch/delete", method = {RequestMethod.POST, RequestMethod.PUT})
|
|
178
|
+
@ApiOperation(value = "批量删除")
|
|
179
|
+
public void batchDelete(@RequestBody LeRequest<List<Long>> request) {
|
|
180
|
+
if (CollUtil.isEmpty(request.getContent())) {
|
|
181
|
+
throw new LeException("ID列表不能为空");
|
|
182
|
+
}
|
|
183
|
+
xxxService.batchDelete(request.getContent());
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### 带合计行的分页查询
|
|
188
|
+
|
|
189
|
+
```java
|
|
190
|
+
@PostMapping("/query")
|
|
191
|
+
@ApiOperation(value = "分页查询(带合计)")
|
|
192
|
+
public ReportBaseTotalVO<XxxVO> query(@RequestBody LeRequest<XxxQueryParam> request) {
|
|
193
|
+
ReportBaseTotalVO<XxxVO> result = new ReportBaseTotalVO<>();
|
|
194
|
+
result.setTotalLine(xxxService.getSummaryTotal(request.getContent()));
|
|
195
|
+
result.setResultPage(PageVO.of(xxxService.pageList(request.getContent())));
|
|
196
|
+
return result;
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Swagger 注解
|
|
203
|
+
|
|
204
|
+
```java
|
|
205
|
+
@Api(value = "模块/功能", tags = "模块/功能") // Controller 类
|
|
206
|
+
@ApiOperation(value = "功能描述-新增") // 方法
|
|
207
|
+
@ApiModel("功能描述DTO") // DTO/VO 类
|
|
208
|
+
@ApiModelProperty(value = "主键ID", required = true) // 字段
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## 检查清单
|
|
214
|
+
|
|
215
|
+
- [ ] 认证注解 `@RequiresAuthentication`
|
|
216
|
+
- [ ] API 文档注解 `@ApiOperation`
|
|
217
|
+
- [ ] 参数校验 `@Validated` + 分组
|
|
218
|
+
- [ ] 返回值类型正确(分页用 `Page<VO>`)
|
|
219
|
+
- [ ] 使用 `LeRequest<T>` 封装请求
|
|
220
|
+
- [ ] 敏感操作加分布式锁
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## 多项目对比
|
|
225
|
+
|
|
226
|
+
| 特征 | RuoYi-Vue-Plus | leniu-tengyun-core |
|
|
227
|
+
|-----|----------------|-------------------|
|
|
228
|
+
| JDK | 17 | 21 |
|
|
229
|
+
| 包名 | `org.dromara.*` | `net.xnzn.core.*` |
|
|
230
|
+
| 请求封装 | 直接 BO | `LeRequest<T>` |
|
|
231
|
+
| 响应封装 | `R<T>`, `TableDataInfo<T>` | `Page<T>`, `void` |
|
|
232
|
+
| 分组校验 | `AddGroup`, `EditGroup` | `InsertGroup`, `UpdateGroup` |
|
|
233
|
+
| 认证 | `@SaCheckPermission` | `@RequiresAuthentication` |
|
|
234
|
+
| 异常 | `ServiceException` | `LeException` |
|
|
235
|
+
| 国际化 | `MessageUtils.message()` | `I18n.getMessage()` |
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## 错误对比
|
|
240
|
+
|
|
241
|
+
```java
|
|
242
|
+
// ---- 错误 ----
|
|
243
|
+
@RestController // 缺认证注解
|
|
244
|
+
public Long add(@RequestBody XxxDTO dto) { } // 不用 LeRequest
|
|
245
|
+
public Long add(@Valid @RequestBody LeRequest<XxxDTO> request) { } // @Valid 应为 @Validated(InsertGroup.class)
|
|
246
|
+
import javax.validation.constraints.NotNull; // JDK 21 用 jakarta
|
|
247
|
+
|
|
248
|
+
// ---- 正确 ----
|
|
249
|
+
@RestController @RequiresAuthentication
|
|
250
|
+
public Long add(@Validated(InsertGroup.class) @RequestBody LeRequest<XxxDTO> request) {
|
|
251
|
+
return xxxService.add(request.getContent());
|
|
252
|
+
}
|
|
253
|
+
import jakarta.validation.constraints.NotNull;
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## 相关技能
|
|
259
|
+
|
|
260
|
+
| 需要了解 | Skill |
|
|
261
|
+
|---------|-------|
|
|
262
|
+
| Service 层 | `java-service` |
|
|
263
|
+
| Controller 详细 | `java-controller` |
|
|
264
|
+
| 异常处理 | `error-handler` |
|
|
265
|
+
| 参数校验 | `java-entity` |
|
|
266
|
+
| 数据库设计 | `database-ops` |
|