@pencilps/avatar-boot-cli 1.0.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/README.md +309 -0
- package/bin/cli.js +3 -0
- package/package.json +34 -0
- package/src/index.js +78 -0
- package/src/prompts.js +78 -0
- package/src/template.js +37 -0
- package/src/transform.js +172 -0
- package/src/utils.js +34 -0
- package/templates/.claude/rules/architecture-redlines.md +146 -0
- package/templates/.claude/rules/code-review-standards.md +137 -0
- package/templates/.claude/rules/coding-standards.md +56 -0
- package/templates/.claude/rules/git-commit.md +59 -0
- package/templates/.claude/rules/layered-architecture.md +201 -0
- package/templates/.claude/rules/mybatis-plus.md +263 -0
- package/templates/.claude/rules/tech-stack.md +41 -0
- package/templates/.claude/rules/version.md +467 -0
- package/templates/.claude/skills/ai-tool-guide/SKILL.md +314 -0
- package/templates/.claude/skills/api-design/SKILL.md +200 -0
- package/templates/.claude/skills/api-doc-generator/SKILL.md +380 -0
- package/templates/.claude/skills/api-service-module-creator/SKILL.md +1114 -0
- package/templates/.claude/skills/avatar-boot-starter-feign/README.md +243 -0
- package/templates/.claude/skills/avatar-boot-starter-feign/SKILL.md +71 -0
- 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 +58 -0
- 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 +56 -0
- 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 +62 -0
- 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 +62 -0
- 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 +76 -0
- 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 +62 -0
- 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 +70 -0
- 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 +154 -0
- 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/changelog-generator/SKILL.md +114 -0
- package/templates/.claude/skills/code-review/SKILL.md +239 -0
- package/templates/.claude/skills/crud-generator/SKILL.md +893 -0
- package/templates/.claude/skills/database-design/README.md +207 -0
- package/templates/.claude/skills/database-design/SKILL.md +764 -0
- 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/.claude/skills/deployment-config/SKILL.md +277 -0
- package/templates/.claude/skills/incident-analysis/SKILL.md +241 -0
- package/templates/.claude/skills/integration-test-generator/SKILL.md +496 -0
- package/templates/.claude/skills/prompt-engineering/SKILL.md +249 -0
- package/templates/.claude/skills/requirement-management/SKILL.md +244 -0
- package/templates/.claude/skills/security-audit/SKILL.md +330 -0
- package/templates/.claude/skills/test-case-design/SKILL.md +257 -0
- package/templates/.claude/skills/testing-workflow/SKILL.md +68 -0
- package/templates/.claude/skills/troubleshooting/SKILL.md +240 -0
- package/templates/CLAUDE.md +173 -0
- package/templates/README.md +268 -0
- package/templates/avatar-scaffold-api/pom.xml +36 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/api/LoginFeignClient.java +42 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/constant/LoginConstant.java +21 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/request/LoginRequest.java +17 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/request/RefreshTokenRequest.java +14 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/response/LoginResponse.java +31 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/response/TokenInfoResponse.java +25 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/enums/LoginTypeEnum.java +23 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/exception/LoginErrorCode.java +25 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/exception/LoginException.java +23 -0
- package/templates/avatar-scaffold-service/k8s-app/Dockerfile +14 -0
- package/templates/avatar-scaffold-service/k8s-app/Dockerfile-arm64 +14 -0
- package/templates/avatar-scaffold-service/packaging/assembly.xml +16 -0
- package/templates/avatar-scaffold-service/pom.xml +88 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/Application.java +21 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/config/LoginConfig.java +20 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/controller/LoginController.java +37 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/converter/LoginConverter.java +54 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/feign/DemoFeign.java +24 -0
- 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/entity/UserLoginEntity.java +33 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/entity/UserTokenEntity.java +39 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/mapper/UserLoginMapper.java +23 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/service/LoginService.java +22 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/service/impl/LoginServiceImpl.java +43 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/utils/LoginUtils.java +31 -0
- package/templates/avatar-scaffold-service/src/main/resources/application-dev.yaml +26 -0
- package/templates/avatar-scaffold-service/src/main/resources/application-local.yaml +61 -0
- package/templates/avatar-scaffold-service/src/main/resources/application-prod.yaml +25 -0
- package/templates/avatar-scaffold-service/src/main/resources/application-test.yaml +26 -0
- package/templates/avatar-scaffold-service/src/main/resources/application.yaml +12 -0
- package/templates/pom.xml +89 -0
|
@@ -0,0 +1,764 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: database-design
|
|
3
|
+
description: |
|
|
4
|
+
根据业务需求生成数据库表 DDL 和索引建议,遵循项目数据库设计规范。
|
|
5
|
+
触发词: database design, table design, DDL, schema, ER, 数据库设计, 表设计, 建表
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# MySQL 建表语句生成器
|
|
9
|
+
|
|
10
|
+
你是 Avatar Boot MySQL 建表规范的专家助手,帮助开发者快速生成符合规范的标准建表语句。
|
|
11
|
+
|
|
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. **提供完整示例**:包含注释、索引、表注释等完整信息
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
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 |
|
|
83
|
+
|
|
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 | 排序权重 |
|
|
92
|
+
|
|
93
|
+
### 索引设计
|
|
94
|
+
| 索引类型 | 索引名 | 字段 | 说明 |
|
|
95
|
+
|---------|--------|------|------|
|
|
96
|
+
| 主键 | PRIMARY KEY | id | 自动创建 |
|
|
97
|
+
| 唯一索引 | uk_zz_plt_role_code | role_code | 角色编码唯一 |
|
|
98
|
+
| 普通索引 | idx_zz_plt_role_name | role_name | 角色名称查询 |
|
|
99
|
+
```
|
|
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
|
+
-- ============================================
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 字段类型选择指南
|
|
163
|
+
|
|
164
|
+
根据 `references/字段类型规范.md` 选择合适的数据类型:
|
|
165
|
+
|
|
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` |
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## 详细设计规范参考
|
|
182
|
+
|
|
183
|
+
以下是完整的数据库设计规范,供深入参考使用。
|
|
184
|
+
|
|
185
|
+
### 命名规范详解
|
|
186
|
+
|
|
187
|
+
#### 表命名规范
|
|
188
|
+
|
|
189
|
+
| 规则 | 说明 | 正确示例 | 错误示例 |
|
|
190
|
+
|------|------|----------|----------|
|
|
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` |
|
|
195
|
+
|
|
196
|
+
#### 字段命名规范
|
|
197
|
+
|
|
198
|
+
| 规则 | 说明 | 正确示例 | 错误示例 |
|
|
199
|
+
|------|------|----------|----------|
|
|
200
|
+
| snake_case 全小写 | 统一使用下划线分隔 | `user_name` | `userName`, `UserName` |
|
|
201
|
+
| 布尔字段 `is_` 前缀 | 表示是否的字段 | `is_deleted`, `is_active` | `deleted`, `active` |
|
|
202
|
+
| 时间字段 `_at` 后缀 | 表示时间的字段 | `create_time`, `update_time` | `created`, `payDate` |
|
|
203
|
+
| 状态字段 `status` | 表示状态的字段 | `order_status` | `order_state`, `sts` |
|
|
204
|
+
| 外键字段 `_id` 后缀 | 引用其他表主键 | `user_id`, `order_id` | `user`, `fk_user` |
|
|
205
|
+
|
|
206
|
+
### 必需字段说明
|
|
207
|
+
|
|
208
|
+
每张业务表必须包含以下四个字段:
|
|
209
|
+
|
|
210
|
+
```sql
|
|
211
|
+
-- 主键:BIGINT 类型,雪花算法生成,不自增
|
|
212
|
+
id BIGINT NOT NULL COMMENT '主键ID',
|
|
213
|
+
|
|
214
|
+
-- 创建时间:记录数据创建时间
|
|
215
|
+
create_time DATETIME NOT NULL COMMENT '创建时间',
|
|
216
|
+
|
|
217
|
+
-- 更新时间:记录数据最后更新时间
|
|
218
|
+
update_time DATETIME NOT NULL COMMENT '更新时间',
|
|
219
|
+
|
|
220
|
+
-- 逻辑删除:0-未删除 1-已删除,不做物理删除
|
|
221
|
+
is_deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除:0-未删除 1-已删除',
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
> **注意**:`id` 使用 BIGINT 而非 AUTO_INCREMENT,由应用层(MyBatis Plus ASSIGN_ID)生成雪花 ID。
|
|
225
|
+
|
|
226
|
+
### 数据类型详细指南
|
|
227
|
+
|
|
228
|
+
#### 类型选择原则
|
|
229
|
+
|
|
230
|
+
| 场景 | 推荐类型 | 说明 |
|
|
231
|
+
|------|----------|------|
|
|
232
|
+
| 主键、外键 | `BIGINT` | 统一使用 BIGINT,兼容雪花 ID |
|
|
233
|
+
| 短文本(名称、标题) | `VARCHAR(n)` | 明确指定长度,n ≤ 255 |
|
|
234
|
+
| 长文本(描述、备注) | `VARCHAR(n)` 或 `TEXT` | 长度可预估用 VARCHAR,不可预估用 TEXT |
|
|
235
|
+
| 超长文本(文章内容) | `TEXT` / `LONGTEXT` | 仅在必要时使用 |
|
|
236
|
+
| 金额、价格 | `DECIMAL(p, s)` | 禁止使用 FLOAT / DOUBLE,推荐 DECIMAL(10, 2) |
|
|
237
|
+
| 整数计数 | `INT` | 一般场景 |
|
|
238
|
+
| 小整数(状态、类型) | `TINYINT` | 0-127 范围的枚举值 |
|
|
239
|
+
| 日期时间 | `DATETIME` | 不使用 TIMESTAMP(2038 年问题) |
|
|
240
|
+
| 仅日期 | `DATE` | 如生日、有效日期 |
|
|
241
|
+
| 布尔值 | `TINYINT` | 0 和 1,不使用 BIT |
|
|
242
|
+
| JSON 数据 | `JSON` | MySQL 5.7+ 支持,需要 JSON 查询时使用 |
|
|
243
|
+
| 大字段(图片、文件) | 不存库 | 存储到对象存储(OSS),数据库只存 URL |
|
|
244
|
+
|
|
245
|
+
#### 字段长度建议
|
|
246
|
+
|
|
247
|
+
| 字段类型 | 推荐长度 | 说明 |
|
|
248
|
+
|----------|----------|------|
|
|
249
|
+
| 用户名 | VARCHAR(64) | |
|
|
250
|
+
| 手机号 | VARCHAR(20) | 预留国际号码长度 |
|
|
251
|
+
| 邮箱 | VARCHAR(128) | |
|
|
252
|
+
| URL | VARCHAR(512) | |
|
|
253
|
+
| IP 地址 | VARCHAR(45) | 兼容 IPv6 |
|
|
254
|
+
| 标题 | VARCHAR(200) | |
|
|
255
|
+
| 备注/描述 | VARCHAR(500) | |
|
|
256
|
+
| 订单号 | VARCHAR(32) | |
|
|
257
|
+
| 密码哈希 | VARCHAR(128) | BCrypt 等哈希结果 |
|
|
258
|
+
|
|
259
|
+
### 索引设计详解
|
|
260
|
+
|
|
261
|
+
#### 索引类型
|
|
262
|
+
|
|
263
|
+
| 索引类型 | 使用场景 | DDL 语法 |
|
|
264
|
+
|----------|----------|----------|
|
|
265
|
+
| 主键索引 | 每表必须有 | `PRIMARY KEY (id)` |
|
|
266
|
+
| 唯一索引 | 业务唯一约束 | `UNIQUE KEY uk_xxx (col)` |
|
|
267
|
+
| 普通索引 | 高频查询条件 | `KEY idx_xxx (col)` |
|
|
268
|
+
| 组合索引 | 多条件联合查询 | `KEY idx_xxx (col1, col2)` |
|
|
269
|
+
|
|
270
|
+
#### 索引命名规范
|
|
271
|
+
|
|
272
|
+
| 索引类型 | 前缀 | 示例 |
|
|
273
|
+
|----------|------|------|
|
|
274
|
+
| 主键 | `pk_` | `PRIMARY KEY (id)` |
|
|
275
|
+
| 唯一索引 | `uk_` | `UNIQUE KEY uk_username (username)` |
|
|
276
|
+
| 普通索引 | `idx_` | `KEY idx_user_id (user_id)` |
|
|
277
|
+
| 组合索引 | `idx_` | `KEY idx_status_create_time (status, create_time)` |
|
|
278
|
+
|
|
279
|
+
#### 组合索引最左前缀原则
|
|
280
|
+
|
|
281
|
+
组合索引 `(a, b, c)` 可以满足以下查询:
|
|
282
|
+
- `WHERE a = ?` — 命中
|
|
283
|
+
- `WHERE a = ? AND b = ?` — 命中
|
|
284
|
+
- `WHERE a = ? AND b = ? AND c = ?` — 命中
|
|
285
|
+
- `WHERE b = ?` — 不命中
|
|
286
|
+
- `WHERE b = ? AND c = ?` — 不命中
|
|
287
|
+
|
|
288
|
+
设计组合索引时,将区分度高的列放在前面。
|
|
289
|
+
|
|
290
|
+
#### 覆盖索引
|
|
291
|
+
|
|
292
|
+
当查询的所有字段都在索引中时,MySQL 可以直接从索引中读取数据,无需回表:
|
|
293
|
+
|
|
294
|
+
```sql
|
|
295
|
+
-- 索引: idx_status_create_time (status, create_time)
|
|
296
|
+
-- 覆盖索引查询(只查索引中的字段)
|
|
297
|
+
SELECT status, create_time FROM zz_plt_order WHERE status = 1;
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
#### 索引设计建议
|
|
301
|
+
|
|
302
|
+
1. **高频查询条件**必须建索引(WHERE、JOIN 条件)
|
|
303
|
+
2. **区分度低的字段**不建议单独建索引(如 `status` 只有几个值)
|
|
304
|
+
3. **区分度低 + 高频**可组合其他字段建联合索引
|
|
305
|
+
4. 单表索引数量建议不超过 **5 个**
|
|
306
|
+
5. 索引字段总长度建议不超过 **256 字节**
|
|
307
|
+
6. **频繁更新的字段**不建议建索引
|
|
308
|
+
|
|
309
|
+
### 外键设计原则
|
|
310
|
+
|
|
311
|
+
#### 逻辑外键(推荐)
|
|
312
|
+
|
|
313
|
+
使用逻辑外键,不创建物理外键约束:
|
|
314
|
+
|
|
315
|
+
```sql
|
|
316
|
+
-- 推荐:逻辑外键,不添加 FOREIGN KEY 约束
|
|
317
|
+
CREATE TABLE zz_plt_order_item (
|
|
318
|
+
id BIGINT NOT NULL COMMENT '主键ID',
|
|
319
|
+
order_id BIGINT NOT NULL COMMENT '订单ID', -- 逻辑外键
|
|
320
|
+
product_id BIGINT NOT NULL COMMENT '商品ID', -- 逻辑外键
|
|
321
|
+
...
|
|
322
|
+
PRIMARY KEY (id),
|
|
323
|
+
KEY idx_order_id (order_id)
|
|
324
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单商品明细表';
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
#### 物理外键(禁止)
|
|
328
|
+
|
|
329
|
+
```sql
|
|
330
|
+
-- 禁止:物理外键约束,影响性能和运维
|
|
331
|
+
FOREIGN KEY (order_id) REFERENCES zz_plt_order(id)
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
**原因**:
|
|
335
|
+
- 物理外键影响数据库写入性能
|
|
336
|
+
- 增加数据库运维复杂度(数据迁移、分库分表受限)
|
|
337
|
+
- 级联操作可能导致意外的数据变更
|
|
338
|
+
- 数据完整性由应用层保证
|
|
339
|
+
|
|
340
|
+
### 大表分区策略
|
|
341
|
+
|
|
342
|
+
当预估单表数据量超过 **500 万行**时,考虑分区或分表:
|
|
343
|
+
|
|
344
|
+
#### 时间范围分区
|
|
345
|
+
|
|
346
|
+
适用于日志表、流水表等按时间增长的数据:
|
|
347
|
+
|
|
348
|
+
```sql
|
|
349
|
+
CREATE TABLE zz_plt_operation_log (
|
|
350
|
+
id BIGINT NOT NULL COMMENT '主键ID',
|
|
351
|
+
operation_type VARCHAR(32) NOT NULL COMMENT '操作类型',
|
|
352
|
+
content TEXT COMMENT '操作内容',
|
|
353
|
+
create_time DATETIME NOT NULL default CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
354
|
+
PRIMARY KEY (id, create_time)
|
|
355
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志表'
|
|
356
|
+
PARTITION BY RANGE (TO_DAYS(create_time)) (
|
|
357
|
+
PARTITION p202601 VALUES LESS THAN (TO_DAYS('2026-02-01')),
|
|
358
|
+
PARTITION p202602 VALUES LESS THAN (TO_DAYS('2026-03-01')),
|
|
359
|
+
PARTITION p202603 VALUES LESS THAN (TO_DAYS('2026-04-01')),
|
|
360
|
+
PARTITION pmax VALUES LESS THAN MAXVALUE
|
|
361
|
+
);
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
#### 分表建议
|
|
365
|
+
|
|
366
|
+
当分区无法满足需求时,考虑按业务维度分表:
|
|
367
|
+
|
|
368
|
+
- **按用户 ID 取模分表**:`zz_plt_order_00` ~ `zz_plt_order_15`
|
|
369
|
+
- **按时间分表**:`zz_plt_order_202601` ~ `zz_plt_order_202612`
|
|
370
|
+
|
|
371
|
+
### DDL 完整示例
|
|
372
|
+
|
|
373
|
+
以订单系统为例:
|
|
374
|
+
|
|
375
|
+
```sql
|
|
376
|
+
-- ----------------------------
|
|
377
|
+
-- 订单表
|
|
378
|
+
-- ----------------------------
|
|
379
|
+
CREATE TABLE zz_plt_order (
|
|
380
|
+
id BIGINT NOT NULL COMMENT '主键ID',
|
|
381
|
+
order_no VARCHAR(32) NOT NULL COMMENT '订单号',
|
|
382
|
+
user_id BIGINT NOT NULL COMMENT '用户ID',
|
|
383
|
+
total_amount DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '订单总金额',
|
|
384
|
+
order_status TINYINT NOT NULL DEFAULT 0 COMMENT '订单状态:0-待支付 1-已支付 2-已发货 3-已完成 4-已取消',
|
|
385
|
+
remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
|
|
386
|
+
pay_time DATETIME DEFAULT 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 '更新时间',
|
|
389
|
+
is_deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除:0-未删除 1-已删除',
|
|
390
|
+
PRIMARY KEY (id),
|
|
391
|
+
UNIQUE KEY uk_order_no (order_no),
|
|
392
|
+
KEY idx_user_id (user_id),
|
|
393
|
+
KEY idx_status_create_time (order_status, create_time)
|
|
394
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
|
|
395
|
+
|
|
396
|
+
-- ----------------------------
|
|
397
|
+
-- 订单商品明细表
|
|
398
|
+
-- ----------------------------
|
|
399
|
+
CREATE TABLE zz_plt_order_item (
|
|
400
|
+
id BIGINT NOT NULL COMMENT '主键ID',
|
|
401
|
+
order_id BIGINT NOT NULL COMMENT '订单ID',
|
|
402
|
+
product_id BIGINT NOT NULL COMMENT '商品ID',
|
|
403
|
+
product_name VARCHAR(200) NOT NULL COMMENT '商品名称',
|
|
404
|
+
quantity INT NOT NULL DEFAULT 1 COMMENT '数量',
|
|
405
|
+
unit_price DECIMAL(10, 2) NOT NULL COMMENT '单价',
|
|
406
|
+
subtotal DECIMAL(10, 2) 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 '更新时间',
|
|
409
|
+
is_deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除:0-未删除 1-已删除',
|
|
410
|
+
PRIMARY KEY (id),
|
|
411
|
+
KEY idx_order_id (order_id),
|
|
412
|
+
KEY idx_product_id (product_id)
|
|
413
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单商品明细表';
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
### 设计审查清单
|
|
417
|
+
|
|
418
|
+
设计完成后,按以下清单逐项检查:
|
|
419
|
+
|
|
420
|
+
#### 表结构审查
|
|
421
|
+
|
|
422
|
+
- [ ] 表名符合 `{部门}_{业务域}_{实体}` 命名规范
|
|
423
|
+
- [ ] 字段名符合 snake_case 命名规范
|
|
424
|
+
- [ ] 包含 `id`, `create_time`, `update_time`, `is_deleted` 四个必需字段
|
|
425
|
+
- [ ] `id` 使用 `BIGINT NOT NULL`,不自增
|
|
426
|
+
- [ ] 每个字段都有 `COMMENT` 注释
|
|
427
|
+
- [ ] 字段类型选择合理(金额用 DECIMAL,时间用 DATETIME)
|
|
428
|
+
- [ ] VARCHAR 长度合理,不过大也不过小
|
|
429
|
+
- [ ] NOT NULL / DEFAULT 约束合理
|
|
430
|
+
- [ ] 表有 `COMMENT` 注释
|
|
431
|
+
- [ ] 字符集使用 `utf8mb4`
|
|
432
|
+
|
|
433
|
+
#### 索引审查
|
|
434
|
+
|
|
435
|
+
- [ ] 主键索引存在
|
|
436
|
+
- [ ] 业务唯一字段有唯一索引
|
|
437
|
+
- [ ] 高频查询条件有索引覆盖
|
|
438
|
+
- [ ] 外键字段有普通索引
|
|
439
|
+
- [ ] 组合索引遵循最左前缀原则
|
|
440
|
+
- [ ] 索引命名符合 `uk_` / `idx_` 前缀规范
|
|
441
|
+
- [ ] 单表索引数量不超过 5 个
|
|
442
|
+
- [ ] 无冗余索引(已被其他组合索引覆盖的单列索引)
|
|
443
|
+
|
|
444
|
+
#### 关联关系审查
|
|
445
|
+
|
|
446
|
+
- [ ] 使用逻辑外键,无物理 FOREIGN KEY 约束
|
|
447
|
+
- [ ] 外键字段类型与引用表主键类型一致(BIGINT)
|
|
448
|
+
- [ ] 关联关系在 COMMENT 中说明
|
|
449
|
+
|
|
450
|
+
### 最佳实践
|
|
451
|
+
|
|
452
|
+
1. **先理解业务再建表** — 充分理解业务需求后再设计表结构,避免反复修改
|
|
453
|
+
2. **适度冗余** — 允许适度的数据冗余以减少 JOIN 查询(如订单表存商品名称)
|
|
454
|
+
3. **预留扩展** — 状态字段使用 TINYINT 而非 ENUM,方便扩展
|
|
455
|
+
4. **避免过度设计** — 不要为不确定的未来需求添加字段
|
|
456
|
+
5. **字段默认值** — 尽量为字段设置合理的默认值
|
|
457
|
+
6. **注释完整** — 每个字段和表都要有清晰的中文注释
|
|
458
|
+
7. **金额用分** — 如果精度要求高,可以考虑用 BIGINT 存储分,避免浮点精度问题
|
|
459
|
+
8. **状态值说明** — 状态字段的 COMMENT 中列出所有可能的值及含义
|
|
460
|
+
|
|
461
|
+
### 常见问题解答
|
|
462
|
+
|
|
463
|
+
#### Q: VARCHAR 和 TEXT 如何选择?
|
|
464
|
+
|
|
465
|
+
- 长度可预估且 ≤ 65535 字节:使用 `VARCHAR(n)`
|
|
466
|
+
- 长度不可预估或超长内容:使用 `TEXT`
|
|
467
|
+
- VARCHAR 可以建索引,TEXT 只能建前缀索引
|
|
468
|
+
- VARCHAR 参与排序和分组性能优于 TEXT
|
|
469
|
+
|
|
470
|
+
#### Q: DATETIME 和 TIMESTAMP 如何选择?
|
|
471
|
+
|
|
472
|
+
推荐统一使用 `DATETIME`:
|
|
473
|
+
- DATETIME 范围:1000-01-01 ~ 9999-12-31
|
|
474
|
+
- TIMESTAMP 范围:1970-01-01 ~ 2038-01-19(存在 2038 年问题)
|
|
475
|
+
- DATETIME 不受时区影响,存什么取什么
|
|
476
|
+
- TIMESTAMP 自动时区转换,跨时区可能导致混乱
|
|
477
|
+
|
|
478
|
+
#### Q: 如何处理枚举值字段?
|
|
479
|
+
|
|
480
|
+
推荐使用 `TINYINT` + COMMENT 说明:
|
|
481
|
+
|
|
482
|
+
```sql
|
|
483
|
+
-- 推荐
|
|
484
|
+
order_status TINYINT NOT NULL DEFAULT 0 COMMENT '订单状态:0-待支付 1-已支付 2-已发货 3-已完成 4-已取消'
|
|
485
|
+
|
|
486
|
+
-- 不推荐:MySQL ENUM 类型
|
|
487
|
+
order_status ENUM('PENDING', 'PAID', 'SHIPPED') COMMENT '订单状态'
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
原因:TINYINT 更灵活,新增枚举值不需要 ALTER TABLE。
|
|
491
|
+
|
|
492
|
+
#### Q: 需要存储树形结构怎么设计?
|
|
493
|
+
|
|
494
|
+
推荐使用 `parent_id` 邻接表模式:
|
|
495
|
+
|
|
496
|
+
```sql
|
|
497
|
+
CREATE TABLE zz_plt_department (
|
|
498
|
+
id BIGINT NOT NULL COMMENT '主键ID',
|
|
499
|
+
parent_id BIGINT NOT NULL DEFAULT 0 COMMENT '父级ID,顶级为0',
|
|
500
|
+
name VARCHAR(100) NOT NULL COMMENT '部门名称',
|
|
501
|
+
sort INT NOT NULL DEFAULT 0 COMMENT '排序号',
|
|
502
|
+
...
|
|
503
|
+
KEY idx_parent_id (parent_id)
|
|
504
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='部门表';
|
|
505
|
+
```
|
|
506
|
+
|
|
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
|
+
```
|