ai-engineering-init 1.4.3 → 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/.cursor/skills/bug-detective/SKILL.md +19 -19
- 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,307 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: task-tracker
|
|
3
|
+
description: |
|
|
4
|
+
开发任务进度跟踪系统。当用户需要记录复杂开发任务的需求、步骤、进度时自动使用此 Skill。
|
|
5
|
+
创建 Markdown 文档实现任务上下文持久化,支持中断后快速恢复。
|
|
6
|
+
|
|
7
|
+
触发场景:
|
|
8
|
+
- 多步骤功能开发(需要跨会话)
|
|
9
|
+
- 复杂需求的步骤分解与跟踪
|
|
10
|
+
- 任务进度记录与更新
|
|
11
|
+
- 中断后的任务恢复
|
|
12
|
+
- 历史任务查询与归档
|
|
13
|
+
|
|
14
|
+
触发词:创建任务、跟踪任务、记录进度、任务跟踪、继续任务、恢复任务、查看任务、归档任务、任务列表
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# 任务跟踪技能
|
|
18
|
+
|
|
19
|
+
## 何时使用
|
|
20
|
+
|
|
21
|
+
✅ 用户明确要求跟踪任务("创建任务跟踪"、"记录进度"、"跟踪这个任务")
|
|
22
|
+
✅ 复杂的多步骤开发任务
|
|
23
|
+
✅ 需要跨会话恢复的工作
|
|
24
|
+
|
|
25
|
+
❌ 简单的单步操作
|
|
26
|
+
❌ 纯咨询性对话
|
|
27
|
+
|
|
28
|
+
## 目录结构
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
{项目根目录}/
|
|
32
|
+
└── docs/
|
|
33
|
+
└── tasks/
|
|
34
|
+
├── README.md # 使用说明(首次自动生成)
|
|
35
|
+
├── active/ # 进行中的任务
|
|
36
|
+
│ └── task-20260121-153045-用户反馈.md
|
|
37
|
+
└── archive/ # 已完成的任务
|
|
38
|
+
└── 2026-01/
|
|
39
|
+
└── task-20260120-优惠券系统.md
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 文档模板
|
|
43
|
+
|
|
44
|
+
```markdown
|
|
45
|
+
# 任务:{任务标题}
|
|
46
|
+
|
|
47
|
+
**状态**: 🟢 进行中 | 🔵 已完成 | 🔴 已暂停
|
|
48
|
+
**创建时间**: {YYYY-MM-DD HH:MM:SS}
|
|
49
|
+
**更新时间**: {YYYY-MM-DD HH:MM:SS}
|
|
50
|
+
**Git 分支**: {branch_name}
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 📋 需求描述
|
|
55
|
+
|
|
56
|
+
{用户原始需求的详细描述,包括背景、目标、约束条件}
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 🎯 实现步骤
|
|
61
|
+
|
|
62
|
+
- [ ] 1. {步骤1简述}
|
|
63
|
+
- **文件**: `path/to/file.ext`
|
|
64
|
+
- **说明**: {详细说明}
|
|
65
|
+
|
|
66
|
+
- [x] 2. {步骤2简述}
|
|
67
|
+
- **文件**: `another/file.ext`
|
|
68
|
+
- **说明**: {详细说明}
|
|
69
|
+
- **完成时间**: {YYYY-MM-DD HH:MM}
|
|
70
|
+
|
|
71
|
+
- [ ] 3. {步骤3简述}
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 📝 关键决策
|
|
76
|
+
|
|
77
|
+
- **模块归属**: {模块名称}
|
|
78
|
+
- **数据库表**: {表名前缀}
|
|
79
|
+
- **主键策略**: {ID生成方式}
|
|
80
|
+
- **技术选型**: {框架/库版本}
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 🔄 当前进度
|
|
85
|
+
|
|
86
|
+
**已完成**: {X} / {总数} 步骤 ({百分比}%)
|
|
87
|
+
|
|
88
|
+
**下一步操作**:
|
|
89
|
+
1. {下一步具体要做的事情}
|
|
90
|
+
2. {再下一步}
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 📁 相关文件
|
|
95
|
+
|
|
96
|
+
- `{文件路径}` - {文件用途}
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## ⚠️ 注意事项
|
|
101
|
+
|
|
102
|
+
- {需要特别注意的点}
|
|
103
|
+
- {已知问题或风险}
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 💬 变更记录
|
|
108
|
+
|
|
109
|
+
### {YYYY-MM-DD HH:MM}
|
|
110
|
+
- {本次更新内容}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## 核心操作
|
|
114
|
+
|
|
115
|
+
### 1. 创建任务
|
|
116
|
+
|
|
117
|
+
**触发**:用户说"创建任务跟踪"、"记录这个任务"
|
|
118
|
+
|
|
119
|
+
**步骤**:
|
|
120
|
+
```bash
|
|
121
|
+
# 1. 确保目录存在
|
|
122
|
+
mkdir -p docs/tasks/active docs/tasks/archive
|
|
123
|
+
|
|
124
|
+
# 2. 生成文件名
|
|
125
|
+
# 格式: task-{YYYYMMdd-HHMMSS}-{任务简称}.md
|
|
126
|
+
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
|
|
127
|
+
SLUG="{任务标题简化版,截断30字符}"
|
|
128
|
+
FILENAME="task-${TIMESTAMP}-${SLUG}.md"
|
|
129
|
+
|
|
130
|
+
# 3. 创建文档
|
|
131
|
+
# 填充上述模板内容到 docs/tasks/active/$FILENAME
|
|
132
|
+
|
|
133
|
+
# 4. 首次使用时创建 README.md(如不存在)
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**README.md 内容**:
|
|
137
|
+
```markdown
|
|
138
|
+
# 任务跟踪中心
|
|
139
|
+
|
|
140
|
+
## 目录说明
|
|
141
|
+
- `active/` - 进行中的任务
|
|
142
|
+
- `archive/` - 已完成的任务(按月归档)
|
|
143
|
+
|
|
144
|
+
## 使用方法
|
|
145
|
+
1. Claude 自动创建任务跟踪文档
|
|
146
|
+
2. 手动编辑文档更新进度(修改复选框)
|
|
147
|
+
3. 任务完成后移动到 archive/{年-月}/
|
|
148
|
+
|
|
149
|
+
## 快速恢复
|
|
150
|
+
```bash
|
|
151
|
+
# 查看活跃任务
|
|
152
|
+
ls -1 active/
|
|
153
|
+
|
|
154
|
+
# 恢复任务
|
|
155
|
+
cat active/task-20260121-*.md
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### 2. 更新进度
|
|
159
|
+
|
|
160
|
+
**触发**:用户说"更新进度"、"标记步骤X完成"
|
|
161
|
+
|
|
162
|
+
**步骤**:
|
|
163
|
+
```bash
|
|
164
|
+
# 1. 找到当前任务文档(最新的那个)
|
|
165
|
+
TASK_FILE=$(ls -t docs/tasks/active/*.md | head -1)
|
|
166
|
+
|
|
167
|
+
# 2. 更新复选框: - [ ] → - [x]
|
|
168
|
+
sed -i "s/^- \[ \] ${STEP_NUMBER}\./- [x] ${STEP_NUMBER}./" "$TASK_FILE"
|
|
169
|
+
|
|
170
|
+
# 3. 更新时间戳
|
|
171
|
+
CURRENT_TIME=$(date '+%Y-%m-%d %H:%M:%S')
|
|
172
|
+
sed -i "s/^\*\*更新时间\*\*:.*/\*\*更新时间\*\*: $CURRENT_TIME/" "$TASK_FILE"
|
|
173
|
+
|
|
174
|
+
# 4. 添加变更记录
|
|
175
|
+
echo -e "### $CURRENT_TIME\n- 完成步骤 $STEP_NUMBER: $DESCRIPTION" >> "$TASK_FILE"
|
|
176
|
+
|
|
177
|
+
# 5. 重新计算进度百分比
|
|
178
|
+
TOTAL=$(grep -c "^- \[.\]" "$TASK_FILE")
|
|
179
|
+
DONE=$(grep -c "^- \[x\]" "$TASK_FILE")
|
|
180
|
+
PERCENT=$((DONE * 100 / TOTAL))
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### 3. 列出活跃任务
|
|
184
|
+
|
|
185
|
+
**触发**:用户说"有哪些任务"、"列出任务"
|
|
186
|
+
|
|
187
|
+
**步骤**:
|
|
188
|
+
```bash
|
|
189
|
+
for file in docs/tasks/active/*.md; do
|
|
190
|
+
TITLE=$(grep "^# 任务:" "$file" | sed 's/^# 任务://')
|
|
191
|
+
STATUS=$(grep "^\*\*状态\*\*:" "$file" | sed 's/.*: //')
|
|
192
|
+
PROGRESS=$(grep "^\*\*已完成\*\*:" "$file" | sed 's/.*: //')
|
|
193
|
+
|
|
194
|
+
echo "📄 $TITLE"
|
|
195
|
+
echo " 状态: $STATUS | 进度: $PROGRESS"
|
|
196
|
+
echo " 文件: $file"
|
|
197
|
+
echo ""
|
|
198
|
+
done
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### 4. 恢复任务
|
|
202
|
+
|
|
203
|
+
**触发**:用户说"继续上次的任务"、"恢复任务"
|
|
204
|
+
|
|
205
|
+
**步骤**:
|
|
206
|
+
```bash
|
|
207
|
+
# 1. 确定要恢复的任务
|
|
208
|
+
if [ 用户指定了任务名 ]; then
|
|
209
|
+
TASK_FILE=$(find docs/tasks/active -name "*{用户指定的关键词}*.md" | head -1)
|
|
210
|
+
else
|
|
211
|
+
TASK_FILE=$(ls -t docs/tasks/active/*.md | head -1) # 最新的
|
|
212
|
+
fi
|
|
213
|
+
|
|
214
|
+
# 2. 读取文档内容
|
|
215
|
+
cat "$TASK_FILE"
|
|
216
|
+
|
|
217
|
+
# 3. 提取关键信息并向用户确认
|
|
218
|
+
TITLE=$(grep "^# 任务:" "$TASK_FILE" | sed 's/^# 任务://')
|
|
219
|
+
NEXT_STEPS=$(提取 "下一步操作" 部分)
|
|
220
|
+
|
|
221
|
+
# 4. 输出恢复信息
|
|
222
|
+
echo "正在恢复任务:$TITLE"
|
|
223
|
+
echo "下一步操作:"
|
|
224
|
+
echo "$NEXT_STEPS"
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### 5. 归档任务
|
|
228
|
+
|
|
229
|
+
**触发**:用户说"任务完成"、"归档任务"
|
|
230
|
+
|
|
231
|
+
**步骤**:
|
|
232
|
+
```bash
|
|
233
|
+
# 1. 更新状态
|
|
234
|
+
sed -i "s/^\*\*状态\*\*:.*/\*\*状态\*\*: 🔵 已完成/" "$TASK_FILE"
|
|
235
|
+
|
|
236
|
+
# 2. 移动到归档目录
|
|
237
|
+
YEAR_MONTH=$(date +%Y-%m)
|
|
238
|
+
mkdir -p "docs/tasks/archive/$YEAR_MONTH"
|
|
239
|
+
mv "$TASK_FILE" "docs/tasks/archive/$YEAR_MONTH/"
|
|
240
|
+
|
|
241
|
+
echo "✅ 已归档到: docs/tasks/archive/$YEAR_MONTH/"
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## 使用示例
|
|
245
|
+
|
|
246
|
+
**场景1:创建任务**
|
|
247
|
+
```
|
|
248
|
+
用户: "创建一个用户反馈功能的任务跟踪"
|
|
249
|
+
|
|
250
|
+
Claude:
|
|
251
|
+
✅ 创建文档: docs/tasks/active/task-20260121-153045-用户反馈.md
|
|
252
|
+
📋 已记录需求描述
|
|
253
|
+
🎯 列出5个实现步骤
|
|
254
|
+
💡 开始第一步:设计数据库表结构
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
**场景2:更新进度**
|
|
258
|
+
```
|
|
259
|
+
用户: "标记步骤1和2完成"
|
|
260
|
+
|
|
261
|
+
Claude:
|
|
262
|
+
✅ 已更新进度: 2/5 (40%)
|
|
263
|
+
⏰ 更新时间: 2026-01-21 16:45:30
|
|
264
|
+
📌 下一步: 实现 Service 层
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
**场景3:恢复任务**
|
|
268
|
+
```
|
|
269
|
+
[用户重新打开窗口]
|
|
270
|
+
用户: "继续上次的用户反馈功能"
|
|
271
|
+
|
|
272
|
+
Claude:
|
|
273
|
+
📄 正在恢复任务:用户反馈管理功能
|
|
274
|
+
✅ 已完成: 数据库设计、实体类创建 (2/5)
|
|
275
|
+
📌 下一步: 实现 Service 层
|
|
276
|
+
🔗 文件: docs/tasks/active/task-20260121-153045-用户反馈.md
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
## 最佳实践
|
|
280
|
+
|
|
281
|
+
**应该做**:
|
|
282
|
+
- ✅ 一个任务 = 一个完整功能开发
|
|
283
|
+
- ✅ 及时更新进度(完成一步更新一次)
|
|
284
|
+
- ✅ 详细记录关键决策
|
|
285
|
+
- ✅ 保留原始需求描述
|
|
286
|
+
|
|
287
|
+
**不应该做**:
|
|
288
|
+
- ❌ 为每个小改动创建任务
|
|
289
|
+
- ❌ 删除旧任务(归档即可)
|
|
290
|
+
- ❌ 自动归档(由用户决定)
|
|
291
|
+
|
|
292
|
+
## 错误处理
|
|
293
|
+
|
|
294
|
+
**目录不存在** → 自动创建 `docs/tasks/active` 和 `archive`
|
|
295
|
+
|
|
296
|
+
**没有活跃任务** → 提示用户:创建新任务 | 恢复归档任务 | 查看历史
|
|
297
|
+
|
|
298
|
+
**文档格式错误** → 尽量解析,提示用户保持格式:
|
|
299
|
+
- 保持 `##` 标题层级
|
|
300
|
+
- 复选框格式:`- [ ]` 或 `- [x]`
|
|
301
|
+
- 不删除 `**字段**` 标记
|
|
302
|
+
|
|
303
|
+
## 功能边界
|
|
304
|
+
|
|
305
|
+
**适用于**:单人开发、本地存储、快速恢复上下文
|
|
306
|
+
|
|
307
|
+
**不适用于**:多人协作、实时同步、复杂依赖管理(请使用专业项目管理工具)
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tech-decision
|
|
3
|
+
description: |
|
|
4
|
+
当需要进行技术选型、对比方案时自动使用此 Skill。
|
|
5
|
+
|
|
6
|
+
触发场景:
|
|
7
|
+
- 选择用什么技术/库
|
|
8
|
+
- 对比不同方案
|
|
9
|
+
- 技术决策
|
|
10
|
+
- 评估优缺点
|
|
11
|
+
- 选择 ruoyi-common 模块
|
|
12
|
+
|
|
13
|
+
触发词:选型、用什么、对比、哪个好、优缺点、选择、技术方案、库、框架、工具、模块
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# 技术决策指南
|
|
17
|
+
|
|
18
|
+
## 本项目技术栈(精确版本)
|
|
19
|
+
|
|
20
|
+
### 后端核心技术
|
|
21
|
+
|
|
22
|
+
| 技术 | 版本 | 用途 | 模块位置 |
|
|
23
|
+
|------|------|------|---------|
|
|
24
|
+
| **Spring Boot** | 3.5.9 | 基础框架 | 全局 |
|
|
25
|
+
| **Java** | 17 | 开发语言 | 全局 |
|
|
26
|
+
| **MyBatis-Plus** | 3.5.16 | ORM 框架 | ruoyi-common-mybatis |
|
|
27
|
+
| **Sa-Token** | 1.44.0 | 权限认证 | ruoyi-common-satoken |
|
|
28
|
+
| **Hutool** | 5.8.43 | 工具库 | ruoyi-common-core |
|
|
29
|
+
| **Redisson** | 3.52.0 | Redis 客户端增强 | ruoyi-common-redis |
|
|
30
|
+
| **MapStruct-Plus** | 1.5.0 | 对象映射 | 全局 |
|
|
31
|
+
| **SpringDoc** | 2.8.15 | API 文档 | ruoyi-common-doc |
|
|
32
|
+
| **Lombok** | 1.18.42 | 代码简化 | 全局 |
|
|
33
|
+
| **FastExcel** | 1.3.0 | Excel 处理 | ruoyi-common-excel |
|
|
34
|
+
|
|
35
|
+
### 后端扩展技术
|
|
36
|
+
|
|
37
|
+
| 技术 | 版本 | 用途 | 模块位置 |
|
|
38
|
+
|------|------|------|---------|
|
|
39
|
+
| **Lock4j** | 2.2.7 | 分布式锁 | ruoyi-common-redis |
|
|
40
|
+
| **SnailJob** | 1.9.0 | 分布式任务调度 | ruoyi-common-job |
|
|
41
|
+
| **AWS SDK** | 2.28.22 | 对象存储 | ruoyi-common-oss |
|
|
42
|
+
| **SMS4j** | 3.3.5 | 短信服务 | ruoyi-common-sms |
|
|
43
|
+
| **JustAuth** | 1.16.7 | 第三方登录 | ruoyi-common-social |
|
|
44
|
+
| **IP2Region** | 3.3.4 | IP 地址定位 | ruoyi-common-core |
|
|
45
|
+
| **P6spy** | 3.9.1 | SQL 日志 | 开发环境 |
|
|
46
|
+
| **Dynamic-DS** | 4.3.1 | 多数据源 | ruoyi-common-mybatis |
|
|
47
|
+
| **Warm-Flow** | 1.8.4 | 工作流引擎 | ruoyi-workflow |
|
|
48
|
+
| **BouncyCastle** | 1.80 | 加密算法 | ruoyi-common-encrypt |
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## ruoyi-common 模块速查(24个模块)
|
|
53
|
+
|
|
54
|
+
### 🔴 高频使用模块(几乎每个项目都用)
|
|
55
|
+
|
|
56
|
+
| 模块 | 说明 | 典型场景 |
|
|
57
|
+
|------|------|---------|
|
|
58
|
+
| `ruoyi-common-core` | 核心工具类 | StringUtils、MapstructUtils、异常处理 |
|
|
59
|
+
| `ruoyi-common-mybatis` | MyBatis 增强 | Mapper 基类(BaseMapperPlus)、分页、查询构建器、多数据源 |
|
|
60
|
+
| `ruoyi-common-redis` | Redis 缓存 | 缓存、分布式锁、延迟队列 |
|
|
61
|
+
| `ruoyi-common-satoken` | 权限认证 | 登录、权限控制、Token 管理 |
|
|
62
|
+
| `ruoyi-common-web` | Web 基础 | 拦截器、过滤器、跨域 |
|
|
63
|
+
| `ruoyi-common-json` | JSON 序列化 | Jackson 配置、Long 精度处理 |
|
|
64
|
+
| `ruoyi-common-log` | 日志记录 | 操作日志、登录日志 |
|
|
65
|
+
| `ruoyi-common-doc` | API 文档 | SpringDoc/Swagger 文档生成 |
|
|
66
|
+
|
|
67
|
+
### 🟡 按需使用模块(根据业务需求)
|
|
68
|
+
|
|
69
|
+
#### 数据处理
|
|
70
|
+
|
|
71
|
+
| 模块 | 说明 | 使用场景 |
|
|
72
|
+
|------|------|---------|
|
|
73
|
+
| `ruoyi-common-excel` | Excel 导入导出 | 数据导入、报表导出 |
|
|
74
|
+
| `ruoyi-common-oss` | 对象存储 | 文件上传(S3/MinIO/阿里云/腾讯云) |
|
|
75
|
+
| `ruoyi-common-encrypt` | 数据加密 | 数据库字段加密存储 |
|
|
76
|
+
| `ruoyi-common-sensitive` | 数据脱敏 | 手机号、身份证脱敏显示 |
|
|
77
|
+
| `ruoyi-common-translation` | 数据翻译 | ID→名称、字典→标签自动转换 |
|
|
78
|
+
|
|
79
|
+
#### 通信与消息
|
|
80
|
+
|
|
81
|
+
| 模块 | 说明 | 使用场景 |
|
|
82
|
+
|------|------|---------|
|
|
83
|
+
| `ruoyi-common-websocket` | WebSocket | 实时消息推送、在线聊天 |
|
|
84
|
+
| `ruoyi-common-sse` | 服务端推送 | 流式响应、单向推送 |
|
|
85
|
+
| `ruoyi-common-mail` | 邮件发送 | 通知邮件、验证码 |
|
|
86
|
+
| `ruoyi-common-sms` | 短信发送 | 短信验证码、营销短信 |
|
|
87
|
+
|
|
88
|
+
#### 系统功能
|
|
89
|
+
|
|
90
|
+
| 模块 | 说明 | 使用场景 |
|
|
91
|
+
|------|------|---------|
|
|
92
|
+
| `ruoyi-common-tenant` | 多租户 | SaaS 多租户隔离 |
|
|
93
|
+
| `ruoyi-common-job` | 任务调度 | 定时任务(SnailJob) |
|
|
94
|
+
| `ruoyi-common-idempotent` | 幂等控制 | 防重复提交 |
|
|
95
|
+
| `ruoyi-common-ratelimiter` | 接口限流 | 防刷、保护接口 |
|
|
96
|
+
| `ruoyi-common-social` | 社交登录 | 第三方平台登录(JustAuth) |
|
|
97
|
+
| `ruoyi-common-security` | 应用安全 | XSS 防护、SQL 注入防护 |
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 技术选型决策树
|
|
102
|
+
|
|
103
|
+
### 场景 1:需要实时通信?
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
需要实时双向通信?
|
|
107
|
+
├─ 是 → WebSocket(ruoyi-common-websocket)
|
|
108
|
+
│ 适用:在线聊天、协同编辑、实时游戏
|
|
109
|
+
│
|
|
110
|
+
└─ 否 → 需要服务端主动推送?
|
|
111
|
+
├─ 是 → SSE(ruoyi-common-sse)
|
|
112
|
+
│ 适用:流式响应、通知推送、进度更新
|
|
113
|
+
│
|
|
114
|
+
└─ 否 → HTTP 轮询或普通请求
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 场景 2:需要异步处理?
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
需要异步处理?
|
|
121
|
+
├─ 简单异步(同一应用内)
|
|
122
|
+
│ └─ @Async + Spring TaskExecutor
|
|
123
|
+
│ 适用:发送邮件、记录日志等不需要可靠性保证的任务
|
|
124
|
+
│
|
|
125
|
+
├─ 需要延迟执行?
|
|
126
|
+
│ └─ Redis 延迟队列(RedissonDelayedQueue)
|
|
127
|
+
│ 适用:订单超时取消、延迟通知(ruoyi-common-redis)
|
|
128
|
+
│
|
|
129
|
+
└─ 不需要异步 → 同步调用
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 场景 3:需要定时任务?
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
需要定时任务?
|
|
136
|
+
├─ 单机简单任务(不需要分布式)
|
|
137
|
+
│ └─ @Scheduled(Spring 原生)
|
|
138
|
+
│ 适用:清理临时文件、统计数据、心跳检测
|
|
139
|
+
│
|
|
140
|
+
├─ 分布式调度/复杂任务
|
|
141
|
+
│ └─ SnailJob(ruoyi-common-job)
|
|
142
|
+
│ 适用:多节点任务、失败重试、任务编排、可视化管理
|
|
143
|
+
│
|
|
144
|
+
└─ 延迟任务(非周期性)
|
|
145
|
+
└─ Redis 延迟队列
|
|
146
|
+
适用:订单超时取消、定时发布
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### 场景 4:需要缓存?
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
需要缓存?
|
|
153
|
+
├─ 简单 Key-Value 缓存
|
|
154
|
+
│ └─ Redis String(ruoyi-common-redis)
|
|
155
|
+
│ 适用:用户信息、配置数据、Token
|
|
156
|
+
│
|
|
157
|
+
├─ 分布式锁
|
|
158
|
+
│ └─ Lock4j + Redisson(ruoyi-common-redis)
|
|
159
|
+
│ 适用:库存扣减、防重复操作
|
|
160
|
+
│
|
|
161
|
+
├─ 排行榜/计数器
|
|
162
|
+
│ └─ Redis ZSet/Hash
|
|
163
|
+
│ 适用:热门排行、点赞计数、在线人数
|
|
164
|
+
│
|
|
165
|
+
├─ 布隆过滤器(防缓存穿透)
|
|
166
|
+
│ └─ Redisson BloomFilter
|
|
167
|
+
│ 适用:用户存在性检查、黑名单过滤
|
|
168
|
+
│
|
|
169
|
+
└─ 本地缓存(高频访问)
|
|
170
|
+
└─ Caffeine
|
|
171
|
+
适用:字典数据、菜单数据(本项目已集成)
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### 场景 5:需要第三方登录?
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
需要第三方登录?
|
|
178
|
+
└─ ruoyi-common-social(基于 JustAuth)
|
|
179
|
+
支持 20+ 平台:微信、QQ、微博、GitHub、企业微信、钉钉等
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## 技术优先级指南
|
|
185
|
+
|
|
186
|
+
### 优先级 1:首选方案(覆盖 80% 场景)
|
|
187
|
+
|
|
188
|
+
| 需求 | 首选技术 | 模块 | 理由 |
|
|
189
|
+
|------|---------|------|------|
|
|
190
|
+
| 缓存 | Redis | ruoyi-common-redis | 功能全面、生态成熟 |
|
|
191
|
+
| 分布式锁 | Lock4j | ruoyi-common-redis | 注解简单、自动续期 |
|
|
192
|
+
| 实时通信 | WebSocket | ruoyi-common-websocket | 双向通信、广泛支持 |
|
|
193
|
+
| 定时任务(简单) | @Scheduled | Spring 原生 | 零配置、够用 |
|
|
194
|
+
| 文件上传 | OSS | ruoyi-common-oss | 统一接口、多云支持 |
|
|
195
|
+
| 权限认证 | Sa-Token | ruoyi-common-satoken | 功能强大、文档好 |
|
|
196
|
+
| 对象转换 | MapStruct | 全局 | 编译期生成、性能好 |
|
|
197
|
+
|
|
198
|
+
### 优先级 2:进阶方案(特定场景)
|
|
199
|
+
|
|
200
|
+
| 需求 | 进阶技术 | 模块 | 使用条件 |
|
|
201
|
+
|------|---------|------|---------|
|
|
202
|
+
| 定时任务(复杂) | SnailJob | ruoyi-common-job | 分布式、可视化 |
|
|
203
|
+
| 流式推送 | SSE | ruoyi-common-sse | 流式响应、实时推送 |
|
|
204
|
+
| 多数据源 | Dynamic-DS | ruoyi-common-mybatis | 多数据库切换 |
|
|
205
|
+
| 工作流 | Warm-Flow | ruoyi-workflow | 审批流程、流程编排 |
|
|
206
|
+
|
|
207
|
+
### 优先级 3:专用方案(特殊需求)
|
|
208
|
+
|
|
209
|
+
| 需求 | 专用技术 | 模块 | 备注 |
|
|
210
|
+
|------|---------|------|------|
|
|
211
|
+
| 短信发送 | SMS4j | ruoyi-common-sms | 多平台聚合 |
|
|
212
|
+
| 第三方登录 | JustAuth | ruoyi-common-social | 20+ 平台支持 |
|
|
213
|
+
| 数据翻译 | Translation | ruoyi-common-translation | ID→名称自动转换 |
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 常见选型对比
|
|
218
|
+
|
|
219
|
+
### 1. 异步处理选型
|
|
220
|
+
|
|
221
|
+
| 方案 | 适用场景 | 优点 | 缺点 |
|
|
222
|
+
|------|---------|------|------|
|
|
223
|
+
| **@Async** | 简单异步任务 | Spring 原生、零配置 | 无可靠性保证 |
|
|
224
|
+
| **Redis Streams** | 轻量消息、简单队列 | 无额外依赖、使用简单 | 功能有限、无事务 |
|
|
225
|
+
| **Redis 延迟队列** | 延迟任务 | 基于 Redisson、易用 | 不适合高吞吐 |
|
|
226
|
+
|
|
227
|
+
**本项目推荐**:
|
|
228
|
+
- 简单场景 → @Async
|
|
229
|
+
- 延迟任务 → Redis 延迟队列(ruoyi-common-redis)
|
|
230
|
+
|
|
231
|
+
### 2. 定时任务选型
|
|
232
|
+
|
|
233
|
+
| 方案 | 适用场景 | 优点 | 缺点 |
|
|
234
|
+
|------|---------|------|------|
|
|
235
|
+
| **@Scheduled** | 单机简单任务 | 零配置、Spring 原生 | 无分布式支持 |
|
|
236
|
+
| **SnailJob** | 分布式复杂任务 | 可视化、失败重试、工作流 | 需要额外部署 |
|
|
237
|
+
| **XXL-Job** | 分布式任务 | 文档丰富、社区活跃 | 本项目未集成 |
|
|
238
|
+
| **Quartz** | 传统定时任务 | 功能完善、历史悠久 | 配置复杂 |
|
|
239
|
+
|
|
240
|
+
**本项目推荐**:
|
|
241
|
+
- 简单场景 → @Scheduled
|
|
242
|
+
- 复杂场景 → SnailJob(ruoyi-common-job)
|
|
243
|
+
|
|
244
|
+
### 3. HTTP 客户端选型
|
|
245
|
+
|
|
246
|
+
| 方案 | 适用场景 | 优点 | 缺点 |
|
|
247
|
+
|------|---------|------|------|
|
|
248
|
+
| **RestTemplate** | 简单 HTTP 调用 | Spring 原生、简单 | 同步阻塞、功能有限 |
|
|
249
|
+
| **WebClient** | 响应式 HTTP | 异步非阻塞 | 学习曲线 |
|
|
250
|
+
| **OkHttp** | 高性能 HTTP | 连接池、拦截器 | 需要手动封装 |
|
|
251
|
+
| **Hutool HttpUtil** | 工具类调用 | 简单易用、已集成 | 功能相对简单 |
|
|
252
|
+
|
|
253
|
+
**本项目推荐**:
|
|
254
|
+
- 简单场景 → RestTemplate 或 Hutool HttpUtil
|
|
255
|
+
- 响应式场景 → WebClient
|
|
256
|
+
|
|
257
|
+
### 4. Excel 处理选型
|
|
258
|
+
|
|
259
|
+
| 方案 | 适用场景 | 优点 | 缺点 |
|
|
260
|
+
|------|---------|------|------|
|
|
261
|
+
| **FastExcel** | 大文件、高性能 | 内存占用低、速度快 | 功能相对简单 |
|
|
262
|
+
| **EasyExcel** | 通用场景 | 功能全面、文档好 | 阿里维护 |
|
|
263
|
+
| **Apache POI** | 复杂操作 | 功能最全 | 内存占用大 |
|
|
264
|
+
|
|
265
|
+
**本项目推荐**:FastExcel(ruoyi-common-excel)
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## 决策记录模板
|
|
270
|
+
|
|
271
|
+
```markdown
|
|
272
|
+
# [决策标题]
|
|
273
|
+
|
|
274
|
+
## 背景
|
|
275
|
+
[为什么需要做这个决策]
|
|
276
|
+
|
|
277
|
+
## 决策内容
|
|
278
|
+
[选择了什么,如何实现]
|
|
279
|
+
|
|
280
|
+
## 考虑的方案
|
|
281
|
+
| 方案 | 优点 | 缺点 | 评分 |
|
|
282
|
+
|------|------|------|------|
|
|
283
|
+
| 方案A | | | |
|
|
284
|
+
| 方案B | | | |
|
|
285
|
+
| 方案C | | | |
|
|
286
|
+
|
|
287
|
+
## 决策理由
|
|
288
|
+
1. [理由1]
|
|
289
|
+
2. [理由2]
|
|
290
|
+
3. [理由3]
|
|
291
|
+
|
|
292
|
+
## 后果
|
|
293
|
+
- **优点**:[带来的好处]
|
|
294
|
+
- **缺点**:[需要接受的代价]
|
|
295
|
+
- **风险**:[潜在风险及应对]
|
|
296
|
+
|
|
297
|
+
## 日期
|
|
298
|
+
[YYYY-MM-DD]
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## 模块引入示例
|
|
304
|
+
|
|
305
|
+
### 在 pom.xml 中引入模块
|
|
306
|
+
|
|
307
|
+
```xml
|
|
308
|
+
<!-- 按需引入 ruoyi-common 模块 -->
|
|
309
|
+
<dependencies>
|
|
310
|
+
<!-- 核心模块(必须) -->
|
|
311
|
+
<dependency>
|
|
312
|
+
<groupId>org.dromara</groupId>
|
|
313
|
+
<artifactId>ruoyi-common-core</artifactId>
|
|
314
|
+
</dependency>
|
|
315
|
+
|
|
316
|
+
<!-- MyBatis(必须) -->
|
|
317
|
+
<dependency>
|
|
318
|
+
<groupId>org.dromara</groupId>
|
|
319
|
+
<artifactId>ruoyi-common-mybatis</artifactId>
|
|
320
|
+
</dependency>
|
|
321
|
+
|
|
322
|
+
<!-- Redis 缓存(推荐) -->
|
|
323
|
+
<dependency>
|
|
324
|
+
<groupId>org.dromara</groupId>
|
|
325
|
+
<artifactId>ruoyi-common-redis</artifactId>
|
|
326
|
+
</dependency>
|
|
327
|
+
|
|
328
|
+
<!-- WebSocket(按需) -->
|
|
329
|
+
<dependency>
|
|
330
|
+
<groupId>org.dromara</groupId>
|
|
331
|
+
<artifactId>ruoyi-common-websocket</artifactId>
|
|
332
|
+
</dependency>
|
|
333
|
+
|
|
334
|
+
<!-- 短信服务(按需) -->
|
|
335
|
+
<dependency>
|
|
336
|
+
<groupId>org.dromara</groupId>
|
|
337
|
+
<artifactId>ruoyi-common-sms</artifactId>
|
|
338
|
+
</dependency>
|
|
339
|
+
</dependencies>
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## 评估检查清单
|
|
345
|
+
|
|
346
|
+
### 选型前必查
|
|
347
|
+
|
|
348
|
+
- [ ] **功能满足**:是否满足当前功能需求?
|
|
349
|
+
- [ ] **性能满足**:是否满足性能要求?
|
|
350
|
+
- [ ] **社区活跃**:GitHub Stars、Issues 响应速度?
|
|
351
|
+
- [ ] **文档完善**:是否有中文文档?
|
|
352
|
+
- [ ] **兼容性**:与现有技术栈是否兼容?
|
|
353
|
+
- [ ] **学习成本**:团队是否熟悉?学习曲线如何?
|
|
354
|
+
- [ ] **维护成本**:长期维护成本如何?
|
|
355
|
+
- [ ] **安全漏洞**:是否有已知安全漏洞?
|
|
356
|
+
- [ ] **License**:是否允许商用?
|
|
357
|
+
- [ ] **项目已有**:ruoyi-common 是否已经集成?
|
|
358
|
+
|
|
359
|
+
### 本项目优先原则
|
|
360
|
+
|
|
361
|
+
1. **优先使用 ruoyi-common 模块**:已集成、已测试、风格统一
|
|
362
|
+
2. **优先使用 Hutool 工具类**:项目已依赖,无需额外引入
|
|
363
|
+
3. **优先使用 Spring 原生**:稳定、文档全、社区大
|
|
364
|
+
4. **避免重复造轮子**:先查 ruoyi-common 是否有现成实现
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
## 快速决策参考
|
|
369
|
+
|
|
370
|
+
| 我想要... | 用这个 | 模块/技术 |
|
|
371
|
+
|----------|--------|---------|
|
|
372
|
+
| 缓存数据 | Redis | ruoyi-common-redis |
|
|
373
|
+
| 分布式锁 | Lock4j | ruoyi-common-redis |
|
|
374
|
+
| 发送短信 | SMS4j | ruoyi-common-sms |
|
|
375
|
+
| 发送邮件 | Spring Mail | ruoyi-common-mail |
|
|
376
|
+
| 上传文件 | AWS S3 SDK | ruoyi-common-oss |
|
|
377
|
+
| 定时任务(简单) | @Scheduled | Spring 原生 |
|
|
378
|
+
| 定时任务(复杂) | SnailJob | ruoyi-common-job |
|
|
379
|
+
| 实时推送 | WebSocket | ruoyi-common-websocket |
|
|
380
|
+
| 流式响应 | SSE | ruoyi-common-sse |
|
|
381
|
+
| 数据脱敏 | @Sensitive | ruoyi-common-sensitive |
|
|
382
|
+
| 字段加密 | @EncryptField | ruoyi-common-encrypt |
|
|
383
|
+
| 数据翻译 | Translation | ruoyi-common-translation |
|
|
384
|
+
| 接口限流 | @RateLimiter | ruoyi-common-ratelimiter |
|
|
385
|
+
| 防重复提交 | @RepeatSubmit | ruoyi-common-idempotent |
|
|
386
|
+
| 第三方登录 | JustAuth | ruoyi-common-social |
|
|
387
|
+
| Excel 导出 | FastExcel | ruoyi-common-excel |
|
|
388
|
+
| API 文档 | SpringDoc | ruoyi-common-doc |
|
|
389
|
+
| HTTP 调用 | RestTemplate/Hutool | Spring 原生/Hutool |
|
|
390
|
+
| 多租户隔离 | Tenant | ruoyi-common-tenant |
|
|
391
|
+
| 多数据源 | Dynamic-DS | ruoyi-common-mybatis |
|
|
392
|
+
| 工作流 | Warm-Flow | ruoyi-workflow |
|
|
393
|
+
| 应用安全 | Security | ruoyi-common-security |
|