ai-engineering-init 1.3.4 → 1.4.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 (226) hide show
  1. package/.claude/hooks/skill-forced-eval.js +2 -0
  2. package/.claude/settings.json +3 -3
  3. package/.claude/skills/add-skill/SKILL.md +79 -32
  4. package/.claude/skills/api-development/SKILL.md +83 -377
  5. package/.claude/skills/architecture-design/SKILL.md +138 -632
  6. package/.claude/skills/backend-annotations/SKILL.md +134 -506
  7. package/.claude/skills/banana-image/SKILL.md +10 -3
  8. package/.claude/skills/brainstorm/SKILL.md +103 -535
  9. package/.claude/skills/bug-detective/SKILL.md +147 -1097
  10. package/.claude/skills/bug-detective/references/error-patterns.md +242 -0
  11. package/.claude/skills/code-patterns/SKILL.md +116 -426
  12. package/.claude/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  13. package/.claude/skills/crud-development/SKILL.md +64 -304
  14. package/.claude/skills/data-permission/SKILL.md +105 -412
  15. package/.claude/skills/data-permission/references/custom-data-scope.md +90 -0
  16. package/.claude/skills/file-oss-management/SKILL.md +106 -714
  17. package/.claude/skills/file-oss-management/references/entities.md +105 -0
  18. package/.claude/skills/file-oss-management/references/service-impl.md +104 -0
  19. package/.claude/skills/leniu-api-development/SKILL.md +142 -626
  20. package/.claude/skills/leniu-api-development/references/real-examples.md +273 -0
  21. package/.claude/skills/leniu-architecture-design/SKILL.md +176 -391
  22. package/.claude/skills/leniu-backend-annotations/SKILL.md +132 -519
  23. package/.claude/skills/leniu-brainstorm/SKILL.md +132 -541
  24. package/.claude/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  25. package/.claude/skills/leniu-crud-development/SKILL.md +232 -938
  26. package/.claude/skills/leniu-crud-development/references/templates.md +597 -0
  27. package/.claude/skills/leniu-customization-location/SKILL.md +410 -0
  28. package/.claude/skills/leniu-data-permission/SKILL.md +70 -0
  29. package/.claude/skills/leniu-java-entity/SKILL.md +76 -590
  30. package/.claude/skills/leniu-java-entity/references/templates.md +237 -0
  31. package/.claude/skills/leniu-java-export/SKILL.md +94 -379
  32. package/.claude/skills/leniu-java-logging/SKILL.md +106 -709
  33. package/.claude/skills/leniu-java-logging/references/data-mask.md +46 -0
  34. package/.claude/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  35. package/.claude/skills/leniu-java-mybatis/SKILL.md +73 -446
  36. package/.claude/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  37. package/.claude/skills/leniu-report-customization/SKILL.md +111 -365
  38. package/.claude/skills/leniu-report-customization/references/table-fields.md +93 -0
  39. package/.claude/skills/leniu-report-standard-customization/SKILL.md +111 -334
  40. package/.claude/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  41. package/.claude/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  42. package/.claude/skills/leniu-security-guard/SKILL.md +133 -347
  43. package/.claude/skills/mysql-debug/SKILL.md +364 -0
  44. package/.claude/skills/openspec-apply-change/SKILL.md +10 -1
  45. package/.claude/skills/openspec-archive-change/SKILL.md +9 -1
  46. package/.claude/skills/openspec-bulk-archive-change/SKILL.md +9 -1
  47. package/.claude/skills/openspec-continue-change/SKILL.md +9 -1
  48. package/.claude/skills/openspec-explore/SKILL.md +10 -1
  49. package/.claude/skills/openspec-ff-change/SKILL.md +9 -1
  50. package/.claude/skills/openspec-new-change/SKILL.md +9 -1
  51. package/.claude/skills/openspec-onboard/SKILL.md +15 -130
  52. package/.claude/skills/openspec-sync-specs/SKILL.md +9 -1
  53. package/.claude/skills/openspec-verify-change/SKILL.md +9 -1
  54. package/.claude/skills/performance-doctor/SKILL.md +110 -434
  55. package/.claude/skills/redis-cache/SKILL.md +89 -595
  56. package/.claude/skills/redis-cache/references/listeners.md +23 -0
  57. package/.claude/skills/scheduled-jobs/SKILL.md +88 -407
  58. package/.claude/skills/security-guard/SKILL.md +137 -532
  59. package/.claude/skills/security-guard/references/encrypt-config.md +103 -0
  60. package/.claude/skills/security-guard/references/sensitive-strategies.md +42 -0
  61. package/.claude/skills/sms-mail/SKILL.md +116 -574
  62. package/.claude/skills/sms-mail/references/mail-config.md +88 -0
  63. package/.claude/skills/sms-mail/references/sms-config.md +74 -0
  64. package/.claude/skills/social-login/SKILL.md +112 -514
  65. package/.claude/skills/social-login/references/provider-configs.md +118 -0
  66. package/.claude/skills/tenant-management/SKILL.md +129 -444
  67. package/.claude/skills/tenant-management/references/tenant-scenarios.md +91 -0
  68. package/.claude/skills/test-development/SKILL.md +86 -540
  69. package/.claude/skills/test-development/references/parameterized-examples.md +119 -0
  70. package/.claude/skills/utils-toolkit/SKILL.md +52 -305
  71. package/.claude/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  72. package/.claude/skills/websocket-sse/SKILL.md +105 -550
  73. package/.claude/skills/workflow-engine/SKILL.md +147 -502
  74. package/.codex/skills/add-skill/SKILL.md +79 -32
  75. package/.codex/skills/api-development/SKILL.md +172 -599
  76. package/.codex/skills/architecture-design/SKILL.md +138 -504
  77. package/.codex/skills/backend-annotations/SKILL.md +134 -496
  78. package/.codex/skills/banana-image/SKILL.md +10 -3
  79. package/.codex/skills/brainstorm/SKILL.md +103 -535
  80. package/.codex/skills/bug-detective/SKILL.md +147 -1097
  81. package/.codex/skills/bug-detective/references/error-patterns.md +242 -0
  82. package/.codex/skills/code-patterns/SKILL.md +120 -282
  83. package/.codex/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  84. package/.codex/skills/crud-development/SKILL.md +64 -292
  85. package/.codex/skills/data-permission/SKILL.md +108 -407
  86. package/.codex/skills/data-permission/references/custom-data-scope.md +90 -0
  87. package/.codex/skills/database-ops/SKILL.md +8 -154
  88. package/.codex/skills/error-handler/SKILL.md +10 -0
  89. package/.codex/skills/file-oss-management/SKILL.md +106 -714
  90. package/.codex/skills/file-oss-management/references/entities.md +105 -0
  91. package/.codex/skills/file-oss-management/references/service-impl.md +104 -0
  92. package/.codex/skills/git-workflow/SKILL.md +27 -5
  93. package/.codex/skills/leniu-api-development/SKILL.md +142 -626
  94. package/.codex/skills/leniu-api-development/references/real-examples.md +273 -0
  95. package/.codex/skills/leniu-architecture-design/SKILL.md +176 -391
  96. package/.codex/skills/leniu-backend-annotations/SKILL.md +132 -519
  97. package/.codex/skills/leniu-brainstorm/SKILL.md +132 -541
  98. package/.codex/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  99. package/.codex/skills/leniu-crud-development/SKILL.md +232 -938
  100. package/.codex/skills/leniu-crud-development/references/templates.md +597 -0
  101. package/.codex/skills/leniu-customization-location/SKILL.md +410 -0
  102. package/.codex/skills/leniu-data-permission/SKILL.md +70 -0
  103. package/.codex/skills/leniu-java-code-style/SKILL.md +510 -0
  104. package/.codex/skills/leniu-java-entity/SKILL.md +76 -590
  105. package/.codex/skills/leniu-java-entity/references/templates.md +237 -0
  106. package/.codex/skills/leniu-java-export/SKILL.md +94 -379
  107. package/.codex/skills/leniu-java-logging/SKILL.md +106 -709
  108. package/.codex/skills/leniu-java-logging/references/data-mask.md +46 -0
  109. package/.codex/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  110. package/.codex/skills/leniu-java-mybatis/SKILL.md +73 -446
  111. package/.codex/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  112. package/.codex/skills/leniu-report-customization/SKILL.md +111 -365
  113. package/.codex/skills/leniu-report-customization/references/table-fields.md +93 -0
  114. package/.codex/skills/leniu-report-standard-customization/SKILL.md +111 -334
  115. package/.codex/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  116. package/.codex/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  117. package/.codex/skills/leniu-security-guard/SKILL.md +133 -347
  118. package/.codex/skills/mysql-debug/SKILL.md +364 -0
  119. package/.codex/skills/openspec-apply-change/SKILL.md +10 -1
  120. package/.codex/skills/openspec-archive-change/SKILL.md +9 -1
  121. package/.codex/skills/openspec-bulk-archive-change/SKILL.md +9 -1
  122. package/.codex/skills/openspec-continue-change/SKILL.md +9 -1
  123. package/.codex/skills/openspec-explore/SKILL.md +10 -1
  124. package/.codex/skills/openspec-ff-change/SKILL.md +9 -1
  125. package/.codex/skills/openspec-new-change/SKILL.md +9 -1
  126. package/.codex/skills/openspec-onboard/SKILL.md +15 -130
  127. package/.codex/skills/openspec-sync-specs/SKILL.md +9 -1
  128. package/.codex/skills/openspec-verify-change/SKILL.md +9 -1
  129. package/.codex/skills/performance-doctor/SKILL.md +110 -434
  130. package/.codex/skills/project-navigator/SKILL.md +20 -1
  131. package/.codex/skills/redis-cache/SKILL.md +93 -589
  132. package/.codex/skills/redis-cache/references/listeners.md +23 -0
  133. package/.codex/skills/scheduled-jobs/SKILL.md +88 -407
  134. package/.codex/skills/security-guard/SKILL.md +141 -527
  135. package/.codex/skills/security-guard/references/encrypt-config.md +103 -0
  136. package/.codex/skills/security-guard/references/sensitive-strategies.md +42 -0
  137. package/.codex/skills/sms-mail/SKILL.md +116 -574
  138. package/.codex/skills/sms-mail/references/mail-config.md +88 -0
  139. package/.codex/skills/sms-mail/references/sms-config.md +74 -0
  140. package/.codex/skills/social-login/SKILL.md +112 -514
  141. package/.codex/skills/social-login/references/provider-configs.md +118 -0
  142. package/.codex/skills/store-pc/SKILL.md +258 -383
  143. package/.codex/skills/tenant-management/SKILL.md +129 -444
  144. package/.codex/skills/tenant-management/references/tenant-scenarios.md +91 -0
  145. package/.codex/skills/test-development/SKILL.md +86 -540
  146. package/.codex/skills/test-development/references/parameterized-examples.md +119 -0
  147. package/.codex/skills/ui-pc/SKILL.md +350 -387
  148. package/.codex/skills/utils-toolkit/SKILL.md +52 -283
  149. package/.codex/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  150. package/.codex/skills/websocket-sse/SKILL.md +105 -550
  151. package/.codex/skills/workflow-engine/SKILL.md +147 -502
  152. package/.cursor/hooks.json +3 -3
  153. package/.cursor/skills/add-skill/SKILL.md +79 -32
  154. package/.cursor/skills/api-development/SKILL.md +83 -377
  155. package/.cursor/skills/architecture-design/SKILL.md +138 -632
  156. package/.cursor/skills/backend-annotations/SKILL.md +134 -506
  157. package/.cursor/skills/banana-image/SKILL.md +10 -3
  158. package/.cursor/skills/brainstorm/SKILL.md +103 -535
  159. package/.cursor/skills/bug-detective/SKILL.md +147 -1097
  160. package/.cursor/skills/bug-detective/references/error-patterns.md +242 -0
  161. package/.cursor/skills/code-patterns/SKILL.md +116 -426
  162. package/.cursor/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  163. package/.cursor/skills/crud-development/SKILL.md +64 -304
  164. package/.cursor/skills/data-permission/SKILL.md +105 -412
  165. package/.cursor/skills/data-permission/references/custom-data-scope.md +90 -0
  166. package/.cursor/skills/file-oss-management/SKILL.md +106 -714
  167. package/.cursor/skills/file-oss-management/references/entities.md +105 -0
  168. package/.cursor/skills/file-oss-management/references/service-impl.md +104 -0
  169. package/.cursor/skills/git-workflow/SKILL.md +27 -5
  170. package/.cursor/skills/leniu-api-development/SKILL.md +142 -626
  171. package/.cursor/skills/leniu-api-development/references/real-examples.md +273 -0
  172. package/.cursor/skills/leniu-architecture-design/SKILL.md +176 -391
  173. package/.cursor/skills/leniu-backend-annotations/SKILL.md +132 -519
  174. package/.cursor/skills/leniu-brainstorm/SKILL.md +132 -541
  175. package/.cursor/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  176. package/.cursor/skills/leniu-crud-development/SKILL.md +232 -938
  177. package/.cursor/skills/leniu-crud-development/references/templates.md +597 -0
  178. package/.cursor/skills/leniu-customization-location/SKILL.md +410 -0
  179. package/.cursor/skills/leniu-data-permission/SKILL.md +70 -0
  180. package/.cursor/skills/leniu-java-code-style/SKILL.md +510 -0
  181. package/.cursor/skills/leniu-java-entity/SKILL.md +76 -590
  182. package/.cursor/skills/leniu-java-entity/references/templates.md +237 -0
  183. package/.cursor/skills/leniu-java-export/SKILL.md +94 -379
  184. package/.cursor/skills/leniu-java-logging/SKILL.md +106 -709
  185. package/.cursor/skills/leniu-java-logging/references/data-mask.md +46 -0
  186. package/.cursor/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  187. package/.cursor/skills/leniu-java-mybatis/SKILL.md +73 -446
  188. package/.cursor/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  189. package/.cursor/skills/leniu-report-customization/SKILL.md +111 -365
  190. package/.cursor/skills/leniu-report-customization/references/table-fields.md +93 -0
  191. package/.cursor/skills/leniu-report-standard-customization/SKILL.md +111 -334
  192. package/.cursor/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  193. package/.cursor/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  194. package/.cursor/skills/leniu-security-guard/SKILL.md +133 -347
  195. package/.cursor/skills/mysql-debug/SKILL.md +364 -0
  196. package/.cursor/skills/openspec-apply-change/SKILL.md +10 -1
  197. package/.cursor/skills/openspec-archive-change/SKILL.md +9 -1
  198. package/.cursor/skills/openspec-bulk-archive-change/SKILL.md +9 -1
  199. package/.cursor/skills/openspec-continue-change/SKILL.md +9 -1
  200. package/.cursor/skills/openspec-explore/SKILL.md +10 -1
  201. package/.cursor/skills/openspec-ff-change/SKILL.md +9 -1
  202. package/.cursor/skills/openspec-new-change/SKILL.md +9 -1
  203. package/.cursor/skills/openspec-onboard/SKILL.md +15 -130
  204. package/.cursor/skills/openspec-sync-specs/SKILL.md +9 -1
  205. package/.cursor/skills/openspec-verify-change/SKILL.md +9 -1
  206. package/.cursor/skills/performance-doctor/SKILL.md +110 -434
  207. package/.cursor/skills/redis-cache/SKILL.md +89 -595
  208. package/.cursor/skills/redis-cache/references/listeners.md +23 -0
  209. package/.cursor/skills/scheduled-jobs/SKILL.md +88 -407
  210. package/.cursor/skills/security-guard/SKILL.md +137 -532
  211. package/.cursor/skills/security-guard/references/encrypt-config.md +103 -0
  212. package/.cursor/skills/security-guard/references/sensitive-strategies.md +42 -0
  213. package/.cursor/skills/sms-mail/SKILL.md +116 -574
  214. package/.cursor/skills/sms-mail/references/mail-config.md +88 -0
  215. package/.cursor/skills/sms-mail/references/sms-config.md +74 -0
  216. package/.cursor/skills/social-login/SKILL.md +112 -514
  217. package/.cursor/skills/social-login/references/provider-configs.md +118 -0
  218. package/.cursor/skills/tenant-management/SKILL.md +129 -444
  219. package/.cursor/skills/tenant-management/references/tenant-scenarios.md +91 -0
  220. package/.cursor/skills/test-development/SKILL.md +86 -540
  221. package/.cursor/skills/test-development/references/parameterized-examples.md +119 -0
  222. package/.cursor/skills/utils-toolkit/SKILL.md +52 -305
  223. package/.cursor/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  224. package/.cursor/skills/websocket-sse/SKILL.md +105 -550
  225. package/.cursor/skills/workflow-engine/SKILL.md +147 -502
  226. package/package.json +1 -1
@@ -8,350 +8,173 @@ description: |
8
8
  - 新业务模块的模块划分与结构规划
9
9
  - 代码分层与重构策略
10
10
  - 依赖关系梳理与解耦
11
- - 架构演进路径建议(从单体到微服务)
11
+ - 架构演进路径建议
12
12
  - 领域边界划分与包结构设计
13
13
  - 技术栈选型与方案决策
14
14
 
15
15
  触发词:架构设计、模块划分、三层架构、分层、领域划分、重构、解耦、依赖管理、系统设计、代码组织、技术栈、架构演进
16
16
 
17
17
  注意:
18
- 1. 具体技术对比(Redis vs 本地缓存)→ 使用 tech-decision
19
- 2. 开发具体 CRUD 模块 使用 crud-development
20
- 3. 数据库建表与字典配置 使用 database-ops
18
+ 1. 具体技术对比(Redis vs 本地缓存)-> 使用 tech-decision
19
+ 2. 开发具体 CRUD 模块 -> 使用 crud-development
20
+ 3. 数据库建表与字典配置 -> 使用 database-ops
21
21
  4. 本项目是纯后端项目(无前端代码)
22
22
  ---
23
23
 
24
24
  # 架构设计指南
25
25
 
26
- ## 本项目技术栈
27
-
28
- ### 核心技术架构
29
-
30
- | 层级 | 技术栈 | 版本 | 说明 |
31
- |------|--------|------|------|
32
- | **后端框架** | Spring Boot | 3.5.9 | 核心框架 |
33
- | **开发语言** | Java | 17 | LTS 版本 |
34
- | **ORM** | MyBatis-Plus | 3.5.16 | 持久层框架 |
35
- | **安全** | Sa-Token | 1.44.0 | 认证授权 |
36
- | **数据库** | MySQL 8.0+ | 8.0+ | 主数据库(支持多库) |
37
- | **缓存** | Redis + Redisson | 3.52.0 | 分布式缓存 |
38
- | **文档** | SpringDoc | 2.8.15 | API 文档 |
39
- | **工具库** | Hutool | 5.8.43 | Java 工具集 |
40
- | **对象转换** | Mapstruct-Plus | 1.5.0 | BO/VO/Entity 映射 |
41
-
42
- **注:** 本项目是纯后端项目,前端项目独立维护。
43
-
44
- ### 扩展技术栈(按优先级)
45
-
46
- #### 1️⃣ 高优先级技术(优先选择)
47
-
48
- | 技术 | 优先级 | 使用场景 | 说明 |
49
- |------|--------|---------|------|
50
- | **Redis** | ⭐⭐⭐⭐⭐ | 缓存、分布式锁、延迟队列 | 优先选择(已集成 Redisson + Caffeine) |
51
- | **WebSocket** | ⭐⭐⭐⭐⭐ | 实时推送、在线聊天、消息通知 | 实时通信首选(已集成) |
52
- | **Sa-Token** | ⭐⭐⭐⭐⭐ | 权限控制、登录认证、单点登录 | 项目安全核心 |
53
- | **Lock4j** | ⭐⭐⭐⭐⭐ | 分布式锁 | 基于 Redisson 实现(已集成) |
54
- | **MyBatis-Plus** | ⭐⭐⭐⭐⭐ | ORM、CRUD | 项目数据访问核心 |
55
- | **Redisson** | ⭐⭐⭐⭐⭐ | 分布式对象、布隆过滤器、延迟队列 | Redis 客户端增强(已集成) |
56
- | **SnailJob** | ⭐⭐⭐⭐ | 分布式定时任务、复杂调度 | 项目定时任务框架(已集成) |
57
-
58
- #### 2️⃣ 中优先级技术(按需使用)
59
-
60
- | 技术 | 优先级 | 使用场景 | 说明 |
61
- |------|--------|---------|------|
62
- | **SSE** | ⭐⭐⭐⭐ | 服务端推送、单向消息 | 实时通知场景(已集成) |
63
- | **FastExcel** | ⭐⭐⭐⭐ | Excel 导入导出 | 比 EasyExcel 性能更好(已集成) |
64
- | **SMS4j** | ⭐⭐⭐ | 多平台短信发送 | 支持阿里云、腾讯、华为等(已集成) |
65
- | **JustAuth** | ⭐⭐⭐ | 第三方 OAuth 登录 | 支持微信、QQ、支付宝等 30+ 平台(已集成) |
66
- | **AWS S3** | ⭐⭐⭐ | 对象存储服务 | S3 兼容协议,支持 MinIO 自建(已集成) |
67
- | **MailSender** | ⭐⭐⭐ | 邮件发送 | 支持 SMTP、企业邮箱(已集成) |
68
- | **Redis Streams** | ⭐⭐⭐ | 消息队列(简单场景) | 比 RocketMQ 轻量级 |
69
-
70
- #### 3️⃣ 扩展能力(按需集成)
71
-
72
- | 技术 | 优先级 | 使用场景 | 集成状态 |
73
- |------|--------|---------|---------|
74
- | **数据加密** | ⭐⭐⭐⭐ | 敏感数据加密、字段级加密 | ✅ 已集成 |
75
- | **数据脱敏** | ⭐⭐⭐⭐ | 身份证、手机号脱敏 | ✅ 已集成 |
76
- | **防重复提交** | ⭐⭐⭐⭐ | 表单防重复、API 幂等 | ✅ 已集成 |
77
- | **国际化翻译** | ⭐⭐⭐ | 多语言支持 | ✅ 已集成 |
78
- | **审计日志** | ⭐⭐⭐ | 操作日志、变更追溯 | ✅ 已集成 |
79
- | **接口限流** | ⭐⭐⭐ | 接口频率限制、防滥用 | ✅ 已集成 |
80
-
81
- #### 4️⃣ 需自行扩展的技术
82
-
83
- | 技术 | 使用场景 | 说明 |
84
- |------|---------|------|
85
- | **RocketMQ** | 高吞吐消息队列、分布式事务 | 高并发场景可自行引入 |
86
- | **MQTT** | 物联网设备通信 | IoT 场景可使用 mica-mqtt |
87
- | **LangChain4j** | AI 大模型集成 | AI 业务可自行集成 |
26
+ ## 核心技术栈
88
27
 
89
- ### 技术选型决策树
90
-
91
- ```
92
- 需要实时通信?
93
- ├─ WebSocket(首选,已集成)
94
- └─ 需要消息队列?
95
- ├─ Redis Streams(优先,轻量级)
96
- │ 或 RocketMQ(自行引入,高吞吐)
97
- └─ 需要定时任务?
98
- ├─ SnailJob(分布式,已集成)
99
- │ 或 @Scheduled(简单场景)
100
- └─ 否 → 需要缓存?
101
- └─ 是 → Redis + Redisson(首选,已集成)
102
- ```
103
-
104
- ---
105
-
106
- ## 本项目架构
107
-
108
- ### 整体架构
28
+ | 层级 | 技术栈 | 版本 |
29
+ |------|--------|------|
30
+ | 后端框架 | Spring Boot | 3.5.9 |
31
+ | 开发语言 | Java | 17 |
32
+ | ORM | MyBatis-Plus | 3.5.16 |
33
+ | 安全 | Sa-Token | 1.44.0 |
34
+ | 数据库 | MySQL | 8.0+ |
35
+ | 缓存 | Redis + Redisson | 3.52.0 |
36
+ | 文档 | SpringDoc | 2.8.15 |
37
+ | 工具库 | Hutool | 5.8.43 |
38
+ | 对象转换 | Mapstruct-Plus | 1.5.0 |
109
39
 
110
- ```
111
- ┌─────────────────────────────────────────────────────────────┐
112
- │ 客户端 │
113
- ├──────────────────┬──────────────────┬───────────────────────┤
114
- │ PC Web │ 小程序 │ App │
115
- │ (独立项目) │ (独立项目) │ (独立项目) │
116
- └────────┬─────────┴────────┬─────────┴───────────┬───────────┘
117
- │ │ │
118
- └──────────────────┼─────────────────────┘
119
-
120
-
121
- ┌─────────────────────────────────────────────────────────────┐
122
- │ API 网关 (可选) │
123
- │ Nginx / Spring Cloud Gateway │
124
- └─────────────────────────────┬───────────────────────────────┘
125
-
126
-
127
- ┌─────────────────────────────────────────────────────────────┐
128
- │ 后端服务 │
129
- │ ruoyi-admin (Spring Boot 3.5.9) │
130
- ├─────────────────────────────────────────────────────────────┤
131
- │ ┌────────────┐ ┌────────────┐ ┌──────────────┐ ┌────────────┐ ┌──────────────┐│
132
- │ │ruoyi-system│ │ ruoyi-demo │ │ruoyi-generator│ │ ruoyi-job │ │ruoyi-workflow││
133
- │ │ 系统管理 │ │ 演示模块 │ │ 代码生成 │ │ 定时任务 │ │ 工作流 ││
134
- │ │ (sys_*) │ │ (test_*) │ │ (gen_*) │ │ (job) │ │ (flow_*) ││
135
- │ └────────────┘ └────────────┘ └──────────────┘ └────────────┘ └──────────────┘│
136
- ├─────────────────────────────────────────────────────────────┤
137
- │ ruoyi-common (20+ 模块) │
138
- │ mybatis/redis/oss/websocket/satoken/job/sms/excel/mail/sse │
139
- └─────────────────────────────┬───────────────────────────────┘
140
-
141
-
142
- ┌─────────────────────────────────────────────────────────────┐
143
- │ 数据与存储层 │
144
- ├──────────┬──────────┬──────────┬──────────────────────────────┤
145
- │ MySQL │ Redis │ OSS │ 可选扩展中间件 │
146
- │ (主数据) │ (缓存) │ (文件) │ (RocketMQ/MQTT/SnailJob) │
147
- └──────────┴──────────┴──────────┴──────────────────────────────┘
148
- ```
40
+ ## 已集成技术栈(按优先级)
149
41
 
150
- ### 🔴 后端三层架构(本项目核心)
42
+ ### 高优先级(优先选择)
151
43
 
152
- 本项目采用 **三层架构**:Controller Service → Mapper
44
+ | 技术 | 使用场景 |
45
+ |------|---------|
46
+ | Redis + Redisson | 缓存、分布式锁、延迟队列、布隆过滤器 |
47
+ | WebSocket | 实时推送、在线聊天、消息通知 |
48
+ | Sa-Token | 权限控制、登录认证、单点登录 |
49
+ | Lock4j | 分布式锁(基于 Redisson) |
50
+ | SnailJob | 分布式定时任务、复杂调度 |
153
51
 
154
- **注意:没有独立的 DAO 层!Service 层直接调用 Mapper。**
52
+ ### 中优先级(按需使用)
155
53
 
156
- ```
157
- ┌──────────────────────────────────────────────────────────────┐
158
- │ Controller 层 │
159
- │ • 接收 HTTP 请求、参数校验、返回 R<T> 响应 │
160
- │ • 路由:/list, /{id}, /, /, /{ids}, /export │
161
- └──────────────────────────────┬───────────────────────────────┘
162
-
163
-
164
- ┌──────────────────────────────────────────────────────────────┐
165
- │ Service 层 │
166
- │ • 业务逻辑处理、事务管理、编排协调 │
167
- │ • buildQueryWrapper() 查询条件构建 │
168
- │ • 使用 MyBatis-Plus LambdaQueryWrapper │
169
- │ • 直接注入 Mapper(无 DAO 层) │
170
- └──────────────────────────────┬───────────────────────────────┘
171
-
172
-
173
- ┌──────────────────────────────────────────────────────────────┐
174
- │ Mapper 层 │
175
- │ • extends BaseMapperPlus<Entity, Vo> │
176
- │ • MyBatis-Plus ORM 映射、SQL 执行 │
177
- └──────────────────────────────────────────────────────────────┘
178
- ```
179
-
180
- **为什么是三层而非四层?**
181
- - **没有独立 DAO 层**:Service 层直接注入 Mapper
182
- - `buildQueryWrapper()` 方法在 **Service 实现类** 中
183
- - 更简洁、更少的样板代码
54
+ | 技术 | 使用场景 |
55
+ |------|---------|
56
+ | SSE | 服务端单向推送 |
57
+ | FastExcel | Excel 导入导出 |
58
+ | SMS4j | 多平台短信发送 |
59
+ | JustAuth | 第三方 OAuth 登录(30+ 平台) |
60
+ | AWS S3 | 对象存储(兼容 MinIO) |
61
+ | MailSender | 邮件发送 |
62
+ | Redis Streams | 轻量级消息队列 |
184
63
 
185
- ---
64
+ ### 已集成扩展能力
186
65
 
187
- ## 架构设计原则
66
+ 数据加密、数据脱敏、防重复提交、国际化翻译、审计日志、接口限流
188
67
 
189
- ### 1. 单一职责
68
+ ### 需自行扩展
190
69
 
191
- ```java
192
- // ✅ 好的设计:每个类只负责一件事
193
- public class OrderService {
194
- // 只处理订单业务
195
- }
70
+ | 技术 | 使用场景 |
71
+ |------|---------|
72
+ | RocketMQ | 高吞吐消息队列、分布式事务 |
73
+ | MQTT | 物联网设备通信 |
74
+ | LangChain4j | AI 大模型集成 |
196
75
 
197
- public class PaymentService {
198
- // 只处理支付业务
199
- }
76
+ ### 技术选型决策树
200
77
 
201
- // ❌ 不好的设计:一个类做太多事
202
- public class OrderService {
203
- // 订单 + 支付 + 物流 + 通知...
204
- }
78
+ ```
79
+ 需要实时通信?
80
+ +-- -> WebSocket(首选)
81
+ +-- 否 -> 需要消息队列?
82
+ +-- 是 -> Redis Streams(优先) / RocketMQ(高吞吐,自行引入)
83
+ +-- 否 -> 需要定时任务?
84
+ +-- 是 -> SnailJob(分布式) / @Scheduled(简单场景)
85
+ +-- 否 -> 需要缓存?
86
+ +-- 是 -> Redis + Redisson
205
87
  ```
206
88
 
207
- ### 2. 开闭原则
89
+ ---
208
90
 
209
- ```java
210
- // ✅ 好的设计:对扩展开放,对修改关闭
211
- public interface PaymentStrategy {
212
- void pay(Order order);
213
- }
91
+ ## 三层架构(Controller -> Service -> Mapper)
214
92
 
215
- public class WechatPayment implements PaymentStrategy { }
216
- public class AlipayPayment implements PaymentStrategy { }
217
- // 新增支付方式只需新增实现类
93
+ **没有独立的 DAO 层。** Service 直接调用 Mapper,`buildQueryWrapper()` 在 Service 实现类中。
218
94
 
219
- // ❌ 不好的设计:新增功能需要修改原有代码
220
- public void pay(Order order, String type) {
221
- if ("wechat".equals(type)) {
222
- // 微信支付
223
- } else if ("alipay".equals(type)) {
224
- // 支付宝支付
225
- }
226
- // 新增支付方式需要修改这里
227
- }
228
95
  ```
229
-
230
- ### 3. 依赖倒置
231
-
232
- ```java
233
- // 好的设计:依赖抽象而非具体实现
234
- @Service
235
- public class OrderServiceImpl implements IOrderService {
236
- private final IPaymentService paymentService; // 依赖接口
237
- }
238
-
239
- // ❌ 不好的设计:直接依赖具体实现
240
- @Service
241
- public class OrderServiceImpl {
242
- private final WechatPaymentService paymentService; // 依赖具体类
243
- }
96
+ Controller 层:接收 HTTP 请求、参数校验、返回 R<T>
97
+ |
98
+ Service 层:业务逻辑、事务管理、buildQueryWrapper()、直接注入 Mapper
99
+ |
100
+ Mapper 层:extends BaseMapperPlus<Entity, Vo>,ORM 映射
244
101
  ```
245
102
 
246
103
  ---
247
104
 
248
- ## 模块划分与表前缀规范
249
-
250
- ### 核心约束(必须遵守)
105
+ ## 模块划分与表前缀
251
106
 
252
107
  **包名必须是 `org.dromara.*`**
253
108
 
254
- ### 标准模块与表前缀对应
255
-
256
- | 模块 | 目录路径 | 包路径 | 表前缀 | 用途 |
257
- |------|---------|--------|--------|------|
258
- | **系统管理** | `ruoyi-modules/ruoyi-system/` | `org.dromara.system` | `sys_` | 系统管理功能 |
259
- | **演示模块** | `ruoyi-modules/ruoyi-demo/` | `org.dromara.demo` | `test_` | 示例与演示 |
260
- | **工作流** | `ruoyi-modules/ruoyi-workflow/` | `org.dromara.workflow` | `flow_` | 工作流引擎 |
261
-
262
- ### 业务模块扩展(按业务领域)
109
+ ### 标准模块
263
110
 
264
- 创建新业务模块时,遵循以下规范:
111
+ | 模块 | 目录 | 包路径 | 表前缀 |
112
+ |------|------|--------|--------|
113
+ | 系统管理 | `ruoyi-modules/ruoyi-system/` | `org.dromara.system` | `sys_` |
114
+ | 演示模块 | `ruoyi-modules/ruoyi-demo/` | `org.dromara.demo` | `test_` |
115
+ | 工作流 | `ruoyi-modules/ruoyi-workflow/` | `org.dromara.workflow` | `flow_` |
265
116
 
266
- | 业务领域 | 新模块命名 | 包路径 | 表前缀 |
267
- |---------|----------|--------|--------|
268
- | **基础业务** | `ruoyi-modules/ruoyi-xxx/` | `org.dromara.xxx` | `xxx_` |
269
- | **商城业务** | `ruoyi-modules/ruoyi-mall/` | `org.dromara.mall` | `m_` |
270
- | **物联网** | `ruoyi-modules/ruoyi-iot/` | `org.dromara.iot` | `iot_` |
117
+ ### 扩展模块命名
271
118
 
272
- ### 关键设计原则
273
-
274
- **1. 表前缀与模块一一对应**
275
119
  ```
276
- ✅ 正确:sys_user 表 → ruoyi-system 模块
277
- ❌ 错误:sys_user 表 → ruoyi-demo 模块(前缀与模块不符)
120
+ ruoyi-modules/ruoyi-{业务}/ -> org.dromara.{业务} -> {前缀}_
121
+ 例:ruoyi-mall/ -> org.dromara.mall -> m_
278
122
  ```
279
123
 
280
- **2. Java 类名不带前缀**
281
- ```java
282
- // ✅ 正确
283
- @TableName("sys_user") // 表名带前缀
284
- public class SysUser extends TenantEntity { } // 类名带 Sys(系统模块特例)
285
-
286
- @TableName("test_demo")
287
- public class TestDemo extends TenantEntity { } // 类名不带 test 前缀
288
- ```
124
+ ### 关键规则
289
125
 
290
- **3. 所有业务表继承 TenantEntity**
291
126
  ```java
292
- // 正确:支持多租户
127
+ // 1. 表前缀与模块一一对应
128
+ // OK: sys_user -> ruoyi-system NG: sys_user -> ruoyi-demo
129
+
130
+ // 2. 所有业务表继承 TenantEntity
293
131
  public class Order extends TenantEntity {
294
- // TenantEntity/BaseEntity 提供:tenant_id, create_dept, create_by, create_time, update_by, update_time
295
- // 子类需自行定义:
296
- @TableId(value = "id")
297
- private Long id; // 主键(雪花ID,全局配置)
132
+ @TableId(value = "id") // 雪花ID,依赖全局配置,不指定 type
133
+ private Long id;
298
134
 
299
135
  @TableLogic
300
- private Long delFlag; // 逻辑删除标志
136
+ private Long delFlag; // 逻辑删除
301
137
  }
302
- ```
303
-
304
- **4. 主键使用雪花 ID(全局配置)**
305
- ```java
306
- // ✅ 正确:依赖全局配置(common-mybatis.yml 中 idType: ASSIGN_ID),不需要显式指定 type
307
- @TableId(value = "id")
308
- private Long id;
309
-
310
- // ❌ 错误:显式指定 type(冗余,全局已配置)
311
- @TableId(value = "id", type = IdType.ASSIGN_ID)
312
138
 
313
- // 错误:SQL 中使用自增
314
- id BIGINT AUTO_INCREMENT -- 禁止!本项目用雪花ID
139
+ // 3. 主键使用雪花 ID(全局配置 idType: ASSIGN_ID)
140
+ @TableId(value = "id") // OK
141
+ @TableId(value = "id", type = IdType.ASSIGN_ID) // NG: 冗余
142
+ // SQL 中禁止 AUTO_INCREMENT
315
143
  ```
316
144
 
317
- ### 🔴 模块内部结构规范(三层架构)
145
+ ---
318
146
 
319
- `TestDemo` 表为例:
147
+ ## 模块内部结构(以 TestDemo 为例)
320
148
 
321
149
  ```
322
150
  ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/
323
- ├── controller/
324
- └── TestDemoController.java # @RestController
325
- ├── service/
326
- ├── ITestDemoService.java # Service 接口
327
- └── impl/
328
- └── TestDemoServiceImpl.java # Service 实现(包含 buildQueryWrapper)
329
- ├── mapper/
330
- └── TestDemoMapper.java # extends BaseMapperPlus<TestDemo, TestDemoVo>
331
- └── domain/
332
- ├── TestDemo.java # Entity,继承 TenantEntity
333
- ├── bo/
334
- └── TestDemoBo.java # 业务对象(@AutoMapper
335
- └── vo/
336
- └── TestDemoVo.java # 视图对象
337
- ```
338
-
339
- **Service 实现示例(buildQueryWrapper 在 Service 层):**
151
+ +-- controller/
152
+ | +-- TestDemoController.java # @RestController
153
+ +-- service/
154
+ | +-- ITestDemoService.java # 接口
155
+ | +-- impl/
156
+ | +-- TestDemoServiceImpl.java # 实现(含 buildQueryWrapper)
157
+ +-- mapper/
158
+ | +-- TestDemoMapper.java # extends BaseMapperPlus<TestDemo, TestDemoVo>
159
+ +-- domain/
160
+ +-- TestDemo.java # extends TenantEntity
161
+ +-- bo/
162
+ | +-- TestDemoBo.java # @AutoMapper
163
+ +-- vo/
164
+ +-- TestDemoVo.java
165
+ ```
166
+
167
+ ### Service 实现核心模式
340
168
 
341
169
  ```java
342
170
  @Service
343
171
  public class TestDemoServiceImpl implements ITestDemoService {
172
+ private final TestDemoMapper baseMapper; // 直接注入 Mapper
344
173
 
345
- private final TestDemoMapper baseMapper; // 直接注入 Mapper,无 DAO 层
346
-
347
- /**
348
- * 构建查询条件(在 Service 层)
349
- */
350
174
  private LambdaQueryWrapper<TestDemo> buildQueryWrapper(TestDemoBo bo) {
351
175
  Map<String, Object> params = bo.getParams();
352
176
  LambdaQueryWrapper<TestDemo> lqw = Wrappers.lambdaQuery();
353
177
  lqw.eq(bo.getDeptId() != null, TestDemo::getDeptId, bo.getDeptId());
354
- lqw.eq(bo.getUserId() != null, TestDemo::getUserId, bo.getUserId());
355
178
  lqw.like(StringUtils.isNotBlank(bo.getTestKey()), TestDemo::getTestKey, bo.getTestKey());
356
179
  lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null,
357
180
  TestDemo::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime"));
@@ -367,390 +190,73 @@ public class TestDemoServiceImpl implements ITestDemoService {
367
190
  }
368
191
  ```
369
192
 
370
- ### 表设计规范
193
+ ---
371
194
 
372
- #### 建表模板(MySQL)
195
+ ## 建表模板(MySQL)
373
196
 
374
197
  ```sql
375
198
  CREATE TABLE xxx_table (
376
- -- 主键(雪花 ID,不用 AUTO_INCREMENT)
377
199
  id BIGINT(20) NOT NULL COMMENT '主键ID',
378
-
379
- -- 多租户字段(必须)
380
200
  tenant_id VARCHAR(20) DEFAULT '000000' COMMENT '租户ID',
381
-
382
201
  -- 业务字段
383
202
  xxx_name VARCHAR(100) NOT NULL COMMENT '名称',
384
203
  status CHAR(1) DEFAULT '0' COMMENT '状态',
385
204
  remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
386
-
387
- -- 审计字段(必须,继承自 TenantEntity)
205
+ -- 审计字段(TenantEntity 提供)
388
206
  create_dept BIGINT(20) DEFAULT NULL COMMENT '创建部门',
389
207
  create_by BIGINT(20) DEFAULT NULL COMMENT '创建人',
390
208
  create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
391
209
  update_by BIGINT(20) DEFAULT NULL COMMENT '更新人',
392
210
  update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
393
-
394
- -- 逻辑删除
395
211
  del_flag CHAR(1) DEFAULT '0' COMMENT '删除标志(0正常 1已删除)',
396
-
397
212
  PRIMARY KEY (id),
398
- INDEX idx_tenant_id (tenant_id),
399
- INDEX idx_status (status)
213
+ INDEX idx_tenant_id (tenant_id)
400
214
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='xxx表';
401
215
  ```
402
216
 
403
- **建表注意事项:**
404
- - 表前缀与模块必须对应
405
- - 必须包含 `tenant_id`(支持多租户)
406
- - 必须包含审计字段
407
- - 必须包含逻辑删除字段(`del_flag`)
408
- - 主键不使用 `AUTO_INCREMENT`(使用雪花 ID)
409
- - 添加必要的索引
410
-
411
- #### 多数据库支持
412
-
413
- | 数据库 | SQL 文件位置 |
414
- |--------|------------|
415
- | MySQL | `script/sql/ry_vue_5.X.sql` |
416
- | Oracle | `script/sql/oracle/` |
417
- | PostgreSQL | `script/sql/postgres/` |
418
- | SQL Server | `script/sql/sqlserver/` |
419
-
420
- ---
421
-
422
- ## 实战架构案例
423
-
424
- ### 案例 1:订单系统架构
425
-
426
- **需求:** 电商订单创建、支付、发货
427
-
428
- **模块划分:**
429
- ```
430
- ruoyi-modules/ruoyi-mall/
431
- ├── order/ # 订单模块(m_order)
432
- ├── goods/ # 商品模块(m_goods)
433
- └── payment/ # 支付模块(m_payment)
434
- ```
435
-
436
- **包路径规范:**
437
- ```
438
- org.dromara.mall.order.controller.OrderController
439
- org.dromara.mall.order.service.IOrderService
440
- org.dromara.mall.order.service.impl.OrderServiceImpl
441
- org.dromara.mall.order.mapper.OrderMapper
442
- org.dromara.mall.order.domain.Order
443
- ```
444
-
445
- **技术选型:**
446
- ```
447
- ├── 数据存储
448
- │ ├── MySQL(订单主数据)
449
- │ ├── Redis(库存缓存、分布式锁)
450
- │ └── OSS(发票、物流单图片)
451
- ├── 消息通信
452
- │ ├── WebSocket(订单状态实时推送)
453
- │ └── Redis Streams(订单异步处理)
454
- └── 定时任务
455
- ├── SnailJob(对账任务 - 分布式)
456
- └── @Scheduled(订单超时取消 - 简单)
457
- ```
458
-
459
- ### 案例 2:IoT 设备监控系统
460
-
461
- **需求:** 设备数据采集、实时监控、告警推送
462
-
463
- **模块划分:**
464
- ```
465
- org.dromara.iot.device.*
466
- org.dromara.iot.data.*
467
- org.dromara.iot.alert.*
468
- ```
217
+ **建表必须**:tenant_id、审计字段、del_flag、雪花ID(无 AUTO_INCREMENT)、表前缀对应模块。
469
218
 
470
- **技术选型:**
471
- ```
472
- ├── 设备通信
473
- │ └── MQTT(物联网协议,需自行集成)
474
- ├── 数据存储
475
- │ ├── MySQL(设备元数据、告警记录)
476
- │ └── Redis(设备在线状态、实时数据)
477
- ├── 实时推送
478
- │ └── WebSocket(告警推送)
479
- └── 定时任务
480
- └── @Scheduled(设备离线检测)
481
- ```
219
+ 多数据库 SQL 位置:`script/sql/` 下的 `ry_vue_5.X.sql`(MySQL)、`oracle/`、`postgres/`、`sqlserver/`
482
220
 
483
221
  ---
484
222
 
485
- ## 技术选型决策指南
486
-
487
- ### 场景 1:需要消息队列吗?
488
-
489
- | 场景 | 推荐方案 | 理由 |
490
- |------|---------|------|
491
- | 订单创建后发送通知 | ❌ 不需要,同步调用 | 简单场景 |
492
- | 订单支付成功后更新库存 | ✅ Redis Streams | 解耦 |
493
- | 秒杀活动削峰填谷 | ✅ RocketMQ | 高并发 |
494
-
495
- ### 场景 2:定时任务如何选择?
496
-
497
- | 场景 | 推荐方案 |
498
- |------|---------|
499
- | 订单超时自动取消(单机) | `@Scheduled` |
500
- | 每日数据汇总(分布式) | SnailJob |
501
- | 实时监控设备状态 | `@Scheduled` |
502
-
503
- ### 场景 3:实时通信方案
223
+ ## 技术选型决策速查
504
224
 
505
225
  | 场景 | 推荐方案 |
506
226
  |------|---------|
507
- | 订单状态推送 | WebSocket |
508
- | 系统通知推送 | SSE |
227
+ | 简单异步通知 | 同步调用即可 |
228
+ | 解耦场景消息队列 | Redis Streams |
229
+ | 高并发削峰 | RocketMQ(自行引入) |
230
+ | 单机定时任务 | `@Scheduled` |
231
+ | 分布式定时任务 | SnailJob |
232
+ | 实时双向通信 | WebSocket |
233
+ | 服务端单向推送 | SSE |
509
234
  | IoT 设备通信 | MQTT(自行集成) |
510
235
 
511
236
  ---
512
237
 
513
- ## 常见架构模式对比
514
-
515
- | 架构模式 | 适用场景 | 本项目采用 |
516
- |---------|---------|-----------|
517
- | **分层架构** | 中小型项目 | ✅ 是(三层架构) |
518
- | **DDD** | 复杂业务领域 | ❌ 否 |
519
- | **微服务** | 大型分布式系统 | ⚠️ 可选 |
520
-
521
- ### 本项目推荐架构路径
522
-
523
- ```
524
- 阶段 1:单体应用(当前)
525
- ├── 三层架构:Controller → Service → Mapper
526
- ├── 多租户支持
527
- ├── 模块化设计
528
- └── 适合:0-10万用户
529
-
530
- 阶段 2:垂直拆分(可选)
531
- ├── 按模块拆分微服务
532
- ├── 引入 Spring Cloud Gateway
533
- └── 适合:10万-100万用户
534
- ```
535
-
536
- ---
537
-
538
- ## 架构设计快速检查清单
539
-
540
- ### ✅ 新模块设计检查
541
-
542
- - [ ] **包路径正确**:`org.dromara.{模块名}`
543
- - [ ] **表前缀匹配**:`sys_` / `test_` / `flow_` / 自定义
544
- - [ ] **表设计规范**:
545
- - [ ] 主键使用雪花 ID
546
- - [ ] 包含 `tenant_id` 字段
547
- - [ ] 包含审计字段
548
- - [ ] 包含逻辑删除字段 `del_flag`
549
- - [ ] **三层架构完整**:
550
- - [ ] Controller
551
- - [ ] Service(包含 `buildQueryWrapper()` 方法)
552
- - [ ] Mapper(`extends BaseMapperPlus<Entity, Vo>`)
553
- - [ ] **对象转换**:使用 `MapstructUtils.convert()`
554
- - [ ] **异常处理**:使用 `ServiceException`
555
- - [ ] **权限注解**:`@SaCheckPermission("{模块}:{实体}:{操作}")`
556
-
557
- ### ✅ 技术选型检查
558
-
559
- - [ ] **缓存需求**:优先选择 Redis + Redisson
560
- - [ ] **实时通信**:优先选择 WebSocket
561
- - [ ] **定时任务**:简单场景用 `@Scheduled`,复杂场景用 SnailJob
562
- - [ ] **消息队列**:优先 Redis Streams
563
- - [ ] **数据导出**:使用 FastExcel
564
- - [ ] **文件存储**:使用 AWS S3 SDK
565
-
566
- ---
567
-
568
- ## 多项目适配说明
569
-
570
- ### 不同项目架构对比
571
-
572
- | 项目特征 | RuoYi-Vue-Plus | leniu-tengyun-core |
573
- |---------|----------------|-------------------|
574
- | **包名前缀** | `org.dromara.*` | `net.xnzn.core.*` |
575
- | **JDK 版本** | 17 | 21 |
576
- | **请求封装** | 直接使用 BO | `LeRequest<T>` |
577
- | **响应封装** | `R<T>`, `TableDataInfo<T>` | `Page<T>`, `void` |
578
- | **异常类** | `ServiceException` | `LeException` |
579
- | **国际化** | `MessageUtils.message()` | `I18n.getMessage()` |
580
- | **权限注解** | `@SaCheckPermission` | `@RequiresAuthentication` |
581
- | **分页** | `PageQuery`, `TableDataInfo` | `PageDTO`, `Page<VO>` |
582
-
583
- ### 通用最佳实践
584
-
585
- 无论使用哪种项目架构,以下原则都是通用的:
586
-
587
- 1. **三层架构**:Controller → Service → Mapper,无独立 DAO 层
588
- 2. **分组校验**:使用 Validation Groups 区分新增/修改场景
589
- 3. **国际化**:所有错误消息使用 i18n,不硬编码
590
- 4. **日志规范**:关键操作记录日志,使用占位符
591
- 5. **异常处理**:使用统一的业务异常类
592
- 6. **分布式锁**:敏感操作使用 Redisson 分布式锁
593
-
594
- ---
595
-
596
- ## leniu-tengyun-core 架构详解
597
-
598
- ### 项目结构
599
-
600
- ```
601
- leniu-tengyun-core/
602
- ├── src/main/java/net/xnzn/core/
603
- │ ├── api/ # API 控制器
604
- │ ├── service/ # 服务层
605
- │ ├── domain/ # 实体类
606
- │ │ ├── entity/ # 数据库实体
607
- │ │ ├── dto/ # 数据传输对象
608
- │ │ └── vo/ # 视图对象
609
- │ ├── mapper/ # MyBatis Mapper
610
- │ ├── common/ # 公共模块
611
- │ │ ├── exception/ # 异常处理
612
- │ │ ├── utils/ # 工具类
613
- │ │ └── config/ # 配置类
614
- │ └── Auth/ # 认证相关
615
- └── src/main/resources/
616
- └── application.yml
617
- ```
618
-
619
- ### JDK 21 特性利用
620
-
621
- ```java
622
- // Record 类(不可变数据载体)
623
- public record UserDTO(
624
- Long id,
625
- String name,
626
- String email
627
- ) {}
628
-
629
- // Sealed 类(限定继承)
630
- public sealed interface Result permits Success, Failure {
631
- record Success<T>(T data) implements Result {}
632
- record Failure(String message) implements Result {}
633
- }
634
-
635
- // Pattern Matching
636
- if (obj instanceof String s && s.length() > 5) {
637
- System.out.println(s.toUpperCase());
638
- }
639
-
640
- // Switch 表达式
641
- String result = switch (status) {
642
- case 0 -> "待处理";
643
- case 1 -> "处理中";
644
- case 2 -> "已完成";
645
- default -> "未知";
646
- };
647
- ```
648
-
649
- ### 请求响应封装
650
-
651
- ```java
652
- // LeRequest 请求封装
653
- @Data
654
- public class LeRequest<T> {
655
- @ApiModelProperty(value = "请求内容", required = true)
656
- @NotNull(message = "请求内容不能为空")
657
- private T content;
658
- }
659
-
660
- // PageDTO 分页参数
661
- @Data
662
- public class PageDTO {
663
- @ApiModelProperty(value = "当前页", required = true)
664
- @NotNull(message = "当前页不能为空")
665
- @Min(value = 1, message = "页码必须大于0")
666
- private Integer pageNum;
667
-
668
- @ApiModelProperty(value = "每页条数", required = true)
669
- @NotNull(message = "每页条数不能为空")
670
- @Min(value = 1, message = "每页条数必须大于0")
671
- @Max(value = 1000, message = "每页条数不能超过1000")
672
- private Integer pageSize;
673
- }
238
+ ## 新模块设计检查清单
674
239
 
675
- // PageVO 分页响应
676
- @Data
677
- public class PageVO<T> {
678
- private List<T> records;
679
- private Long total;
680
- private Integer pageNum;
681
- private Integer pageSize;
682
-
683
- public static <T> PageVO<T> of(Page<T> page) {
684
- PageVO<T> vo = new PageVO<>();
685
- vo.setRecords(page.getRecords());
686
- vo.setTotal(page.getTotal());
687
- vo.setPageNum(page.getCurrent());
688
- vo.setPageSize(page.getSize());
689
- return vo;
690
- }
691
- }
692
- ```
240
+ - [ ] 包路径:`org.dromara.{模块名}`
241
+ - [ ] 表前缀与模块对应
242
+ - [ ] 主键雪花ID、含 tenant_id、审计字段、del_flag
243
+ - [ ] 三层完整:Controller / Service(含 buildQueryWrapper) / Mapper(extends BaseMapperPlus)
244
+ - [ ] 对象转换:`MapstructUtils.convert()`
245
+ - [ ] 异常处理:`ServiceException`
246
+ - [ ] 权限注解:`@SaCheckPermission("{模块}:{实体}:{操作}")`
247
+ - [ ] 缓存优先 Redis、实时通信优先 WebSocket、导出用 FastExcel
693
248
 
694
249
  ---
695
250
 
696
- ## 常见问题 FAQ
697
-
698
- ### Q1: 什么时候需要使用 RocketMQ?
699
-
700
- **A:** 本框架未内置 RocketMQ,只在高并发削峰、分布式事务等场景考虑使用。
701
- - 简单场景 Redis Streams(已集成)
702
- - 异步任务 SnailJob(已集成)
703
- - 高吞吐 RocketMQ(自行集成)
704
-
705
- ### Q2: 本项目为什么没有 DAO 层?
706
-
707
- **A:** 本项目采用三层架构:
708
- - Service 层直接注入 Mapper
709
- - `buildQueryWrapper()` 方法在 Service 实现类中
710
- - 更简洁、更少的样板代码
711
- - 避免过度分层
712
-
713
- ### Q3: 表前缀与模块如何对应?
714
-
715
- **A:** 严格对应规则:
716
- | 模块 | 表前缀 |
717
- |------|--------|
718
- | system | `sys_` |
719
- | demo | `test_` |
720
- | workflow | `flow_` |
721
- | 自定义 | 自定义前缀 |
722
-
723
- ### Q4: 什么时候用 SnailJob 而非 @Scheduled?
724
-
725
- **A:** 选择标准:
726
- - **@Scheduled**:单机、简单定时任务
727
- - **SnailJob**:分布式、需要失败重试、工作流编排
728
-
729
- ### Q5: 新增模块需要创建哪些文件?
730
-
731
- **A:** 最小集合(以 `XxxDemo` 表为例):
732
-
733
- ```
734
- ruoyi-modules/ruoyi-xxx/src/main/java/org/dromara/xxx/
735
- ├── controller/
736
- │ └── XxxDemoController.java # @RestController
737
- ├── service/
738
- │ ├── IXxxDemoService.java # 接口
739
- │ └── impl/
740
- │ └── XxxDemoServiceImpl.java # 实现(含 buildQueryWrapper)
741
- ├── mapper/
742
- │ └── XxxDemoMapper.java # extends BaseMapperPlus
743
- └── domain/
744
- ├── XxxDemo.java # extends TenantEntity
745
- ├── bo/
746
- │ └── XxxDemoBo.java # @AutoMapper
747
- └── vo/
748
- └── XxxDemoVo.java # 视图对象
749
- ```
750
-
751
- **关键清单:**
752
- - [ ] 包名:`org.dromara.xxx.*`
753
- - [ ] Entity 继承:`TenantEntity`
754
- - [ ] Service 不继承基类,直接注入 Mapper
755
- - [ ] `buildQueryWrapper()` 在 Service 实现类中
756
- - [ ] 对象转换使用 `MapstructUtils.convert()`
251
+ ## 多项目适配对照
252
+
253
+ | 特征 | RuoYi-Vue-Plus | leniu-tengyun-core |
254
+ |------|----------------|-------------------|
255
+ | 包名前缀 | `org.dromara.*` | `net.xnzn.core.*` |
256
+ | JDK | 17 | 21 |
257
+ | 请求封装 | 直接 BO | `LeRequest<T>` |
258
+ | 响应封装 | `R<T>`, `TableDataInfo<T>` | `Page<T>`, `void` |
259
+ | 异常类 | `ServiceException` | `LeException` |
260
+ | 国际化 | `MessageUtils.message()` | `I18n.getMessage()` |
261
+ | 权限注解 | `@SaCheckPermission` | `@RequiresAuthentication` |
262
+ | 分页 | `PageQuery`, `TableDataInfo` | `PageDTO`, `Page<VO>` |