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,407 +1,210 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: database-ops
|
|
3
3
|
description: |
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
-
|
|
8
|
-
- 设计 Entity 实体类(TenantEntity、@TableLogic、@Version)
|
|
9
|
-
- 配置逻辑删除、乐观锁、审计字段
|
|
10
|
-
- 树结构表设计(祖先路径法/父子法)
|
|
11
|
-
- 字典数据和菜单 SQL 配置
|
|
12
|
-
|
|
13
|
-
触发词:数据库、SQL、建表、CREATE TABLE、Entity、TenantEntity、@TableLogic、del_flag、逻辑删除、字典、菜单SQL、表设计、字段设计、数据库设计
|
|
4
|
+
通用数据库操作指南。涵盖建表规范、审计字段、逻辑删除、索引设计等。
|
|
5
|
+
触发场景:建表、数据库设计、SQL 编写、数据迁移。
|
|
6
|
+
触发词:建表、数据库、SQL、DDL、数据迁移、索引。
|
|
7
|
+
注意:如果项目有专属技能(如 `leniu-database`),优先使用专属版本。
|
|
14
8
|
---
|
|
15
9
|
|
|
16
|
-
#
|
|
17
|
-
|
|
18
|
-
> **⚠️ 重要声明**: 本项目是 **RuoYi-Vue-Plus 纯后端项目**,采用三层架构!
|
|
19
|
-
> 本文档规范基于 **TestDemo 模块**的真实实现。
|
|
10
|
+
# 数据库操作指南
|
|
20
11
|
|
|
21
|
-
|
|
12
|
+
> 通用模板。如果项目有专属技能(如 `leniu-database`),优先使用。
|
|
22
13
|
|
|
23
|
-
|
|
24
|
-
|--------|----------------------|
|
|
25
|
-
| **包名前缀** | `org.dromara.*` |
|
|
26
|
-
| **架构** | 三层:Controller → Service → Mapper |
|
|
27
|
-
| **Entity基类** | `TenantEntity`(多租户) |
|
|
28
|
-
| **主键策略** | 雪花 ID(不用 AUTO_INCREMENT) |
|
|
29
|
-
| **逻辑删除** | `@TableLogic private Long delFlag;`(Long 类型) |
|
|
30
|
-
| **乐观锁** | `@Version private Long version;` |
|
|
31
|
-
| **对象转换** | `MapstructUtils.convert()` |
|
|
32
|
-
| **表前缀** | 按模块区分:sys_/test_/flow_ 等 |
|
|
14
|
+
## 核心规范
|
|
33
15
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
## 1. Entity 实体类模板(带逻辑删除)
|
|
16
|
+
### 建表标准模板
|
|
37
17
|
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
public class Xxx extends TenantEntity {
|
|
56
|
-
|
|
57
|
-
@Serial
|
|
58
|
-
private static final long serialVersionUID = 1L;
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* 主键 ID
|
|
62
|
-
*/
|
|
63
|
-
@TableId(value = "id")
|
|
64
|
-
private Long id;
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* 名称
|
|
68
|
-
*/
|
|
69
|
-
private String xxxName;
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* 状态(0正常 1停用)
|
|
73
|
-
*/
|
|
74
|
-
private String status;
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* 版本号(乐观锁)
|
|
78
|
-
*/
|
|
79
|
-
@Version
|
|
80
|
-
private Long version;
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* 删除标志(0正常 1已删除)
|
|
84
|
-
* ✅ 使用 @TableLogic 标记,MyBatis-Plus 自动处理逻辑删除
|
|
85
|
-
* ✅ 类型必须是 Long(自动映射到数据库 del_flag BIGINT)
|
|
86
|
-
*/
|
|
87
|
-
@TableLogic
|
|
88
|
-
private Long delFlag;
|
|
89
|
-
}
|
|
18
|
+
```sql
|
|
19
|
+
CREATE TABLE t_order (
|
|
20
|
+
id BIGINT NOT NULL COMMENT '主键',
|
|
21
|
+
order_no VARCHAR(64) NOT NULL COMMENT '订单编号',
|
|
22
|
+
status TINYINT NOT NULL DEFAULT 0 COMMENT '状态(0-待处理,1-已完成,2-已取消)',
|
|
23
|
+
amount BIGINT NOT NULL DEFAULT 0 COMMENT '金额(单位:分)',
|
|
24
|
+
remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
|
|
25
|
+
create_by VARCHAR(64) DEFAULT NULL COMMENT '创建人',
|
|
26
|
+
create_time DATETIME DEFAULT NULL COMMENT '创建时间',
|
|
27
|
+
update_by VARCHAR(64) DEFAULT NULL COMMENT '更新人',
|
|
28
|
+
update_time DATETIME DEFAULT NULL COMMENT '更新时间',
|
|
29
|
+
deleted TINYINT NOT NULL DEFAULT 0 COMMENT '删除标识(0-正常,1-删除)',
|
|
30
|
+
PRIMARY KEY (id),
|
|
31
|
+
UNIQUE KEY uk_order_no (order_no),
|
|
32
|
+
KEY idx_status (status),
|
|
33
|
+
KEY idx_create_time (create_time)
|
|
34
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单表';
|
|
90
35
|
```
|
|
91
36
|
|
|
92
|
-
|
|
37
|
+
### 审计字段规范
|
|
93
38
|
|
|
94
|
-
|
|
39
|
+
| 字段 | 类型 | 说明 | 填充时机 |
|
|
40
|
+
|------|------|------|---------|
|
|
41
|
+
| `create_by` | VARCHAR(64) | 创建人 | INSERT |
|
|
42
|
+
| `create_time` | DATETIME | 创建时间 | INSERT |
|
|
43
|
+
| `update_by` | VARCHAR(64) | 更新人 | INSERT / UPDATE |
|
|
44
|
+
| `update_time` | DATETIME | 更新时间 | INSERT / UPDATE |
|
|
45
|
+
| `deleted` | TINYINT | 逻辑删除 | 手动 / 框架自动 |
|
|
95
46
|
|
|
96
|
-
|
|
97
|
-
CREATE TABLE `demo_xxx` (
|
|
98
|
-
-- 主键和租户
|
|
99
|
-
`id` BIGINT(20) NOT NULL COMMENT '主键 ID',
|
|
100
|
-
`tenant_id` VARCHAR(20) DEFAULT '000000' COMMENT '租户 ID',
|
|
101
|
-
|
|
102
|
-
-- 业务字段
|
|
103
|
-
`xxx_name` VARCHAR(100) NOT NULL COMMENT '名称',
|
|
104
|
-
`status` CHAR(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
|
|
105
|
-
|
|
106
|
-
-- 版本和删除
|
|
107
|
-
`version` INT(0) DEFAULT 0 COMMENT '版本号',
|
|
108
|
-
`del_flag` BIGINT(20) DEFAULT 0 COMMENT '删除标志(0正常 1已删除)',
|
|
109
|
-
|
|
110
|
-
-- 审计字段(必须)
|
|
111
|
-
`create_dept` BIGINT(20) DEFAULT NULL COMMENT '创建部门',
|
|
112
|
-
`create_by` BIGINT(20) DEFAULT NULL COMMENT '创建人',
|
|
113
|
-
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
114
|
-
`update_by` BIGINT(20) DEFAULT NULL COMMENT '更新人',
|
|
115
|
-
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|
116
|
-
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注(可选业务字段,不在 BaseEntity 中)',
|
|
117
|
-
|
|
118
|
-
PRIMARY KEY (`id`)
|
|
119
|
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='XXX表';
|
|
120
|
-
```
|
|
47
|
+
> 审计字段自动填充可通过 MyBatis-Plus 的 `MetaObjectHandler` 实现。
|
|
121
48
|
|
|
122
|
-
|
|
49
|
+
### 逻辑删除
|
|
123
50
|
|
|
124
|
-
|
|
51
|
+
- `deleted = 0` 表示正常
|
|
52
|
+
- `deleted = 1` 表示已删除
|
|
53
|
+
- MyBatis-Plus 配置:
|
|
125
54
|
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
xxx_name VARCHAR(100) NOT NULL,
|
|
134
|
-
status CHAR(1) DEFAULT '0',
|
|
135
|
-
|
|
136
|
-
-- 版本和删除
|
|
137
|
-
version INT DEFAULT 0,
|
|
138
|
-
del_flag BIGINT DEFAULT 0,
|
|
139
|
-
|
|
140
|
-
-- 审计字段
|
|
141
|
-
create_dept BIGINT DEFAULT NULL,
|
|
142
|
-
create_by BIGINT DEFAULT NULL,
|
|
143
|
-
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
144
|
-
update_by BIGINT DEFAULT NULL,
|
|
145
|
-
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
146
|
-
remark VARCHAR(500) DEFAULT NULL,
|
|
147
|
-
|
|
148
|
-
PRIMARY KEY (id)
|
|
149
|
-
);
|
|
150
|
-
|
|
151
|
-
COMMENT ON TABLE demo_xxx IS 'XXX表';
|
|
152
|
-
COMMENT ON COLUMN demo_xxx.id IS '主键 ID';
|
|
153
|
-
COMMENT ON COLUMN demo_xxx.tenant_id IS '租户 ID';
|
|
154
|
-
COMMENT ON COLUMN demo_xxx.xxx_name IS '名称';
|
|
155
|
-
COMMENT ON COLUMN demo_xxx.del_flag IS '删除标志(0正常 1已删除)';
|
|
55
|
+
```yaml
|
|
56
|
+
mybatis-plus:
|
|
57
|
+
global-config:
|
|
58
|
+
db-config:
|
|
59
|
+
logic-delete-field: deleted
|
|
60
|
+
logic-delete-value: 1
|
|
61
|
+
logic-not-delete-value: 0
|
|
156
62
|
```
|
|
157
63
|
|
|
158
|
-
|
|
64
|
+
### 命名规范
|
|
159
65
|
|
|
160
|
-
|
|
66
|
+
| 类型 | 规范 | 示例 |
|
|
67
|
+
|------|------|------|
|
|
68
|
+
| 表名 | 小写下划线,建议加前缀 | `t_order`, `sys_user` |
|
|
69
|
+
| 字段名 | 小写下划线 | `order_no`, `create_time` |
|
|
70
|
+
| 主键 | `id` | `id BIGINT NOT NULL` |
|
|
71
|
+
| 外键字段 | `关联表_id` | `user_id`, `order_id` |
|
|
72
|
+
| 唯一索引 | `uk_字段名` | `uk_order_no` |
|
|
73
|
+
| 普通索引 | `idx_字段名` | `idx_status` |
|
|
74
|
+
| 联合索引 | `idx_字段1_字段2` | `idx_user_id_status` |
|
|
161
75
|
|
|
162
|
-
|
|
76
|
+
## 代码示例
|
|
163
77
|
|
|
164
|
-
|
|
165
|
-
// 自动处理:TenantEntity 已包含
|
|
166
|
-
private String tenantId; // 自动填充为当前租户 ID
|
|
78
|
+
### 审计字段自动填充
|
|
167
79
|
|
|
168
|
-
|
|
169
|
-
|
|
80
|
+
```java
|
|
81
|
+
@Component
|
|
82
|
+
public class MyMetaObjectHandler implements MetaObjectHandler {
|
|
83
|
+
|
|
84
|
+
@Override
|
|
85
|
+
public void insertFill(MetaObject metaObject) {
|
|
86
|
+
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
|
|
87
|
+
this.strictInsertFill(metaObject, "createBy", String.class, getCurrentUser());
|
|
88
|
+
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
|
|
89
|
+
this.strictInsertFill(metaObject, "updateBy", String.class, getCurrentUser());
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
@Override
|
|
93
|
+
public void updateFill(MetaObject metaObject) {
|
|
94
|
+
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
|
|
95
|
+
this.strictUpdateFill(metaObject, "updateBy", String.class, getCurrentUser());
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
private String getCurrentUser() {
|
|
99
|
+
// 从安全上下文获取当前用户,按项目实际实现
|
|
100
|
+
return [你的用户上下文工具].getCurrentUsername();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
170
103
|
```
|
|
171
104
|
|
|
172
|
-
|
|
105
|
+
### 常见数据库设计模式
|
|
173
106
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
### 模式二:树结构 - 祖先路径法(推荐)
|
|
107
|
+
#### 模式一:树结构 - 祖先路径法
|
|
177
108
|
|
|
178
109
|
```sql
|
|
179
|
-
CREATE TABLE
|
|
180
|
-
id
|
|
181
|
-
parent_id
|
|
182
|
-
ancestors
|
|
183
|
-
name
|
|
184
|
-
|
|
110
|
+
CREATE TABLE t_org (
|
|
111
|
+
id BIGINT NOT NULL COMMENT '主键',
|
|
112
|
+
parent_id BIGINT DEFAULT NULL COMMENT '父节点ID',
|
|
113
|
+
ancestors VARCHAR(500) DEFAULT NULL COMMENT '祖先路径(逗号分隔)',
|
|
114
|
+
name VARCHAR(100) NOT NULL COMMENT '节点名称',
|
|
115
|
+
sort INT NOT NULL DEFAULT 0 COMMENT '排序',
|
|
116
|
+
create_by VARCHAR(64) DEFAULT NULL COMMENT '创建人',
|
|
117
|
+
create_time DATETIME DEFAULT NULL COMMENT '创建时间',
|
|
118
|
+
update_by VARCHAR(64) DEFAULT NULL COMMENT '更新人',
|
|
119
|
+
update_time DATETIME DEFAULT NULL COMMENT '更新时间',
|
|
120
|
+
deleted TINYINT NOT NULL DEFAULT 0 COMMENT '删除标识(0-正常,1-删除)',
|
|
185
121
|
PRIMARY KEY (id),
|
|
186
|
-
|
|
187
|
-
)
|
|
122
|
+
KEY idx_parent_id (parent_id),
|
|
123
|
+
KEY idx_ancestors (ancestors(255))
|
|
124
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='组织树';
|
|
188
125
|
```
|
|
189
126
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
---
|
|
193
|
-
|
|
194
|
-
### 模式三:树结构 - 简单父子法
|
|
127
|
+
#### 模式二:关联表(多对多)
|
|
195
128
|
|
|
196
129
|
```sql
|
|
197
|
-
CREATE TABLE
|
|
198
|
-
id
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
130
|
+
CREATE TABLE t_user_role (
|
|
131
|
+
id BIGINT NOT NULL COMMENT '主键',
|
|
132
|
+
user_id BIGINT NOT NULL COMMENT '用户ID',
|
|
133
|
+
role_id BIGINT NOT NULL COMMENT '角色ID',
|
|
134
|
+
create_time DATETIME DEFAULT NULL COMMENT '创建时间',
|
|
202
135
|
PRIMARY KEY (id),
|
|
203
|
-
|
|
204
|
-
) COMMENT='
|
|
136
|
+
UNIQUE KEY uk_user_role (user_id, role_id)
|
|
137
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户角色关联';
|
|
205
138
|
```
|
|
206
139
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
---
|
|
210
|
-
|
|
211
|
-
### 模式四:软删除(逻辑删除)
|
|
140
|
+
#### 模式三:状态字段(枚举驱动)
|
|
212
141
|
|
|
213
142
|
```java
|
|
214
|
-
|
|
215
|
-
@
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
// MyBatis-Plus 自动处理
|
|
219
|
-
// INSERT/UPDATE: 业务代码不变
|
|
220
|
-
// SELECT: 自动添加 WHERE del_flag = 0
|
|
221
|
-
// DELETE: 转换为 UPDATE del_flag = 1
|
|
222
|
-
```
|
|
143
|
+
@Getter
|
|
144
|
+
@AllArgsConstructor
|
|
145
|
+
public enum OrderStatusEnum {
|
|
223
146
|
|
|
224
|
-
|
|
147
|
+
PENDING(0, "待处理"),
|
|
148
|
+
COMPLETED(1, "已完成"),
|
|
149
|
+
CANCELLED(2, "已取消");
|
|
225
150
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
### 模式五:审计追踪(自动填充)
|
|
229
|
-
|
|
230
|
-
```sql
|
|
231
|
-
CREATE TABLE demo_audit (
|
|
232
|
-
id BIGINT NOT NULL,
|
|
233
|
-
create_dept BIGINT, -- 创建部门(自动填充)
|
|
234
|
-
create_by BIGINT, -- 创建人(自动填充)
|
|
235
|
-
create_time DATETIME, -- 创建时间(自动填充)
|
|
236
|
-
update_by BIGINT, -- 更新人(自动填充)
|
|
237
|
-
update_time DATETIME, -- 更新时间(自动填充)
|
|
238
|
-
PRIMARY KEY (id)
|
|
239
|
-
) COMMENT='带审计的表';
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
**TenantEntity 已包含所有审计字段**
|
|
243
|
-
|
|
244
|
-
---
|
|
245
|
-
|
|
246
|
-
### 模式六:状态字段(字典驱动)
|
|
247
|
-
|
|
248
|
-
```java
|
|
249
|
-
@ExcelProperty(value = "状态")
|
|
250
|
-
@ExcelDictFormat(dictType = "sys_normal_disable")
|
|
251
|
-
private String status; // 0=正常,1=停用
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
**配合字典表**:不硬编码状态值,支持动态扩展
|
|
255
|
-
|
|
256
|
-
---
|
|
257
|
-
|
|
258
|
-
### 模式七:数据权限控制
|
|
259
|
-
|
|
260
|
-
```java
|
|
261
|
-
// ✅ 在 Mapper 接口上标注(类级别或方法级别均可)
|
|
262
|
-
@DataPermission({
|
|
263
|
-
@DataColumn(key = "deptName", value = "dept_id"),
|
|
264
|
-
@DataColumn(key = "userName", value = "user_id")
|
|
265
|
-
})
|
|
266
|
-
public interface XxxMapper extends BaseMapperPlus<Xxx, XxxVo> {
|
|
151
|
+
private final int code;
|
|
152
|
+
private final String desc;
|
|
267
153
|
}
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
**权限类型**(通过 `sys_role.data_scope` 配置):
|
|
271
|
-
- 1=全部数据权限、2=自定义数据权限、3=本部门数据权限
|
|
272
|
-
- 4=本部门及以下数据权限、5=仅本人数据权限
|
|
273
|
-
|
|
274
|
-
---
|
|
275
|
-
|
|
276
|
-
### 模式八:跨数据库兼容
|
|
277
|
-
|
|
278
|
-
| 场景 | MySQL | PostgreSQL | Oracle | SQL Server |
|
|
279
|
-
|------|-------|-----------|--------|------------|
|
|
280
|
-
| 查询 Long 字段 | `LIKE` | `CAST AS VARCHAR)` | `TO_CHAR()` | `CAST` |
|
|
281
|
-
| 自增ID | MyBatis-Plus 雪花ID | 同 | 同 | 同 |
|
|
282
|
-
| 日期函数 | `CURRENT_TIMESTAMP` | `NOW()` | `SYSDATE` | `GETDATE()` |
|
|
283
|
-
|
|
284
|
-
---
|
|
285
|
-
|
|
286
|
-
## 5. 模块表前缀参考
|
|
287
|
-
|
|
288
|
-
| 模块 | 前缀 | 包路径 | 示例表 |
|
|
289
|
-
|------|------|--------|---------|
|
|
290
|
-
| system | `sys_` | `org.dromara.system` | sys_user, sys_menu |
|
|
291
|
-
| demo | `test_` | `org.dromara.demo` | test_demo, test_tree |
|
|
292
|
-
| workflow | `flow_` | `org.dromara.workflow` | flow_xxx |
|
|
293
|
-
|
|
294
|
-
---
|
|
295
|
-
|
|
296
|
-
## 6. 常见错误对比
|
|
297
|
-
|
|
298
|
-
### ❌ 不要做
|
|
299
|
-
|
|
300
|
-
```sql
|
|
301
|
-
-- 错误1: 使用自增 ID
|
|
302
|
-
id INT AUTO_INCREMENT
|
|
303
|
-
|
|
304
|
-
-- 错误2: 使用 TINYINT 存储删除标志
|
|
305
|
-
del_flag TINYINT(1) -- ❌ 应该用 BIGINT
|
|
306
|
-
|
|
307
|
-
-- 错误3: 软删除字段缺少注释
|
|
308
|
-
del_flag BIGINT -- ❌ 应添加注释说明用途
|
|
309
154
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
-- 错误5: 字段名不规范
|
|
314
|
-
userName VARCHAR(50) -- ❌ 应该是 user_name
|
|
315
|
-
|
|
316
|
-
-- 错误6: COMMENT 使用英文(⚠️ 高频错误,尤其 Codex 协作时)
|
|
317
|
-
`user_name` VARCHAR(50) COMMENT 'user name' -- ❌ 禁止英文!
|
|
318
|
-
`status` CHAR(1) COMMENT 'status(0=normal 1=off)' -- ❌ 禁止英文!
|
|
319
|
-
COMMENT='user table' -- ❌ 表注释也禁止英文!
|
|
155
|
+
// SQL 字段
|
|
156
|
+
// status TINYINT NOT NULL DEFAULT 0 COMMENT '状态(0-待处理,1-已完成,2-已取消)'
|
|
320
157
|
```
|
|
321
158
|
|
|
322
|
-
###
|
|
159
|
+
### 常见查询模式
|
|
323
160
|
|
|
324
161
|
```sql
|
|
325
|
-
--
|
|
326
|
-
id
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
-- 正确5: 字段名使用蛇形命名法
|
|
343
|
-
user_name VARCHAR(50)
|
|
344
|
-
|
|
345
|
-
-- 正确6: COMMENT 必须使用中文
|
|
346
|
-
`user_name` VARCHAR(50) COMMENT '用户名' -- ✅ 中文
|
|
347
|
-
`status` CHAR(1) DEFAULT '0' COMMENT '状态(0正常 1停用)' -- ✅ 中文
|
|
348
|
-
COMMENT='用户表' -- ✅ 表注释中文
|
|
162
|
+
-- 分页查询(配合 MyBatis-Plus Page)
|
|
163
|
+
SELECT id, order_no, status, amount, create_time
|
|
164
|
+
FROM t_order
|
|
165
|
+
WHERE deleted = 0
|
|
166
|
+
AND status = #{status}
|
|
167
|
+
ORDER BY create_time DESC;
|
|
168
|
+
|
|
169
|
+
-- 批量插入
|
|
170
|
+
INSERT INTO t_order (id, order_no, status, amount, create_by, create_time, deleted)
|
|
171
|
+
VALUES
|
|
172
|
+
(#{id1}, #{orderNo1}, 0, #{amount1}, #{createBy}, NOW(), 0),
|
|
173
|
+
(#{id2}, #{orderNo2}, 0, #{amount2}, #{createBy}, NOW(), 0);
|
|
174
|
+
|
|
175
|
+
-- 逻辑删除
|
|
176
|
+
UPDATE t_order SET deleted = 1, update_by = #{updateBy}, update_time = NOW()
|
|
177
|
+
WHERE id = #{id} AND deleted = 0;
|
|
349
178
|
```
|
|
350
179
|
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
## 7. 检查清单
|
|
354
|
-
|
|
355
|
-
生成表前必须检查:
|
|
356
|
-
|
|
357
|
-
- [ ] **主键是否是 BIGINT(20)?**(使用雪花 ID)
|
|
358
|
-
- [ ] **是否有 tenant_id 字段?**(多租户隔离)
|
|
359
|
-
- [ ] **是否有 del_flag BIGINT 字段?**(逻辑删除)
|
|
360
|
-
- [ ] **是否有 version BIGINT 字段?**(乐观锁)
|
|
361
|
-
- [ ] **是否有完整的审计字段?**(create_by, create_time, update_by, update_time)
|
|
362
|
-
- [ ] **字段名是否全部使用蛇形命名法?**(xxx_name 而非 xxxName)
|
|
363
|
-
- [ ] **所有字段是否有注释?**
|
|
364
|
-
- [ ] **所有 COMMENT 是否使用中文?**(禁止英文 COMMENT,包括字段注释和表注释)
|
|
365
|
-
- [ ] **Entity 是否继承 TenantEntity?**
|
|
366
|
-
- [ ] **@TableLogic 注解是否应用到 delFlag?**
|
|
367
|
-
- [ ] **SQL 脚本是否保存到正确目录?**(script/sql/ry_vue_5.X.sql)
|
|
368
|
-
|
|
369
|
-
---
|
|
370
|
-
|
|
371
|
-
## 8. SQL 文件位置
|
|
372
|
-
|
|
373
|
-
| 数据库 | 脚本位置 |
|
|
374
|
-
|--------|---------|
|
|
375
|
-
| MySQL | `script/sql/ry_vue_5.X.sql` |
|
|
376
|
-
| PostgreSQL | `script/sql/postgres/postgres_ry_vue_5.X.sql` |
|
|
377
|
-
| Oracle | `script/sql/oracle/oracle_ry_vue_5.X.sql` |
|
|
378
|
-
| SQL Server | `script/sql/sqlserver/sqlserver_ry_vue_5.X.sql` |
|
|
180
|
+
### 索引设计原则
|
|
379
181
|
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
- **Entity 参考**: `org.dromara.demo.domain.TestDemo`
|
|
387
|
-
- **表结构参考**: `script/sql/ry_vue_5.X.sql` 中的 test_demo 表
|
|
388
|
-
|
|
389
|
-
**特别注意**:
|
|
390
|
-
- ✅ 软删除字段类型是 `Long delFlag`(不是 CHAR(1))
|
|
391
|
-
- ✅ MyBatis-Plus 自动将 Java `delFlag` 映射到数据库 `del_flag`
|
|
392
|
-
- ✅ `@TableLogic` 注解自动处理查询和删除操作
|
|
182
|
+
1. **必须有主键**:推荐 BIGINT 雪花 ID 或自增
|
|
183
|
+
2. **高频查询字段建索引**:WHERE、JOIN、ORDER BY 中的字段
|
|
184
|
+
3. **联合索引遵循最左前缀**:把区分度高的字段放前面
|
|
185
|
+
4. **避免在大文本字段上建索引**:TEXT、BLOB 等
|
|
186
|
+
5. **控制单表索引数量**:建议不超过 5-6 个
|
|
393
187
|
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
## 参考实现
|
|
397
|
-
|
|
398
|
-
查看已有的完整实现:
|
|
188
|
+
### 数据迁移脚本规范
|
|
399
189
|
|
|
400
|
-
|
|
401
|
-
|
|
190
|
+
```sql
|
|
191
|
+
-- V1.0.1__add_order_remark.sql
|
|
192
|
+
-- 描述:订单表新增备注字段
|
|
193
|
+
-- 作者:xxx
|
|
194
|
+
-- 日期:2024-01-01
|
|
402
195
|
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
- ✅ MyBatis-Plus 自动将 Java `delFlag` 映射到数据库 `del_flag`
|
|
406
|
-
- ✅ `@TableLogic` 注解自动处理查询和删除操作
|
|
196
|
+
ALTER TABLE t_order ADD COLUMN remark VARCHAR(500) DEFAULT NULL COMMENT '备注' AFTER amount;
|
|
197
|
+
```
|
|
407
198
|
|
|
199
|
+
## 常见错误
|
|
200
|
+
|
|
201
|
+
| 错误 | 正确做法 |
|
|
202
|
+
|------|---------|
|
|
203
|
+
| 用 VARCHAR 存金额 | 用 BIGINT 存分,或 DECIMAL(10,2) |
|
|
204
|
+
| 字段不加 COMMENT | 所有字段必须有注释 |
|
|
205
|
+
| 表没有主键 | 每张表必须有主键 |
|
|
206
|
+
| 用 UUID 做主键 | 推荐 BIGINT(索引友好) |
|
|
207
|
+
| 逻辑删除值搞反 | 确认项目约定(通用:0=正常, 1=删除) |
|
|
208
|
+
| 大表无索引 | 根据查询模式建立合适索引 |
|
|
209
|
+
| 字段允许 NULL 但业务不允许 | 加 NOT NULL 约束 + DEFAULT 值 |
|
|
210
|
+
| 直接物理删除数据 | 使用逻辑删除,保留数据可追溯 |
|