@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.
Files changed (72) hide show
  1. package/docs/exam-question-generate-api.md +163 -0
  2. package/package.json +1 -1
  3. package/src/prompts.js +3 -3
  4. package/src/transform.js +1 -1
  5. package/templates/.claude/skills/avatar-boot-starter-feign/README.md +243 -0
  6. package/templates/.claude/skills/avatar-boot-starter-feign/SKILL.md +47 -219
  7. package/templates/.claude/skills/avatar-boot-starter-feign/references//345/212/237/350/203/275/350/257/246/350/247/243.md +65 -0
  8. 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
  9. package/templates/.claude/skills/avatar-boot-starter-feign/references//351/205/215/347/275/256/345/217/202/350/200/203.md +70 -0
  10. package/templates/.claude/skills/avatar-boot-starter-job/README.md +437 -0
  11. package/templates/.claude/skills/avatar-boot-starter-job/SKILL.md +35 -414
  12. package/templates/.claude/skills/avatar-boot-starter-job/references//345/270/270/350/247/201/351/227/256/351/242/230.md +55 -0
  13. 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
  14. package/templates/.claude/skills/avatar-boot-starter-job/references//347/233/221/346/216/247/346/214/207/346/240/207.md +72 -0
  15. package/templates/.claude/skills/avatar-boot-starter-kafka/README.md +580 -0
  16. package/templates/.claude/skills/avatar-boot-starter-kafka/SKILL.md +36 -560
  17. package/templates/.claude/skills/avatar-boot-starter-kafka/references//346/234/200/344/275/263/345/256/236/350/267/265.md +43 -0
  18. package/templates/.claude/skills/avatar-boot-starter-kafka/references//346/240/270/345/277/203/345/212/237/350/203/275.md +117 -0
  19. package/templates/.claude/skills/avatar-boot-starter-kafka/references//351/205/215/347/275/256/345/217/202/350/200/203.md +54 -0
  20. package/templates/.claude/skills/avatar-boot-starter-mysql/README.md +572 -0
  21. package/templates/.claude/skills/avatar-boot-starter-mysql/SKILL.md +40 -550
  22. 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
  23. 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
  24. 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
  25. package/templates/.claude/skills/avatar-boot-starter-nacos/README.md +901 -0
  26. package/templates/.claude/skills/avatar-boot-starter-nacos/SKILL.md +40 -879
  27. package/templates/.claude/skills/avatar-boot-starter-nacos/references//345/212/237/350/203/275/344/275/277/347/224/250.md +134 -0
  28. 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
  29. package/templates/.claude/skills/avatar-boot-starter-nacos/references//346/225/205/351/232/234/346/216/222/346/237/245.md +64 -0
  30. package/templates/.claude/skills/avatar-boot-starter-oss/README.md +594 -0
  31. package/templates/.claude/skills/avatar-boot-starter-oss/SKILL.md +52 -570
  32. 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
  33. package/templates/.claude/skills/avatar-boot-starter-oss/references//346/240/270/345/277/203/345/212/237/350/203/275.md +94 -0
  34. 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
  35. package/templates/.claude/skills/avatar-boot-starter-redis/README.md +586 -0
  36. package/templates/.claude/skills/avatar-boot-starter-redis/SKILL.md +42 -566
  37. 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
  38. package/templates/.claude/skills/avatar-boot-starter-redis/references//346/225/260/346/215/256/346/223/215/344/275/234.md +111 -0
  39. package/templates/.claude/skills/avatar-boot-starter-redis/references//351/253/230/347/272/247/345/212/237/350/203/275.md +90 -0
  40. package/templates/.claude/skills/avatar-boot-starter-rocketmq/README.md +662 -0
  41. package/templates/.claude/skills/avatar-boot-starter-rocketmq/SKILL.md +48 -640
  42. package/templates/.claude/skills/avatar-boot-starter-rocketmq/references//346/240/270/345/277/203/345/212/237/350/203/275.md +101 -0
  43. 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
  44. package/templates/.claude/skills/avatar-boot-starter-rocketmq/references//351/253/230/347/272/247/347/211/271/346/200/247.md +71 -0
  45. package/templates/.claude/skills/avatar-boot-starter-web/README.md +1007 -0
  46. package/templates/.claude/skills/avatar-boot-starter-web/SKILL.md +150 -1003
  47. 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
  48. 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
  49. 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
  50. 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
  51. 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
  52. 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
  53. package/templates/.claude/skills/avatar-boot-starter-web/references//346/263/250/346/204/217/344/272/213/351/241/271.md +68 -0
  54. 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
  55. package/templates/.claude/skills/avatar-boot-starter-web/references//351/205/215/347/275/256/345/217/202/350/200/203.md +107 -0
  56. package/templates/.claude/skills/crud-generator/SKILL.md +133 -64
  57. package/templates/.claude/skills/database-design/README.md +207 -0
  58. package/templates/.claude/skills/database-design/SKILL.md +469 -82
  59. package/templates/.claude/skills/database-design/references//345/221/275/345/220/215/350/247/204/350/214/203.md +232 -0
  60. 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
  61. package/templates/.claude/skills/database-design/references//347/264/242/345/274/225/350/247/204/350/214/203.md +506 -0
  62. package/templates/README.md +65 -100
  63. package/templates/avatar-scaffold-api/pom.xml +0 -5
  64. package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/api/LoginFeignClient.java +2 -0
  65. package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/exception/LoginErrorCode.java +25 -0
  66. package/templates/avatar-scaffold-service/pom.xml +25 -87
  67. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/feign/DemoFeign.java +4 -1
  68. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/UserLoginRepository.java +10 -0
  69. package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/mapper/UserLoginMapper.java +4 -1
  70. package/templates/avatar-scaffold-service/src/main/resources/application-dev.yaml +3 -5
  71. package/templates/avatar-scaffold-service/src/main/resources/application-local.yaml +21 -21
  72. 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
- # 数据库设计技能 (Database Design Skill)
8
+ # MySQL 建表语句生成器
9
9
 
10
- ## 概述
10
+ 你是 Avatar Boot MySQL 建表规范的专家助手,帮助开发者快速生成符合规范的标准建表语句。
11
11
 
12
- 本技能根据业务需求描述,生成符合 Avatar Boot 项目规范的数据库表 DDL、索引设计和优化建议。输出可直接用于 CRUD 代码生成。
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
- - 订单信息:订单号、用户ID、订单金额、订单状态、备注
23
- - 订单商品明细:关联订单、商品ID、商品名称、数量、单价、小计
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
- 1. **DDL 建表语句** 完整的 CREATE TABLE 语句
32
- 2. **索引建议** — 索引设计及理由
33
- 3. **设计说明** 关键设计决策的说明
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 全小写 | 统一使用下划线分隔 | `t_user_order` | `T_UserOrder`, `tUserOrder` |
44
- | 模块前缀 `t_` | 所有业务表以 `t_` 开头 | `t_user` | `user`, `tb_user` |
45
- | 有意义的英文名词 | 清晰表达表的业务含义 | `t_order_item` | `t_oi`, `t_table1` |
46
- | 关联表命名 | 两个实体名拼接 | `t_user_role` | `t_ur` |
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
- | 时间字段 `_time` 后缀 | 表示时间的字段 | `create_time`, `pay_time` | `created`, `payDate` |
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
- > 注意:`id` 使用 BIGINT 而非 AUTO_INCREMENT,由应用层(MyBatis Plus ASSIGN_ID)生成雪花 ID。
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 t_order WHERE status = 1;
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 t_order_item (
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 t_order(id)
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 t_operation_log (
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 取模分表**:`t_order_00` ~ `t_order_15`
231
- - **按时间分表**:`t_order_202601` ~ `t_order_202612`
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 t_order (
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 t_order_item (
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
- - [ ] 表名符合 `t_模块_实体` 命名规范
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
- ### Q: VARCHAR 和 TEXT 如何选择?
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
- ### Q: DATETIME 和 TIMESTAMP 如何选择?
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
- ### Q: 如何处理枚举值字段?
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
- ### Q: 需要存储树形结构怎么设计?
492
+ #### Q: 需要存储树形结构怎么设计?
363
493
 
364
494
  推荐使用 `parent_id` 邻接表模式:
365
495
 
366
496
  ```sql
367
- CREATE TABLE t_department (
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
+ ```