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,375 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: git-workflow
|
|
3
|
+
description: |
|
|
4
|
+
当需要进行 Git 版本控制操作时自动使用此 Skill。
|
|
5
|
+
|
|
6
|
+
触发场景:
|
|
7
|
+
- 提交代码
|
|
8
|
+
- 创建/合并分支
|
|
9
|
+
- 查看提交历史
|
|
10
|
+
- 解决冲突
|
|
11
|
+
- 回滚代码
|
|
12
|
+
|
|
13
|
+
触发词:git、提交、commit、分支、合并、push、pull、冲突、回滚、版本、历史
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Git 工作流指南
|
|
17
|
+
|
|
18
|
+
## ⚠️ 本项目提交规范(必须遵守)
|
|
19
|
+
|
|
20
|
+
### 核心原则
|
|
21
|
+
|
|
22
|
+
1. **只提交当前会话的改动**:只 `git add` 当前聊天中修改或新增的文件
|
|
23
|
+
2. **不提交配置文件**:排除 `.env*`、`application*.yml` 等配置
|
|
24
|
+
3. **默认只提交到本地**:执行 `git add` + `git commit`,**不自动 push**
|
|
25
|
+
4. **明确指定才推送**:只有用户明确说"推送"、"push"、"提交到远程"时才执行 `git push`
|
|
26
|
+
|
|
27
|
+
### 提交信息格式
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
<type>(<scope>): <subject>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
> **注意**:本项目是纯后端项目,无需平台前缀。
|
|
34
|
+
|
|
35
|
+
### 提交示例
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# 新功能
|
|
39
|
+
feat(system): 新增用户反馈功能
|
|
40
|
+
|
|
41
|
+
# 修复 Bug
|
|
42
|
+
fix(demo): 修复订单状态显示错误
|
|
43
|
+
|
|
44
|
+
# 文档更新
|
|
45
|
+
docs(readme): 更新安装说明
|
|
46
|
+
|
|
47
|
+
# 重构
|
|
48
|
+
refactor(common): 重构分页查询工具类
|
|
49
|
+
|
|
50
|
+
# 性能优化
|
|
51
|
+
perf(system): 优化用户列表查询性能
|
|
52
|
+
|
|
53
|
+
# 测试
|
|
54
|
+
test(demo): 添加单元测试
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 提交流程
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# 1. 查看当前改动
|
|
61
|
+
git status
|
|
62
|
+
|
|
63
|
+
# 2. 只添加当前会话修改的业务文件(排除配置)
|
|
64
|
+
git add ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/xxx/
|
|
65
|
+
# 或者添加具体文件
|
|
66
|
+
git add path/to/file1.java path/to/file2.java
|
|
67
|
+
|
|
68
|
+
# 3. 提交到本地(不 push!)
|
|
69
|
+
git commit -m "feat(system): 新增xxx功能"
|
|
70
|
+
|
|
71
|
+
# 4. 只有用户明确要求时才推送
|
|
72
|
+
# git push # ← 用户说"推送"时才执行
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 不要提交的文件
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# ❌ 配置文件(绝对不提交)
|
|
79
|
+
ruoyi-admin/src/main/resources/application.yml
|
|
80
|
+
ruoyi-admin/src/main/resources/application-*.yml
|
|
81
|
+
ruoyi-common/**/resources/*.yml
|
|
82
|
+
|
|
83
|
+
# ❌ IDE 配置
|
|
84
|
+
.idea/
|
|
85
|
+
.vscode/
|
|
86
|
+
*.iml
|
|
87
|
+
|
|
88
|
+
# ❌ 本地临时文件
|
|
89
|
+
*.log
|
|
90
|
+
target/
|
|
91
|
+
logs/
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## 提交类型说明
|
|
97
|
+
|
|
98
|
+
| 类型 | 说明 | 示例 |
|
|
99
|
+
|------|------|------|
|
|
100
|
+
| feat | 新功能 | `feat(system): 新增用户反馈功能` |
|
|
101
|
+
| fix | 修复Bug | `fix(demo): 修复订单状态显示错误` |
|
|
102
|
+
| docs | 文档更新 | `docs(readme): 更新安装说明` |
|
|
103
|
+
| style | 代码格式 | `style(system): 格式化代码` |
|
|
104
|
+
| refactor | 重构 | `refactor(common): 重构用户模块` |
|
|
105
|
+
| perf | 性能优化 | `perf(system): 优化查询性能` |
|
|
106
|
+
| test | 测试 | `test(demo): 添加单元测试` |
|
|
107
|
+
| chore | 构建/工具 | `chore: 更新依赖` |
|
|
108
|
+
|
|
109
|
+
### scope 常用范围
|
|
110
|
+
|
|
111
|
+
| scope | 说明 | 对应模块 |
|
|
112
|
+
|-------|------|----------|
|
|
113
|
+
| system | 系统管理 | `ruoyi-modules/ruoyi-system/` |
|
|
114
|
+
| demo | 演示模块 | `ruoyi-modules/ruoyi-demo/` |
|
|
115
|
+
| workflow | 工作流 | `ruoyi-modules/ruoyi-workflow/` |
|
|
116
|
+
| job | 定时任务 | `ruoyi-modules/ruoyi-job/` |
|
|
117
|
+
| generator | 代码生成 | `ruoyi-modules/ruoyi-generator/` |
|
|
118
|
+
| common | 通用模块 | `ruoyi-common/` |
|
|
119
|
+
| admin | 启动模块 | `ruoyi-admin/` |
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 常用命令
|
|
124
|
+
|
|
125
|
+
### 基础操作
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
# 查看状态
|
|
129
|
+
git status
|
|
130
|
+
|
|
131
|
+
# 查看改动
|
|
132
|
+
git diff
|
|
133
|
+
git diff --staged # 已暂存的改动
|
|
134
|
+
|
|
135
|
+
# 添加文件
|
|
136
|
+
git add . # 添加所有(谨慎使用!)
|
|
137
|
+
git add <file> # 添加指定文件(推荐)
|
|
138
|
+
|
|
139
|
+
# 提交
|
|
140
|
+
git commit -m "提交信息"
|
|
141
|
+
|
|
142
|
+
# 推送(需用户明确要求)
|
|
143
|
+
git push
|
|
144
|
+
git push -u origin <branch> # 首次推送并设置上游
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 分支操作
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
# 查看分支
|
|
151
|
+
git branch # 本地分支
|
|
152
|
+
git branch -r # 远程分支
|
|
153
|
+
git branch -a # 所有分支
|
|
154
|
+
|
|
155
|
+
# 创建分支
|
|
156
|
+
git branch <name>
|
|
157
|
+
git checkout -b <name> # 创建并切换
|
|
158
|
+
|
|
159
|
+
# 切换分支
|
|
160
|
+
git checkout <name>
|
|
161
|
+
git switch <name>
|
|
162
|
+
|
|
163
|
+
# 合并分支
|
|
164
|
+
git merge <name>
|
|
165
|
+
|
|
166
|
+
# 删除分支
|
|
167
|
+
git branch -d <name> # 删除本地
|
|
168
|
+
git push origin -d <name> # 删除远程
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### 历史查看
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
# 查看提交历史
|
|
175
|
+
git log
|
|
176
|
+
git log --oneline
|
|
177
|
+
git log --oneline -10 # 最近10条
|
|
178
|
+
|
|
179
|
+
# 查看某文件历史
|
|
180
|
+
git log --follow <file>
|
|
181
|
+
|
|
182
|
+
# 查看某次提交的内容
|
|
183
|
+
git show <commit-id>
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 撤销操作
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
# 撤销工作区修改
|
|
190
|
+
git checkout -- <file>
|
|
191
|
+
git restore <file>
|
|
192
|
+
|
|
193
|
+
# 撤销暂存
|
|
194
|
+
git reset HEAD <file>
|
|
195
|
+
git restore --staged <file>
|
|
196
|
+
|
|
197
|
+
# 撤销提交(保留修改)
|
|
198
|
+
git reset --soft HEAD^
|
|
199
|
+
|
|
200
|
+
# 撤销提交(丢弃修改)
|
|
201
|
+
git reset --hard HEAD^
|
|
202
|
+
|
|
203
|
+
# 回滚到某个提交
|
|
204
|
+
git reset --hard <commit-id>
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## 分支策略
|
|
210
|
+
|
|
211
|
+
### 主要分支
|
|
212
|
+
|
|
213
|
+
| 分支 | 用途 | 说明 |
|
|
214
|
+
|------|------|------|
|
|
215
|
+
| 5.X | 主分支 | 生产/发布代码(本项目主分支) |
|
|
216
|
+
| dev | 开发分支 | 日常开发代码 |
|
|
217
|
+
| feature/* | 功能分支 | 新功能开发 |
|
|
218
|
+
| fix/* | 修复分支 | Bug修复 |
|
|
219
|
+
| release/* | 发布分支 | 版本发布 |
|
|
220
|
+
|
|
221
|
+
### 工作流程
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
# 1. 从 dev 创建功能分支
|
|
225
|
+
git checkout dev
|
|
226
|
+
git pull
|
|
227
|
+
git checkout -b feature/user-feedback
|
|
228
|
+
|
|
229
|
+
# 2. 开发并提交(只提交当前会话改动的业务文件)
|
|
230
|
+
git add ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/feedback/
|
|
231
|
+
git commit -m "feat(system): 新增用户反馈功能"
|
|
232
|
+
|
|
233
|
+
# 3. 用户明确要求时才推送到远程
|
|
234
|
+
git push -u origin feature/user-feedback
|
|
235
|
+
|
|
236
|
+
# 4. 创建 Pull Request 合并到 dev
|
|
237
|
+
|
|
238
|
+
# 5. 合并后删除功能分支
|
|
239
|
+
git checkout dev
|
|
240
|
+
git pull
|
|
241
|
+
git branch -d feature/user-feedback
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## 冲突解决
|
|
247
|
+
|
|
248
|
+
### 合并冲突
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
# 1. 拉取最新代码
|
|
252
|
+
git pull
|
|
253
|
+
|
|
254
|
+
# 2. 如果有冲突,Git 会提示
|
|
255
|
+
# Auto-merging xxx.java
|
|
256
|
+
# CONFLICT (content): Merge conflict in xxx.java
|
|
257
|
+
|
|
258
|
+
# 3. 打开冲突文件,手动解决
|
|
259
|
+
# <<<<<<< HEAD
|
|
260
|
+
# 当前分支的代码
|
|
261
|
+
# =======
|
|
262
|
+
# 要合并的代码
|
|
263
|
+
# >>>>>>> feature/xxx
|
|
264
|
+
|
|
265
|
+
# 4. 解决后添加并提交
|
|
266
|
+
git add .
|
|
267
|
+
git commit -m "fix: 解决合并冲突"
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### 变基冲突
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
# 1. 变基
|
|
274
|
+
git rebase dev
|
|
275
|
+
|
|
276
|
+
# 2. 如果有冲突,解决后
|
|
277
|
+
git add .
|
|
278
|
+
git rebase --continue
|
|
279
|
+
|
|
280
|
+
# 3. 放弃变基
|
|
281
|
+
git rebase --abort
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## 实用技巧
|
|
287
|
+
|
|
288
|
+
### 暂存修改
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
# 暂存当前修改
|
|
292
|
+
git stash
|
|
293
|
+
|
|
294
|
+
# 查看暂存列表
|
|
295
|
+
git stash list
|
|
296
|
+
|
|
297
|
+
# 恢复暂存
|
|
298
|
+
git stash pop # 恢复并删除
|
|
299
|
+
git stash apply # 恢复但保留
|
|
300
|
+
|
|
301
|
+
# 删除暂存
|
|
302
|
+
git stash drop
|
|
303
|
+
git stash clear # 清空所有
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### 修改提交
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
# 修改最后一次提交信息
|
|
310
|
+
git commit --amend -m "新的提交信息"
|
|
311
|
+
|
|
312
|
+
# 追加到最后一次提交
|
|
313
|
+
git add .
|
|
314
|
+
git commit --amend --no-edit
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Cherry-pick
|
|
318
|
+
|
|
319
|
+
```bash
|
|
320
|
+
# 把某个提交应用到当前分支
|
|
321
|
+
git cherry-pick <commit-id>
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### 查看某人的提交
|
|
325
|
+
|
|
326
|
+
```bash
|
|
327
|
+
git log --author="作者名"
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
## 注意事项
|
|
333
|
+
|
|
334
|
+
### 禁止操作
|
|
335
|
+
|
|
336
|
+
1. **不要强制推送到主分支**
|
|
337
|
+
```bash
|
|
338
|
+
# ❌ 禁止
|
|
339
|
+
git push --force origin 5.X
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
2. **不要在主分支直接开发**
|
|
343
|
+
```bash
|
|
344
|
+
# ❌ 禁止
|
|
345
|
+
git checkout 5.X
|
|
346
|
+
# 直接修改代码...
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
3. **不要提交敏感信息和配置文件**
|
|
350
|
+
```bash
|
|
351
|
+
# ❌ 禁止提交
|
|
352
|
+
application.yml
|
|
353
|
+
application-dev.yml
|
|
354
|
+
application-prod.yml
|
|
355
|
+
credentials.json
|
|
356
|
+
password.txt
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
4. **不要自动 push(除非用户明确要求)**
|
|
360
|
+
```bash
|
|
361
|
+
# ❌ 默认不执行
|
|
362
|
+
git push
|
|
363
|
+
|
|
364
|
+
# ✅ 只有用户说"推送到远程"时才执行
|
|
365
|
+
git push
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### 最佳实践
|
|
369
|
+
|
|
370
|
+
1. **只提交当前会话改动**:不要 `git add .`,精确添加修改的文件
|
|
371
|
+
2. **排除配置文件**:配置文件包含本地环境信息,不应提交
|
|
372
|
+
3. **清晰的提交信息**:包含类型 + 范围 + 描述
|
|
373
|
+
4. **默认只本地提交**:`git add` + `git commit`,不自动 push
|
|
374
|
+
5. **频繁小步提交**:便于追踪和回滚
|
|
375
|
+
6. **Code Review**:通过 PR 合并代码
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: json-serialization
|
|
3
|
+
description: |
|
|
4
|
+
当需要处理 JSON 序列化、反序列化、数据类型转换、日期处理、大数字精度保护时自动使用此 Skill。
|
|
5
|
+
|
|
6
|
+
触发场景:
|
|
7
|
+
- JSON 序列化/反序列化操作
|
|
8
|
+
- 大数字精度问题(Long/BigInteger/BigDecimal)
|
|
9
|
+
- 日期时间格式化与转换
|
|
10
|
+
- 复杂泛型类型转换
|
|
11
|
+
- JSON 格式验证
|
|
12
|
+
- 数据类型映射与转换
|
|
13
|
+
|
|
14
|
+
触发词:JSON、序列化、反序列化、JsonUtils、日期格式、精度、BigDecimal、Long、类型转换、JSON验证
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# JSON 序列化与数据转换指南
|
|
18
|
+
|
|
19
|
+
> 模块位置:`ruoyi-common/ruoyi-common-json`
|
|
20
|
+
|
|
21
|
+
## 快速索引
|
|
22
|
+
|
|
23
|
+
| 功能 | 方法/类 | 说明 |
|
|
24
|
+
|------|---------|------|
|
|
25
|
+
| 对象转 JSON | `JsonUtils.toJsonString()` | null 返回 null |
|
|
26
|
+
| JSON 转对象 | `JsonUtils.parseObject()` | 空返回 null |
|
|
27
|
+
| JSON 转 List | `JsonUtils.parseArray()` | 空返回空 ArrayList |
|
|
28
|
+
| JSON 转 Dict | `JsonUtils.parseMap()` | 非 JSON 返回 null |
|
|
29
|
+
| JSON 数组转 Dict 列表 | `JsonUtils.parseArrayMap()` | 空返回 null |
|
|
30
|
+
| 复杂类型转换 | `JsonUtils.parseObject(text, TypeReference)` | 支持泛型 |
|
|
31
|
+
| JSON 验证 | `JsonUtils.isJson()` / `isJsonObject()` / `isJsonArray()` | |
|
|
32
|
+
| 字段校验注解 | `@JsonPattern` | 支持 OBJECT/ARRAY/ANY |
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 核心工具类 JsonUtils
|
|
37
|
+
|
|
38
|
+
```java
|
|
39
|
+
import org.dromara.common.json.utils.JsonUtils;
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 序列化
|
|
43
|
+
|
|
44
|
+
```java
|
|
45
|
+
// 对象转 JSON 字符串(null 返回 null)
|
|
46
|
+
String json = JsonUtils.toJsonString(user);
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 反序列化
|
|
50
|
+
|
|
51
|
+
```java
|
|
52
|
+
// JSON 转简单对象(空返回 null)
|
|
53
|
+
User user = JsonUtils.parseObject(json, User.class);
|
|
54
|
+
|
|
55
|
+
// 字节数组转对象
|
|
56
|
+
User user = JsonUtils.parseObject(bytes, User.class);
|
|
57
|
+
|
|
58
|
+
// JSON 数组转 List(空返回空 ArrayList)
|
|
59
|
+
List<User> users = JsonUtils.parseArray(json, User.class);
|
|
60
|
+
|
|
61
|
+
// JSON 转 Dict(非 JSON 返回 null)
|
|
62
|
+
Dict dict = JsonUtils.parseMap(json);
|
|
63
|
+
String name = dict.getStr("name");
|
|
64
|
+
int age = dict.getInt("age");
|
|
65
|
+
|
|
66
|
+
// JSON 数组转 Dict 列表
|
|
67
|
+
List<Dict> dicts = JsonUtils.parseArrayMap(json);
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 复杂泛型类型
|
|
71
|
+
|
|
72
|
+
```java
|
|
73
|
+
import com.fasterxml.jackson.core.type.TypeReference;
|
|
74
|
+
|
|
75
|
+
// Map 类型
|
|
76
|
+
Map<String, User> map = JsonUtils.parseObject(json,
|
|
77
|
+
new TypeReference<Map<String, User>>(){});
|
|
78
|
+
|
|
79
|
+
// 嵌套泛型
|
|
80
|
+
Map<String, List<User>> data = JsonUtils.parseObject(json,
|
|
81
|
+
new TypeReference<Map<String, List<User>>>(){});
|
|
82
|
+
|
|
83
|
+
// 性能优化:缓存 TypeReference
|
|
84
|
+
private static final TypeReference<List<User>> USER_LIST_TYPE =
|
|
85
|
+
new TypeReference<List<User>>(){};
|
|
86
|
+
List<User> users = JsonUtils.parseObject(json, USER_LIST_TYPE);
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### JSON 验证
|
|
90
|
+
|
|
91
|
+
```java
|
|
92
|
+
// 判断是否为合法 JSON(对象或数组)
|
|
93
|
+
JsonUtils.isJson("{\"name\":\"张三\"}"); // true
|
|
94
|
+
JsonUtils.isJson("[1,2,3]"); // true
|
|
95
|
+
JsonUtils.isJson("not json"); // false
|
|
96
|
+
|
|
97
|
+
// 判断是否为 JSON 对象
|
|
98
|
+
JsonUtils.isJsonObject("{\"a\":1}"); // true
|
|
99
|
+
JsonUtils.isJsonObject("[1,2,3]"); // false
|
|
100
|
+
|
|
101
|
+
// 判断是否为 JSON 数组
|
|
102
|
+
JsonUtils.isJsonArray("[1,2,3]"); // true
|
|
103
|
+
JsonUtils.isJsonArray("{\"a\":1}"); // false
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 获取 ObjectMapper
|
|
107
|
+
|
|
108
|
+
```java
|
|
109
|
+
ObjectMapper mapper = JsonUtils.getObjectMapper();
|
|
110
|
+
JsonNode node = mapper.readTree(json);
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## @JsonPattern 校验注解
|
|
116
|
+
|
|
117
|
+
用于 BO 类字段的 JSON 格式校验。
|
|
118
|
+
|
|
119
|
+
```java
|
|
120
|
+
import org.dromara.common.json.validate.JsonPattern;
|
|
121
|
+
import org.dromara.common.json.validate.JsonType;
|
|
122
|
+
|
|
123
|
+
public class ConfigBo {
|
|
124
|
+
|
|
125
|
+
// 任意 JSON 格式(对象或数组)
|
|
126
|
+
@JsonPattern
|
|
127
|
+
private String configValue;
|
|
128
|
+
|
|
129
|
+
// 必须是 JSON 对象
|
|
130
|
+
@JsonPattern(type = JsonType.OBJECT, message = "配置必须是 JSON 对象格式")
|
|
131
|
+
private String objectConfig;
|
|
132
|
+
|
|
133
|
+
// 必须是 JSON 数组
|
|
134
|
+
@JsonPattern(type = JsonType.ARRAY, message = "列表必须是 JSON 数组格式")
|
|
135
|
+
private String arrayConfig;
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**JsonType 枚举**:
|
|
140
|
+
|
|
141
|
+
| 值 | 说明 | 示例 |
|
|
142
|
+
|----|------|------|
|
|
143
|
+
| `ANY` | 对象或数组都可以(默认) | `{}` 或 `[]` |
|
|
144
|
+
| `OBJECT` | 必须是 JSON 对象 | `{"a":1}` |
|
|
145
|
+
| `ARRAY` | 必须是 JSON 数组 | `[1,2,3]` |
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Jackson 自动配置
|
|
150
|
+
|
|
151
|
+
配置类:`org.dromara.common.json.config.JacksonConfig`
|
|
152
|
+
|
|
153
|
+
### 大数字处理(BigNumberSerializer)
|
|
154
|
+
|
|
155
|
+
**问题**:JavaScript 最大安全整数为 `2^53 - 1`(9007199254740991),超出范围会丢失精度。
|
|
156
|
+
|
|
157
|
+
**解决方案**:自动将超出 JS 安全范围的数字序列化为字符串。
|
|
158
|
+
|
|
159
|
+
```java
|
|
160
|
+
// 安全范围内 → 保持数字
|
|
161
|
+
Long id = 123456L;
|
|
162
|
+
// 序列化结果:{"id": 123456}
|
|
163
|
+
|
|
164
|
+
// 超出安全范围 → 转为字符串
|
|
165
|
+
Long id = 9007199254740992L;
|
|
166
|
+
// 序列化结果:{"id": "9007199254740992"}
|
|
167
|
+
|
|
168
|
+
// BigDecimal 始终转为字符串
|
|
169
|
+
BigDecimal amount = new BigDecimal("123.45");
|
|
170
|
+
// 序列化结果:{"amount": "123.45"}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**处理规则**:
|
|
174
|
+
|
|
175
|
+
| 类型 | 范围内 | 超出范围 |
|
|
176
|
+
|------|--------|----------|
|
|
177
|
+
| `Long` | 数字 | 字符串 |
|
|
178
|
+
| `long` | 数字 | 字符串 |
|
|
179
|
+
| `BigInteger` | 数字 | 字符串 |
|
|
180
|
+
| `BigDecimal` | 字符串 | 字符串 |
|
|
181
|
+
|
|
182
|
+
> **安全范围**:`-9007199254740991` ~ `9007199254740991`
|
|
183
|
+
|
|
184
|
+
### LocalDateTime 格式化
|
|
185
|
+
|
|
186
|
+
统一格式:`yyyy-MM-dd HH:mm:ss`
|
|
187
|
+
|
|
188
|
+
```java
|
|
189
|
+
LocalDateTime now = LocalDateTime.now();
|
|
190
|
+
String json = JsonUtils.toJsonString(now);
|
|
191
|
+
// 输出:"2026-02-06 14:30:45"
|
|
192
|
+
|
|
193
|
+
LocalDateTime parsed = JsonUtils.parseObject("\"2026-02-06 14:30:45\"", LocalDateTime.class);
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Date 自动解析(CustomDateDeserializer)
|
|
197
|
+
|
|
198
|
+
使用 Hutool 的 `DateUtil.parse()` 自动识别多种日期格式:
|
|
199
|
+
|
|
200
|
+
```java
|
|
201
|
+
// 支持的格式(自动识别)
|
|
202
|
+
Date d1 = JsonUtils.parseObject("\"2026-02-06 14:30:45\"", Date.class);
|
|
203
|
+
Date d2 = JsonUtils.parseObject("\"2026-02-06\"", Date.class);
|
|
204
|
+
Date d3 = JsonUtils.parseObject("\"2026/02/06 14:30:45\"", Date.class);
|
|
205
|
+
Date d4 = JsonUtils.parseObject("\"20260206143045\"", Date.class);
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## 使用示例
|
|
211
|
+
|
|
212
|
+
### Service 中的 JSON 操作
|
|
213
|
+
|
|
214
|
+
```java
|
|
215
|
+
@Service
|
|
216
|
+
@RequiredArgsConstructor
|
|
217
|
+
public class ConfigServiceImpl implements IConfigService {
|
|
218
|
+
|
|
219
|
+
private final ConfigMapper baseMapper;
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* 获取配置为对象
|
|
223
|
+
*/
|
|
224
|
+
public <T> T getConfig(String configKey, Class<T> clazz) {
|
|
225
|
+
SysConfig config = baseMapper.selectOne(
|
|
226
|
+
Wrappers.<SysConfig>lambdaQuery()
|
|
227
|
+
.eq(SysConfig::getConfigKey, configKey));
|
|
228
|
+
if (config == null) {
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
return JsonUtils.parseObject(config.getConfigValue(), clazz);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* 保存配置
|
|
236
|
+
*/
|
|
237
|
+
public void saveConfig(String configKey, Object value) {
|
|
238
|
+
SysConfig config = new SysConfig();
|
|
239
|
+
config.setConfigKey(configKey);
|
|
240
|
+
config.setConfigValue(JsonUtils.toJsonString(value));
|
|
241
|
+
baseMapper.insert(config);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* 导入 JSON 数据
|
|
246
|
+
*/
|
|
247
|
+
public void importData(String jsonData) {
|
|
248
|
+
if (!JsonUtils.isJsonArray(jsonData)) {
|
|
249
|
+
throw new ServiceException("数据格式不正确,应为 JSON 数组");
|
|
250
|
+
}
|
|
251
|
+
List<DataBo> list = JsonUtils.parseArray(jsonData, DataBo.class);
|
|
252
|
+
// 处理数据...
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### BO 中使用 JSON 校验
|
|
258
|
+
|
|
259
|
+
```java
|
|
260
|
+
@Data
|
|
261
|
+
@AutoMapper(target = SysConfig.class, reverseConvertGenerate = false)
|
|
262
|
+
public class SysConfigBo extends BaseEntity {
|
|
263
|
+
|
|
264
|
+
@NotNull(message = "ID不能为空", groups = EditGroup.class)
|
|
265
|
+
private Long id;
|
|
266
|
+
|
|
267
|
+
@NotBlank(message = "配置键不能为空")
|
|
268
|
+
private String configKey;
|
|
269
|
+
|
|
270
|
+
@NotBlank(message = "配置值不能为空")
|
|
271
|
+
@JsonPattern(type = JsonType.OBJECT, message = "配置值必须是有效的 JSON 对象")
|
|
272
|
+
private String configValue;
|
|
273
|
+
}
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## 常见问题
|
|
279
|
+
|
|
280
|
+
### 1. 什么时候用 parseObject vs parseArray?
|
|
281
|
+
|
|
282
|
+
```java
|
|
283
|
+
// JSON 对象 → parseObject
|
|
284
|
+
String json = "{\"name\":\"张三\"}";
|
|
285
|
+
User user = JsonUtils.parseObject(json, User.class);
|
|
286
|
+
|
|
287
|
+
// JSON 数组 → parseArray
|
|
288
|
+
String json = "[{\"name\":\"张三\"},{\"name\":\"李四\"}]";
|
|
289
|
+
List<User> users = JsonUtils.parseArray(json, User.class);
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### 2. 泛型类型怎么处理?
|
|
293
|
+
|
|
294
|
+
```java
|
|
295
|
+
// ❌ 错误:泛型擦除,无法正确转换
|
|
296
|
+
Map<String, User> map = JsonUtils.parseObject(json, Map.class);
|
|
297
|
+
|
|
298
|
+
// ✅ 正确:使用 TypeReference
|
|
299
|
+
Map<String, User> map = JsonUtils.parseObject(json,
|
|
300
|
+
new TypeReference<Map<String, User>>(){});
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### 3. null 和空字符串的处理?
|
|
304
|
+
|
|
305
|
+
```java
|
|
306
|
+
// toJsonString
|
|
307
|
+
JsonUtils.toJsonString(null); // 返回 null
|
|
308
|
+
JsonUtils.toJsonString(user); // 返回 JSON 字符串
|
|
309
|
+
|
|
310
|
+
// parseObject
|
|
311
|
+
JsonUtils.parseObject(null, User.class); // 返回 null
|
|
312
|
+
JsonUtils.parseObject("", User.class); // 返回 null
|
|
313
|
+
|
|
314
|
+
// parseArray
|
|
315
|
+
JsonUtils.parseArray(null, User.class); // 返回空 ArrayList
|
|
316
|
+
JsonUtils.parseArray("", User.class); // 返回空 ArrayList
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### 4. 如何在解析前验证 JSON?
|
|
320
|
+
|
|
321
|
+
```java
|
|
322
|
+
public void processData(String data) {
|
|
323
|
+
// 先验证再解析
|
|
324
|
+
if (!JsonUtils.isJsonArray(data)) {
|
|
325
|
+
throw new ServiceException("数据格式不正确");
|
|
326
|
+
}
|
|
327
|
+
List<User> users = JsonUtils.parseArray(data, User.class);
|
|
328
|
+
}
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
## 禁止事项
|
|
334
|
+
|
|
335
|
+
```java
|
|
336
|
+
// ❌ 禁止:频繁创建 ObjectMapper
|
|
337
|
+
ObjectMapper mapper = new ObjectMapper();
|
|
338
|
+
String json = mapper.writeValueAsString(user);
|
|
339
|
+
|
|
340
|
+
// ✅ 正确:使用 JsonUtils
|
|
341
|
+
String json = JsonUtils.toJsonString(user);
|
|
342
|
+
|
|
343
|
+
// ❌ 禁止:不验证直接解析(可能报错)
|
|
344
|
+
List<User> users = JsonUtils.parseArray(data, User.class);
|
|
345
|
+
|
|
346
|
+
// ✅ 正确:先验证再解析
|
|
347
|
+
if (JsonUtils.isJsonArray(data)) {
|
|
348
|
+
List<User> users = JsonUtils.parseArray(data, User.class);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// ❌ 禁止:泛型不使用 TypeReference
|
|
352
|
+
Map map = JsonUtils.parseObject(json, Map.class);
|
|
353
|
+
|
|
354
|
+
// ✅ 正确:使用 TypeReference
|
|
355
|
+
Map<String, User> map = JsonUtils.parseObject(json,
|
|
356
|
+
new TypeReference<Map<String, User>>(){});
|
|
357
|
+
```
|