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,18 @@
1
+ {
2
+ "name": "banana-image-scripts",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "generate": "npx tsx banana_image_exec.ts"
8
+ },
9
+ "dependencies": {
10
+ "@google/genai": "^1.0.0",
11
+ "undici": "^7.16.0"
12
+ },
13
+ "devDependencies": {
14
+ "@types/node": "^22.0.0",
15
+ "tsx": "^4.19.0",
16
+ "typescript": "^5.6.0"
17
+ }
18
+ }
@@ -0,0 +1,10 @@
1
+ # banana-image skill Python dependencies
2
+ # Python 3.9+ required
3
+ # Used for template processing and batch preparation scripts
4
+
5
+ # No external dependencies - uses standard library only
6
+ # - json
7
+ # - csv
8
+ # - argparse
9
+ # - pathlib
10
+ # - re
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "电影海报",
3
+ "description": "电影级海报设计",
4
+ "prompt_template": "Design a cinematic movie poster for '{{title}}' about {{theme}}. Dramatic lighting, central hero composition, atmospheric fog or effects. Hollywood blockbuster aesthetic, detailed, vertical composition. No text, focus on visual art.",
5
+ "defaults": {
6
+ "model_tier": "pro",
7
+ "resolution": "4k",
8
+ "aspect_ratio": "2:3",
9
+ "enable_grounding": true,
10
+ "thinking_level": "high"
11
+ },
12
+ "placeholders": {
13
+ "title": {
14
+ "description": "电影标题",
15
+ "example": "The Last Guardian"
16
+ },
17
+ "theme": {
18
+ "description": "电影主题/故事",
19
+ "example": "a lone warrior protecting an ancient temple"
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "产品图",
3
+ "description": "专业产品摄影风格",
4
+ "prompt_template": "Create a professional, high-end product photography shot of {{product}}. Studio lighting with softbox, rim lighting to highlight edges. Minimalist background, neutral color. Ultra-detailed, commercial advertisement standard, focus on texture and material quality.",
5
+ "defaults": {
6
+ "model_tier": "pro",
7
+ "resolution": "4k",
8
+ "aspect_ratio": "4:5",
9
+ "enable_grounding": true
10
+ },
11
+ "placeholders": {
12
+ "product": {
13
+ "description": "产品名称和描述",
14
+ "example": "a sleek black coffee maker with chrome accents"
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "社交媒体图",
3
+ "description": "Instagram/微博等社交平台方图",
4
+ "prompt_template": "Create a visually appealing social media post image about {{subject}}. Modern, clean aesthetic with good composition. Suitable for Instagram feed. {{style}}",
5
+ "defaults": {
6
+ "model_tier": "flash",
7
+ "resolution": "2k",
8
+ "aspect_ratio": "1:1",
9
+ "enable_grounding": false
10
+ },
11
+ "placeholders": {
12
+ "subject": {
13
+ "description": "图片主题",
14
+ "example": "morning coffee with a cozy atmosphere"
15
+ },
16
+ "style": {
17
+ "description": "风格说明(可选)",
18
+ "example": "Minimalist, warm tones, lifestyle photography style.",
19
+ "optional": true
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "YouTube缩略图",
3
+ "description": "吸引眼球的视频封面",
4
+ "prompt_template": "Design a click-worthy YouTube thumbnail for a video about {{topic}}. High contrast, vibrant colors, expressive focal point. Leave negative space for text overlay. Digital art style, dynamic composition, rule of thirds.",
5
+ "defaults": {
6
+ "model_tier": "flash",
7
+ "resolution": "2k",
8
+ "aspect_ratio": "16:9",
9
+ "enable_grounding": false
10
+ },
11
+ "placeholders": {
12
+ "topic": {
13
+ "description": "视频主题",
14
+ "example": "cooking Italian pasta from scratch"
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,216 @@
1
+ ---
2
+ name: brainstorm
3
+ description: |
4
+ 当需要探索方案、头脑风暴、创意思维时自动使用此 Skill。
5
+
6
+ 触发场景:
7
+ - 不知道怎么设计
8
+ - 需要多种方案对比
9
+ - 架构讨论与功能规划
10
+ - 业务扩展方向探索
11
+ - 模块划分决策
12
+
13
+ 触发词:头脑风暴、方案、怎么设计、有什么办法、创意、讨论、探索、想法、建议、怎么做、如何实现、有哪些方式、能不能做、可以实现吗
14
+ ---
15
+
16
+ # 头脑风暴框架
17
+
18
+ ## 本项目技术约束(方案边界)
19
+
20
+ ### 已集成技术
21
+
22
+ | 层面 | 技术 | 说明 |
23
+ |------|------|------|
24
+ | **框架** | Spring Boot 3.5.9 | 核心框架 |
25
+ | **ORM** | MyBatis-Plus 3.5.16 | 数据持久层 |
26
+ | **缓存** | Redis + Redisson(Caffeine 本地缓存)| 分布式+本地缓存 |
27
+ | **消息** | Redis Streams | 轻量消息队列 |
28
+ | **定时** | SnailJob + @Scheduled | 分布式定时任务 |
29
+ | **认证** | Sa-Token 1.44.0 | 权限与认证 |
30
+ | **实时** | WebSocket + SSE | 实时推送 |
31
+ | **存储** | AWS S3 SDK | MinIO 兼容 |
32
+ | **加密** | AES/RSA | 字段级加密 |
33
+ | **短信** | SMS4j | 多平台短信 |
34
+ | **邮件** | Spring Mail | 邮件发送 |
35
+ | **登录** | JustAuth | OAuth2(30+ 平台) |
36
+ | **Excel** | FastExcel | 导入导出 |
37
+
38
+ ### 需自行扩展的技术
39
+
40
+ | 技术 | 场景 |
41
+ |------|------|
42
+ | **RocketMQ** | 高吞吐消息队列、分布式事务 |
43
+ | **MQTT** | IoT 设备通信(mica-mqtt) |
44
+ | **LangChain4j** | AI 大模型集成 |
45
+ | **支付模块** | 微信/支付宝(IJPay 等) |
46
+
47
+ ### 可复用 Common 模块(24个)
48
+
49
+ ```
50
+ 核心: core, web, security, log, doc, bom
51
+ 数据: mybatis, redis, json, encrypt, sensitive, oss, excel
52
+ 认证: satoken, tenant, social
53
+ 通信: mail, sms, websocket, sse
54
+ 业务: job(SnailJob), idempotent, ratelimiter, translation
55
+ ```
56
+
57
+ ---
58
+
59
+ ## 决策维度(必须考虑)
60
+
61
+ | 维度 | 关键问题 | 实现要点 |
62
+ |------|---------|---------|
63
+ | **三层架构** | 如何分层? | Controller -> Service -> Mapper(无 DAO 层) |
64
+ | **模块归属** | 属于哪个模块? | sys/demo/wf(标准)或 b/m/iot/crm(业务) |
65
+ | **多租户** | 需要隔离? | Entity 继承 TenantEntity,自动 SQL 过滤 |
66
+ | **多端** | 哪些端需要? | 同一套 API,按需扩展前端 |
67
+ | **多数据库** | 要兼容多库? | SQL 脚本同步 MySQL/Oracle/PG/SQLServer |
68
+
69
+ ### 方案评估矩阵
70
+
71
+ ```markdown
72
+ | 方案 | 复用度(25%) | 多端(20%) | 多租户(20%) | 多数据库(15%) | 开发量(20%) | 总分 |
73
+ |------|-------------|-----------|-------------|---------------|-------------|------|
74
+ | 方案A | ? | ? | ? | ? | ? | ? |
75
+ | 方案B | ? | ? | ? | ? | ? | ? |
76
+
77
+ 评分说明:1-10分,分数越高越好
78
+ - 开发量:分数越高=工作量越少
79
+ ```
80
+
81
+ ---
82
+
83
+ ## 方案探索模板
84
+
85
+ ### 问题定义
86
+
87
+ ```markdown
88
+ - **是什么**: [功能描述]
89
+ - **模块归属**: base / mall / crm / iot / 新模块
90
+ - **端支持**: PC端 / 移动端 / 两者
91
+ - **租户**: 需要隔离 / 系统级
92
+ - **数据库**: MySQL only / 多库兼容
93
+ ```
94
+
95
+ ### 可复用资源盘点
96
+
97
+ ```markdown
98
+ | 资源 | 类型 | 复用程度 |
99
+ |------|------|---------|
100
+ | ruoyi-common-xxx | 模块 | 完全/部分/参考 |
101
+ | 现有 Xxx 功能 | 代码 | 参考模式 |
102
+ ```
103
+
104
+ ### 方案对比(至少2个)
105
+
106
+ ```markdown
107
+ ### 方案 A: 最大复用(优先考虑)
108
+ - **复用**: [列出模块/代码]
109
+ - **新开发**: [列出新写部分]
110
+ - **优缺点**: [简述]
111
+
112
+ ### 方案 B: 适度扩展
113
+ - **复用**: [列出模块/代码]
114
+ - **新开发**: [列出新写部分]
115
+ - **优缺点**: [简述]
116
+ ```
117
+
118
+ ### 推荐方案
119
+
120
+ ```markdown
121
+ **推荐**: 方案 [X]
122
+ **理由**: [1-3条]
123
+ **实施步骤**:
124
+ 1. [ ] 数据库设计 -> database-ops
125
+ 2. [ ] 后端开发 -> crud-development
126
+ 3. [ ] 测试验证
127
+ **风险点**: [风险] -> [应对策略]
128
+ ```
129
+
130
+ ---
131
+
132
+ ## 典型场景速查
133
+
134
+ ### 新增业务管理模块
135
+
136
+ ```
137
+ 需求示例:优惠券管理
138
+
139
+ 模块归属 -> mall(商城相关)
140
+ 功能拆解 -> 模板管理 / 发放 / 使用 / 统计
141
+ 可复用 -> Ad模块(CRUD模板) + redis(分布式锁) + SnailJob(过期作废) + 字典(类型/状态)
142
+ 表设计 -> m_coupon_template, m_coupon_record
143
+ ```
144
+
145
+ ### 接入第三方服务
146
+
147
+ ```
148
+ 可复用 -> encrypt(密钥存储) + redis(结果缓存) + Platform(配置存储)
149
+ 实现 -> 接口+实现类(策略模式支持扩展)
150
+ 注意 -> 密钥加密 + @RateLimiter频率限制 + 失败降级
151
+ ```
152
+
153
+ ### 实时通信
154
+
155
+ ```
156
+ WebSocket(双向,已集成) ✅ 首选 | SSE(单向推送,已集成) | 轮询(不推荐)
157
+ 消息类型 -> 广播(全连接) / 点对点(特定用户) / 组播(群组) / 主题订阅
158
+ 可复用 -> websocket模块 + redis(在线状态/多实例同步)
159
+ ```
160
+
161
+ ### 数据统计报表
162
+
163
+ ```
164
+ 方案选择 -> 小数据(<100万):实时查询 | 中数据:预计算+缓存(推荐) | 大数据:分析引擎
165
+ 可复用 -> FastExcel(导出) + SnailJob(预计算) + redis(结果缓存)
166
+ ```
167
+
168
+ ### AI 功能集成
169
+
170
+ ```
171
+ 需自行引入 LangChain4j Maven 依赖
172
+ 可复用 -> SSE(流式响应) + redis(会话上下文)
173
+ 模型推荐 -> DeepSeek(国产便宜) / ChatGPT / Claude
174
+ 需开发 -> ChatSession表 + ChatMessage表 + AiService + 模型配置
175
+ ```
176
+
177
+ ---
178
+
179
+ ## 常见问题快速决策
180
+
181
+ | 问题 | 推荐 | 原因 |
182
+ |------|------|------|
183
+ | 新功能放哪个模块? | 看业务相关性 | base=基础、mall=商城、crm=客户、iot=设备 |
184
+ | WebSocket vs SSE? | WebSocket | 双向通信、已有封装 |
185
+ | RocketMQ vs Redis? | Redis 优先 | Streams 简单场景够用 |
186
+ | 要支持多数据库? | 是 | 项目标准,SQL 脚本同步 4 库 |
187
+ | 要支持多租户? | 业务数据要 | TenantEntity 自动隔离 |
188
+ | 定时任务用什么? | 简单->@Scheduled,复杂->SnailJob | 按复杂度选 |
189
+ | 文件上传? | AWS S3 SDK | 已集成、MinIO 兼容 |
190
+ | 敏感数据? | @EncryptField | ruoyi-common-encrypt |
191
+ | 防重复提交? | @RepeatSubmit | ruoyi-common-idempotent |
192
+ | 接口限流? | @RateLimiter | ruoyi-common-ratelimiter |
193
+ | 分布式锁? | Redisson | 已集成 |
194
+
195
+ ---
196
+
197
+ ## Skill 联动路径
198
+
199
+ ```
200
+ brainstorm(本 Skill)
201
+ |-- 需要建表 -> database-ops
202
+ |-- 需要后端开发 -> crud-development
203
+ |-- 需要定时任务 -> scheduled-jobs
204
+ |-- 需要安全认证 -> security-guard
205
+ |-- 需要数据权限 -> data-permission
206
+ |-- 需要异常处理 -> error-handler
207
+ |-- 需要技术对比 -> tech-decision
208
+ |-- 需要代码规范 -> code-patterns
209
+ ```
210
+
211
+ | 头脑风暴结论 | 下一步 Skill | 触发方式 |
212
+ |-------------|-------------|---------|
213
+ | 需要新建业务模块 | crud-development | "帮我开发 xxx 模块" |
214
+ | 需要数据库设计 | database-ops | "帮我设计 xxx 表" |
215
+ | 需要安全认证 | security-guard | "怎么控制权限访问" |
216
+ | 需要技术对比 | tech-decision | "Redis 还是本地缓存好" |
@@ -0,0 +1,256 @@
1
+ ---
2
+ name: bug-detective
3
+ description: |
4
+ leniu 后端 Bug 排查指南。包含错误诊断决策树、日志分析、分层定位、本项目特有错误模式库。
5
+
6
+ 触发场景:
7
+ - 接口返回 4xx/5xx 错误需要排查
8
+ - NullPointerException、SQLException 等异常定位
9
+ - 数据查不到、对象转换失败、租户隔离问题
10
+ - 日志文件分析(./logs/sys-console.log)
11
+ - 前端页面不显示、API 调用异常
12
+
13
+ 联动技能:数据问题自动联动 mysql-debug 查库验证
14
+
15
+ 触发词:Bug、报错、异常、不工作、500错误、NullPointerException、SQLException、数据查不到、日志分析、排查、调试、debug、错误排查、精度丢失
16
+ ---
17
+
18
+ # Bug 排查指南(leniu 四层架构)
19
+
20
+ > 本项目四层架构:Controller -> Business -> Service -> Mapper,包名 `net.xnzn.core.*`
21
+ > 详细错误案例库见 `references/error-patterns.md`
22
+
23
+ ## 错误关键词索引
24
+
25
+ | 关键词 | 原因 | 解决 |
26
+ |--------|------|------|
27
+ | `NullPointerException` | 对象为空 | selectById 判空,用 Optional |
28
+ | `SQLException` | SQL 语法/字段名 | 检查表名、字段、类型 |
29
+ | `401/403` | Token/权限 | 检查 `@RequiresAuthentication`、角色配置 |
30
+ | `404` | URL 路径错误 | 检查 `@RequestMapping` |
31
+ | `500` | 后端异常 | 读日志 `./logs/sys-console.log` |
32
+ | `data 为 null, msg 有值` | **LeResponse 返回陷阱** | 见下方特有问题 #1 |
33
+ | `精度丢失/ID 不对` | 雪花 ID 大数 | Long -> String 或 `@JsonSerialize(using = ToStringSerializer.class)` |
34
+ | `like 报错` | 非 String 类型 | Long/Date 用 eq/in/between |
35
+ | `查询无结果` | 租户/del_flag/条件 | 检查双库切换、del_flag=2 |
36
+ | `BeanUtil 转换 null` | 源对象为空 | 转换前判空 |
37
+
38
+ ---
39
+
40
+ ## 诊断决策树
41
+
42
+ ```
43
+ 接口返回错误
44
+ +-- 4xx
45
+ | +-- 400 -> 参数格式/类型错误(@RequestBody、LeRequest<T>)
46
+ | +-- 401 -> Token 过期(检查 Admin-Token)
47
+ | +-- 403 -> 无权限(检查 @RequiresAuthentication)
48
+ | +-- 404 -> 路径错误(检查 /api/v2/web|mobile|android/{module})
49
+ |
50
+ +-- 500
51
+ | +-- 有堆栈 -> 按异常类型定位
52
+ | | +-- NullPointerException -> 查询返回 null 未判空
53
+ | | +-- SQLException -> SQL 语法/字段错误
54
+ | | +-- LeException -> 业务逻辑主动抛出
55
+ | +-- 无堆栈 -> 全局异常处理器吞掉了异常
56
+ |
57
+ +-- 200 但数据不对
58
+ +-- data=null, msg有值 -> LeResponse 返回陷阱(见特有问题 #1)
59
+ +-- data=null, msg=null -> 查询条件错误/del_flag/双库切换
60
+ +-- 字段缺失 -> BeanUtil.copyProperties 字段名不匹配
61
+ +-- ID 精度丢失 -> 雪花 ID 大数问题
62
+ ```
63
+
64
+ ---
65
+
66
+ ## 分层定位
67
+
68
+ ```
69
+ 步骤 1:Postman/curl 直接调接口
70
+ +-- 返回正确 -> 问题在前端
71
+ +-- 返回错误 -> 问题在后端
72
+
73
+ 步骤 2(后端):读日志 ./logs/sys-console.log
74
+ +-- 有 ERROR -> 定位异常类和行号
75
+ +-- 无 ERROR -> 打断点逐层排查
76
+
77
+ 步骤 3:按调用链向下
78
+ Controller -> Business -> Service -> Mapper -> 数据库
79
+ ```
80
+
81
+ | 层级 | 常见问题 | 排查重点 |
82
+ |------|---------|---------|
83
+ | Controller | 参数绑定、路径 404 | `@RequestMapping`、`LeRequest<T>`、`@Validated` |
84
+ | Business | 业务编排错误、跨 Service 协调 | 方法调用顺序、数据组装 |
85
+ | Service | 查询条件、事务回滚 | `buildWrapper`、`@Transactional`、判空 |
86
+ | Mapper | SQL 语法、字段映射 | `@TableName`、`@TableField`、XML SQL |
87
+
88
+ ---
89
+
90
+ ## 日志分析
91
+
92
+ ### 日志文件位置
93
+
94
+ | 环境 | 文件 | 说明 |
95
+ |------|------|------|
96
+ | 开发 | `./logs/sys-console.log` | 本次启动完整日志(INFO/WARN/ERROR + SQL) |
97
+ | 生产 | `./logs/sys-info.log` | INFO 日志(60 天) |
98
+ | 生产 | `./logs/sys-error.log` | ERROR 日志(60 天) |
99
+ | 生产 | `./logs/sys-sql.log` | SQL 日志(7 天) |
100
+
101
+ ### AI 自动读取流程
102
+
103
+ **触发条件**(任一):用户报告问题无堆栈、需分析 SQL、需查看流程、用户说"看日志"
104
+
105
+ ```
106
+ 1. Read ./logs/sys-console.log
107
+ 2. 搜索 ERROR/WARN -> 定位异常堆栈
108
+ 3. 搜索 p6spy -> 分析 SQL 执行和耗时
109
+ 4. 结合代码给出诊断和修复方案
110
+ ```
111
+
112
+ ### 日志格式
113
+
114
+ ```
115
+ 2026-01-08 22:12:10 [xxx] [http-nio-8080-exec-1] INFO p6spy - Execute SQL: SELECT ... | Cost: 5 ms
116
+ 2026-01-08 22:12:10 [xxx] [http-nio-8080-exec-1] ERROR net.xnzn.core.xxx - 错误信息
117
+ ```
118
+
119
+ **SQL 耗时阈值**:<50ms 正常 | 50-200ms 关注 | >200ms 需优化
120
+
121
+ ---
122
+
123
+ ## 本项目特有问题库
124
+
125
+ ### 1. LeResponse 返回 String 的陷阱
126
+
127
+ ```java
128
+ // ---- 错误:R.ok(String) 匹配到 ok(String msg) ----
129
+ return R.ok(code); // { code: 200, msg: "ABC123", data: null }
130
+
131
+ // ---- 正确 ----
132
+ return R.ok(null, code); // { code: 200, msg: null, data: "ABC123" }
133
+ return R.ok("成功", code); // { code: 200, msg: "成功", data: "ABC123" }
134
+ ```
135
+
136
+ **原因**:当 T 是 String 时,Java 优先匹配 `ok(String msg)` 而非泛型 `ok(T data)`。
137
+
138
+ ### 2. 双库架构数据查不到
139
+
140
+ ```java
141
+ // leniu 是物理双库(系统库 + 商户库),无 tenant_id 字段
142
+ // 默认操作商户库,切换系统库需要:
143
+ Executors.doInSystem(() -> { /* 系统库操作 */ });
144
+ Executors.doInTenant(tenantId, () -> { /* 指定商户库 */ });
145
+
146
+ // 排查:数据在哪个库?请求头 MERCHANT-ID 是否正确?
147
+ ```
148
+
149
+ ### 3. del_flag 值反直觉
150
+
151
+ ```java
152
+ // leniu: 1=删除, 2=正常(非通用的 0=正常, 1=删除)
153
+ wrapper.eq(XxxEntity::getDelFlag, 2); // 查正常数据
154
+ entity.setDelFlag(1); // 逻辑删除
155
+ ```
156
+
157
+ ### 4. 查询条件不生效
158
+
159
+ ```java
160
+ // ---- 错误:无条件判断 ----
161
+ wrapper.eq(Xxx::getStatus, bo.getStatus()); // null 时报错
162
+ wrapper.like(Xxx::getName, bo.getName()); // 空串时 LIKE '%%'
163
+
164
+ // ---- 正确 ----
165
+ wrapper.eq(ObjectUtil.isNotNull(bo.getStatus()), Xxx::getStatus, bo.getStatus());
166
+ wrapper.like(StrUtil.isNotBlank(bo.getName()), Xxx::getName, bo.getName());
167
+ ```
168
+
169
+ ### 5. like 仅限 String 类型
170
+
171
+ | 字段类型 | 用法 |
172
+ |---------|------|
173
+ | String | `like()` |
174
+ | Long/Integer | `eq()` / `in()` |
175
+ | Date/LocalDateTime | `between()` / `ge()` / `le()` |
176
+
177
+ ### 6. 雪花 ID 精度丢失
178
+
179
+ ```java
180
+ // JS Number 最大安全整数 2^53-1,雪花 ID 超出
181
+ // 方案 1:VO 中 String 类型
182
+ // 方案 2:@JsonSerialize(using = ToStringSerializer.class)
183
+ // 方案 3:全局 JacksonConfig(本项目已配置,检查是否生效)
184
+ ```
185
+
186
+ ### 7. Self 自注入事务失效
187
+
188
+ ```java
189
+ // 同类方法互调,被调用方有 @Transactional 时,必须用 self 调用
190
+ @Autowired @Lazy
191
+ private XxxBusiness self;
192
+
193
+ public void doSave(OrderDTO dto) {
194
+ self.save(dto); // 通过代理调用,事务生效
195
+ // this.save(dto); // 直接调用,事务不生效
196
+ }
197
+ ```
198
+
199
+ ### 8. BeanUtil 转换注意
200
+
201
+ ```java
202
+ // leniu 用 Hutool BeanUtil,不是 MapstructUtils
203
+ XxxVO vo = BeanUtil.copyProperties(entity, XxxVO.class); // 源对象为 null 时返回 null
204
+ // 转换前务必判空
205
+ ```
206
+
207
+ ---
208
+
209
+ ## 数据库排查(委托 mysql-debug)
210
+
211
+ 当诊断结果指向数据问题时,**必须联动 `mysql-debug` 技能**进行数据库查询验证:
212
+
213
+ ```
214
+ 诊断决策树判定"数据相关问题"
215
+
216
+ 自动激活 mysql-debug 技能
217
+
218
+ mysql-debug 执行:配置检查 → 日志提取数据库名 → 执行只读 SQL → 返回结果
219
+
220
+ bug-detective 结合查询结果给出修复方案
221
+ ```
222
+
223
+ **触发 mysql-debug 的信号**:
224
+ - 查询返回空/数据不存在
225
+ - 数据数量、金额、状态不对
226
+ - SQL 异常(DataIntegrityViolation、DuplicateKey)
227
+ - 关联数据不一致
228
+ - 特定租户才出现的问题
229
+
230
+ > 如果 mysql-debug 配置未就绪(密码未设置/mysql CLI 未安装),仍可继续纯代码分析路径。
231
+
232
+ ---
233
+
234
+ ## 常见问题速查
235
+
236
+ | 问题 | 原因 | 解决 |
237
+ |------|------|------|
238
+ | 接口 404 | URL/未启动 | 检查路由前缀 `/api/v2/web/{module}` |
239
+ | 接口 500 | 后端异常 | 读日志 |
240
+ | data 为 null | LeResponse 陷阱 | `R.ok(null, value)` |
241
+ | 转换失败 | BeanUtil 源为 null | 转换前判空 |
242
+ | 数据查不到 | 双库/del_flag | 检查 Executors 切换、del_flag=2 |
243
+ | 事务不回滚 | 异常被吞/非 public/this 调用 | 检查 @Transactional、用 self |
244
+ | Bean 注入失败 | 包名/注解 | 必须 `net.xnzn.core.*` + `@Service` |
245
+
246
+ ---
247
+
248
+ ## Skill 联动
249
+
250
+ | 排查发现 | 推荐 Skill |
251
+ |---------|-----------|
252
+ | 数据问题(查不到/不一致/状态异常) | `mysql-debug`(自动联动) |
253
+ | SQL 性能慢 | `performance-doctor` |
254
+ | 权限配置问题 | `security-guard` |
255
+ | BO/VO 映射错误 | `leniu-crud-development` |
256
+ | 前端组件用法 | `ui-pc` |