ai-engineering-init 1.7.0 → 1.8.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/hooks/skill-forced-eval.js +46 -62
- package/.claude/settings.json +10 -1
- package/.claude/skills/api-development/SKILL.md +179 -130
- package/.claude/skills/architecture-design/SKILL.md +102 -212
- package/.claude/skills/backend-annotations/SKILL.md +166 -220
- package/.claude/skills/bug-detective/SKILL.md +225 -186
- package/.claude/skills/code-patterns/SKILL.md +127 -244
- package/.claude/skills/collaborating-with-codex/SKILL.md +96 -113
- package/.claude/skills/crud-development/SKILL.md +226 -307
- package/.claude/skills/data-permission/SKILL.md +131 -202
- package/.claude/skills/database-ops/SKILL.md +158 -355
- package/.claude/skills/error-handler/SKILL.md +224 -285
- package/.claude/skills/file-oss-management/SKILL.md +174 -169
- package/.claude/skills/git-workflow/SKILL.md +123 -341
- package/.claude/skills/json-serialization/SKILL.md +121 -137
- package/.claude/skills/performance-doctor/SKILL.md +83 -89
- package/.claude/skills/redis-cache/SKILL.md +134 -185
- package/.claude/skills/scheduled-jobs/SKILL.md +187 -224
- package/.claude/skills/security-guard/SKILL.md +168 -276
- package/.claude/skills/sms-mail/SKILL.md +266 -228
- package/.claude/skills/social-login/SKILL.md +257 -195
- package/.claude/skills/tenant-management/SKILL.md +172 -188
- package/.claude/skills/utils-toolkit/SKILL.md +214 -222
- package/.claude/skills/websocket-sse/SKILL.md +251 -172
- package/.claude/skills/workflow-engine/SKILL.md +178 -250
- package/.codex/skills/api-development/SKILL.md +179 -130
- package/.codex/skills/architecture-design/SKILL.md +102 -212
- package/.codex/skills/backend-annotations/SKILL.md +166 -220
- package/.codex/skills/bug-detective/SKILL.md +225 -186
- package/.codex/skills/code-patterns/SKILL.md +127 -244
- package/.codex/skills/collaborating-with-codex/SKILL.md +96 -113
- package/.codex/skills/crud-development/SKILL.md +226 -307
- package/.codex/skills/data-permission/SKILL.md +131 -202
- package/.codex/skills/database-ops/SKILL.md +158 -355
- package/.codex/skills/error-handler/SKILL.md +224 -285
- package/.codex/skills/file-oss-management/SKILL.md +174 -169
- package/.codex/skills/git-workflow/SKILL.md +123 -341
- package/.codex/skills/json-serialization/SKILL.md +121 -137
- package/.codex/skills/performance-doctor/SKILL.md +83 -89
- package/.codex/skills/redis-cache/SKILL.md +134 -185
- package/.codex/skills/scheduled-jobs/SKILL.md +187 -224
- package/.codex/skills/security-guard/SKILL.md +168 -276
- package/.codex/skills/sms-mail/SKILL.md +266 -228
- package/.codex/skills/social-login/SKILL.md +257 -195
- package/.codex/skills/tenant-management/SKILL.md +172 -188
- package/.codex/skills/utils-toolkit/SKILL.md +214 -222
- package/.codex/skills/websocket-sse/SKILL.md +251 -172
- package/.codex/skills/workflow-engine/SKILL.md +178 -250
- package/.cursor/hooks/cursor-skill-eval.js +66 -6
- package/.cursor/skills/api-development/SKILL.md +179 -130
- package/.cursor/skills/architecture-design/SKILL.md +102 -212
- package/.cursor/skills/backend-annotations/SKILL.md +166 -220
- package/.cursor/skills/bug-detective/SKILL.md +225 -186
- package/.cursor/skills/code-patterns/SKILL.md +127 -244
- package/.cursor/skills/collaborating-with-codex/SKILL.md +96 -113
- package/.cursor/skills/crud-development/SKILL.md +226 -307
- package/.cursor/skills/data-permission/SKILL.md +131 -202
- package/.cursor/skills/database-ops/SKILL.md +158 -355
- package/.cursor/skills/error-handler/SKILL.md +224 -285
- package/.cursor/skills/file-oss-management/SKILL.md +174 -169
- package/.cursor/skills/git-workflow/SKILL.md +123 -341
- package/.cursor/skills/json-serialization/SKILL.md +121 -137
- package/.cursor/skills/performance-doctor/SKILL.md +83 -89
- package/.cursor/skills/redis-cache/SKILL.md +134 -185
- package/.cursor/skills/scheduled-jobs/SKILL.md +187 -224
- package/.cursor/skills/security-guard/SKILL.md +168 -276
- package/.cursor/skills/sms-mail/SKILL.md +266 -228
- package/.cursor/skills/social-login/SKILL.md +257 -195
- package/.cursor/skills/tenant-management/SKILL.md +172 -188
- package/.cursor/skills/utils-toolkit/SKILL.md +214 -222
- package/.cursor/skills/websocket-sse/SKILL.md +251 -172
- package/.cursor/skills/workflow-engine/SKILL.md +178 -250
- package/AGENTS.md +49 -540
- package/CLAUDE.md +73 -119
- package/README.md +37 -6
- package/bin/index.js +5 -1
- package/package.json +1 -1
- package/src/skills/api-development/SKILL.md +179 -130
- package/src/skills/architecture-design/SKILL.md +102 -212
- package/src/skills/backend-annotations/SKILL.md +166 -220
- package/src/skills/bug-detective/SKILL.md +225 -186
- package/src/skills/code-patterns/SKILL.md +127 -244
- package/src/skills/collaborating-with-codex/SKILL.md +96 -113
- package/src/skills/crud-development/SKILL.md +226 -307
- package/src/skills/data-permission/SKILL.md +131 -202
- package/src/skills/database-ops/SKILL.md +158 -355
- package/src/skills/error-handler/SKILL.md +224 -285
- package/src/skills/file-oss-management/SKILL.md +174 -169
- package/src/skills/git-workflow/SKILL.md +123 -341
- package/src/skills/json-serialization/SKILL.md +121 -137
- package/src/skills/performance-doctor/SKILL.md +83 -89
- package/src/skills/redis-cache/SKILL.md +134 -185
- package/src/skills/scheduled-jobs/SKILL.md +187 -224
- package/src/skills/security-guard/SKILL.md +168 -276
- package/src/skills/sms-mail/SKILL.md +266 -228
- package/src/skills/social-login/SKILL.md +257 -195
- package/src/skills/tenant-management/SKILL.md +172 -188
- package/src/skills/utils-toolkit/SKILL.md +214 -222
- package/src/skills/websocket-sse/SKILL.md +251 -172
- package/src/skills/workflow-engine/SKILL.md +178 -250
- package/.claude/skills/skill-creator/LICENSE.txt +0 -202
- package/.claude/skills/skill-creator/SKILL.md +0 -479
- package/.claude/skills/skill-creator/agents/analyzer.md +0 -274
- package/.claude/skills/skill-creator/agents/comparator.md +0 -202
- package/.claude/skills/skill-creator/agents/grader.md +0 -223
- package/.claude/skills/skill-creator/assets/eval_review.html +0 -146
- package/.claude/skills/skill-creator/eval-viewer/generate_review.py +0 -471
- package/.claude/skills/skill-creator/eval-viewer/viewer.html +0 -1325
- package/.claude/skills/skill-creator/references/schemas.md +0 -430
- package/.claude/skills/skill-creator/scripts/__init__.py +0 -0
- package/.claude/skills/skill-creator/scripts/aggregate_benchmark.py +0 -401
- package/.claude/skills/skill-creator/scripts/generate_report.py +0 -326
- package/.claude/skills/skill-creator/scripts/improve_description.py +0 -248
- package/.claude/skills/skill-creator/scripts/package_skill.py +0 -136
- package/.claude/skills/skill-creator/scripts/quick_validate.py +0 -103
- package/.claude/skills/skill-creator/scripts/run_eval.py +0 -310
- package/.claude/skills/skill-creator/scripts/run_loop.py +0 -332
- package/.claude/skills/skill-creator/scripts/utils.py +0 -47
|
@@ -1,256 +1,295 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: bug-detective
|
|
3
3
|
description: |
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
-
|
|
8
|
-
- NullPointerException、SQLException 等异常定位
|
|
9
|
-
- 数据查不到、对象转换失败、租户隔离问题
|
|
10
|
-
- 日志文件分析(./logs/sys-console.log)
|
|
11
|
-
- 前端页面不显示、API 调用异常
|
|
12
|
-
|
|
13
|
-
联动技能:数据问题自动联动 mysql-debug 查库验证
|
|
14
|
-
|
|
15
|
-
触发词:Bug、报错、异常、不工作、500错误、NullPointerException、SQLException、数据查不到、日志分析、排查、调试、debug、错误排查、精度丢失
|
|
4
|
+
通用 Bug 排查指南。提供分层定位方法论、日志分析技巧、HTTP 错误码诊断决策树。
|
|
5
|
+
触发场景:Bug 排查、错误分析、日志诊断、线上问题定位。
|
|
6
|
+
触发词:Bug、排查、报错、异常、日志分析、线上问题。
|
|
7
|
+
注意:如果项目有专属技能(如 `leniu-bug-detective`),优先使用专属版本。
|
|
16
8
|
---
|
|
17
9
|
|
|
18
|
-
# Bug
|
|
19
|
-
|
|
20
|
-
> 本项目四层架构:Controller -> Business -> Service -> Mapper,包名 `net.xnzn.core.*`
|
|
21
|
-
> 详细错误案例库见 `references/error-patterns.md`
|
|
22
|
-
|
|
23
|
-
## 错误关键词索引
|
|
10
|
+
# Bug 排查指南
|
|
24
11
|
|
|
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` | 源对象为空 | 转换前判空 |
|
|
12
|
+
> 通用模板。如果项目有专属技能(如 `leniu-bug-detective`),优先使用。
|
|
37
13
|
|
|
38
|
-
|
|
14
|
+
## 核心规范
|
|
39
15
|
|
|
40
|
-
|
|
16
|
+
### 排查方法论:分层定位
|
|
41
17
|
|
|
42
18
|
```
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
19
|
+
[问题现象]
|
|
20
|
+
│
|
|
21
|
+
▼
|
|
22
|
+
[1. 复现] ── 能否稳定复现?记录复现步骤
|
|
23
|
+
│
|
|
24
|
+
▼
|
|
25
|
+
[2. 定位层] ── 问题出在哪一层?
|
|
26
|
+
│
|
|
27
|
+
├── 前端层 ── 浏览器控制台、网络请求、渲染问题
|
|
28
|
+
├── 网关层 ── 路由、限流、认证
|
|
29
|
+
├── 接口层 ── 参数校验、序列化
|
|
30
|
+
├── 业务层 ── 业务逻辑、数据状态
|
|
31
|
+
├── 数据层 ── SQL、数据一致性
|
|
32
|
+
└── 基础设施 ── 网络、配置、资源
|
|
33
|
+
│
|
|
34
|
+
▼
|
|
35
|
+
[3. 缩小范围] ── 二分法排除
|
|
36
|
+
│
|
|
37
|
+
▼
|
|
38
|
+
[4. 根因分析] ── 找到根本原因,而非表象
|
|
39
|
+
│
|
|
40
|
+
▼
|
|
41
|
+
[5. 修复验证] ── 修复 + 回归测试
|
|
62
42
|
```
|
|
63
43
|
|
|
64
|
-
|
|
44
|
+
### 信息收集清单
|
|
45
|
+
|
|
46
|
+
排查前先收集:
|
|
65
47
|
|
|
66
|
-
|
|
48
|
+
- [ ] 错误信息 / 错误码 / 堆栈
|
|
49
|
+
- [ ] 发生时间、频率
|
|
50
|
+
- [ ] 影响范围(所有用户 / 特定用户 / 特定数据)
|
|
51
|
+
- [ ] 最近的代码变更(最近一次部署了什么)
|
|
52
|
+
- [ ] 环境信息(开发 / 测试 / 生产)
|
|
53
|
+
- [ ] 能否复现,复现步骤
|
|
54
|
+
|
|
55
|
+
### 前后端分离定位
|
|
67
56
|
|
|
68
57
|
```
|
|
69
58
|
步骤 1:Postman/curl 直接调接口
|
|
70
|
-
|
|
71
|
-
|
|
59
|
+
├── 返回正确 → 问题在前端(请求参数、渲染、状态管理)
|
|
60
|
+
└── 返回错误 → 问题在后端(继续向下排查)
|
|
72
61
|
|
|
73
|
-
步骤 2
|
|
74
|
-
|
|
75
|
-
|
|
62
|
+
步骤 2(后端):读应用日志
|
|
63
|
+
├── 有 ERROR 堆栈 → 定位异常类和行号
|
|
64
|
+
└── 无 ERROR → 打断点或加诊断日志逐层排查
|
|
76
65
|
|
|
77
66
|
步骤 3:按调用链向下
|
|
78
|
-
Controller
|
|
67
|
+
Controller → Service → Mapper → 数据库
|
|
79
68
|
```
|
|
80
69
|
|
|
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 天) |
|
|
70
|
+
## HTTP 错误码诊断决策树
|
|
100
71
|
|
|
101
|
-
###
|
|
102
|
-
|
|
103
|
-
**触发条件**(任一):用户报告问题无堆栈、需分析 SQL、需查看流程、用户说"看日志"
|
|
72
|
+
### 4xx 客户端错误
|
|
104
73
|
|
|
105
74
|
```
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
75
|
+
400 Bad Request
|
|
76
|
+
├── 请求参数格式错误? → 检查 JSON 格式、字段类型
|
|
77
|
+
├── 参数校验失败? → 检查 @Valid 注解和 DTO 约束
|
|
78
|
+
└── Content-Type 不匹配? → 检查请求头
|
|
79
|
+
|
|
80
|
+
401 Unauthorized
|
|
81
|
+
├── Token 缺失? → 检查请求头是否携带认证信息
|
|
82
|
+
├── Token 过期? → 检查 Token 有效期
|
|
83
|
+
└── Token 无效? → 检查签发逻辑和密钥
|
|
84
|
+
|
|
85
|
+
403 Forbidden
|
|
86
|
+
├── 角色/权限不足? → 检查权限配置
|
|
87
|
+
├── IP 白名单? → 检查网关或防火墙配置
|
|
88
|
+
└── CORS 跨域? → 检查跨域配置
|
|
89
|
+
|
|
90
|
+
404 Not Found
|
|
91
|
+
├── URL 拼写错误? → 对照 API 文档
|
|
92
|
+
├── 路由未注册? → 检查 Controller 注解和包扫描路径
|
|
93
|
+
├── 资源确实不存在? → 检查数据库数据
|
|
94
|
+
└── 网关路由未配置? → 检查网关转发规则
|
|
95
|
+
|
|
96
|
+
405 Method Not Allowed
|
|
97
|
+
└── HTTP 方法不匹配? → GET vs POST,检查 Controller 映射
|
|
98
|
+
|
|
99
|
+
409 Conflict
|
|
100
|
+
└── 数据冲突? → 唯一约束、并发修改、乐观锁失败
|
|
110
101
|
```
|
|
111
102
|
|
|
112
|
-
###
|
|
103
|
+
### 5xx 服务端错误
|
|
113
104
|
|
|
114
105
|
```
|
|
115
|
-
|
|
116
|
-
|
|
106
|
+
500 Internal Server Error
|
|
107
|
+
├── NullPointerException → 检查空值处理
|
|
108
|
+
├── SQL 异常 → 检查 SQL 语法、字段类型
|
|
109
|
+
├── 类型转换异常 → 检查数据格式
|
|
110
|
+
├── 序列化异常 → 检查对象中的循环引用、日期格式
|
|
111
|
+
└── 第三方调用失败 → 检查外部服务状态
|
|
112
|
+
|
|
113
|
+
502 Bad Gateway
|
|
114
|
+
├── 后端服务未启动? → 检查进程状态
|
|
115
|
+
├── 端口未监听? → 检查端口占用
|
|
116
|
+
└── 反向代理配置错误? → 检查 Nginx/网关配置
|
|
117
|
+
|
|
118
|
+
503 Service Unavailable
|
|
119
|
+
├── 服务过载? → 检查 CPU/内存/线程池
|
|
120
|
+
├── 熔断触发? → 检查熔断器状态
|
|
121
|
+
└── 正在部署? → 检查发布状态
|
|
122
|
+
|
|
123
|
+
504 Gateway Timeout
|
|
124
|
+
├── 慢查询? → 检查 SQL 执行计划
|
|
125
|
+
├── 外部调用超时? → 检查第三方服务响应时间
|
|
126
|
+
└── 超时配置过短? → 调整网关/代理超时设置
|
|
117
127
|
```
|
|
118
128
|
|
|
119
|
-
|
|
129
|
+
## 日志分析技巧
|
|
120
130
|
|
|
121
|
-
|
|
131
|
+
### 关键信息提取
|
|
122
132
|
|
|
123
|
-
|
|
133
|
+
```bash
|
|
134
|
+
# 按关键字搜索错误
|
|
135
|
+
grep -n "ERROR\|Exception\|WARN" app.log | tail -50
|
|
124
136
|
|
|
125
|
-
|
|
137
|
+
# 按时间范围过滤
|
|
138
|
+
sed -n '/2024-01-01 10:00/,/2024-01-01 10:30/p' app.log
|
|
126
139
|
|
|
127
|
-
|
|
128
|
-
|
|
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
|
-
```
|
|
140
|
+
# 按请求 ID 追踪(如果有链路追踪)
|
|
141
|
+
grep "traceId=abc123" app.log
|
|
135
142
|
|
|
136
|
-
|
|
143
|
+
# 统计错误类型分布
|
|
144
|
+
grep "Exception" app.log | awk -F: '{print $NF}' | sort | uniq -c | sort -rn
|
|
137
145
|
|
|
138
|
-
|
|
146
|
+
# 查看某个时间点前后的上下文
|
|
147
|
+
grep -n "OutOfMemoryError" app.log # 先找到行号
|
|
148
|
+
sed -n '95,115p' app.log # 查看前后各 10 行
|
|
149
|
+
```
|
|
139
150
|
|
|
140
|
-
|
|
141
|
-
// leniu 是物理双库(系统库 + 商户库),无 tenant_id 字段
|
|
142
|
-
// 默认操作商户库,切换系统库需要:
|
|
143
|
-
Executors.doInSystem(() -> { /* 系统库操作 */ });
|
|
144
|
-
Executors.doInTenant(tenantId, () -> { /* 指定商户库 */ });
|
|
151
|
+
### 日志级别含义
|
|
145
152
|
|
|
146
|
-
|
|
147
|
-
|
|
153
|
+
| 级别 | 用途 | 排查价值 |
|
|
154
|
+
|------|------|---------|
|
|
155
|
+
| ERROR | 系统错误,需要立即关注 | 最高,直接定位问题 |
|
|
156
|
+
| WARN | 潜在问题,可能导致错误 | 高,可能是问题前兆 |
|
|
157
|
+
| INFO | 业务关键节点 | 中,了解业务流程 |
|
|
158
|
+
| DEBUG | 详细调试信息 | 开发环境排查用 |
|
|
159
|
+
| TRACE | 最详细的跟踪信息 | 极少使用 |
|
|
148
160
|
|
|
149
|
-
###
|
|
161
|
+
### 常见日志模式识别
|
|
150
162
|
|
|
151
|
-
```java
|
|
152
|
-
// leniu: 1=删除, 2=正常(非通用的 0=正常, 1=删除)
|
|
153
|
-
wrapper.eq(XxxEntity::getDelFlag, 2); // 查正常数据
|
|
154
|
-
entity.setDelFlag(1); // 逻辑删除
|
|
155
163
|
```
|
|
164
|
+
# 连接池耗尽
|
|
165
|
+
"Cannot get a connection, pool error Timeout waiting for idle object"
|
|
166
|
+
→ 检查连接池配置、是否有连接泄漏
|
|
156
167
|
|
|
157
|
-
|
|
168
|
+
# 内存溢出
|
|
169
|
+
"java.lang.OutOfMemoryError: Java heap space"
|
|
170
|
+
→ 检查堆内存配置、是否有内存泄漏
|
|
158
171
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
wrapper.like(Xxx::getName, bo.getName()); // 空串时 LIKE '%%'
|
|
172
|
+
# 死锁
|
|
173
|
+
"Deadlock found when trying to get lock"
|
|
174
|
+
→ 检查事务范围、锁顺序
|
|
163
175
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
176
|
+
# 慢 SQL
|
|
177
|
+
"SlowQuery: execution time exceeds"
|
|
178
|
+
→ 分析 SQL 执行计划,添加索引
|
|
167
179
|
```
|
|
168
180
|
|
|
169
|
-
|
|
181
|
+
## 代码示例
|
|
170
182
|
|
|
171
|
-
|
|
172
|
-
|---------|------|
|
|
173
|
-
| String | `like()` |
|
|
174
|
-
| Long/Integer | `eq()` / `in()` |
|
|
175
|
-
| Date/LocalDateTime | `between()` / `ge()` / `le()` |
|
|
176
|
-
|
|
177
|
-
### 6. 雪花 ID 精度丢失
|
|
183
|
+
### 排查辅助:添加诊断日志
|
|
178
184
|
|
|
179
185
|
```java
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
186
|
+
@Slf4j
|
|
187
|
+
@Service
|
|
188
|
+
public class OrderServiceImpl {
|
|
189
|
+
|
|
190
|
+
public OrderVO getOrderDetail(Long id) {
|
|
191
|
+
log.info("查询订单详情, id={}", id);
|
|
192
|
+
|
|
193
|
+
Order order = orderMapper.selectById(id);
|
|
194
|
+
if (order == null) {
|
|
195
|
+
log.warn("订单不存在, id={}", id);
|
|
196
|
+
throw new [你的业务异常类]("订单不存在");
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
log.debug("订单数据: status={}, amount={}", order.getStatus(), order.getAmount());
|
|
200
|
+
// ... 业务逻辑
|
|
201
|
+
return orderVO;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
184
204
|
```
|
|
185
205
|
|
|
186
|
-
###
|
|
206
|
+
### 排查辅助:请求链路追踪
|
|
187
207
|
|
|
188
208
|
```java
|
|
189
|
-
//
|
|
190
|
-
@
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
209
|
+
// 使用 MDC 添加请求上下文
|
|
210
|
+
@Component
|
|
211
|
+
public class TraceInterceptor implements HandlerInterceptor {
|
|
212
|
+
|
|
213
|
+
@Override
|
|
214
|
+
public boolean preHandle(HttpServletRequest request,
|
|
215
|
+
HttpServletResponse response,
|
|
216
|
+
Object handler) {
|
|
217
|
+
String traceId = request.getHeader("X-Trace-Id");
|
|
218
|
+
if (traceId == null) {
|
|
219
|
+
traceId = UUID.randomUUID().toString().replace("-", "");
|
|
220
|
+
}
|
|
221
|
+
MDC.put("traceId", traceId);
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
@Override
|
|
226
|
+
public void afterCompletion(HttpServletRequest request,
|
|
227
|
+
HttpServletResponse response,
|
|
228
|
+
Object handler, Exception ex) {
|
|
229
|
+
MDC.clear();
|
|
230
|
+
}
|
|
196
231
|
}
|
|
197
232
|
```
|
|
198
233
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
// leniu 用 Hutool BeanUtil,不是 MapstructUtils
|
|
203
|
-
XxxVO vo = BeanUtil.copyProperties(entity, XxxVO.class); // 源对象为 null 时返回 null
|
|
204
|
-
// 转换前务必判空
|
|
234
|
+
```xml
|
|
235
|
+
<!-- logback 配置中包含 traceId -->
|
|
236
|
+
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId}] %-5level %logger{36} - %msg%n</pattern>
|
|
205
237
|
```
|
|
206
238
|
|
|
207
|
-
|
|
239
|
+
### 常见 Bug 排查模板
|
|
208
240
|
|
|
209
|
-
|
|
241
|
+
```markdown
|
|
242
|
+
## Bug 报告
|
|
210
243
|
|
|
211
|
-
|
|
244
|
+
**现象**:[描述用户看到的问题]
|
|
212
245
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
```
|
|
246
|
+
**复现步骤**:
|
|
247
|
+
1. ...
|
|
248
|
+
2. ...
|
|
249
|
+
3. ...
|
|
250
|
+
|
|
251
|
+
**预期行为**:[应该发生什么]
|
|
252
|
+
|
|
253
|
+
**实际行为**:[实际发生了什么]
|
|
222
254
|
|
|
223
|
-
|
|
224
|
-
- 查询返回空/数据不存在
|
|
225
|
-
- 数据数量、金额、状态不对
|
|
226
|
-
- SQL 异常(DataIntegrityViolation、DuplicateKey)
|
|
227
|
-
- 关联数据不一致
|
|
228
|
-
- 特定租户才出现的问题
|
|
255
|
+
**环境**:[开发/测试/生产]
|
|
229
256
|
|
|
230
|
-
|
|
257
|
+
**日志/截图**:[关键日志片段]
|
|
231
258
|
|
|
232
259
|
---
|
|
233
260
|
|
|
234
|
-
##
|
|
261
|
+
## 排查过程
|
|
235
262
|
|
|
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` |
|
|
263
|
+
**定位层**:[前端/网关/接口/业务/数据/基础设施]
|
|
245
264
|
|
|
246
|
-
|
|
265
|
+
**根因**:[根本原因分析]
|
|
266
|
+
|
|
267
|
+
**修复方案**:[如何修复]
|
|
247
268
|
|
|
248
|
-
|
|
269
|
+
**回归验证**:[如何确认修复有效]
|
|
270
|
+
```
|
|
249
271
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
|
253
|
-
|
|
254
|
-
|
|
|
255
|
-
|
|
|
256
|
-
|
|
|
272
|
+
### 常见问题速查
|
|
273
|
+
|
|
274
|
+
| 问题 | 可能原因 | 排查方向 |
|
|
275
|
+
|------|---------|---------|
|
|
276
|
+
| 接口 404 | URL 错误/服务未启动 | 检查路由映射、服务状态 |
|
|
277
|
+
| 接口 500 | 后端异常 | 读应用日志 ERROR 堆栈 |
|
|
278
|
+
| 数据查不到 | 条件错误/逻辑删除/权限 | 检查 SQL、deleted 字段、数据权限 |
|
|
279
|
+
| 事务不回滚 | 异常被吞/非 public/this 调用 | 检查 @Transactional、代理调用 |
|
|
280
|
+
| Bean 注入失败 | 包扫描/注解缺失 | 检查包路径、@Service/@Component |
|
|
281
|
+
| 对象转换字段丢失 | 字段名不匹配 | 检查源和目标对象字段名 |
|
|
282
|
+
| 雪花 ID 精度丢失 | JS Number 精度限制 | Long 序列化为 String |
|
|
283
|
+
|
|
284
|
+
## 常见错误
|
|
285
|
+
|
|
286
|
+
| 错误 | 正确做法 |
|
|
287
|
+
|------|---------|
|
|
288
|
+
| 看到错误就改代码 | 先理解根因再修复 |
|
|
289
|
+
| 只看最后一行异常信息 | 从 `Caused by` 往上找根因 |
|
|
290
|
+
| 生产环境开 DEBUG 日志 | 临时开启,问题解决后立即关闭 |
|
|
291
|
+
| 修复后不验证 | 修复后必须复现场景验证 |
|
|
292
|
+
| 只修表象不修根因 | 加 null 判断不如搞清楚为什么是 null |
|
|
293
|
+
| 修复时引入新 Bug | 修复范围最小化,充分回归 |
|
|
294
|
+
| 依赖"重启解决" | 重启只是临时手段,必须找到根因 |
|
|
295
|
+
| 忽略 WARN 日志 | WARN 往往是问题的前兆 |
|