befly 3.9.12 → 3.9.13
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/README.md +85 -0
- package/docs/addon.md +512 -0
- package/docs/api.md +1368 -0
- package/docs/cipher.md +580 -0
- package/docs/config.md +638 -0
- package/docs/examples.md +799 -0
- package/docs/hook.md +754 -0
- package/docs/logger.md +495 -0
- package/docs/plugin.md +978 -0
- package/docs/quickstart.md +331 -0
- package/docs/sync.md +586 -0
- package/docs/table.md +765 -0
- package/docs/validator.md +588 -0
- package/package.json +3 -3
- package/sync/syncDb/apply.ts +1 -1
- package/sync/syncDb/constants.ts +0 -11
- package/sync/syncDb/helpers.ts +0 -1
- package/sync/syncDb/table.ts +2 -2
- package/sync/syncDb/tableCreate.ts +3 -3
- package/tests/syncDb-constants.test.ts +1 -23
- package/tests/syncDb-helpers.test.ts +0 -1
- package/types/database.d.ts +0 -2
package/docs/sync.md
ADDED
|
@@ -0,0 +1,586 @@
|
|
|
1
|
+
# Sync 同步命令
|
|
2
|
+
|
|
3
|
+
> 数据库结构、API路由、菜单配置、开发账户同步
|
|
4
|
+
|
|
5
|
+
## 目录
|
|
6
|
+
|
|
7
|
+
- [概述](#概述)
|
|
8
|
+
- [syncAll 全量同步](#syncall-全量同步)
|
|
9
|
+
- [syncDb 数据库同步](#syncdb-数据库同步)
|
|
10
|
+
- [syncApi 接口同步](#syncapi-接口同步)
|
|
11
|
+
- [syncMenu 菜单同步](#syncmenu-菜单同步)
|
|
12
|
+
- [syncDev 开发账户同步](#syncdev-开发账户同步)
|
|
13
|
+
- [命令行使用](#命令行使用)
|
|
14
|
+
- [表名规则](#表名规则)
|
|
15
|
+
- [注意事项](#注意事项)
|
|
16
|
+
- [FAQ](#faq)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 概述
|
|
21
|
+
|
|
22
|
+
Sync 同步系统用于将代码定义同步到数据库,包括:
|
|
23
|
+
|
|
24
|
+
| 命令 | 功能 | 目标表 |
|
|
25
|
+
| ---------- | ----------------- | --------------------------------------- |
|
|
26
|
+
| `syncDb` | 同步表结构定义 | 所有业务表 |
|
|
27
|
+
| `syncApi` | 同步 API 路由信息 | `addon_admin_api` |
|
|
28
|
+
| `syncMenu` | 同步菜单配置 | `addon_admin_menu` |
|
|
29
|
+
| `syncDev` | 创建开发者账户 | `addon_admin_role`, `addon_admin_admin` |
|
|
30
|
+
| `syncAll` | 依次执行以上全部 | - |
|
|
31
|
+
|
|
32
|
+
**执行顺序**:`checkApp` → `syncDb` → `syncApi` → `syncMenu` → `syncDev`
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## syncAll 全量同步
|
|
37
|
+
|
|
38
|
+
一键执行所有同步命令:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# 执行全量同步
|
|
42
|
+
befly sync
|
|
43
|
+
|
|
44
|
+
# 等同于依次执行:
|
|
45
|
+
# 1. checkApp - 检查应用配置
|
|
46
|
+
# 2. syncDb - 同步数据库表结构
|
|
47
|
+
# 3. syncApi - 同步 API 路由
|
|
48
|
+
# 4. syncMenu - 同步菜单配置
|
|
49
|
+
# 5. syncDev - 同步开发账户
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**执行流程**:
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
┌──────────────────────────────────────────────────┐
|
|
56
|
+
│ syncAll │
|
|
57
|
+
├──────────────────────────────────────────────────┤
|
|
58
|
+
│ 1. checkApp() 检查应用配置是否完整 │
|
|
59
|
+
│ ↓ │
|
|
60
|
+
│ 2. syncDbCommand() 同步数据库表结构 │
|
|
61
|
+
│ ↓ │
|
|
62
|
+
│ 3. syncApiCommand() 同步 API 路由到数据库 │
|
|
63
|
+
│ ↓ │
|
|
64
|
+
│ 4. syncMenuCommand() 同步菜单配置到数据库 │
|
|
65
|
+
│ ↓ │
|
|
66
|
+
│ 5. syncDevCommand() 创建/更新开发者账户 │
|
|
67
|
+
└──────────────────────────────────────────────────┘
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## syncDb 数据库同步
|
|
73
|
+
|
|
74
|
+
将 `tables/*.json` 表定义同步到数据库结构。
|
|
75
|
+
|
|
76
|
+
### 基本用法
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# 同步所有表
|
|
80
|
+
befly sync:db
|
|
81
|
+
|
|
82
|
+
# 只同步指定表
|
|
83
|
+
befly sync:db --table user
|
|
84
|
+
|
|
85
|
+
# 强制模式(允许破坏性操作)
|
|
86
|
+
befly sync:db --force
|
|
87
|
+
|
|
88
|
+
# 预览模式(仅显示变更,不执行)
|
|
89
|
+
befly sync:db --dry-run
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 命令选项
|
|
93
|
+
|
|
94
|
+
| 选项 | 类型 | 默认值 | 说明 |
|
|
95
|
+
| ----------- | ------- | ------ | -------------------- |
|
|
96
|
+
| `--table` | string | - | 只同步指定表 |
|
|
97
|
+
| `--force` | boolean | false | 强制模式,允许删除列 |
|
|
98
|
+
| `--dry-run` | boolean | false | 预览模式,不实际执行 |
|
|
99
|
+
|
|
100
|
+
### 同步逻辑
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
┌─────────────────────────────────────────────────────┐
|
|
104
|
+
│ syncDb │
|
|
105
|
+
├─────────────────────────────────────────────────────┤
|
|
106
|
+
│ 1. 设置数据库类型 (setDbType) │
|
|
107
|
+
│ 2. 检查表定义完整性 (checkTable) │
|
|
108
|
+
│ 3. 连接数据库 (Connect.connectSql) │
|
|
109
|
+
│ 4. 确保版本表存在 (ensureDbVersion) │
|
|
110
|
+
│ ↓ │
|
|
111
|
+
│ 5. 扫描表定义文件: │
|
|
112
|
+
│ - 项目表:tpl/tables/*.json │
|
|
113
|
+
│ - Addon 表:addons/*/tables/*.json │
|
|
114
|
+
│ ↓ │
|
|
115
|
+
│ 6. 对每个表: │
|
|
116
|
+
│ ├── 表存在?→ modifyTable (修改) │
|
|
117
|
+
│ └── 表不存在?→ createTable (新建) │
|
|
118
|
+
│ ↓ │
|
|
119
|
+
│ 7. 清理 Redis 缓存 (tableColumns) │
|
|
120
|
+
│ 8. 关闭数据库连接 │
|
|
121
|
+
└─────────────────────────────────────────────────────┘
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### 自动添加字段
|
|
125
|
+
|
|
126
|
+
每个表自动添加以下系统字段:
|
|
127
|
+
|
|
128
|
+
| 字段 | 类型 | 说明 |
|
|
129
|
+
| ------------ | ------- | ------------------------------- |
|
|
130
|
+
| `id` | BIGINT | 主键,自增 |
|
|
131
|
+
| `created_at` | BIGINT | 创建时间戳 |
|
|
132
|
+
| `updated_at` | BIGINT | 更新时间戳 |
|
|
133
|
+
| `state` | TINYINT | 状态(1=正常,0=禁用,-1=删除) |
|
|
134
|
+
|
|
135
|
+
### 示例
|
|
136
|
+
|
|
137
|
+
**表定义文件** `tables/user.json`:
|
|
138
|
+
|
|
139
|
+
```json
|
|
140
|
+
{
|
|
141
|
+
"email": "邮箱|string|5|100||true|^[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}$",
|
|
142
|
+
"password": "密码|string|6|100||true",
|
|
143
|
+
"nickname": "昵称|string|2|50|用户",
|
|
144
|
+
"avatar": "头像|string|0|500",
|
|
145
|
+
"phone": "手机号|string|0|20"
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**同步结果**:创建/更新 `user` 表,包含定义的字段 + 系统字段。
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## syncApi 接口同步
|
|
154
|
+
|
|
155
|
+
将 API 路由定义同步到 `addon_admin_api` 表。
|
|
156
|
+
|
|
157
|
+
### 基本用法
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# 同步 API 路由
|
|
161
|
+
befly sync:api
|
|
162
|
+
|
|
163
|
+
# 预览模式
|
|
164
|
+
befly sync:api --plan
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### 命令选项
|
|
168
|
+
|
|
169
|
+
| 选项 | 类型 | 默认值 | 说明 |
|
|
170
|
+
| -------- | ------- | ------ | ---------------------- |
|
|
171
|
+
| `--plan` | boolean | false | 预览模式,显示变更计划 |
|
|
172
|
+
|
|
173
|
+
### 同步逻辑
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
┌─────────────────────────────────────────────────────┐
|
|
177
|
+
│ syncApi │
|
|
178
|
+
├─────────────────────────────────────────────────────┤
|
|
179
|
+
│ 1. 扫描 API 文件: │
|
|
180
|
+
│ - 项目 API:tpl/apis/**/*.ts │
|
|
181
|
+
│ - Addon API:addons/*/apis/**/*.ts │
|
|
182
|
+
│ ↓ │
|
|
183
|
+
│ 2. 提取 API 信息: │
|
|
184
|
+
│ - name: 接口名称 │
|
|
185
|
+
│ - path: 路由路径 │
|
|
186
|
+
│ - method: 请求方法 │
|
|
187
|
+
│ - description: 接口描述 │
|
|
188
|
+
│ - addonName: 所属 Addon │
|
|
189
|
+
│ ↓ │
|
|
190
|
+
│ 3. 同步到 addon_admin_api 表: │
|
|
191
|
+
│ - 新增不存在的 API │
|
|
192
|
+
│ - 更新已存在的 API │
|
|
193
|
+
│ - 删除代码中已移除的 API │
|
|
194
|
+
└─────────────────────────────────────────────────────┘
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### API 信息提取
|
|
198
|
+
|
|
199
|
+
从 API 文件中提取以下信息:
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
interface ApiInfo {
|
|
203
|
+
name: string; // 接口名称(name 属性)
|
|
204
|
+
path: string; // 路由路径(由文件路径生成)
|
|
205
|
+
method: string; // 请求方法(method 属性,默认 POST)
|
|
206
|
+
description: string; // 接口描述(desc 属性)
|
|
207
|
+
addonName: string; // 所属 Addon 名称
|
|
208
|
+
addonTitle: string; // Addon 标题
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### 统计信息
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
interface SyncApiStats {
|
|
216
|
+
totalApis: number; // API 总数
|
|
217
|
+
created: number; // 新增数量
|
|
218
|
+
updated: number; // 更新数量
|
|
219
|
+
deleted: number; // 删除数量
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## syncMenu 菜单同步
|
|
226
|
+
|
|
227
|
+
将 `views/*/meta.json` 菜单配置同步到 `addon_admin_menu` 表。
|
|
228
|
+
|
|
229
|
+
### 基本用法
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
# 同步菜单
|
|
233
|
+
befly sync:menu
|
|
234
|
+
|
|
235
|
+
# 预览模式
|
|
236
|
+
befly sync:menu --plan
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### 命令选项
|
|
240
|
+
|
|
241
|
+
| 选项 | 类型 | 默认值 | 说明 |
|
|
242
|
+
| -------- | ------- | ------ | ---------------------- |
|
|
243
|
+
| `--plan` | boolean | false | 预览模式,显示变更计划 |
|
|
244
|
+
|
|
245
|
+
### 菜单配置文件
|
|
246
|
+
|
|
247
|
+
在 `views/{menuName}/meta.json` 中定义菜单:
|
|
248
|
+
|
|
249
|
+
```json
|
|
250
|
+
{
|
|
251
|
+
"name": "用户管理",
|
|
252
|
+
"icon": "Users",
|
|
253
|
+
"sort": 10
|
|
254
|
+
}
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
**配置字段**:
|
|
258
|
+
|
|
259
|
+
| 字段 | 类型 | 必填 | 说明 |
|
|
260
|
+
| -------- | ------- | ---- | -------------------------- |
|
|
261
|
+
| `name` | string | 是 | 菜单名称 |
|
|
262
|
+
| `icon` | string | 否 | 图标名称(Lucide 图标) |
|
|
263
|
+
| `sort` | number | 否 | 排序权重,越小越靠前 |
|
|
264
|
+
| `hidden` | boolean | 否 | 是否隐藏(不同步到数据库) |
|
|
265
|
+
|
|
266
|
+
### 目录结构
|
|
267
|
+
|
|
268
|
+
```
|
|
269
|
+
views/
|
|
270
|
+
├── index/ # 首页
|
|
271
|
+
│ ├── index.vue
|
|
272
|
+
│ └── meta.json # { "name": "首页", "icon": "Home", "sort": 1 }
|
|
273
|
+
├── user/ # 用户管理(父菜单)
|
|
274
|
+
│ ├── user.vue
|
|
275
|
+
│ ├── meta.json # { "name": "用户管理", "icon": "Users", "sort": 10 }
|
|
276
|
+
│ ├── list/ # 用户列表(子菜单)
|
|
277
|
+
│ │ ├── list.vue
|
|
278
|
+
│ │ └── meta.json # { "name": "用户列表", "sort": 1 }
|
|
279
|
+
│ └── detail/ # 用户详情(子菜单)
|
|
280
|
+
│ ├── detail.vue
|
|
281
|
+
│ └── meta.json # { "name": "用户详情", "sort": 2 }
|
|
282
|
+
└── setting/ # 系统设置
|
|
283
|
+
├── setting.vue
|
|
284
|
+
└── meta.json # { "name": "系统设置", "icon": "Settings", "sort": 99 }
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### 同步逻辑
|
|
288
|
+
|
|
289
|
+
```
|
|
290
|
+
┌─────────────────────────────────────────────────────┐
|
|
291
|
+
│ syncMenu │
|
|
292
|
+
├─────────────────────────────────────────────────────┤
|
|
293
|
+
│ 1. 扫描 views 目录: │
|
|
294
|
+
│ - 项目:tpl/views/ │
|
|
295
|
+
│ - Addon:addons/*/views/ │
|
|
296
|
+
│ ↓ │
|
|
297
|
+
│ 2. 读取每个目录的 meta.json 配置 │
|
|
298
|
+
│ ↓ │
|
|
299
|
+
│ 3. 构建菜单树(父子关系由目录层级决定) │
|
|
300
|
+
│ ↓ │
|
|
301
|
+
│ 4. 过滤隐藏菜单(hidden: true) │
|
|
302
|
+
│ ↓ │
|
|
303
|
+
│ 5. 同步到 addon_admin_menu 表: │
|
|
304
|
+
│ - 新增不存在的菜单 │
|
|
305
|
+
│ - 更新已存在的菜单 │
|
|
306
|
+
│ - 删除代码中已移除的菜单 │
|
|
307
|
+
└─────────────────────────────────────────────────────┘
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### 统计信息
|
|
311
|
+
|
|
312
|
+
```typescript
|
|
313
|
+
interface SyncMenuStats {
|
|
314
|
+
totalMenus: number; // 菜单总数
|
|
315
|
+
parentMenus: number; // 父菜单数量
|
|
316
|
+
childMenus: number; // 子菜单数量
|
|
317
|
+
created: number; // 新增数量
|
|
318
|
+
updated: number; // 更新数量
|
|
319
|
+
deleted: number; // 删除数量
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## syncDev 开发账户同步
|
|
326
|
+
|
|
327
|
+
创建开发环境的管理员账户和角色。
|
|
328
|
+
|
|
329
|
+
### 基本用法
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
# 同步开发账户
|
|
333
|
+
befly sync:dev
|
|
334
|
+
|
|
335
|
+
# 预览模式
|
|
336
|
+
befly sync:dev --plan
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
### 命令选项
|
|
340
|
+
|
|
341
|
+
| 选项 | 类型 | 默认值 | 说明 |
|
|
342
|
+
| -------- | ------- | ------ | ---------------------- |
|
|
343
|
+
| `--plan` | boolean | false | 预览模式,显示变更计划 |
|
|
344
|
+
|
|
345
|
+
### 同步逻辑
|
|
346
|
+
|
|
347
|
+
```
|
|
348
|
+
┌─────────────────────────────────────────────────────┐
|
|
349
|
+
│ syncDev │
|
|
350
|
+
├─────────────────────────────────────────────────────┤
|
|
351
|
+
│ 1. 创建/更新开发角色: │
|
|
352
|
+
│ - 角色名称:开发者 │
|
|
353
|
+
│ - 角色标识:dev │
|
|
354
|
+
│ - 权限:所有菜单 + 所有 API │
|
|
355
|
+
│ ↓ │
|
|
356
|
+
│ 2. 获取所有菜单 ID 列表 │
|
|
357
|
+
│ ↓ │
|
|
358
|
+
│ 3. 获取所有 API ID 列表 │
|
|
359
|
+
│ ↓ │
|
|
360
|
+
│ 4. 更新角色权限: │
|
|
361
|
+
│ - menus: 所有菜单 ID │
|
|
362
|
+
│ - apis: 所有 API ID │
|
|
363
|
+
│ ↓ │
|
|
364
|
+
│ 5. 创建/更新开发管理员: │
|
|
365
|
+
│ - 用户名:dev │
|
|
366
|
+
│ - 密码:从配置读取 │
|
|
367
|
+
│ - 角色:开发者角色 │
|
|
368
|
+
└─────────────────────────────────────────────────────┘
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### 配置说明
|
|
372
|
+
|
|
373
|
+
开发账户配置在 `befly.config.ts` 或环境配置文件中:
|
|
374
|
+
|
|
375
|
+
```typescript
|
|
376
|
+
// befly.config.ts
|
|
377
|
+
export default {
|
|
378
|
+
dev: {
|
|
379
|
+
username: 'dev', // 开发账户用户名
|
|
380
|
+
password: 'dev123456' // 开发账户密码
|
|
381
|
+
}
|
|
382
|
+
};
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
**注意**:此命令仅用于开发环境,生产环境应通过正式流程创建管理员。
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
|
|
389
|
+
## 命令行使用
|
|
390
|
+
|
|
391
|
+
### CLI 命令列表
|
|
392
|
+
|
|
393
|
+
```bash
|
|
394
|
+
# 全量同步
|
|
395
|
+
befly sync
|
|
396
|
+
|
|
397
|
+
# 单独执行
|
|
398
|
+
befly sync:db # 同步数据库结构
|
|
399
|
+
befly sync:api # 同步 API 路由
|
|
400
|
+
befly sync:menu # 同步菜单配置
|
|
401
|
+
befly sync:dev # 同步开发账户
|
|
402
|
+
|
|
403
|
+
# 带参数
|
|
404
|
+
befly sync:db --table user # 只同步 user 表
|
|
405
|
+
befly sync:db --force # 强制模式
|
|
406
|
+
befly sync:db --dry-run # 预览模式
|
|
407
|
+
befly sync:api --plan # 预览 API 变更
|
|
408
|
+
befly sync:menu --plan # 预览菜单变更
|
|
409
|
+
befly sync:dev --plan # 预览开发账户变更
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### 代码调用
|
|
413
|
+
|
|
414
|
+
```typescript
|
|
415
|
+
import { syncAllCommand } from './sync/syncAll';
|
|
416
|
+
import { syncDbCommand } from './sync/syncDb';
|
|
417
|
+
import { syncApiCommand } from './sync/syncApi';
|
|
418
|
+
import { syncMenuCommand } from './sync/syncMenu';
|
|
419
|
+
import { syncDevCommand } from './sync/syncDev';
|
|
420
|
+
|
|
421
|
+
// 全量同步
|
|
422
|
+
await syncAllCommand();
|
|
423
|
+
|
|
424
|
+
// 单独调用
|
|
425
|
+
await syncDbCommand({ table: 'user' });
|
|
426
|
+
await syncApiCommand({ plan: true });
|
|
427
|
+
await syncMenuCommand({ plan: true });
|
|
428
|
+
await syncDevCommand({ plan: true });
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
---
|
|
432
|
+
|
|
433
|
+
## 表名规则
|
|
434
|
+
|
|
435
|
+
### 项目表
|
|
436
|
+
|
|
437
|
+
项目表直接使用文件名(转换为下划线格式):
|
|
438
|
+
|
|
439
|
+
```
|
|
440
|
+
tables/user.json → user
|
|
441
|
+
tables/userProfile.json → user_profile
|
|
442
|
+
tables/order_item.json → order_item
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
### Addon 表
|
|
446
|
+
|
|
447
|
+
Addon 表使用 `addon_{addonName}_{tableName}` 格式:
|
|
448
|
+
|
|
449
|
+
```
|
|
450
|
+
addons/admin/tables/role.json → addon_admin_role
|
|
451
|
+
addons/admin/tables/menu.json → addon_admin_menu
|
|
452
|
+
addons/demo/tables/article.json → addon_demo_article
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
### 命名转换
|
|
456
|
+
|
|
457
|
+
| 源文件名 | 表名 |
|
|
458
|
+
| ------------------- | -------------- |
|
|
459
|
+
| `user.json` | `user` |
|
|
460
|
+
| `userProfile.json` | `user_profile` |
|
|
461
|
+
| `UserProfile.json` | `user_profile` |
|
|
462
|
+
| `user_profile.json` | `user_profile` |
|
|
463
|
+
|
|
464
|
+
---
|
|
465
|
+
|
|
466
|
+
## 注意事项
|
|
467
|
+
|
|
468
|
+
### 1. 执行顺序
|
|
469
|
+
|
|
470
|
+
**必须按顺序执行**:`syncDb` → `syncApi` → `syncMenu` → `syncDev`
|
|
471
|
+
|
|
472
|
+
- `syncApi` 依赖 `addon_admin_api` 表(由 `syncDb` 创建)
|
|
473
|
+
- `syncMenu` 依赖 `addon_admin_menu` 表(由 `syncDb` 创建)
|
|
474
|
+
- `syncDev` 依赖角色表和权限数据(由前面命令创建)
|
|
475
|
+
|
|
476
|
+
### 2. 破坏性操作
|
|
477
|
+
|
|
478
|
+
默认模式下,`syncDb` **不会删除列**,只会:
|
|
479
|
+
|
|
480
|
+
- 新增缺失的列
|
|
481
|
+
- 修改现有列的类型/默认值
|
|
482
|
+
|
|
483
|
+
使用 `--force` 参数允许删除列:
|
|
484
|
+
|
|
485
|
+
```bash
|
|
486
|
+
# 谨慎使用!会删除数据库中存在但定义中不存在的列
|
|
487
|
+
befly sync:db --force
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
### 3. 缓存清理
|
|
491
|
+
|
|
492
|
+
`syncDb` 执行后会自动清理 Redis 中的表结构缓存:
|
|
493
|
+
|
|
494
|
+
```typescript
|
|
495
|
+
// 自动清理以下缓存键
|
|
496
|
+
RedisKeys.tableColumns(tableName); // table:columns:{tableName}
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
### 4. 连接管理
|
|
500
|
+
|
|
501
|
+
Sync 命令会自动管理数据库和 Redis 连接:
|
|
502
|
+
|
|
503
|
+
- 执行前建立连接
|
|
504
|
+
- 执行后关闭连接
|
|
505
|
+
- 出错时正确清理资源
|
|
506
|
+
|
|
507
|
+
### 5. 预览模式
|
|
508
|
+
|
|
509
|
+
使用 `--dry-run` 或 `--plan` 参数可以预览变更而不实际执行:
|
|
510
|
+
|
|
511
|
+
```bash
|
|
512
|
+
befly sync:db --dry-run # 预览数据库结构变更
|
|
513
|
+
befly sync:api --plan # 预览 API 变更
|
|
514
|
+
befly sync:menu --plan # 预览菜单变更
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
---
|
|
518
|
+
|
|
519
|
+
## FAQ
|
|
520
|
+
|
|
521
|
+
### Q: sync 命令报错 "表不存在" 怎么办?
|
|
522
|
+
|
|
523
|
+
A: 确保先执行 `befly sync:db` 创建表结构,再执行其他 sync 命令。或直接使用 `befly sync` 执行全量同步。
|
|
524
|
+
|
|
525
|
+
### Q: 为什么修改了表定义但数据库没变化?
|
|
526
|
+
|
|
527
|
+
A: 检查以下几点:
|
|
528
|
+
|
|
529
|
+
1. JSON 文件语法是否正确
|
|
530
|
+
2. 字段定义格式是否正确
|
|
531
|
+
3. 是否保存了文件
|
|
532
|
+
4. 尝试使用 `--dry-run` 查看预期变更
|
|
533
|
+
|
|
534
|
+
### Q: 如何删除数据库中不需要的列?
|
|
535
|
+
|
|
536
|
+
A: 使用 `--force` 参数:
|
|
537
|
+
|
|
538
|
+
```bash
|
|
539
|
+
befly sync:db --force
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
**警告**:这会删除表定义中不存在的列及其数据,请先备份。
|
|
543
|
+
|
|
544
|
+
### Q: Addon 表名太长怎么办?
|
|
545
|
+
|
|
546
|
+
A: Addon 表名格式为 `addon_{addonName}_{tableName}`,建议:
|
|
547
|
+
|
|
548
|
+
- 使用简短的 Addon 名称
|
|
549
|
+
- 使用简短的表名
|
|
550
|
+
- MySQL 表名限制 64 字符
|
|
551
|
+
|
|
552
|
+
### Q: 同步失败后如何恢复?
|
|
553
|
+
|
|
554
|
+
A:
|
|
555
|
+
|
|
556
|
+
1. 检查错误日志确定失败原因
|
|
557
|
+
2. 修复问题后重新执行 sync 命令
|
|
558
|
+
3. sync 命令是幂等的,可以安全地多次执行
|
|
559
|
+
|
|
560
|
+
### Q: 如何只同步某个 Addon 的表?
|
|
561
|
+
|
|
562
|
+
A: 目前不支持按 Addon 筛选,可以使用 `--table` 参数同步单个表:
|
|
563
|
+
|
|
564
|
+
```bash
|
|
565
|
+
befly sync:db --table addon_admin_role
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
### Q: 开发账户密码在哪里配置?
|
|
569
|
+
|
|
570
|
+
A: 在配置文件中设置:
|
|
571
|
+
|
|
572
|
+
```typescript
|
|
573
|
+
// befly.config.ts
|
|
574
|
+
export default {
|
|
575
|
+
dev: {
|
|
576
|
+
username: 'dev',
|
|
577
|
+
password: 'your_password'
|
|
578
|
+
}
|
|
579
|
+
};
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
或使用环境变量:
|
|
583
|
+
|
|
584
|
+
```bash
|
|
585
|
+
DEV_PASSWORD=your_password befly sync:dev
|
|
586
|
+
```
|