ai-engineering-init 1.1.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/agents/code-reviewer.md +139 -0
- package/.claude/agents/project-manager.md +159 -0
- package/.claude/audio/completed.wav +0 -0
- package/.claude/commands/add-todo.md +255 -0
- package/.claude/commands/check.md +210 -0
- package/.claude/commands/crud.md +454 -0
- package/.claude/commands/dev.md +503 -0
- package/.claude/commands/init-docs.md +681 -0
- package/.claude/commands/next.md +251 -0
- package/.claude/commands/progress.md +242 -0
- package/.claude/commands/start.md +199 -0
- package/.claude/commands/sync.md +307 -0
- package/.claude/commands/update-status.md +428 -0
- package/.claude/docs/Mixin/344/275/277/347/224/250/346/214/207/345/215/227.md +299 -0
- package/.claude/docs/README.md +167 -0
- package/.claude/docs//345/211/215/347/253/257/345/274/200/345/217/221/346/214/207/345/215/227.md +599 -0
- package/.claude/docs//345/220/216/347/253/257/345/274/200/345/217/221/346/214/207/345/215/227.md +726 -0
- package/.claude/docs//345/267/245/344/275/234/346/265/201/345/274/200/345/217/221/346/214/207/345/215/227.md +714 -0
- package/.claude/docs//345/267/245/345/205/267/347/261/273/344/275/277/347/224/250/346/214/207/345/215/227.md +463 -0
- package/.claude/docs//346/225/260/346/215/256/345/272/223/350/256/276/350/256/241/350/247/204/350/214/203.md +390 -0
- package/.claude/docs//346/226/260/345/212/237/350/203/275/345/274/200/345/217/221/346/265/201/347/250/213/350/247/204/350/214/203.md +688 -0
- package/.claude/docs//346/226/260/351/241/271/347/233/256/345/274/200/345/217/221/346/265/201/347/250/213.md +365 -0
- package/.claude/docs//346/241/206/346/236/266/350/257/264/346/230/216.md +393 -0
- package/.claude/docs//350/267/257/347/224/261/351/205/215/347/275/256/346/214/207/345/215/227.md +246 -0
- package/.claude/framework-config.json +73 -0
- package/.claude/hooks/pre-tool-use.js +117 -0
- package/.claude/hooks/skill-forced-eval.js +167 -0
- package/.claude/hooks/stop.js +58 -0
- package/.claude/settings.json +41 -0
- package/.claude/skills/add-skill/SKILL.md +352 -0
- package/.claude/skills/api-development/SKILL.md +560 -0
- package/.claude/skills/architecture-design/SKILL.md +756 -0
- package/.claude/skills/backend-annotations/SKILL.md +674 -0
- package/.claude/skills/banana-image/CHANGELOG.md +37 -0
- package/.claude/skills/banana-image/README.md +146 -0
- package/.claude/skills/banana-image/SKILL.md +164 -0
- package/.claude/skills/banana-image/assets/logo.png +0 -0
- package/.claude/skills/banana-image/references/advanced-usage.md +189 -0
- package/.claude/skills/banana-image/scripts/apply_template.py +125 -0
- package/.claude/skills/banana-image/scripts/banana_image_exec.ts +412 -0
- package/.claude/skills/banana-image/scripts/batch_prep.py +82 -0
- package/.claude/skills/banana-image/scripts/package-lock.json +1437 -0
- package/.claude/skills/banana-image/scripts/package.json +18 -0
- package/.claude/skills/banana-image/scripts/requirements.txt +10 -0
- package/.claude/skills/banana-image/templates/poster.json +22 -0
- package/.claude/skills/banana-image/templates/product.json +17 -0
- package/.claude/skills/banana-image/templates/social.json +22 -0
- package/.claude/skills/banana-image/templates/thumbnail.json +17 -0
- package/.claude/skills/brainstorm/SKILL.md +648 -0
- package/.claude/skills/bug-detective/SKILL.md +1206 -0
- package/.claude/skills/code-patterns/SKILL.md +590 -0
- package/.claude/skills/collaborating-with-codex/SKILL.md +174 -0
- package/.claude/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
- package/.claude/skills/collaborating-with-gemini/SKILL.md +194 -0
- package/.claude/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
- package/.claude/skills/crud-development/SKILL.md +649 -0
- package/.claude/skills/data-permission/SKILL.md +599 -0
- package/.claude/skills/database-ops/SKILL.md +407 -0
- package/.claude/skills/error-handler/SKILL.md +371 -0
- package/.claude/skills/file-oss-management/SKILL.md +863 -0
- package/.claude/skills/git-workflow/SKILL.md +375 -0
- package/.claude/skills/json-serialization/SKILL.md +357 -0
- package/.claude/skills/leniu-api-development/SKILL.md +803 -0
- package/.claude/skills/leniu-architecture-design/SKILL.md +598 -0
- package/.claude/skills/leniu-backend-annotations/SKILL.md +664 -0
- package/.claude/skills/leniu-code-patterns/SKILL.md +365 -0
- package/.claude/skills/leniu-crud-development/SKILL.md +1110 -0
- package/.claude/skills/leniu-data-permission/SKILL.md +256 -0
- package/.claude/skills/leniu-database-ops/SKILL.md +426 -0
- package/.claude/skills/leniu-error-handler/SKILL.md +462 -0
- package/.claude/skills/leniu-java-amount-handling/SKILL.md +461 -0
- package/.claude/skills/leniu-java-code-style/SKILL.md +510 -0
- package/.claude/skills/leniu-java-concurrent/SKILL.md +400 -0
- package/.claude/skills/leniu-java-entity/SKILL.md +751 -0
- package/.claude/skills/leniu-java-export/SKILL.md +560 -0
- package/.claude/skills/leniu-java-logging/SKILL.md +832 -0
- package/.claude/skills/leniu-java-mq/SKILL.md +338 -0
- package/.claude/skills/leniu-java-mybatis/SKILL.md +640 -0
- package/.claude/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/.claude/skills/leniu-java-task/SKILL.md +367 -0
- package/.claude/skills/leniu-java-total-line/SKILL.md +195 -0
- package/.claude/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/.claude/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/.claude/skills/leniu-mealtime/SKILL.md +215 -0
- package/.claude/skills/leniu-redis-cache/SKILL.md +316 -0
- package/.claude/skills/leniu-security-guard/SKILL.md +520 -0
- package/.claude/skills/leniu-utils-toolkit/SKILL.md +380 -0
- package/.claude/skills/openspec-apply-change/SKILL.md +156 -0
- package/.claude/skills/openspec-archive-change/SKILL.md +114 -0
- package/.claude/skills/openspec-bulk-archive-change/SKILL.md +246 -0
- package/.claude/skills/openspec-continue-change/SKILL.md +118 -0
- package/.claude/skills/openspec-explore/SKILL.md +290 -0
- package/.claude/skills/openspec-ff-change/SKILL.md +101 -0
- package/.claude/skills/openspec-new-change/SKILL.md +74 -0
- package/.claude/skills/openspec-onboard/SKILL.md +529 -0
- package/.claude/skills/openspec-sync-specs/SKILL.md +138 -0
- package/.claude/skills/openspec-verify-change/SKILL.md +168 -0
- package/.claude/skills/performance-doctor/SKILL.md +627 -0
- package/.claude/skills/project-navigator/SKILL.md +305 -0
- package/.claude/skills/redis-cache/SKILL.md +839 -0
- package/.claude/skills/scheduled-jobs/SKILL.md +633 -0
- package/.claude/skills/security-guard/SKILL.md +748 -0
- package/.claude/skills/sms-mail/SKILL.md +766 -0
- package/.claude/skills/social-login/SKILL.md +668 -0
- package/.claude/skills/store-pc/SKILL.md +366 -0
- package/.claude/skills/task-tracker/SKILL.md +307 -0
- package/.claude/skills/tech-decision/SKILL.md +393 -0
- package/.claude/skills/tenant-management/SKILL.md +603 -0
- package/.claude/skills/test-development/SKILL.md +755 -0
- package/.claude/skills/ui-pc/SKILL.md +438 -0
- package/.claude/skills/utils-toolkit/SKILL.md +615 -0
- package/.claude/skills/websocket-sse/SKILL.md +716 -0
- package/.claude/skills/workflow-engine/SKILL.md +676 -0
- package/.claude/templates//345/276/205/345/212/236/346/270/205/345/215/225/346/250/241/346/235/277.md +56 -0
- package/.claude/templates//351/234/200/346/261/202/346/226/207/346/241/243/346/250/241/346/235/277.md +85 -0
- package/.claude/templates//351/241/271/347/233/256/347/212/266/346/200/201/346/250/241/346/235/277.md +43 -0
- package/.codex/skills/add-skill/SKILL.md +352 -0
- package/.codex/skills/add-todo/SKILL.md +269 -0
- package/.codex/skills/api-development/SKILL.md +693 -0
- package/.codex/skills/architecture-design/SKILL.md +628 -0
- package/.codex/skills/backend-annotations/SKILL.md +664 -0
- package/.codex/skills/banana-image/CHANGELOG.md +37 -0
- package/.codex/skills/banana-image/README.md +146 -0
- package/.codex/skills/banana-image/SKILL.md +164 -0
- package/.codex/skills/banana-image/assets/logo.png +0 -0
- package/.codex/skills/banana-image/references/advanced-usage.md +189 -0
- package/.codex/skills/banana-image/scripts/apply_template.py +125 -0
- package/.codex/skills/banana-image/scripts/banana_image_exec.ts +412 -0
- package/.codex/skills/banana-image/scripts/batch_prep.py +82 -0
- package/.codex/skills/banana-image/scripts/package-lock.json +1437 -0
- package/.codex/skills/banana-image/scripts/package.json +18 -0
- package/.codex/skills/banana-image/scripts/requirements.txt +10 -0
- package/.codex/skills/banana-image/templates/poster.json +22 -0
- package/.codex/skills/banana-image/templates/product.json +17 -0
- package/.codex/skills/banana-image/templates/social.json +22 -0
- package/.codex/skills/banana-image/templates/thumbnail.json +17 -0
- package/.codex/skills/brainstorm/SKILL.md +648 -0
- package/.codex/skills/bug-detective/SKILL.md +1206 -0
- package/.codex/skills/check/SKILL.md +367 -0
- package/.codex/skills/code-patterns/SKILL.md +442 -0
- package/.codex/skills/collaborating-with-codex/SKILL.md +174 -0
- package/.codex/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
- package/.codex/skills/collaborating-with-gemini/SKILL.md +194 -0
- package/.codex/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
- package/.codex/skills/crud/SKILL.md +265 -0
- package/.codex/skills/crud-development/SKILL.md +637 -0
- package/.codex/skills/data-permission/SKILL.md +591 -0
- package/.codex/skills/database-ops/SKILL.md +553 -0
- package/.codex/skills/dev/SKILL.md +187 -0
- package/.codex/skills/error-handler/SKILL.md +361 -0
- package/.codex/skills/file-oss-management/SKILL.md +863 -0
- package/.codex/skills/git-workflow/SKILL.md +375 -0
- package/.codex/skills/init-docs/SKILL.md +194 -0
- package/.codex/skills/json-serialization/SKILL.md +357 -0
- package/.codex/skills/leniu-api-development/SKILL.md +803 -0
- package/.codex/skills/leniu-architecture-design/SKILL.md +594 -0
- package/.codex/skills/leniu-backend-annotations/SKILL.md +662 -0
- package/.codex/skills/leniu-code-patterns/SKILL.md +365 -0
- package/.codex/skills/leniu-crud-development/SKILL.md +1110 -0
- package/.codex/skills/leniu-data-permission/SKILL.md +256 -0
- package/.codex/skills/leniu-database-ops/SKILL.md +426 -0
- package/.codex/skills/leniu-error-handler/SKILL.md +462 -0
- package/.codex/skills/leniu-java-amount-handling/SKILL.md +461 -0
- package/.codex/skills/leniu-java-code-style/SKILL.md +510 -0
- package/.codex/skills/leniu-java-concurrent/SKILL.md +400 -0
- package/.codex/skills/leniu-java-entity/SKILL.md +751 -0
- package/.codex/skills/leniu-java-export/SKILL.md +560 -0
- package/.codex/skills/leniu-java-logging/SKILL.md +832 -0
- package/.codex/skills/leniu-java-mq/SKILL.md +338 -0
- package/.codex/skills/leniu-java-mybatis/SKILL.md +640 -0
- package/.codex/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/.codex/skills/leniu-java-task/SKILL.md +367 -0
- package/.codex/skills/leniu-java-total-line/SKILL.md +195 -0
- package/.codex/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/.codex/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/.codex/skills/leniu-mealtime/SKILL.md +215 -0
- package/.codex/skills/leniu-redis-cache/SKILL.md +316 -0
- package/.codex/skills/leniu-security-guard/SKILL.md +520 -0
- package/.codex/skills/leniu-utils-toolkit/SKILL.md +378 -0
- package/.codex/skills/next/SKILL.md +137 -0
- package/.codex/skills/openspec-apply-change/SKILL.md +156 -0
- package/.codex/skills/openspec-archive-change/SKILL.md +114 -0
- package/.codex/skills/openspec-bulk-archive-change/SKILL.md +246 -0
- package/.codex/skills/openspec-continue-change/SKILL.md +118 -0
- package/.codex/skills/openspec-explore/SKILL.md +290 -0
- package/.codex/skills/openspec-ff-change/SKILL.md +101 -0
- package/.codex/skills/openspec-new-change/SKILL.md +74 -0
- package/.codex/skills/openspec-onboard/SKILL.md +529 -0
- package/.codex/skills/openspec-sync-specs/SKILL.md +138 -0
- package/.codex/skills/openspec-verify-change/SKILL.md +168 -0
- package/.codex/skills/performance-doctor/SKILL.md +627 -0
- package/.codex/skills/progress/SKILL.md +193 -0
- package/.codex/skills/project-navigator/SKILL.md +286 -0
- package/.codex/skills/redis-cache/SKILL.md +829 -0
- package/.codex/skills/scheduled-jobs/SKILL.md +633 -0
- package/.codex/skills/security-guard/SKILL.md +739 -0
- package/.codex/skills/sms-mail/SKILL.md +766 -0
- package/.codex/skills/social-login/SKILL.md +668 -0
- package/.codex/skills/start/SKILL.md +154 -0
- package/.codex/skills/store-pc/SKILL.md +491 -0
- package/.codex/skills/sync/SKILL.md +149 -0
- package/.codex/skills/task-tracker/SKILL.md +307 -0
- package/.codex/skills/tech-decision/SKILL.md +393 -0
- package/.codex/skills/tenant-management/SKILL.md +603 -0
- package/.codex/skills/test-development/SKILL.md +755 -0
- package/.codex/skills/ui-pc/SKILL.md +475 -0
- package/.codex/skills/update-status/SKILL.md +159 -0
- package/.codex/skills/utils-toolkit/SKILL.md +593 -0
- package/.codex/skills/websocket-sse/SKILL.md +716 -0
- package/.codex/skills/workflow-engine/SKILL.md +676 -0
- package/.cursor/agents/code-reviewer.md +139 -0
- package/.cursor/agents/project-manager.md +159 -0
- package/.cursor/commands/opsx-apply.md +152 -0
- package/.cursor/commands/opsx-archive.md +157 -0
- package/.cursor/commands/opsx-bulk-archive.md +242 -0
- package/.cursor/commands/opsx-continue.md +114 -0
- package/.cursor/commands/opsx-explore.md +174 -0
- package/.cursor/commands/opsx-ff.md +94 -0
- package/.cursor/commands/opsx-new.md +69 -0
- package/.cursor/commands/opsx-onboard.md +525 -0
- package/.cursor/commands/opsx-sync.md +134 -0
- package/.cursor/commands/opsx-verify.md +164 -0
- package/.cursor/mcp.json +22 -0
- package/.cursor/skills/add-skill/SKILL.md +352 -0
- package/.cursor/skills/api-development/SKILL.md +560 -0
- package/.cursor/skills/architecture-design/SKILL.md +756 -0
- package/.cursor/skills/backend-annotations/SKILL.md +674 -0
- package/.cursor/skills/banana-image/CHANGELOG.md +37 -0
- package/.cursor/skills/banana-image/README.md +146 -0
- package/.cursor/skills/banana-image/SKILL.md +164 -0
- package/.cursor/skills/banana-image/assets/logo.png +0 -0
- package/.cursor/skills/banana-image/references/advanced-usage.md +189 -0
- package/.cursor/skills/banana-image/scripts/apply_template.py +125 -0
- package/.cursor/skills/banana-image/scripts/banana_image_exec.ts +412 -0
- package/.cursor/skills/banana-image/scripts/batch_prep.py +82 -0
- package/.cursor/skills/banana-image/scripts/package-lock.json +1437 -0
- package/.cursor/skills/banana-image/scripts/package.json +18 -0
- package/.cursor/skills/banana-image/scripts/requirements.txt +10 -0
- package/.cursor/skills/banana-image/templates/poster.json +22 -0
- package/.cursor/skills/banana-image/templates/product.json +17 -0
- package/.cursor/skills/banana-image/templates/social.json +22 -0
- package/.cursor/skills/banana-image/templates/thumbnail.json +17 -0
- package/.cursor/skills/brainstorm/SKILL.md +648 -0
- package/.cursor/skills/bug-detective/SKILL.md +1206 -0
- package/.cursor/skills/code-patterns/SKILL.md +590 -0
- package/.cursor/skills/collaborating-with-codex/SKILL.md +174 -0
- package/.cursor/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
- package/.cursor/skills/collaborating-with-gemini/SKILL.md +194 -0
- package/.cursor/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
- package/.cursor/skills/crud-development/SKILL.md +649 -0
- package/.cursor/skills/data-permission/SKILL.md +599 -0
- package/.cursor/skills/database-ops/SKILL.md +407 -0
- package/.cursor/skills/error-handler/SKILL.md +371 -0
- package/.cursor/skills/file-oss-management/SKILL.md +863 -0
- package/.cursor/skills/git-workflow/SKILL.md +375 -0
- package/.cursor/skills/json-serialization/SKILL.md +357 -0
- package/.cursor/skills/leniu-api-development/SKILL.md +803 -0
- package/.cursor/skills/leniu-architecture-design/SKILL.md +598 -0
- package/.cursor/skills/leniu-backend-annotations/SKILL.md +664 -0
- package/.cursor/skills/leniu-code-patterns/SKILL.md +365 -0
- package/.cursor/skills/leniu-crud-development/SKILL.md +1110 -0
- package/.cursor/skills/leniu-data-permission/SKILL.md +256 -0
- package/.cursor/skills/leniu-database-ops/SKILL.md +426 -0
- package/.cursor/skills/leniu-error-handler/SKILL.md +462 -0
- package/.cursor/skills/leniu-java-amount-handling/SKILL.md +461 -0
- package/.cursor/skills/leniu-java-code-style/SKILL.md +510 -0
- package/.cursor/skills/leniu-java-concurrent/SKILL.md +400 -0
- package/.cursor/skills/leniu-java-entity/SKILL.md +751 -0
- package/.cursor/skills/leniu-java-export/SKILL.md +560 -0
- package/.cursor/skills/leniu-java-logging/SKILL.md +832 -0
- package/.cursor/skills/leniu-java-mq/SKILL.md +338 -0
- package/.cursor/skills/leniu-java-mybatis/SKILL.md +640 -0
- package/.cursor/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/.cursor/skills/leniu-java-task/SKILL.md +367 -0
- package/.cursor/skills/leniu-java-total-line/SKILL.md +195 -0
- package/.cursor/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/.cursor/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/.cursor/skills/leniu-mealtime/SKILL.md +215 -0
- package/.cursor/skills/leniu-redis-cache/SKILL.md +316 -0
- package/.cursor/skills/leniu-security-guard/SKILL.md +520 -0
- package/.cursor/skills/leniu-utils-toolkit/SKILL.md +380 -0
- package/.cursor/skills/openspec-apply-change/SKILL.md +156 -0
- package/.cursor/skills/openspec-archive-change/SKILL.md +114 -0
- package/.cursor/skills/openspec-bulk-archive-change/SKILL.md +246 -0
- package/.cursor/skills/openspec-continue-change/SKILL.md +118 -0
- package/.cursor/skills/openspec-explore/SKILL.md +290 -0
- package/.cursor/skills/openspec-ff-change/SKILL.md +101 -0
- package/.cursor/skills/openspec-new-change/SKILL.md +74 -0
- package/.cursor/skills/openspec-onboard/SKILL.md +529 -0
- package/.cursor/skills/openspec-sync-specs/SKILL.md +138 -0
- package/.cursor/skills/openspec-verify-change/SKILL.md +168 -0
- package/.cursor/skills/performance-doctor/SKILL.md +627 -0
- package/.cursor/skills/project-navigator/SKILL.md +305 -0
- package/.cursor/skills/redis-cache/SKILL.md +839 -0
- package/.cursor/skills/scheduled-jobs/SKILL.md +633 -0
- package/.cursor/skills/security-guard/SKILL.md +748 -0
- package/.cursor/skills/sms-mail/SKILL.md +766 -0
- package/.cursor/skills/social-login/SKILL.md +668 -0
- package/.cursor/skills/store-pc/SKILL.md +366 -0
- package/.cursor/skills/task-tracker/SKILL.md +307 -0
- package/.cursor/skills/tech-decision/SKILL.md +393 -0
- package/.cursor/skills/tenant-management/SKILL.md +603 -0
- package/.cursor/skills/test-development/SKILL.md +755 -0
- package/.cursor/skills/ui-pc/SKILL.md +438 -0
- package/.cursor/skills/utils-toolkit/SKILL.md +615 -0
- package/.cursor/skills/websocket-sse/SKILL.md +716 -0
- package/.cursor/skills/workflow-engine/SKILL.md +676 -0
- package/AGENTS.md +669 -0
- package/CLAUDE.md +205 -0
- package/README.md +205 -0
- package/bin/index.js +179 -0
- package/init.sh +178 -0
- package/package.json +27 -0
|
@@ -0,0 +1,756 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: architecture-design
|
|
3
|
+
description: |
|
|
4
|
+
系统架构设计、模块划分、代码重构、技术栈选型。核心内容:三层架构规范、业务模块划分、表设计规范、技术栈优先级决策。
|
|
5
|
+
|
|
6
|
+
触发场景:
|
|
7
|
+
- 系统整体架构设计
|
|
8
|
+
- 新业务模块的模块划分与结构规划
|
|
9
|
+
- 代码分层与重构策略
|
|
10
|
+
- 依赖关系梳理与解耦
|
|
11
|
+
- 架构演进路径建议(从单体到微服务)
|
|
12
|
+
- 领域边界划分与包结构设计
|
|
13
|
+
- 技术栈选型与方案决策
|
|
14
|
+
|
|
15
|
+
触发词:架构设计、模块划分、三层架构、分层、领域划分、重构、解耦、依赖管理、系统设计、代码组织、技术栈、架构演进
|
|
16
|
+
|
|
17
|
+
注意:
|
|
18
|
+
1. 具体技术对比(Redis vs 本地缓存)→ 使用 tech-decision
|
|
19
|
+
2. 开发具体 CRUD 模块 → 使用 crud-development
|
|
20
|
+
3. 数据库建表与字典配置 → 使用 database-ops
|
|
21
|
+
4. 本项目是纯后端项目(无前端代码)
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# 架构设计指南
|
|
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 业务可自行集成 |
|
|
88
|
+
|
|
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
|
+
### 整体架构
|
|
109
|
+
|
|
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
|
+
```
|
|
149
|
+
|
|
150
|
+
### 🔴 后端三层架构(本项目核心)
|
|
151
|
+
|
|
152
|
+
本项目采用 **三层架构**:Controller → Service → Mapper
|
|
153
|
+
|
|
154
|
+
**注意:没有独立的 DAO 层!Service 层直接调用 Mapper。**
|
|
155
|
+
|
|
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
|
+
- 更简洁、更少的样板代码
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## 架构设计原则
|
|
188
|
+
|
|
189
|
+
### 1. 单一职责
|
|
190
|
+
|
|
191
|
+
```java
|
|
192
|
+
// ✅ 好的设计:每个类只负责一件事
|
|
193
|
+
public class OrderService {
|
|
194
|
+
// 只处理订单业务
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
public class PaymentService {
|
|
198
|
+
// 只处理支付业务
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// ❌ 不好的设计:一个类做太多事
|
|
202
|
+
public class OrderService {
|
|
203
|
+
// 订单 + 支付 + 物流 + 通知...
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### 2. 开闭原则
|
|
208
|
+
|
|
209
|
+
```java
|
|
210
|
+
// ✅ 好的设计:对扩展开放,对修改关闭
|
|
211
|
+
public interface PaymentStrategy {
|
|
212
|
+
void pay(Order order);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
public class WechatPayment implements PaymentStrategy { }
|
|
216
|
+
public class AlipayPayment implements PaymentStrategy { }
|
|
217
|
+
// 新增支付方式只需新增实现类
|
|
218
|
+
|
|
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
|
+
```
|
|
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
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## 模块划分与表前缀规范
|
|
249
|
+
|
|
250
|
+
### 核心约束(必须遵守)
|
|
251
|
+
|
|
252
|
+
**包名必须是 `org.dromara.*`**
|
|
253
|
+
|
|
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
|
+
### 业务模块扩展(按业务领域)
|
|
263
|
+
|
|
264
|
+
创建新业务模块时,遵循以下规范:
|
|
265
|
+
|
|
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_` |
|
|
271
|
+
|
|
272
|
+
### 关键设计原则
|
|
273
|
+
|
|
274
|
+
**1. 表前缀与模块一一对应**
|
|
275
|
+
```
|
|
276
|
+
✅ 正确:sys_user 表 → ruoyi-system 模块
|
|
277
|
+
❌ 错误:sys_user 表 → ruoyi-demo 模块(前缀与模块不符)
|
|
278
|
+
```
|
|
279
|
+
|
|
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
|
+
```
|
|
289
|
+
|
|
290
|
+
**3. 所有业务表继承 TenantEntity**
|
|
291
|
+
```java
|
|
292
|
+
// ✅ 正确:支持多租户
|
|
293
|
+
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,全局配置)
|
|
298
|
+
|
|
299
|
+
@TableLogic
|
|
300
|
+
private Long delFlag; // 逻辑删除标志
|
|
301
|
+
}
|
|
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
|
+
|
|
313
|
+
// ❌ 错误:SQL 中使用自增
|
|
314
|
+
id BIGINT AUTO_INCREMENT -- 禁止!本项目用雪花ID
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### 🔴 模块内部结构规范(三层架构)
|
|
318
|
+
|
|
319
|
+
以 `TestDemo` 表为例:
|
|
320
|
+
|
|
321
|
+
```
|
|
322
|
+
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 层):**
|
|
340
|
+
|
|
341
|
+
```java
|
|
342
|
+
@Service
|
|
343
|
+
public class TestDemoServiceImpl implements ITestDemoService {
|
|
344
|
+
|
|
345
|
+
private final TestDemoMapper baseMapper; // 直接注入 Mapper,无 DAO 层
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* 构建查询条件(在 Service 层)
|
|
349
|
+
*/
|
|
350
|
+
private LambdaQueryWrapper<TestDemo> buildQueryWrapper(TestDemoBo bo) {
|
|
351
|
+
Map<String, Object> params = bo.getParams();
|
|
352
|
+
LambdaQueryWrapper<TestDemo> lqw = Wrappers.lambdaQuery();
|
|
353
|
+
lqw.eq(bo.getDeptId() != null, TestDemo::getDeptId, bo.getDeptId());
|
|
354
|
+
lqw.eq(bo.getUserId() != null, TestDemo::getUserId, bo.getUserId());
|
|
355
|
+
lqw.like(StringUtils.isNotBlank(bo.getTestKey()), TestDemo::getTestKey, bo.getTestKey());
|
|
356
|
+
lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null,
|
|
357
|
+
TestDemo::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime"));
|
|
358
|
+
return lqw;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
@Override
|
|
362
|
+
public TableDataInfo<TestDemoVo> queryPageList(TestDemoBo bo, PageQuery pageQuery) {
|
|
363
|
+
LambdaQueryWrapper<TestDemo> lqw = buildQueryWrapper(bo);
|
|
364
|
+
Page<TestDemoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
365
|
+
return TableDataInfo.build(result);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### 表设计规范
|
|
371
|
+
|
|
372
|
+
#### 建表模板(MySQL)
|
|
373
|
+
|
|
374
|
+
```sql
|
|
375
|
+
CREATE TABLE xxx_table (
|
|
376
|
+
-- 主键(雪花 ID,不用 AUTO_INCREMENT)
|
|
377
|
+
id BIGINT(20) NOT NULL COMMENT '主键ID',
|
|
378
|
+
|
|
379
|
+
-- 多租户字段(必须)
|
|
380
|
+
tenant_id VARCHAR(20) DEFAULT '000000' COMMENT '租户ID',
|
|
381
|
+
|
|
382
|
+
-- 业务字段
|
|
383
|
+
xxx_name VARCHAR(100) NOT NULL COMMENT '名称',
|
|
384
|
+
status CHAR(1) DEFAULT '0' COMMENT '状态',
|
|
385
|
+
remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
|
|
386
|
+
|
|
387
|
+
-- 审计字段(必须,继承自 TenantEntity)
|
|
388
|
+
create_dept BIGINT(20) DEFAULT NULL COMMENT '创建部门',
|
|
389
|
+
create_by BIGINT(20) DEFAULT NULL COMMENT '创建人',
|
|
390
|
+
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
391
|
+
update_by BIGINT(20) DEFAULT NULL COMMENT '更新人',
|
|
392
|
+
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|
393
|
+
|
|
394
|
+
-- 逻辑删除
|
|
395
|
+
del_flag CHAR(1) DEFAULT '0' COMMENT '删除标志(0正常 1已删除)',
|
|
396
|
+
|
|
397
|
+
PRIMARY KEY (id),
|
|
398
|
+
INDEX idx_tenant_id (tenant_id),
|
|
399
|
+
INDEX idx_status (status)
|
|
400
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='xxx表';
|
|
401
|
+
```
|
|
402
|
+
|
|
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
|
+
```
|
|
469
|
+
|
|
470
|
+
**技术选型:**
|
|
471
|
+
```
|
|
472
|
+
├── 设备通信
|
|
473
|
+
│ └── MQTT(物联网协议,需自行集成)
|
|
474
|
+
├── 数据存储
|
|
475
|
+
│ ├── MySQL(设备元数据、告警记录)
|
|
476
|
+
│ └── Redis(设备在线状态、实时数据)
|
|
477
|
+
├── 实时推送
|
|
478
|
+
│ └── WebSocket(告警推送)
|
|
479
|
+
└── 定时任务
|
|
480
|
+
└── @Scheduled(设备离线检测)
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
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:实时通信方案
|
|
504
|
+
|
|
505
|
+
| 场景 | 推荐方案 |
|
|
506
|
+
|------|---------|
|
|
507
|
+
| 订单状态推送 | WebSocket |
|
|
508
|
+
| 系统通知推送 | SSE |
|
|
509
|
+
| IoT 设备通信 | MQTT(自行集成) |
|
|
510
|
+
|
|
511
|
+
---
|
|
512
|
+
|
|
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
|
+
}
|
|
674
|
+
|
|
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
|
+
```
|
|
693
|
+
|
|
694
|
+
---
|
|
695
|
+
|
|
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()`
|