@nebula-skills/nebula-code-standards 0.1.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 +45 -0
- package/bin/cli.cjs +50 -0
- package/package.json +45 -0
- package/scripts/postinstall.cjs +18 -0
- package/skill/SKILL.md +133 -0
- package/skill/backend-standards.md +611 -0
- package/skill/boot-components-catalog.md +546 -0
- package/skill/db-standards.md +232 -0
- package/skill/framework-standards.md +610 -0
- package/skill/frontend-standards.md +310 -0
- package/skill/full-crud-example.md +608 -0
- package/skill/init-new-project.md +842 -0
- package/skill/microapp-guide.md +510 -0
- package/skill/pitfalls-checklist.md +188 -0
- package/skill/rpc-api-reference.md +313 -0
- package/skill/upgrade-decision.md +151 -0
- package/skill/workspace-overview.md +194 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# 数据库设计规范
|
|
2
|
+
|
|
3
|
+
> 适用于所有 Nebula 框架业务项目的数据库脚本编写规范。
|
|
4
|
+
|
|
5
|
+
## 一、Flyway 版本文件命名
|
|
6
|
+
|
|
7
|
+
脚本存放路径:`{项目}-server/src/main/resources/db/migration/`
|
|
8
|
+
|
|
9
|
+
命名格式:`V{大版本}.{小版本}.{补丁}__{描述}.sql`
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
V1.0.0__init_t_demo.sql # 建表 DDL
|
|
13
|
+
V1.0.1__add_column_xxx.sql # 字段变更(新增列、修改注释等)
|
|
14
|
+
V1.0.2__init_demo_menu_data.sql # 菜单/字典初始化 DML
|
|
15
|
+
V1.0.3__alter_t_demo_index.sql # 索引调整
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**规则:**
|
|
19
|
+
- 版本号必须严格递增,**已提交的脚本文件绝对不可修改**
|
|
20
|
+
- 双下划线 `__` 分隔版本号与描述
|
|
21
|
+
- 描述用英文蛇形命名,简洁说明变更内容
|
|
22
|
+
- 一次发布对应一个文件,不拆分多文件(除非必要)
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 二、DDL 建表规范
|
|
27
|
+
|
|
28
|
+
### 2.1 表命名
|
|
29
|
+
|
|
30
|
+
- 格式:`t_{业务名蛇形}`
|
|
31
|
+
- 示例:`t_demo`、`t_customer`、`t_order_detail`
|
|
32
|
+
- 系统表使用 `sys_` 前缀(如 `sys_user`、`sys_menu`)
|
|
33
|
+
|
|
34
|
+
### 2.2 公共字段(必须包含,顺序固定)
|
|
35
|
+
|
|
36
|
+
每张业务表必须包含来自 `BaseEntity` 的 **11 个公共字段**,**顺序固定,且全部集中置于业务字段之前**(不可与业务字段交错排列)。
|
|
37
|
+
|
|
38
|
+
**11 个公共字段快速对照(建表前逐一检查,带 ⚠️ 的是高频遗漏项):**
|
|
39
|
+
|
|
40
|
+
| # | 列名 | 类型约束 | 易遗漏 |
|
|
41
|
+
|---|------|---------|--------|
|
|
42
|
+
| 1 | `id` | `BIGINT NOT NULL` | — |
|
|
43
|
+
| 2 | `tenant_id` | `BIGINT DEFAULT NULL` | — |
|
|
44
|
+
| 3 | `create_user_id` | `BIGINT DEFAULT NULL` | — |
|
|
45
|
+
| 4 | `creator` | `VARCHAR(128) DEFAULT NULL` | — |
|
|
46
|
+
| 5 | `create_time` | `DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6)` | — |
|
|
47
|
+
| 6 | `modify_user_id` | `BIGINT DEFAULT NULL` | — |
|
|
48
|
+
| 7 | `updater` | `VARCHAR(128) DEFAULT NULL` | — |
|
|
49
|
+
| 8 | `modify_time` | `DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)` | — |
|
|
50
|
+
| 9 | `delete_flag` | `INT NOT NULL DEFAULT 0` | — |
|
|
51
|
+
| 10 | `remark` | `VARCHAR(500) DEFAULT NULL` | ⚠️ 容易遗漏 |
|
|
52
|
+
| 11 | `custom_fields` | `TEXT DEFAULT NULL` | ⚠️ 容易遗漏 |
|
|
53
|
+
|
|
54
|
+
> **常见错误**:只写到 `delete_flag` 就结束,漏掉 `remark` 和 `custom_fields`。这会导致 MyBatis-Plus 自动填充时找不到列,运行时报错。
|
|
55
|
+
|
|
56
|
+
```sql
|
|
57
|
+
CREATE TABLE IF NOT EXISTS `t_demo`
|
|
58
|
+
(
|
|
59
|
+
-- ========== 公共字段(对应 BaseEntity,顺序固定,不可省略) ==========
|
|
60
|
+
`id` BIGINT NOT NULL COMMENT '主键(雪花算法)',
|
|
61
|
+
`tenant_id` BIGINT DEFAULT NULL COMMENT '租户ID(多租户行级隔离)',
|
|
62
|
+
`create_user_id` BIGINT DEFAULT NULL COMMENT '创建人ID',
|
|
63
|
+
`creator` VARCHAR(128) DEFAULT NULL COMMENT '创建人用户名',
|
|
64
|
+
`create_time` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
|
|
65
|
+
`modify_user_id` BIGINT DEFAULT NULL COMMENT '最后修改人ID',
|
|
66
|
+
`updater` VARCHAR(128) DEFAULT NULL COMMENT '最后修改人用户名',
|
|
67
|
+
`modify_time` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '最后修改时间',
|
|
68
|
+
`delete_flag` INT NOT NULL DEFAULT 0 COMMENT '逻辑删除(0:未删除 1:已删除)',
|
|
69
|
+
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注', -- ⚠️ 不可省略
|
|
70
|
+
`custom_fields` TEXT DEFAULT NULL COMMENT '自定义扩展字段(JSON)', -- ⚠️ 不可省略
|
|
71
|
+
|
|
72
|
+
-- ========== 业务字段(放公共字段之后) ==========
|
|
73
|
+
`demo_name` VARCHAR(100) NOT NULL COMMENT '示例名称',
|
|
74
|
+
`demo_code` VARCHAR(50) NOT NULL COMMENT '示例编码(租户内唯一)',
|
|
75
|
+
`demo_type` VARCHAR(20) DEFAULT NULL COMMENT '示例类型(A:类型A B:类型B)',
|
|
76
|
+
`status` INT NOT NULL DEFAULT 0 COMMENT '状态(0:正常 1:禁用)',
|
|
77
|
+
|
|
78
|
+
PRIMARY KEY (`id`),
|
|
79
|
+
UNIQUE KEY `uk_tenant_demo_code` (`tenant_id`, `demo_code`),
|
|
80
|
+
KEY `idx_demo_name` (`demo_name`),
|
|
81
|
+
KEY `idx_status` (`status`)
|
|
82
|
+
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='示例表';
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 2.3 公共字段 Java 映射(BaseEntity 自动填充)
|
|
86
|
+
|
|
87
|
+
| SQL 字段 | Java 属性 | 填充时机 | 说明 |
|
|
88
|
+
|---------|-----------|---------|------|
|
|
89
|
+
| `id` | `id` | INSERT | 雪花算法,无需手动赋值 |
|
|
90
|
+
| `tenant_id` | `tenantId` | INSERT | 从 TenantContext 自动获取 |
|
|
91
|
+
| `create_user_id` | `createUserId` | INSERT | 自动填充 |
|
|
92
|
+
| `creator` | `creator` | INSERT | 创建人用户名,自动填充 |
|
|
93
|
+
| `create_time` | `createTime` | INSERT | 自动填充 |
|
|
94
|
+
| `modify_user_id` | `modifyUserId` | INSERT+UPDATE | 自动填充 |
|
|
95
|
+
| `updater` | `updater` | INSERT+UPDATE | 最后修改人,自动填充 |
|
|
96
|
+
| `modify_time` | `modifyTime` | INSERT+UPDATE | 自动填充 |
|
|
97
|
+
| `delete_flag` | `deleteFlag` | 逻辑删除标记 | `@TableLogic`,查询自动追加 `AND delete_flag=0` |
|
|
98
|
+
| `remark` | `remark` | 手动赋值 | 通用备注 |
|
|
99
|
+
| `custom_fields` | `customFields` | 手动赋值 | JSON 扩展字段,配合表单设计器 |
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 三、字段设计规范
|
|
104
|
+
|
|
105
|
+
### 3.1 字段类型映射
|
|
106
|
+
|
|
107
|
+
| 数据库类型 | Java 类型 | 适用场景 |
|
|
108
|
+
|-----------|-----------|---------|
|
|
109
|
+
| `VARCHAR(N)` | `String` | 字符串,N 根据业务设定 |
|
|
110
|
+
| `TEXT` | `String` | 长文本(> 500 字符)|
|
|
111
|
+
| `INT` | `Integer` | 整数(状态、数量等)|
|
|
112
|
+
| `BIGINT` | `Long` | 主键、ID、大整数 |
|
|
113
|
+
| `DATETIME` | `LocalDateTime` | 日期时间 |
|
|
114
|
+
| `DATE` | `LocalDate` | 仅日期 |
|
|
115
|
+
| `DECIMAL(M,D)` | `BigDecimal` | 金额、精确小数(禁止用 Double)|
|
|
116
|
+
| `TINYINT(1)` | `Boolean` | 布尔值(可选,也可用 INT)|
|
|
117
|
+
|
|
118
|
+
### 3.2 字段命名
|
|
119
|
+
|
|
120
|
+
- 数据库列:蛇形命名,如 `demo_name`、`create_time`
|
|
121
|
+
- Java 字段:驼峰命名,如 `demoName`、`createTime`
|
|
122
|
+
- MyBatis-Plus 全局开启 `camel-case-column-map`,自动完成两者映射
|
|
123
|
+
|
|
124
|
+
### 3.3 枚举值约定
|
|
125
|
+
|
|
126
|
+
枚举值使用整数存储,字段注释中说明含义:
|
|
127
|
+
|
|
128
|
+
```sql
|
|
129
|
+
`status` INT NOT NULL DEFAULT 0 COMMENT '状态(0:正常 1:禁用)',
|
|
130
|
+
`order_type` INT DEFAULT NULL COMMENT '订单类型(1:普通订单 2:定制订单 3:补单)',
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 3.4 状态字段
|
|
134
|
+
|
|
135
|
+
- 通用状态字段名:`status`
|
|
136
|
+
- 约定:`0` 为正常/启用,`1` 为禁用/停用
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## 四、索引设计规范
|
|
141
|
+
|
|
142
|
+
| 索引类型 | 命名格式 | 示例 |
|
|
143
|
+
|---------|---------|------|
|
|
144
|
+
| 主键 | `PRIMARY KEY (id)` | — |
|
|
145
|
+
| 唯一键 | `uk_{表简称}_{列名}` | `uk_tenant_demo_code` |
|
|
146
|
+
| 普通索引 | `idx_{列名}` | `idx_demo_name`、`idx_status` |
|
|
147
|
+
| 联合索引 | `idx_{列1}_{列2}` | `idx_tenant_status` |
|
|
148
|
+
|
|
149
|
+
**多租户唯一键必须包含 `tenant_id`:**
|
|
150
|
+
```sql
|
|
151
|
+
UNIQUE KEY `uk_tenant_demo_code` (`tenant_id`, `demo_code`)
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## 五、菜单与字典 DML 规范
|
|
157
|
+
|
|
158
|
+
### 5.1 存放位置
|
|
159
|
+
|
|
160
|
+
**菜单和字典 DML 维护在 `nebula-system` 项目的迁移脚本中**,不放在业务服务的迁移脚本里:
|
|
161
|
+
```
|
|
162
|
+
nebula-system-server/src/main/resources/db/migration/
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### 5.2 菜单插入模板
|
|
166
|
+
|
|
167
|
+
```sql
|
|
168
|
+
-- 一级目录菜单({业务中文名}:替换为当前项目名,{domain} 替换为业务域)
|
|
169
|
+
INSERT INTO sys_menu (id, parent_id, menu_type, menu_name, perms, path, component, sort_order, visible, status)
|
|
170
|
+
VALUES (40000, 0, 'M', '{业务中文名}', '', '/{domain}app', '', 10, 1, 1);
|
|
171
|
+
|
|
172
|
+
-- 二级功能菜单
|
|
173
|
+
INSERT INTO sys_menu (id, parent_id, menu_type, menu_name, perms, path, component, sort_order, visible, status)
|
|
174
|
+
VALUES (40001, 40000, 'C', '示例管理', '{domain}:demo:query', '/{domain}app/demo', '{domain}app/demo', 1, 1, 1);
|
|
175
|
+
|
|
176
|
+
-- 权限按钮(menu_type = 'F')
|
|
177
|
+
INSERT INTO sys_menu (id, parent_id, menu_type, menu_name, perms, sort_order)
|
|
178
|
+
VALUES (40010, 40001, 'F', '新增', '{domain}:demo:create', 1);
|
|
179
|
+
|
|
180
|
+
INSERT INTO sys_menu (id, parent_id, menu_type, menu_name, perms, sort_order)
|
|
181
|
+
VALUES (40011, 40001, 'F', '修改', '{domain}:demo:update', 2);
|
|
182
|
+
|
|
183
|
+
INSERT INTO sys_menu (id, parent_id, menu_type, menu_name, perms, sort_order)
|
|
184
|
+
VALUES (40012, 40001, 'F', '删除', '{domain}:demo:delete', 3);
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
**权限标识格式:** `{业务域}:{资源}:{操作}`
|
|
188
|
+
|
|
189
|
+
常用操作:`query`(查询)、`create`(新增)、`update`(修改)、`delete`(删除)、`export`(导出)
|
|
190
|
+
|
|
191
|
+
### 5.3 字典插入模板
|
|
192
|
+
|
|
193
|
+
```sql
|
|
194
|
+
-- 字典类型
|
|
195
|
+
INSERT INTO sys_dict_type (id, dict_name, type_code, status, remark)
|
|
196
|
+
VALUES (100, '示例类型', 'demo_type', 0, '示例模块使用的类型字典');
|
|
197
|
+
|
|
198
|
+
-- 字典项
|
|
199
|
+
INSERT INTO sys_dict_item (dict_type_id, item_label, item_value, sort_order, status)
|
|
200
|
+
VALUES (100, '类型A', 'A', 1, 0);
|
|
201
|
+
|
|
202
|
+
INSERT INTO sys_dict_item (dict_type_id, item_label, item_value, sort_order, status)
|
|
203
|
+
VALUES (100, '类型B', 'B', 2, 0);
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## 六、字段变更脚本规范
|
|
209
|
+
|
|
210
|
+
```sql
|
|
211
|
+
-- 新增列(安全,不影响现有数据)
|
|
212
|
+
ALTER TABLE `t_demo`
|
|
213
|
+
ADD COLUMN `new_field` VARCHAR(100) DEFAULT NULL COMMENT '新字段说明'
|
|
214
|
+
AFTER `demo_code`; -- 指定插入位置
|
|
215
|
+
|
|
216
|
+
-- 修改列注释(不修改类型,最安全)
|
|
217
|
+
ALTER TABLE `t_demo`
|
|
218
|
+
MODIFY COLUMN `status` INT NOT NULL DEFAULT 0 COMMENT '状态(0:正常 1:禁用 2:待审核)';
|
|
219
|
+
|
|
220
|
+
-- 新增索引
|
|
221
|
+
ALTER TABLE `t_demo`
|
|
222
|
+
ADD INDEX `idx_new_field` (`new_field`);
|
|
223
|
+
|
|
224
|
+
-- 新增唯一键
|
|
225
|
+
ALTER TABLE `t_demo`
|
|
226
|
+
ADD UNIQUE KEY `uk_tenant_new_field` (`tenant_id`, `new_field`);
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
**注意:**
|
|
230
|
+
- 生产环境禁止 DROP COLUMN / DROP TABLE(需单独审批)
|
|
231
|
+
- 不允许修改已提交的 Flyway 脚本,必须新建版本文件来变更
|
|
232
|
+
- 字段变更后对应更新 Java DO 类和相关 VO 类
|