@llryiop/avatar-boot-cli 1.0.0 → 1.0.2
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/docs/exam-question-generate-api.md +163 -0
- package/package.json +1 -1
- package/src/prompts.js +3 -3
- package/src/transform.js +1 -1
- package/templates/.claude/skills/avatar-boot-starter-feign/README.md +243 -0
- package/templates/.claude/skills/avatar-boot-starter-feign/SKILL.md +47 -219
- package/templates/.claude/skills/avatar-boot-starter-feign/references//345/212/237/350/203/275/350/257/246/350/247/243.md +65 -0
- package/templates/.claude/skills/avatar-boot-starter-feign/references//345/277/253/351/200/237/346/216/245/345/205/245/346/214/207/345/215/227.md +75 -0
- package/templates/.claude/skills/avatar-boot-starter-feign/references//351/205/215/347/275/256/345/217/202/350/200/203.md +70 -0
- package/templates/.claude/skills/avatar-boot-starter-job/README.md +437 -0
- package/templates/.claude/skills/avatar-boot-starter-job/SKILL.md +35 -414
- package/templates/.claude/skills/avatar-boot-starter-job/references//345/270/270/350/247/201/351/227/256/351/242/230.md +55 -0
- package/templates/.claude/skills/avatar-boot-starter-job/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/351/205/215/347/275/256.md +124 -0
- package/templates/.claude/skills/avatar-boot-starter-job/references//347/233/221/346/216/247/346/214/207/346/240/207.md +72 -0
- package/templates/.claude/skills/avatar-boot-starter-kafka/README.md +580 -0
- package/templates/.claude/skills/avatar-boot-starter-kafka/SKILL.md +36 -560
- package/templates/.claude/skills/avatar-boot-starter-kafka/references//346/234/200/344/275/263/345/256/236/350/267/265.md +43 -0
- package/templates/.claude/skills/avatar-boot-starter-kafka/references//346/240/270/345/277/203/345/212/237/350/203/275.md +117 -0
- package/templates/.claude/skills/avatar-boot-starter-kafka/references//351/205/215/347/275/256/345/217/202/350/200/203.md +54 -0
- package/templates/.claude/skills/avatar-boot-starter-mysql/README.md +572 -0
- package/templates/.claude/skills/avatar-boot-starter-mysql/SKILL.md +40 -550
- package/templates/.claude/skills/avatar-boot-starter-mysql/references//345/256/236/344/275/223/344/270/216/345/212/237/350/203/275.md +96 -0
- package/templates/.claude/skills/avatar-boot-starter-mysql/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/346/225/260/346/215/256/346/272/220.md +91 -0
- package/templates/.claude/skills/avatar-boot-starter-mysql/references//351/253/230/347/272/247/347/211/271/346/200/247/344/270/216/351/205/215/347/275/256.md +59 -0
- package/templates/.claude/skills/avatar-boot-starter-nacos/README.md +901 -0
- package/templates/.claude/skills/avatar-boot-starter-nacos/SKILL.md +40 -879
- package/templates/.claude/skills/avatar-boot-starter-nacos/references//345/212/237/350/203/275/344/275/277/347/224/250.md +134 -0
- package/templates/.claude/skills/avatar-boot-starter-nacos/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/351/205/215/347/275/256.md +96 -0
- package/templates/.claude/skills/avatar-boot-starter-nacos/references//346/225/205/351/232/234/346/216/222/346/237/245.md +64 -0
- package/templates/.claude/skills/avatar-boot-starter-oss/README.md +594 -0
- package/templates/.claude/skills/avatar-boot-starter-oss/SKILL.md +52 -570
- package/templates/.claude/skills/avatar-boot-starter-oss/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/351/205/215/347/275/256.md +77 -0
- package/templates/.claude/skills/avatar-boot-starter-oss/references//346/240/270/345/277/203/345/212/237/350/203/275.md +94 -0
- package/templates/.claude/skills/avatar-boot-starter-oss/references//350/247/204/350/214/203/344/270/216/346/263/250/346/204/217/344/272/213/351/241/271.md +61 -0
- package/templates/.claude/skills/avatar-boot-starter-redis/README.md +586 -0
- package/templates/.claude/skills/avatar-boot-starter-redis/SKILL.md +42 -566
- package/templates/.claude/skills/avatar-boot-starter-redis/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/351/205/215/347/275/256.md +78 -0
- package/templates/.claude/skills/avatar-boot-starter-redis/references//346/225/260/346/215/256/346/223/215/344/275/234.md +111 -0
- package/templates/.claude/skills/avatar-boot-starter-redis/references//351/253/230/347/272/247/345/212/237/350/203/275.md +90 -0
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/README.md +662 -0
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/SKILL.md +48 -640
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/references//346/240/270/345/277/203/345/212/237/350/203/275.md +101 -0
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/references//351/205/215/347/275/256/344/270/216/346/263/250/346/204/217/344/272/213/351/241/271.md +44 -0
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/references//351/253/230/347/272/247/347/211/271/346/200/247.md +71 -0
- package/templates/.claude/skills/avatar-boot-starter-web/README.md +1007 -0
- package/templates/.claude/skills/avatar-boot-starter-web/SKILL.md +150 -1003
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-LogInfo/346/263/250/350/247/243.md +75 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-/345/205/250/345/261/200/345/274/202/345/270/270/345/244/204/347/220/206.md +90 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-/346/214/207/346/240/207/347/233/221/346/216/247.md +74 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-/346/227/245/345/277/227/344/275/223/347/263/273.md +73 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-/350/257/267/346/261/202/344/270/212/344/270/213/346/226/207.md +77 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/277/253/351/200/237/346/216/245/345/205/245/346/214/207/345/215/227.md +52 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//346/263/250/346/204/217/344/272/213/351/241/271.md +68 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//350/207/252/345/256/232/344/271/211/346/211/251/345/261/225/346/214/207/345/215/227.md +107 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//351/205/215/347/275/256/345/217/202/350/200/203.md +107 -0
- package/templates/.claude/skills/crud-generator/SKILL.md +133 -64
- package/templates/.claude/skills/database-design/README.md +207 -0
- package/templates/.claude/skills/database-design/SKILL.md +469 -82
- package/templates/.claude/skills/database-design/references//345/221/275/345/220/215/350/247/204/350/214/203.md +232 -0
- package/templates/.claude/skills/database-design/references//345/255/227/346/256/265/347/261/273/345/236/213/350/247/204/350/214/203.md +400 -0
- package/templates/.claude/skills/database-design/references//347/264/242/345/274/225/350/247/204/350/214/203.md +506 -0
- package/templates/README.md +65 -100
- package/templates/avatar-scaffold-api/pom.xml +0 -5
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/api/LoginFeignClient.java +2 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/exception/LoginErrorCode.java +25 -0
- package/templates/avatar-scaffold-service/pom.xml +25 -87
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/feign/DemoFeign.java +4 -1
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/UserLoginRepository.java +10 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/mapper/UserLoginMapper.java +4 -1
- package/templates/avatar-scaffold-service/src/main/resources/application-dev.yaml +3 -5
- package/templates/avatar-scaffold-service/src/main/resources/application-local.yaml +21 -21
- package/templates/pom.xml +9 -18
|
@@ -5,59 +5,205 @@ description: |
|
|
|
5
5
|
触发词: database design, table design, DDL, schema, ER, 数据库设计, 表设计, 建表
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
#
|
|
8
|
+
# MySQL 建表语句生成器
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
你是 Avatar Boot MySQL 建表规范的专家助手,帮助开发者快速生成符合规范的标准建表语句。
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
## 交互流程(必须遵守)
|
|
13
|
+
|
|
14
|
+
**每次被触发时,先通过 AskUserQuestion 工具询问用户需求:**
|
|
15
|
+
|
|
16
|
+
问题:"您好!我是 MySQL 建表助手,请问您需要什么帮助?"
|
|
17
|
+
选项:
|
|
18
|
+
1. **创建新表** - 生成符合规范的完整建表语句
|
|
19
|
+
2. **查看规范** - 了解命名规范、字段规范、索引规范
|
|
20
|
+
3. **验证表结构** - 检查现有建表语句是否符合规范
|
|
21
|
+
4. **生成关联表** - 创建中间表/关联表
|
|
22
|
+
|
|
23
|
+
**根据用户选择,按下方流程执行。**
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 行为准则
|
|
28
|
+
|
|
29
|
+
1. **严格遵守规范**:所有生成的建表语句必须符合 `docs/database/mysql-specification.md` 规范
|
|
30
|
+
2. **主动询问信息**:生成表前必须收集必要信息(部门、业务域、实体名、字段等)
|
|
31
|
+
3. **使用中文回答**
|
|
32
|
+
4. **提供完整示例**:包含注释、索引、表注释等完整信息
|
|
13
33
|
|
|
14
34
|
---
|
|
15
35
|
|
|
16
|
-
##
|
|
36
|
+
## 创建新表流程
|
|
37
|
+
|
|
38
|
+
### 第一步:收集基础信息
|
|
39
|
+
|
|
40
|
+
使用 AskUserQuestion 收集以下信息:
|
|
41
|
+
|
|
42
|
+
**问题 1**:"请选择所属部门"
|
|
43
|
+
选项:
|
|
44
|
+
- 讯飞智作 (zz)
|
|
45
|
+
- 交互平台 (jh)
|
|
46
|
+
- 资产平台 (zc)
|
|
47
|
+
- 大模型 (dm)
|
|
48
|
+
- 其他(请输入部门缩写)
|
|
49
|
+
|
|
50
|
+
**问题 2**:"请输入业务域缩写(如:plt-平台、usr-用户、cms-内容)"
|
|
51
|
+
(文本输入)
|
|
52
|
+
|
|
53
|
+
**问题 3**:"请输入实体名称(如:role-角色、user-用户、article-文章)"
|
|
54
|
+
(文本输入)
|
|
55
|
+
|
|
56
|
+
**问题 4**:"请描述需要哪些业务字段(除基础字段外)"
|
|
57
|
+
(文本输入,示例:角色编码、角色名称、描述、是否启用、排序权重)
|
|
58
|
+
|
|
59
|
+
### 第二步:生成字段列表并与用户确认
|
|
60
|
+
|
|
61
|
+
根据收集的信息,生成字段列表并展示给用户:
|
|
62
|
+
|
|
63
|
+
#### 1. 展示字段列表
|
|
64
|
+
|
|
65
|
+
以表格形式展示所有字段(包括基础字段和业务字段):
|
|
66
|
+
|
|
67
|
+
```markdown
|
|
68
|
+
## 字段列表预览
|
|
69
|
+
|
|
70
|
+
### 基础字段(必须)
|
|
71
|
+
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|
|
72
|
+
|--------|------|---------|--------|------|
|
|
73
|
+
| id | BIGINT UNSIGNED | 是 | AUTO_INCREMENT | 主键ID |
|
|
74
|
+
| create_time | DATETIME | 是 | CURRENT_TIMESTAMP | 创建时间 |
|
|
75
|
+
| update_time | DATETIME | 是 | CURRENT_TIMESTAMP ON UPDATE | 更新时间 |
|
|
76
|
+
| is_deleted | TINYINT(1) | 是 | 0 | 逻辑删除:0-未删除,1-已删除 |
|
|
77
|
+
|
|
78
|
+
### 审计字段(可选)
|
|
79
|
+
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|
|
80
|
+
|--------|------|---------|--------|------|
|
|
81
|
+
| created_by | BIGINT UNSIGNED | 是 | 0 | 创建人ID |
|
|
82
|
+
| updated_by | BIGINT UNSIGNED | 是 | 0 | 更新人ID |
|
|
17
83
|
|
|
18
|
-
|
|
84
|
+
### 业务字段
|
|
85
|
+
| 字段名 | 类型 | 是否必填 | 默认值 | 说明 |
|
|
86
|
+
|--------|------|---------|--------|------|
|
|
87
|
+
| role_code | VARCHAR(64) | 是 | - | 角色编码 |
|
|
88
|
+
| role_name | VARCHAR(128) | 是 | - | 角色名称 |
|
|
89
|
+
| description | VARCHAR(512) | 否 | NULL | 角色描述 |
|
|
90
|
+
| is_enabled | TINYINT(1) | 是 | 1 | 是否启用:0-禁用,1-启用 |
|
|
91
|
+
| sort_order | INT | 是 | 0 | 排序权重 |
|
|
19
92
|
|
|
93
|
+
### 索引设计
|
|
94
|
+
| 索引类型 | 索引名 | 字段 | 说明 |
|
|
95
|
+
|---------|--------|------|------|
|
|
96
|
+
| 主键 | PRIMARY KEY | id | 自动创建 |
|
|
97
|
+
| 唯一索引 | uk_zz_plt_role_code | role_code | 角色编码唯一 |
|
|
98
|
+
| 普通索引 | idx_zz_plt_role_name | role_name | 角色名称查询 |
|
|
20
99
|
```
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
100
|
+
|
|
101
|
+
#### 2. 询问用户确认
|
|
102
|
+
|
|
103
|
+
使用 AskUserQuestion 询问用户是否需要修改:
|
|
104
|
+
|
|
105
|
+
**问题**:"请确认字段列表是否正确,是否需要修改?"
|
|
106
|
+
选项:
|
|
107
|
+
- **确认无误,生成 SQL** - 直接生成建表语句
|
|
108
|
+
- **需要修改字段** - 说明需要修改的内容(添加、删除、修改字段)
|
|
109
|
+
- **需要调整索引** - 说明需要调整的索引
|
|
110
|
+
- **需要添加特殊字段** - 如租户ID、树形结构、状态机等
|
|
111
|
+
|
|
112
|
+
#### 3. 根据用户反馈调整
|
|
113
|
+
|
|
114
|
+
如果用户选择修改,根据用户的反馈调整字段列表,然后重新展示并再次确认。
|
|
115
|
+
|
|
116
|
+
### 第三步:生成完整 SQL
|
|
117
|
+
|
|
118
|
+
确认字段列表后,生成包含以下内容的完整建表语句:
|
|
119
|
+
1. 表注释(说明归属部门和业务域)
|
|
120
|
+
2. 所有字段定义(含 COMMENT)
|
|
121
|
+
3. 主键定义
|
|
122
|
+
4. 必要的索引(唯一索引、常用查询字段索引)
|
|
123
|
+
5. 引擎和字符集声明
|
|
124
|
+
|
|
125
|
+
### 第四步:询问是否保存为 SQL 文件
|
|
126
|
+
|
|
127
|
+
生成建表语句后,使用 AskUserQuestion 询问用户:
|
|
128
|
+
|
|
129
|
+
**问题**:"建表语句已生成,是否需要保存为 SQL 文件?"
|
|
130
|
+
选项:
|
|
131
|
+
- **保存为 SQL 文件** - 保存到指定位置
|
|
132
|
+
- **仅查看,不保存** - 只在对话中显示
|
|
133
|
+
|
|
134
|
+
### 第五步:保存 SQL 文件(如果用户选择保存)
|
|
135
|
+
|
|
136
|
+
如果用户选择保存,再次询问保存位置:
|
|
137
|
+
|
|
138
|
+
**问题**:"请选择保存位置"
|
|
139
|
+
选项:
|
|
140
|
+
- **项目 SQL 目录** - 保存到 `docs/sql/tables/` 目录
|
|
141
|
+
- **自定义位置** - 用户输入完整路径
|
|
142
|
+
|
|
143
|
+
保存文件时:
|
|
144
|
+
1. 文件名格式:`{表名}.sql`(如:`zz_plt_role.sql`)
|
|
145
|
+
2. 文件内容包含:
|
|
146
|
+
- 文件头注释(表名、创建时间、说明)
|
|
147
|
+
- 完整的建表语句
|
|
148
|
+
- 使用说明注释
|
|
149
|
+
|
|
150
|
+
文件头注释模板:
|
|
151
|
+
```sql
|
|
152
|
+
-- ============================================
|
|
153
|
+
-- 表名:{表名}
|
|
154
|
+
-- 说明:{表说明}
|
|
155
|
+
-- 归属:{部门名称}({部门缩写}) - {业务域名称}({业务域缩写})
|
|
156
|
+
-- 创建时间:{当前日期}
|
|
157
|
+
-- ============================================
|
|
25
158
|
```
|
|
26
159
|
|
|
27
160
|
---
|
|
28
161
|
|
|
29
|
-
##
|
|
162
|
+
## 字段类型选择指南
|
|
163
|
+
|
|
164
|
+
根据 `references/字段类型规范.md` 选择合适的数据类型:
|
|
30
165
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
166
|
+
| 场景 | 推荐类型 | 示例 |
|
|
167
|
+
|------|---------|------|
|
|
168
|
+
| 主键 | `BIGINT UNSIGNED AUTO_INCREMENT` | `id` |
|
|
169
|
+
| 外键 | `BIGINT UNSIGNED` | `user_id`, `role_id` |
|
|
170
|
+
| 编码/Code | `VARCHAR(64)` | `role_code` |
|
|
171
|
+
| 名称/Name | `VARCHAR(128)` | `role_name` |
|
|
172
|
+
| 描述 | `VARCHAR(512)` | `description` |
|
|
173
|
+
| 布尔 | `TINYINT(1)` | `is_enabled` |
|
|
174
|
+
| 排序 | `INT` | `sort_order` |
|
|
175
|
+
| 金额 | `DECIMAL(18,4)` | `amount` |
|
|
176
|
+
| JSON | `JSON` | `config_json` |
|
|
177
|
+
| 时间 | `DATETIME` | `create_time` |
|
|
34
178
|
|
|
35
179
|
---
|
|
36
180
|
|
|
37
|
-
##
|
|
181
|
+
## 详细设计规范参考
|
|
182
|
+
|
|
183
|
+
以下是完整的数据库设计规范,供深入参考使用。
|
|
184
|
+
|
|
185
|
+
### 命名规范详解
|
|
38
186
|
|
|
39
|
-
|
|
187
|
+
#### 表命名规范
|
|
40
188
|
|
|
41
189
|
| 规则 | 说明 | 正确示例 | 错误示例 |
|
|
42
190
|
|------|------|----------|----------|
|
|
43
|
-
| snake_case 全小写 | 统一使用下划线分隔 | `
|
|
44
|
-
|
|
|
45
|
-
| 有意义的英文名词 | 清晰表达表的业务含义 | `
|
|
46
|
-
| 关联表命名 | 两个实体名拼接 | `
|
|
191
|
+
| snake_case 全小写 | 统一使用下划线分隔 | `zz_plt_user_order` | `T_UserOrder`, `tUserOrder` |
|
|
192
|
+
| 部门_业务域_实体 | 格式:{部门}_{业务域}_{实体} | `zz_plt_user` | `user`, `tb_user`, `t_user` |
|
|
193
|
+
| 有意义的英文名词 | 清晰表达表的业务含义 | `zz_plt_order_item` | `zz_plt_oi`, `table1` |
|
|
194
|
+
| 关联表命名 | 两个实体名拼接 | `zz_plt_user_role` | `zz_plt_ur` |
|
|
47
195
|
|
|
48
|
-
|
|
196
|
+
#### 字段命名规范
|
|
49
197
|
|
|
50
198
|
| 规则 | 说明 | 正确示例 | 错误示例 |
|
|
51
199
|
|------|------|----------|----------|
|
|
52
200
|
| snake_case 全小写 | 统一使用下划线分隔 | `user_name` | `userName`, `UserName` |
|
|
53
201
|
| 布尔字段 `is_` 前缀 | 表示是否的字段 | `is_deleted`, `is_active` | `deleted`, `active` |
|
|
54
|
-
| 时间字段 `
|
|
202
|
+
| 时间字段 `_at` 后缀 | 表示时间的字段 | `create_time`, `update_time` | `created`, `payDate` |
|
|
55
203
|
| 状态字段 `status` | 表示状态的字段 | `order_status` | `order_state`, `sts` |
|
|
56
204
|
| 外键字段 `_id` 后缀 | 引用其他表主键 | `user_id`, `order_id` | `user`, `fk_user` |
|
|
57
205
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
## 必需字段
|
|
206
|
+
### 必需字段说明
|
|
61
207
|
|
|
62
208
|
每张业务表必须包含以下四个字段:
|
|
63
209
|
|
|
@@ -75,13 +221,11 @@ update_time DATETIME NOT NULL COMMENT '更新时间',
|
|
|
75
221
|
is_deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除:0-未删除 1-已删除',
|
|
76
222
|
```
|
|
77
223
|
|
|
78
|
-
>
|
|
224
|
+
> **注意**:`id` 使用 BIGINT 而非 AUTO_INCREMENT,由应用层(MyBatis Plus ASSIGN_ID)生成雪花 ID。
|
|
79
225
|
|
|
80
|
-
|
|
226
|
+
### 数据类型详细指南
|
|
81
227
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
### 类型选择原则
|
|
228
|
+
#### 类型选择原则
|
|
85
229
|
|
|
86
230
|
| 场景 | 推荐类型 | 说明 |
|
|
87
231
|
|------|----------|------|
|
|
@@ -98,7 +242,7 @@ is_deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除:0-未删除 1-已
|
|
|
98
242
|
| JSON 数据 | `JSON` | MySQL 5.7+ 支持,需要 JSON 查询时使用 |
|
|
99
243
|
| 大字段(图片、文件) | 不存库 | 存储到对象存储(OSS),数据库只存 URL |
|
|
100
244
|
|
|
101
|
-
|
|
245
|
+
#### 字段长度建议
|
|
102
246
|
|
|
103
247
|
| 字段类型 | 推荐长度 | 说明 |
|
|
104
248
|
|----------|----------|------|
|
|
@@ -112,11 +256,9 @@ is_deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除:0-未删除 1-已
|
|
|
112
256
|
| 订单号 | VARCHAR(32) | |
|
|
113
257
|
| 密码哈希 | VARCHAR(128) | BCrypt 等哈希结果 |
|
|
114
258
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
## 索引设计原则
|
|
259
|
+
### 索引设计详解
|
|
118
260
|
|
|
119
|
-
|
|
261
|
+
#### 索引类型
|
|
120
262
|
|
|
121
263
|
| 索引类型 | 使用场景 | DDL 语法 |
|
|
122
264
|
|----------|----------|----------|
|
|
@@ -125,7 +267,7 @@ is_deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除:0-未删除 1-已
|
|
|
125
267
|
| 普通索引 | 高频查询条件 | `KEY idx_xxx (col)` |
|
|
126
268
|
| 组合索引 | 多条件联合查询 | `KEY idx_xxx (col1, col2)` |
|
|
127
269
|
|
|
128
|
-
|
|
270
|
+
#### 索引命名规范
|
|
129
271
|
|
|
130
272
|
| 索引类型 | 前缀 | 示例 |
|
|
131
273
|
|----------|------|------|
|
|
@@ -134,7 +276,7 @@ is_deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除:0-未删除 1-已
|
|
|
134
276
|
| 普通索引 | `idx_` | `KEY idx_user_id (user_id)` |
|
|
135
277
|
| 组合索引 | `idx_` | `KEY idx_status_create_time (status, create_time)` |
|
|
136
278
|
|
|
137
|
-
|
|
279
|
+
#### 组合索引最左前缀原则
|
|
138
280
|
|
|
139
281
|
组合索引 `(a, b, c)` 可以满足以下查询:
|
|
140
282
|
- `WHERE a = ?` — 命中
|
|
@@ -145,17 +287,17 @@ is_deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除:0-未删除 1-已
|
|
|
145
287
|
|
|
146
288
|
设计组合索引时,将区分度高的列放在前面。
|
|
147
289
|
|
|
148
|
-
|
|
290
|
+
#### 覆盖索引
|
|
149
291
|
|
|
150
292
|
当查询的所有字段都在索引中时,MySQL 可以直接从索引中读取数据,无需回表:
|
|
151
293
|
|
|
152
294
|
```sql
|
|
153
295
|
-- 索引: idx_status_create_time (status, create_time)
|
|
154
296
|
-- 覆盖索引查询(只查索引中的字段)
|
|
155
|
-
SELECT status, create_time FROM
|
|
297
|
+
SELECT status, create_time FROM zz_plt_order WHERE status = 1;
|
|
156
298
|
```
|
|
157
299
|
|
|
158
|
-
|
|
300
|
+
#### 索引设计建议
|
|
159
301
|
|
|
160
302
|
1. **高频查询条件**必须建索引(WHERE、JOIN 条件)
|
|
161
303
|
2. **区分度低的字段**不建议单独建索引(如 `status` 只有几个值)
|
|
@@ -164,17 +306,15 @@ SELECT status, create_time FROM t_order WHERE status = 1;
|
|
|
164
306
|
5. 索引字段总长度建议不超过 **256 字节**
|
|
165
307
|
6. **频繁更新的字段**不建议建索引
|
|
166
308
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
## 外键设计
|
|
309
|
+
### 外键设计原则
|
|
170
310
|
|
|
171
|
-
|
|
311
|
+
#### 逻辑外键(推荐)
|
|
172
312
|
|
|
173
313
|
使用逻辑外键,不创建物理外键约束:
|
|
174
314
|
|
|
175
315
|
```sql
|
|
176
316
|
-- 推荐:逻辑外键,不添加 FOREIGN KEY 约束
|
|
177
|
-
CREATE TABLE
|
|
317
|
+
CREATE TABLE zz_plt_order_item (
|
|
178
318
|
id BIGINT NOT NULL COMMENT '主键ID',
|
|
179
319
|
order_id BIGINT NOT NULL COMMENT '订单ID', -- 逻辑外键
|
|
180
320
|
product_id BIGINT NOT NULL COMMENT '商品ID', -- 逻辑外键
|
|
@@ -184,11 +324,11 @@ CREATE TABLE t_order_item (
|
|
|
184
324
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单商品明细表';
|
|
185
325
|
```
|
|
186
326
|
|
|
187
|
-
|
|
327
|
+
#### 物理外键(禁止)
|
|
188
328
|
|
|
189
329
|
```sql
|
|
190
330
|
-- 禁止:物理外键约束,影响性能和运维
|
|
191
|
-
FOREIGN KEY (order_id) REFERENCES
|
|
331
|
+
FOREIGN KEY (order_id) REFERENCES zz_plt_order(id)
|
|
192
332
|
```
|
|
193
333
|
|
|
194
334
|
**原因**:
|
|
@@ -197,22 +337,20 @@ FOREIGN KEY (order_id) REFERENCES t_order(id)
|
|
|
197
337
|
- 级联操作可能导致意外的数据变更
|
|
198
338
|
- 数据完整性由应用层保证
|
|
199
339
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
## 大表分区策略
|
|
340
|
+
### 大表分区策略
|
|
203
341
|
|
|
204
342
|
当预估单表数据量超过 **500 万行**时,考虑分区或分表:
|
|
205
343
|
|
|
206
|
-
|
|
344
|
+
#### 时间范围分区
|
|
207
345
|
|
|
208
346
|
适用于日志表、流水表等按时间增长的数据:
|
|
209
347
|
|
|
210
348
|
```sql
|
|
211
|
-
CREATE TABLE
|
|
349
|
+
CREATE TABLE zz_plt_operation_log (
|
|
212
350
|
id BIGINT NOT NULL COMMENT '主键ID',
|
|
213
351
|
operation_type VARCHAR(32) NOT NULL COMMENT '操作类型',
|
|
214
352
|
content TEXT COMMENT '操作内容',
|
|
215
|
-
create_time DATETIME NOT NULL COMMENT '创建时间',
|
|
353
|
+
create_time DATETIME NOT NULL default CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
216
354
|
PRIMARY KEY (id, create_time)
|
|
217
355
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志表'
|
|
218
356
|
PARTITION BY RANGE (TO_DAYS(create_time)) (
|
|
@@ -223,16 +361,14 @@ PARTITION BY RANGE (TO_DAYS(create_time)) (
|
|
|
223
361
|
);
|
|
224
362
|
```
|
|
225
363
|
|
|
226
|
-
|
|
364
|
+
#### 分表建议
|
|
227
365
|
|
|
228
366
|
当分区无法满足需求时,考虑按业务维度分表:
|
|
229
367
|
|
|
230
|
-
- **按用户 ID 取模分表**:`
|
|
231
|
-
- **按时间分表**:`
|
|
368
|
+
- **按用户 ID 取模分表**:`zz_plt_order_00` ~ `zz_plt_order_15`
|
|
369
|
+
- **按时间分表**:`zz_plt_order_202601` ~ `zz_plt_order_202612`
|
|
232
370
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
## DDL 完整示例
|
|
371
|
+
### DDL 完整示例
|
|
236
372
|
|
|
237
373
|
以订单系统为例:
|
|
238
374
|
|
|
@@ -240,7 +376,7 @@ PARTITION BY RANGE (TO_DAYS(create_time)) (
|
|
|
240
376
|
-- ----------------------------
|
|
241
377
|
-- 订单表
|
|
242
378
|
-- ----------------------------
|
|
243
|
-
CREATE TABLE
|
|
379
|
+
CREATE TABLE zz_plt_order (
|
|
244
380
|
id BIGINT NOT NULL COMMENT '主键ID',
|
|
245
381
|
order_no VARCHAR(32) NOT NULL COMMENT '订单号',
|
|
246
382
|
user_id BIGINT NOT NULL COMMENT '用户ID',
|
|
@@ -248,8 +384,8 @@ CREATE TABLE t_order (
|
|
|
248
384
|
order_status TINYINT NOT NULL DEFAULT 0 COMMENT '订单状态:0-待支付 1-已支付 2-已发货 3-已完成 4-已取消',
|
|
249
385
|
remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
|
|
250
386
|
pay_time DATETIME DEFAULT NULL COMMENT '支付时间',
|
|
251
|
-
create_time DATETIME NOT NULL COMMENT '创建时间',
|
|
252
|
-
update_time DATETIME NOT NULL COMMENT '更新时间',
|
|
387
|
+
create_time DATETIME NOT NULL default CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
388
|
+
update_time DATETIME NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP COMMENT '更新时间',
|
|
253
389
|
is_deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除:0-未删除 1-已删除',
|
|
254
390
|
PRIMARY KEY (id),
|
|
255
391
|
UNIQUE KEY uk_order_no (order_no),
|
|
@@ -260,7 +396,7 @@ CREATE TABLE t_order (
|
|
|
260
396
|
-- ----------------------------
|
|
261
397
|
-- 订单商品明细表
|
|
262
398
|
-- ----------------------------
|
|
263
|
-
CREATE TABLE
|
|
399
|
+
CREATE TABLE zz_plt_order_item (
|
|
264
400
|
id BIGINT NOT NULL COMMENT '主键ID',
|
|
265
401
|
order_id BIGINT NOT NULL COMMENT '订单ID',
|
|
266
402
|
product_id BIGINT NOT NULL COMMENT '商品ID',
|
|
@@ -268,8 +404,8 @@ CREATE TABLE t_order_item (
|
|
|
268
404
|
quantity INT NOT NULL DEFAULT 1 COMMENT '数量',
|
|
269
405
|
unit_price DECIMAL(10, 2) NOT NULL COMMENT '单价',
|
|
270
406
|
subtotal DECIMAL(10, 2) NOT NULL COMMENT '小计',
|
|
271
|
-
create_time DATETIME NOT NULL COMMENT '创建时间',
|
|
272
|
-
update_time DATETIME NOT NULL COMMENT '更新时间',
|
|
407
|
+
create_time DATETIME NOT NULL default CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
408
|
+
update_time DATETIME NOT NULL default CURRENT_TIMESTAMP ON UPDATE COMMENT '更新时间',
|
|
273
409
|
is_deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除:0-未删除 1-已删除',
|
|
274
410
|
PRIMARY KEY (id),
|
|
275
411
|
KEY idx_order_id (order_id),
|
|
@@ -277,15 +413,13 @@ CREATE TABLE t_order_item (
|
|
|
277
413
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单商品明细表';
|
|
278
414
|
```
|
|
279
415
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
## 审查清单
|
|
416
|
+
### 设计审查清单
|
|
283
417
|
|
|
284
418
|
设计完成后,按以下清单逐项检查:
|
|
285
419
|
|
|
286
|
-
|
|
420
|
+
#### 表结构审查
|
|
287
421
|
|
|
288
|
-
- [ ] 表名符合 `
|
|
422
|
+
- [ ] 表名符合 `{部门}_{业务域}_{实体}` 命名规范
|
|
289
423
|
- [ ] 字段名符合 snake_case 命名规范
|
|
290
424
|
- [ ] 包含 `id`, `create_time`, `update_time`, `is_deleted` 四个必需字段
|
|
291
425
|
- [ ] `id` 使用 `BIGINT NOT NULL`,不自增
|
|
@@ -296,7 +430,7 @@ CREATE TABLE t_order_item (
|
|
|
296
430
|
- [ ] 表有 `COMMENT` 注释
|
|
297
431
|
- [ ] 字符集使用 `utf8mb4`
|
|
298
432
|
|
|
299
|
-
|
|
433
|
+
#### 索引审查
|
|
300
434
|
|
|
301
435
|
- [ ] 主键索引存在
|
|
302
436
|
- [ ] 业务唯一字段有唯一索引
|
|
@@ -307,15 +441,13 @@ CREATE TABLE t_order_item (
|
|
|
307
441
|
- [ ] 单表索引数量不超过 5 个
|
|
308
442
|
- [ ] 无冗余索引(已被其他组合索引覆盖的单列索引)
|
|
309
443
|
|
|
310
|
-
|
|
444
|
+
#### 关联关系审查
|
|
311
445
|
|
|
312
446
|
- [ ] 使用逻辑外键,无物理 FOREIGN KEY 约束
|
|
313
447
|
- [ ] 外键字段类型与引用表主键类型一致(BIGINT)
|
|
314
448
|
- [ ] 关联关系在 COMMENT 中说明
|
|
315
449
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
## 最佳实践
|
|
450
|
+
### 最佳实践
|
|
319
451
|
|
|
320
452
|
1. **先理解业务再建表** — 充分理解业务需求后再设计表结构,避免反复修改
|
|
321
453
|
2. **适度冗余** — 允许适度的数据冗余以减少 JOIN 查询(如订单表存商品名称)
|
|
@@ -326,18 +458,16 @@ CREATE TABLE t_order_item (
|
|
|
326
458
|
7. **金额用分** — 如果精度要求高,可以考虑用 BIGINT 存储分,避免浮点精度问题
|
|
327
459
|
8. **状态值说明** — 状态字段的 COMMENT 中列出所有可能的值及含义
|
|
328
460
|
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
## 常见问题排查
|
|
461
|
+
### 常见问题解答
|
|
332
462
|
|
|
333
|
-
|
|
463
|
+
#### Q: VARCHAR 和 TEXT 如何选择?
|
|
334
464
|
|
|
335
465
|
- 长度可预估且 ≤ 65535 字节:使用 `VARCHAR(n)`
|
|
336
466
|
- 长度不可预估或超长内容:使用 `TEXT`
|
|
337
467
|
- VARCHAR 可以建索引,TEXT 只能建前缀索引
|
|
338
468
|
- VARCHAR 参与排序和分组性能优于 TEXT
|
|
339
469
|
|
|
340
|
-
|
|
470
|
+
#### Q: DATETIME 和 TIMESTAMP 如何选择?
|
|
341
471
|
|
|
342
472
|
推荐统一使用 `DATETIME`:
|
|
343
473
|
- DATETIME 范围:1000-01-01 ~ 9999-12-31
|
|
@@ -345,7 +475,7 @@ CREATE TABLE t_order_item (
|
|
|
345
475
|
- DATETIME 不受时区影响,存什么取什么
|
|
346
476
|
- TIMESTAMP 自动时区转换,跨时区可能导致混乱
|
|
347
477
|
|
|
348
|
-
|
|
478
|
+
#### Q: 如何处理枚举值字段?
|
|
349
479
|
|
|
350
480
|
推荐使用 `TINYINT` + COMMENT 说明:
|
|
351
481
|
|
|
@@ -359,12 +489,12 @@ order_status ENUM('PENDING', 'PAID', 'SHIPPED') COMMENT '订单状态'
|
|
|
359
489
|
|
|
360
490
|
原因:TINYINT 更灵活,新增枚举值不需要 ALTER TABLE。
|
|
361
491
|
|
|
362
|
-
|
|
492
|
+
#### Q: 需要存储树形结构怎么设计?
|
|
363
493
|
|
|
364
494
|
推荐使用 `parent_id` 邻接表模式:
|
|
365
495
|
|
|
366
496
|
```sql
|
|
367
|
-
CREATE TABLE
|
|
497
|
+
CREATE TABLE zz_plt_department (
|
|
368
498
|
id BIGINT NOT NULL COMMENT '主键ID',
|
|
369
499
|
parent_id BIGINT NOT NULL DEFAULT 0 COMMENT '父级ID,顶级为0',
|
|
370
500
|
name VARCHAR(100) NOT NULL COMMENT '部门名称',
|
|
@@ -375,3 +505,260 @@ CREATE TABLE t_department (
|
|
|
375
505
|
```
|
|
376
506
|
|
|
377
507
|
如需高效查询整棵子树,可额外添加 `path` 字段存储路径(如 `/1/3/7/`)。
|
|
508
|
+
|
|
509
|
+
---
|
|
510
|
+
|
|
511
|
+
## 生成关联表流程
|
|
512
|
+
|
|
513
|
+
关联表(中间表)命名规则:`{表A}_{表B}_rel`
|
|
514
|
+
|
|
515
|
+
必须包含:
|
|
516
|
+
- 基础字段(id, create_time, is_deleted)
|
|
517
|
+
- 两个外键字段(如 `avatar_id`, `role_id`)
|
|
518
|
+
- 联合唯一索引(防止重复关联)
|
|
519
|
+
- 外键字段的普通索引(提升查询性能)
|
|
520
|
+
|
|
521
|
+
示例:
|
|
522
|
+
```sql
|
|
523
|
+
CREATE TABLE `zz_plt_avatar_role_rel` (
|
|
524
|
+
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
|
525
|
+
`avatar_id` BIGINT UNSIGNED NOT NULL COMMENT '虚拟人ID',
|
|
526
|
+
`role_id` BIGINT UNSIGNED NOT NULL COMMENT '角色ID',
|
|
527
|
+
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
528
|
+
`is_deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '逻辑删除:0-未删除,1-已删除',
|
|
529
|
+
PRIMARY KEY (`id`),
|
|
530
|
+
UNIQUE KEY `uk_zz_plt_avatar_role_rel` (`avatar_id`, `role_id`),
|
|
531
|
+
KEY `idx_zz_plt_avatar_role_rel_role` (`role_id`)
|
|
532
|
+
) ENGINE=InnoDB
|
|
533
|
+
DEFAULT CHARSET=utf8mb4
|
|
534
|
+
COLLATE=utf8mb4_0900_ai_ci
|
|
535
|
+
COMMENT='智作平台-虚拟人角色关联表 [zz][plt]';
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
---
|
|
539
|
+
|
|
540
|
+
## 验证表结构流程
|
|
541
|
+
|
|
542
|
+
检查用户提供的建表语句是否符合规范:
|
|
543
|
+
|
|
544
|
+
1. **表名检查**:是否符合 `{部门}_{业务域}_{实体}` 格式
|
|
545
|
+
2. **基础字段检查**:是否包含 id, create_time, update_time, is_deleted
|
|
546
|
+
3. **字段注释检查**:每个字段是否有 COMMENT
|
|
547
|
+
4. **索引检查**:主键、唯一约束、常用查询字段是否有索引
|
|
548
|
+
5. **引擎和字符集检查**:是否使用 InnoDB 和 utf8mb4
|
|
549
|
+
6. **表注释检查**:是否包含部门和业务域标识
|
|
550
|
+
|
|
551
|
+
对于不符合规范的地方,给出具体的修改建议。
|
|
552
|
+
|
|
553
|
+
---
|
|
554
|
+
|
|
555
|
+
## 文档读取路由
|
|
556
|
+
|
|
557
|
+
> 所有路径相对于 skill 目录 `docs/skills/mysql-table-generator-skill/`
|
|
558
|
+
|
|
559
|
+
| 用户需求 | 需读取的文件 |
|
|
560
|
+
|:--|:--|
|
|
561
|
+
| 查看命名规范 | `references/命名规范.md` |
|
|
562
|
+
| 查看字段类型规范 | `references/字段类型规范.md` |
|
|
563
|
+
| 查看索引规范 | `references/索引规范.md` |
|
|
564
|
+
| 查看完整规范 | `../../database/mysql-specification.md` |
|
|
565
|
+
|
|
566
|
+
---
|
|
567
|
+
|
|
568
|
+
## 快速参考
|
|
569
|
+
|
|
570
|
+
### 常用字段模板
|
|
571
|
+
|
|
572
|
+
```sql
|
|
573
|
+
-- 编码字段
|
|
574
|
+
`{entity}_code` VARCHAR(64) NOT NULL COMMENT '{实体}编码',
|
|
575
|
+
|
|
576
|
+
-- 名称字段
|
|
577
|
+
`{entity}_name` VARCHAR(128) NOT NULL COMMENT '{实体}名称',
|
|
578
|
+
|
|
579
|
+
-- 描述字段
|
|
580
|
+
`description` VARCHAR(512) DEFAULT NULL COMMENT '描述',
|
|
581
|
+
|
|
582
|
+
-- 启用状态
|
|
583
|
+
`is_enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用:0-禁用,1-启用',
|
|
584
|
+
|
|
585
|
+
-- 排序权重
|
|
586
|
+
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序权重',
|
|
587
|
+
|
|
588
|
+
-- 租户ID(多租户场景)
|
|
589
|
+
`tenant_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID',
|
|
590
|
+
|
|
591
|
+
-- JSON配置
|
|
592
|
+
`config_json` JSON DEFAULT NULL COMMENT '扩展配置(JSON格式)',
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
### 常用索引模板
|
|
596
|
+
|
|
597
|
+
```sql
|
|
598
|
+
-- 唯一索引(编码字段)
|
|
599
|
+
UNIQUE KEY `uk_{表名}_{字段}` (`{字段}`),
|
|
600
|
+
|
|
601
|
+
-- 普通索引(名称字段)
|
|
602
|
+
KEY `idx_{表名}_{字段}` (`{字段}`),
|
|
603
|
+
|
|
604
|
+
-- 联合索引(租户+删除标记)
|
|
605
|
+
KEY `idx_{表名}_tenant` (`tenant_id`, `is_deleted`),
|
|
606
|
+
|
|
607
|
+
-- 联合索引(状态+启用+删除)
|
|
608
|
+
KEY `idx_{表名}_status` (`status`, `is_enabled`, `is_deleted`)
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
---
|
|
612
|
+
|
|
613
|
+
## 输出格式
|
|
614
|
+
|
|
615
|
+
生成建表语句后,按以下格式输出:
|
|
616
|
+
|
|
617
|
+
```markdown
|
|
618
|
+
## 生成的建表语句
|
|
619
|
+
|
|
620
|
+
### 表信息
|
|
621
|
+
- **表名**:{表名}
|
|
622
|
+
- **归属**:{部门名称}({部门缩写}) - {业务域名称}({业务域缩写})
|
|
623
|
+
- **说明**:{表的用途说明}
|
|
624
|
+
|
|
625
|
+
### SQL 语句
|
|
626
|
+
|
|
627
|
+
```sql
|
|
628
|
+
{完整的建表语句}
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
### Spring 实体类名
|
|
632
|
+
|
|
633
|
+
根据规范,Spring 实体类不需要前缀,建议使用:`{实体名首字母大写}`
|
|
634
|
+
|
|
635
|
+
示例:表名 `zz_plt_role` → 实体类 `Role`
|
|
636
|
+
|
|
637
|
+
### 使用说明
|
|
638
|
+
|
|
639
|
+
1. 在 MySQL 客户端或工具中执行上述 SQL
|
|
640
|
+
2. 创建对应的 Spring 实体类(继承 BaseEntity)
|
|
641
|
+
3. 创建 Mapper 接口(继承 BaseMapper)
|
|
642
|
+
4. 如需多数据源,使用 @DS 注解指定数据源
|
|
643
|
+
|
|
644
|
+
### 注意事项
|
|
645
|
+
|
|
646
|
+
- 所有查询必须带 `AND is_deleted = 0` 条件
|
|
647
|
+
- 建议在 MyBatis Plus 中配置全局逻辑删除
|
|
648
|
+
- 唯一索引字段需要在业务层做唯一性校验
|
|
649
|
+
|
|
650
|
+
### 文件保存
|
|
651
|
+
|
|
652
|
+
**已保存到**:`{文件路径}`(如果用户选择保存)
|
|
653
|
+
|
|
654
|
+
或
|
|
655
|
+
|
|
656
|
+
**未保存**:如需保存,请告诉我保存位置(如果用户选择不保存)
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
---
|
|
660
|
+
|
|
661
|
+
## SQL 文件保存格式
|
|
662
|
+
|
|
663
|
+
当用户选择保存为 SQL 文件时,使用 Write 工具创建文件,文件内容格式如下:
|
|
664
|
+
|
|
665
|
+
```sql
|
|
666
|
+
-- ============================================
|
|
667
|
+
-- 表名:{表名}
|
|
668
|
+
-- 说明:{表说明}
|
|
669
|
+
-- 归属:{部门名称}({部门缩写}) - {业务域名称}({业务域缩写})
|
|
670
|
+
-- 创建时间:{当前日期 YYYY-MM-DD}
|
|
671
|
+
-- 生成工具:MySQL 建表语句生成器
|
|
672
|
+
-- ============================================
|
|
673
|
+
|
|
674
|
+
-- 删除已存在的表(谨慎使用)
|
|
675
|
+
-- DROP TABLE IF EXISTS `{表名}`;
|
|
676
|
+
|
|
677
|
+
-- 创建表
|
|
678
|
+
{完整的建表语句}
|
|
679
|
+
|
|
680
|
+
-- ============================================
|
|
681
|
+
-- 使用说明
|
|
682
|
+
-- ============================================
|
|
683
|
+
-- 1. 在 MySQL 客户端或工具中执行上述 SQL
|
|
684
|
+
-- 2. 创建对应的 Spring 实体类(继承 BaseEntity)
|
|
685
|
+
-- 3. 创建 Mapper 接口(继承 BaseMapper)
|
|
686
|
+
-- 4. 如需多数据源,使用 @DS 注解指定数据源
|
|
687
|
+
--
|
|
688
|
+
-- 注意事项:
|
|
689
|
+
-- - 所有查询必须带 AND is_deleted = 0 条件
|
|
690
|
+
-- - 建议在 MyBatis Plus 中配置全局逻辑删除
|
|
691
|
+
-- - 唯一索引字段需要在业务层做唯一性校验
|
|
692
|
+
-- ============================================
|
|
693
|
+
```
|
|
694
|
+
|
|
695
|
+
### 保存路径规则
|
|
696
|
+
|
|
697
|
+
1. **项目 SQL 目录**:`docs/sql/tables/{表名}.sql`
|
|
698
|
+
2. **自定义位置**:用户指定的完整路径
|
|
699
|
+
|
|
700
|
+
保存前检查目录是否存在,如不存在则创建。
|
|
701
|
+
|
|
702
|
+
根据规范,Spring 实体类不需要前缀,建议使用:`{实体名首字母大写}`
|
|
703
|
+
|
|
704
|
+
示例:表名 `zz_plt_role` → 实体类 `Role`
|
|
705
|
+
|
|
706
|
+
### 使用说明
|
|
707
|
+
|
|
708
|
+
1. 在 MySQL 客户端或工具中执行上述 SQL
|
|
709
|
+
2. 创建对应的 Spring 实体类(继承 BaseEntity)
|
|
710
|
+
3. 创建 Mapper 接口(继承 BaseMapper)
|
|
711
|
+
4. 如需多数据源,使用 @DS 注解指定数据源
|
|
712
|
+
|
|
713
|
+
### 注意事项
|
|
714
|
+
|
|
715
|
+
- 所有查询必须带 `AND is_deleted = 0` 条件
|
|
716
|
+
- 建议在 MyBatis Plus 中配置全局逻辑删除
|
|
717
|
+
- 唯一索引字段需要在业务层做唯一性校验
|
|
718
|
+
```
|
|
719
|
+
|
|
720
|
+
---
|
|
721
|
+
|
|
722
|
+
## 示例对话
|
|
723
|
+
|
|
724
|
+
**用户**:"帮我创建一个角色表"
|
|
725
|
+
|
|
726
|
+
**助手**:
|
|
727
|
+
1. 使用 AskUserQuestion 询问部门、业务域、字段信息
|
|
728
|
+
2. 根据用户回答生成完整建表语句
|
|
729
|
+
3. 提供 Spring 实体类建议和使用说明
|
|
730
|
+
|
|
731
|
+
**用户**:"检查这个建表语句是否符合规范:CREATE TABLE user ..."
|
|
732
|
+
|
|
733
|
+
**助手**:
|
|
734
|
+
1. 读取用户提供的 SQL
|
|
735
|
+
2. 逐项检查是否符合规范
|
|
736
|
+
3. 列出不符合的地方并给出修改建议
|
|
737
|
+
4. 提供修正后的完整 SQL
|
|
738
|
+
|
|
739
|
+
---
|
|
740
|
+
|
|
741
|
+
## 特殊场景处理
|
|
742
|
+
|
|
743
|
+
### 多租户表
|
|
744
|
+
自动添加 `tenant_id` 字段和相关索引:
|
|
745
|
+
```sql
|
|
746
|
+
`tenant_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID',
|
|
747
|
+
KEY `idx_{表名}_tenant` (`tenant_id`, `is_deleted`),
|
|
748
|
+
```
|
|
749
|
+
|
|
750
|
+
### 树形结构表
|
|
751
|
+
添加父节点字段:
|
|
752
|
+
```sql
|
|
753
|
+
`parent_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '父节点ID',
|
|
754
|
+
`level` INT NOT NULL DEFAULT 0 COMMENT '层级',
|
|
755
|
+
`path` VARCHAR(512) DEFAULT NULL COMMENT '路径(如:/1/2/3/)',
|
|
756
|
+
KEY `idx_{表名}_parent` (`parent_id`),
|
|
757
|
+
```
|
|
758
|
+
|
|
759
|
+
### 状态机表
|
|
760
|
+
添加状态字段和状态索引:
|
|
761
|
+
```sql
|
|
762
|
+
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '状态:0-待审核,1-已通过,2-已拒绝',
|
|
763
|
+
KEY `idx_{表名}_status` (`status`, `is_deleted`),
|
|
764
|
+
```
|