ai-engineering-init 1.4.3 → 1.6.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 (131) hide show
  1. package/.cursor/skills/bug-detective/SKILL.md +19 -19
  2. package/.cursor/skills/project-navigator/SKILL.md +164 -258
  3. package/README.md +20 -236
  4. package/bin/index.js +437 -7
  5. package/package.json +7 -1
  6. package/scripts/build-skills.js +180 -0
  7. package/src/platform-map.json +56 -0
  8. package/src/skills/add-skill/SKILL.md +488 -0
  9. package/src/skills/add-todo/SKILL.md +269 -0
  10. package/src/skills/api-development/SKILL.md +266 -0
  11. package/src/skills/architecture-design/SKILL.md +262 -0
  12. package/src/skills/backend-annotations/SKILL.md +302 -0
  13. package/src/skills/banana-image/CHANGELOG.md +37 -0
  14. package/src/skills/banana-image/README.md +146 -0
  15. package/src/skills/banana-image/SKILL.md +171 -0
  16. package/src/skills/banana-image/assets/logo.png +0 -0
  17. package/src/skills/banana-image/references/advanced-usage.md +189 -0
  18. package/src/skills/banana-image/scripts/apply_template.py +125 -0
  19. package/src/skills/banana-image/scripts/banana_image_exec.ts +412 -0
  20. package/src/skills/banana-image/scripts/batch_prep.py +82 -0
  21. package/src/skills/banana-image/scripts/package-lock.json +1437 -0
  22. package/src/skills/banana-image/scripts/package.json +18 -0
  23. package/src/skills/banana-image/scripts/requirements.txt +10 -0
  24. package/src/skills/banana-image/templates/poster.json +22 -0
  25. package/src/skills/banana-image/templates/product.json +17 -0
  26. package/src/skills/banana-image/templates/social.json +22 -0
  27. package/src/skills/banana-image/templates/thumbnail.json +17 -0
  28. package/src/skills/brainstorm/SKILL.md +216 -0
  29. package/src/skills/bug-detective/SKILL.md +256 -0
  30. package/src/skills/bug-detective/references/error-patterns.md +242 -0
  31. package/src/skills/check/SKILL.md +367 -0
  32. package/src/skills/code-patterns/SKILL.md +280 -0
  33. package/src/skills/code-patterns/references/leniu-code-patterns.md +87 -0
  34. package/src/skills/codex-code-review/SKILL.md +135 -0
  35. package/src/skills/collaborating-with-codex/SKILL.md +174 -0
  36. package/src/skills/collaborating-with-codex/scripts/codex_bridge.py +275 -0
  37. package/src/skills/collaborating-with-gemini/SKILL.md +194 -0
  38. package/src/skills/collaborating-with-gemini/scripts/gemini_bridge.py +275 -0
  39. package/src/skills/crud/SKILL.md +265 -0
  40. package/src/skills/crud-development/SKILL.md +409 -0
  41. package/src/skills/data-permission/SKILL.md +292 -0
  42. package/src/skills/data-permission/references/custom-data-scope.md +90 -0
  43. package/src/skills/database-ops/SKILL.md +407 -0
  44. package/src/skills/dev/SKILL.md +187 -0
  45. package/src/skills/error-handler/SKILL.md +371 -0
  46. package/src/skills/file-oss-management/SKILL.md +255 -0
  47. package/src/skills/file-oss-management/references/entities.md +105 -0
  48. package/src/skills/file-oss-management/references/service-impl.md +104 -0
  49. package/src/skills/git-workflow/SKILL.md +397 -0
  50. package/src/skills/init-docs/SKILL.md +194 -0
  51. package/src/skills/json-serialization/SKILL.md +357 -0
  52. package/src/skills/leniu-api-development/SKILL.md +319 -0
  53. package/src/skills/leniu-api-development/references/real-examples.md +273 -0
  54. package/src/skills/leniu-architecture-design/SKILL.md +383 -0
  55. package/src/skills/leniu-backend-annotations/SKILL.md +277 -0
  56. package/src/skills/leniu-brainstorm/SKILL.md +242 -0
  57. package/src/skills/leniu-brainstorm/references/business-scenarios.md +162 -0
  58. package/src/skills/leniu-code-patterns/SKILL.md +411 -0
  59. package/src/skills/leniu-crud-development/SKILL.md +404 -0
  60. package/src/skills/leniu-crud-development/references/templates.md +597 -0
  61. package/src/skills/leniu-customization-location/SKILL.md +410 -0
  62. package/src/skills/leniu-data-permission/SKILL.md +341 -0
  63. package/src/skills/leniu-database-ops/SKILL.md +426 -0
  64. package/src/skills/leniu-error-handler/SKILL.md +462 -0
  65. package/src/skills/leniu-java-amount-handling/SKILL.md +461 -0
  66. package/src/skills/leniu-java-code-style/SKILL.md +510 -0
  67. package/src/skills/leniu-java-concurrent/SKILL.md +400 -0
  68. package/src/skills/leniu-java-entity/SKILL.md +237 -0
  69. package/src/skills/leniu-java-entity/references/templates.md +237 -0
  70. package/src/skills/leniu-java-export/SKILL.md +570 -0
  71. package/src/skills/leniu-java-logging/SKILL.md +229 -0
  72. package/src/skills/leniu-java-logging/references/data-mask.md +46 -0
  73. package/src/skills/leniu-java-logging/references/logging-scenarios.md +113 -0
  74. package/src/skills/leniu-java-mq/SKILL.md +338 -0
  75. package/src/skills/leniu-java-mybatis/SKILL.md +267 -0
  76. package/src/skills/leniu-java-mybatis/references/report-mapper.md +88 -0
  77. package/src/skills/leniu-java-report-query-param/SKILL.md +291 -0
  78. package/src/skills/leniu-java-task/SKILL.md +367 -0
  79. package/src/skills/leniu-java-total-line/SKILL.md +196 -0
  80. package/src/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
  81. package/src/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
  82. package/src/skills/leniu-mealtime/SKILL.md +215 -0
  83. package/src/skills/leniu-redis-cache/SKILL.md +331 -0
  84. package/src/skills/leniu-report-customization/SKILL.md +335 -0
  85. package/src/skills/leniu-report-customization/references/table-fields.md +93 -0
  86. package/src/skills/leniu-report-standard-customization/SKILL.md +328 -0
  87. package/src/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
  88. package/src/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
  89. package/src/skills/leniu-security-guard/SKILL.md +306 -0
  90. package/src/skills/leniu-utils-toolkit/SKILL.md +380 -0
  91. package/src/skills/mysql-debug/SKILL.md +364 -0
  92. package/src/skills/next/SKILL.md +137 -0
  93. package/src/skills/openspec-apply-change/SKILL.md +165 -0
  94. package/src/skills/openspec-archive-change/SKILL.md +122 -0
  95. package/src/skills/openspec-bulk-archive-change/SKILL.md +254 -0
  96. package/src/skills/openspec-continue-change/SKILL.md +126 -0
  97. package/src/skills/openspec-explore/SKILL.md +299 -0
  98. package/src/skills/openspec-ff-change/SKILL.md +109 -0
  99. package/src/skills/openspec-new-change/SKILL.md +82 -0
  100. package/src/skills/openspec-onboard/SKILL.md +414 -0
  101. package/src/skills/openspec-sync-specs/SKILL.md +146 -0
  102. package/src/skills/openspec-verify-change/SKILL.md +176 -0
  103. package/src/skills/performance-doctor/SKILL.md +303 -0
  104. package/src/skills/progress/SKILL.md +193 -0
  105. package/src/skills/project-navigator/SKILL.md +211 -0
  106. package/src/skills/redis-cache/SKILL.md +333 -0
  107. package/src/skills/redis-cache/references/listeners.md +23 -0
  108. package/src/skills/scheduled-jobs/SKILL.md +314 -0
  109. package/src/skills/security-guard/SKILL.md +353 -0
  110. package/src/skills/security-guard/references/encrypt-config.md +103 -0
  111. package/src/skills/security-guard/references/sensitive-strategies.md +42 -0
  112. package/src/skills/sms-mail/SKILL.md +308 -0
  113. package/src/skills/sms-mail/references/mail-config.md +88 -0
  114. package/src/skills/sms-mail/references/sms-config.md +74 -0
  115. package/src/skills/social-login/SKILL.md +266 -0
  116. package/src/skills/social-login/references/provider-configs.md +118 -0
  117. package/src/skills/start/SKILL.md +154 -0
  118. package/src/skills/store-pc/SKILL.md +366 -0
  119. package/src/skills/sync/SKILL.md +149 -0
  120. package/src/skills/task-tracker/SKILL.md +307 -0
  121. package/src/skills/tech-decision/SKILL.md +393 -0
  122. package/src/skills/tenant-management/SKILL.md +288 -0
  123. package/src/skills/tenant-management/references/tenant-scenarios.md +91 -0
  124. package/src/skills/test-development/SKILL.md +301 -0
  125. package/src/skills/test-development/references/parameterized-examples.md +119 -0
  126. package/src/skills/ui-pc/SKILL.md +438 -0
  127. package/src/skills/update-status/SKILL.md +159 -0
  128. package/src/skills/utils-toolkit/SKILL.md +362 -0
  129. package/src/skills/utils-toolkit/references/redis-utils-api.md +56 -0
  130. package/src/skills/websocket-sse/SKILL.md +271 -0
  131. package/src/skills/workflow-engine/SKILL.md +321 -0
@@ -0,0 +1,194 @@
1
+ ---
2
+ name: init-docs
3
+ description: |
4
+ 当需要为项目初始化文档体系、创建项目文档时自动使用此 Skill。
5
+
6
+ 触发场景:
7
+ - 新项目第一次初始化文档体系
8
+ - 现有文档丢失或需要重新组织
9
+ - 新成员加入,需要统一文档格式
10
+ - 根据最新代码重新生成文档
11
+
12
+ 触发词:初始化文档、init-docs、文档初始化、创建文档、项目文档、文档体系
13
+ ---
14
+
15
+ # /init-docs - 项目文档初始化
16
+
17
+ 为纯后端 RuoYi-Vue-Plus 项目初始化完整的项目文档体系。支持空白模板或基于现有代码智能生成。
18
+
19
+ ---
20
+
21
+ ## 🎯 适用场景
22
+
23
+ | 场景 | 说明 |
24
+ |------|------|
25
+ | **项目启动** | 新项目第一次初始化文档体系 |
26
+ | **文档重建** | 现有文档丢失或需要重新组织 |
27
+ | **团队协作** | 新成员加入,需要统一文档格式 |
28
+ | **定期整理** | 根据最新代码重新生成文档 |
29
+
30
+ ---
31
+
32
+ ## 📋 执行模式
33
+
34
+ ### 模式 1:空白模板(默认)
35
+
36
+ ```bash
37
+ /init-docs
38
+ ```
39
+
40
+ 创建空白文档结构,适合新项目或想从零开始规划的项目。
41
+
42
+ ### 模式 2:智能扫描
43
+
44
+ ```bash
45
+ /init-docs --scan
46
+ ```
47
+
48
+ 扫描现有代码并智能生成文档,自动分析项目结构和代码完整度。
49
+
50
+ ---
51
+
52
+ ## 🚀 执行流程
53
+
54
+ ### 第一步:确认初始化模式
55
+
56
+ ```
57
+ 请选择初始化方式:
58
+ 1. 空白模板(推荐新项目)
59
+ 2. 扫描现有代码(推荐已有代码)
60
+ ```
61
+
62
+ ### 第二步:创建目录结构
63
+
64
+ ```bash
65
+ mkdir -p docs
66
+ ```
67
+
68
+ **生成的目录结构**:
69
+ ```
70
+ 项目根目录/
71
+ └── docs/
72
+ ├── README.md # 项目简介
73
+ ├── ARCHITECTURE.md # 架构说明
74
+ ├── PROJECT_STATUS.md # 项目进度
75
+ ├── TODO.md # 待办清单
76
+ └── CHANGELOG.md # 变更日志
77
+ ```
78
+
79
+ ### 第三步:扫描代码(仅在 --scan 模式)
80
+
81
+ ```bash
82
+ # 查找所有业务模块
83
+ Glob pattern: "ruoyi-modules/ruoyi-*/src/main/java/**/controller/*Controller.java"
84
+ ```
85
+
86
+ ### 第四步:生成文档内容
87
+
88
+ 根据扫描或手动输入的信息生成文档。
89
+
90
+ ---
91
+
92
+ ## 生成的文档模板
93
+
94
+ ### docs/README.md
95
+
96
+ ```markdown
97
+ # 项目名称
98
+
99
+ ## 📋 项目简介
100
+
101
+ **项目名**:RuoYi-Vue-Plus 纯后端版
102
+ **技术栈**:
103
+ - **后端框架**:Spring Boot 3.x
104
+ - **ORM框架**:MyBatis-Plus 3.x
105
+ - **权限框架**:Sa-Token
106
+ - **数据库**:MySQL 8.0+
107
+
108
+ ## 🚀 快速开始
109
+
110
+ 1. 克隆项目
111
+ 2. 导入数据库
112
+ 3. 修改数据库配置
113
+ 4. 运行后端服务
114
+
115
+ ## 📖 文档导航
116
+
117
+ - [📊 项目进度](./PROJECT_STATUS.md)
118
+ - [🏗️ 架构说明](./ARCHITECTURE.md)
119
+ - [📝 待办清单](./TODO.md)
120
+ - [📝 变更日志](./CHANGELOG.md)
121
+ ```
122
+
123
+ ### docs/PROJECT_STATUS.md
124
+
125
+ ```markdown
126
+ # 📊 项目进度报告
127
+
128
+ **报告生成时间**:YYYY-MM-DD
129
+ **项目状态**:🟢 开发中
130
+
131
+ ## 概览
132
+
133
+ | 指标 | 值 | 说明 |
134
+ |------|-----|------|
135
+ | 总功能数 | X | 规划的功能总数 |
136
+ | 已完成 | X | 100% 完成的功能 |
137
+ | 进行中 | X | 50-99% 的功能 |
138
+ | 待开发 | X | 0% 的功能 |
139
+ ```
140
+
141
+ ### docs/TODO.md
142
+
143
+ ```markdown
144
+ # 📝 待办清单
145
+
146
+ **最后更新**:YYYY-MM-DD
147
+
148
+ ## 🔴 高优先级(本周必做)
149
+
150
+ - [ ] [任务描述]
151
+
152
+ ## 🟡 中优先级(本月完成)
153
+
154
+ - [ ] [任务描述]
155
+
156
+ ## 🟢 低优先级(有时间做)
157
+
158
+ - [ ] [任务描述]
159
+
160
+ ## ✅ 已完成
161
+
162
+ - [x] [任务描述] - 完成于 YYYY-MM-DD
163
+ ```
164
+
165
+ ---
166
+
167
+ ## 第五步:输出初始化报告
168
+
169
+ ```markdown
170
+ # ✅ 项目文档初始化完成!
171
+
172
+ **初始化时间**:YYYY-MM-DD HH:mm
173
+
174
+ ## 📂 已创建的文件
175
+
176
+ | 文件 | 说明 | 位置 |
177
+ |------|------|------|
178
+ | README.md | 项目简介 | docs/README.md |
179
+ | PROJECT_STATUS.md | 项目进度 | docs/PROJECT_STATUS.md |
180
+ | ARCHITECTURE.md | 架构说明 | docs/ARCHITECTURE.md |
181
+ | TODO.md | 待办清单 | docs/TODO.md |
182
+ | CHANGELOG.md | 变更日志 | docs/CHANGELOG.md |
183
+
184
+ ## 🎯 下一步建议
185
+
186
+ ### 1️⃣ 快速了解项目
187
+ \`/start\`
188
+
189
+ ### 2️⃣ 查看详细进度
190
+ \`/progress\`
191
+
192
+ ### 3️⃣ 检查代码规范
193
+ \`/check\`
194
+ ```
@@ -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
+ ```