befly 3.17.4 → 3.17.7
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/checks/table.js +1 -1
- package/lib/cacheHelper.js +109 -125
- package/package.json +2 -2
- package/sql/befly.sql +173 -0
- package/sql/admin.sql +0 -18
- package/sql/api.sql +0 -12
- package/sql/dict.sql +0 -13
- package/sql/dictType.sql +0 -12
- package/sql/emailLog.sql +0 -20
- package/sql/loginLog.sql +0 -25
- package/sql/menu.sql +0 -12
- package/sql/operateLog.sql +0 -22
- package/sql/role.sql +0 -14
- package/sql/sysConfig.sql +0 -16
package/checks/table.js
CHANGED
|
@@ -29,7 +29,7 @@ function addIssue(context, path, message) {
|
|
|
29
29
|
|
|
30
30
|
const fieldDefSchema = z
|
|
31
31
|
.object({
|
|
32
|
-
name: z.string().min(1)
|
|
32
|
+
name: z.string().min(1),
|
|
33
33
|
input: inputSchema,
|
|
34
34
|
min: z.number().nullable().optional(),
|
|
35
35
|
max: z.number().nullable().optional()
|
package/lib/cacheHelper.js
CHANGED
|
@@ -16,88 +16,11 @@ export class CacheHelper {
|
|
|
16
16
|
this.redis = deps.redis;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
assertApiPathList(value) {
|
|
20
|
-
if (isNullable(value)) return [];
|
|
21
|
-
|
|
22
|
-
let list = value;
|
|
23
|
-
|
|
24
|
-
if (isString(list)) {
|
|
25
|
-
const trimmed = list.trim();
|
|
26
|
-
if (trimmed === "" || trimmed === "null") {
|
|
27
|
-
return [];
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (trimmed.startsWith("[") && trimmed.endsWith("]")) {
|
|
31
|
-
try {
|
|
32
|
-
list = JSON.parse(trimmed);
|
|
33
|
-
} catch {
|
|
34
|
-
return [];
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
if (!Array.isArray(list)) {
|
|
40
|
-
return [];
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const out = [];
|
|
44
|
-
for (const item of list) {
|
|
45
|
-
if (!isString(item)) continue;
|
|
46
|
-
const trimmed = item.trim();
|
|
47
|
-
if (!isNonEmptyString(trimmed)) continue;
|
|
48
|
-
out.push(trimmed);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return out;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
assertMenuPathList(value) {
|
|
55
|
-
if (isNullable(value)) return [];
|
|
56
|
-
|
|
57
|
-
let list = value;
|
|
58
|
-
|
|
59
|
-
if (isString(list)) {
|
|
60
|
-
const trimmed = list.trim();
|
|
61
|
-
if (trimmed === "" || trimmed === "null") {
|
|
62
|
-
return [];
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
if (trimmed.startsWith("[") && trimmed.endsWith("]")) {
|
|
66
|
-
try {
|
|
67
|
-
list = JSON.parse(trimmed);
|
|
68
|
-
} catch {
|
|
69
|
-
return [];
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
if (!Array.isArray(list)) {
|
|
75
|
-
return [];
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const out = [];
|
|
79
|
-
for (const item of list) {
|
|
80
|
-
if (!isString(item)) continue;
|
|
81
|
-
const trimmed = item.trim();
|
|
82
|
-
if (!isNonEmptyString(trimmed)) continue;
|
|
83
|
-
out.push(trimmed);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return out;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
19
|
/**
|
|
90
20
|
* 缓存所有接口到 Redis
|
|
91
21
|
*/
|
|
92
22
|
async cacheApis() {
|
|
93
23
|
try {
|
|
94
|
-
// 检查表是否存在
|
|
95
|
-
const tableExists = await this.mysql.tableExists("beflyApi");
|
|
96
|
-
if (!tableExists.data) {
|
|
97
|
-
Logger.warn("⚠️ 接口表不存在,跳过接口缓存");
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
24
|
// 从数据库查询所有接口
|
|
102
25
|
const apiList = await this.mysql.getAll({
|
|
103
26
|
table: "beflyApi"
|
|
@@ -107,10 +30,21 @@ export class CacheHelper {
|
|
|
107
30
|
const result = await this.redis.setObject(CacheKeys.apisAll(), apiList.data.lists);
|
|
108
31
|
|
|
109
32
|
if (result === null) {
|
|
110
|
-
|
|
33
|
+
throw new Error("接口缓存失败", {
|
|
34
|
+
cause: null,
|
|
35
|
+
code: "runtime",
|
|
36
|
+
subsystem: "cache",
|
|
37
|
+
operation: "cacheApis"
|
|
38
|
+
});
|
|
111
39
|
}
|
|
112
40
|
} catch (error) {
|
|
113
41
|
Logger.error("⚠️ 接口缓存异常", error);
|
|
42
|
+
throw new Error("接口缓存异常", {
|
|
43
|
+
cause: error,
|
|
44
|
+
code: "runtime",
|
|
45
|
+
subsystem: "cache",
|
|
46
|
+
operation: "cacheApis"
|
|
47
|
+
});
|
|
114
48
|
}
|
|
115
49
|
}
|
|
116
50
|
|
|
@@ -119,13 +53,6 @@ export class CacheHelper {
|
|
|
119
53
|
*/
|
|
120
54
|
async cacheMenus() {
|
|
121
55
|
try {
|
|
122
|
-
// 检查表是否存在
|
|
123
|
-
const tableExists = await this.mysql.tableExists("beflyMenu");
|
|
124
|
-
if (!tableExists.data) {
|
|
125
|
-
Logger.warn("⚠️ 菜单表不存在,跳过菜单缓存");
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
56
|
// 从数据库查询所有菜单
|
|
130
57
|
const menus = await this.mysql.getAll({
|
|
131
58
|
table: "beflyMenu"
|
|
@@ -135,10 +62,21 @@ export class CacheHelper {
|
|
|
135
62
|
const result = await this.redis.setObject(CacheKeys.menusAll(), menus.data.lists);
|
|
136
63
|
|
|
137
64
|
if (result === null) {
|
|
138
|
-
|
|
65
|
+
throw new Error("菜单缓存失败", {
|
|
66
|
+
cause: null,
|
|
67
|
+
code: "runtime",
|
|
68
|
+
subsystem: "cache",
|
|
69
|
+
operation: "cacheMenus"
|
|
70
|
+
});
|
|
139
71
|
}
|
|
140
72
|
} catch (error) {
|
|
141
|
-
Logger.
|
|
73
|
+
Logger.error("⚠️ 菜单缓存异常", error);
|
|
74
|
+
throw new Error("菜单缓存异常", {
|
|
75
|
+
cause: error,
|
|
76
|
+
code: "runtime",
|
|
77
|
+
subsystem: "cache",
|
|
78
|
+
operation: "cacheMenus"
|
|
79
|
+
});
|
|
142
80
|
}
|
|
143
81
|
}
|
|
144
82
|
|
|
@@ -149,14 +87,6 @@ export class CacheHelper {
|
|
|
149
87
|
*/
|
|
150
88
|
async cacheRoleApis() {
|
|
151
89
|
try {
|
|
152
|
-
// 检查表是否存在
|
|
153
|
-
const roleTableExists = await this.mysql.tableExists("beflyRole");
|
|
154
|
-
|
|
155
|
-
if (!roleTableExists.data) {
|
|
156
|
-
Logger.warn("⚠️ 角色表不存在,跳过角色权限缓存");
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
90
|
// 查询所有角色(仅取必要字段)
|
|
161
91
|
const roles = await this.mysql.getAll({
|
|
162
92
|
table: "beflyRole",
|
|
@@ -167,8 +97,7 @@ export class CacheHelper {
|
|
|
167
97
|
|
|
168
98
|
for (const role of roles.data.lists) {
|
|
169
99
|
if (!role?.code) continue;
|
|
170
|
-
|
|
171
|
-
roleApiPathsMap.set(role.code, apiPaths);
|
|
100
|
+
roleApiPathsMap.set(role.code, role.apis);
|
|
172
101
|
}
|
|
173
102
|
|
|
174
103
|
const roleCodes = Array.from(roleApiPathsMap.keys());
|
|
@@ -216,14 +145,6 @@ export class CacheHelper {
|
|
|
216
145
|
*/
|
|
217
146
|
async cacheRoleMenus() {
|
|
218
147
|
try {
|
|
219
|
-
// 检查表是否存在
|
|
220
|
-
const roleTableExists = await this.mysql.tableExists("beflyRole");
|
|
221
|
-
|
|
222
|
-
if (!roleTableExists.data) {
|
|
223
|
-
Logger.warn("⚠️ 角色表不存在,跳过角色菜单权限缓存");
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
148
|
// 查询所有角色(仅取必要字段)
|
|
228
149
|
const roles = await this.mysql.getAll({
|
|
229
150
|
table: "beflyRole",
|
|
@@ -234,8 +155,7 @@ export class CacheHelper {
|
|
|
234
155
|
|
|
235
156
|
for (const role of roles.data.lists) {
|
|
236
157
|
if (!role?.code) continue;
|
|
237
|
-
|
|
238
|
-
roleMenuPathsMap.set(role.code, menuPaths);
|
|
158
|
+
roleMenuPathsMap.set(role.code, role.menus);
|
|
239
159
|
}
|
|
240
160
|
|
|
241
161
|
const roleCodes = Array.from(roleMenuPathsMap.keys());
|
|
@@ -281,22 +201,31 @@ export class CacheHelper {
|
|
|
281
201
|
*/
|
|
282
202
|
async refreshRoleApiPermissions(roleCode, apiPaths) {
|
|
283
203
|
if (!isNonEmptyString(roleCode)) {
|
|
284
|
-
|
|
204
|
+
throw new Error("roleCode 参数不合法", {
|
|
205
|
+
cause: null,
|
|
206
|
+
code: "validation",
|
|
207
|
+
subsystem: "cache",
|
|
208
|
+
operation: "refreshRoleApiPermissions"
|
|
209
|
+
});
|
|
285
210
|
}
|
|
286
211
|
if (!Array.isArray(apiPaths)) {
|
|
287
|
-
|
|
212
|
+
throw new Error("apiPaths 参数不合法", {
|
|
213
|
+
cause: null,
|
|
214
|
+
code: "validation",
|
|
215
|
+
subsystem: "cache",
|
|
216
|
+
operation: "refreshRoleApiPermissions"
|
|
217
|
+
});
|
|
288
218
|
}
|
|
289
219
|
|
|
290
|
-
const normalizedPaths = this.assertApiPathList(apiPaths);
|
|
291
220
|
const roleKey = CacheKeys.roleApis(roleCode);
|
|
292
221
|
|
|
293
222
|
// 空数组短路:保证清理残留
|
|
294
|
-
if (
|
|
223
|
+
if (apiPaths.length === 0) {
|
|
295
224
|
await this.redis.del(roleKey);
|
|
296
225
|
return;
|
|
297
226
|
}
|
|
298
227
|
|
|
299
|
-
const members = Array.from(new Set(
|
|
228
|
+
const members = Array.from(new Set(apiPaths));
|
|
300
229
|
|
|
301
230
|
await this.redis.del(roleKey);
|
|
302
231
|
if (members.length > 0) {
|
|
@@ -311,22 +240,31 @@ export class CacheHelper {
|
|
|
311
240
|
*/
|
|
312
241
|
async refreshRoleMenuPermissions(roleCode, menuPaths) {
|
|
313
242
|
if (!isNonEmptyString(roleCode)) {
|
|
314
|
-
|
|
243
|
+
throw new Error("roleCode 参数不合法", {
|
|
244
|
+
cause: null,
|
|
245
|
+
code: "validation",
|
|
246
|
+
subsystem: "cache",
|
|
247
|
+
operation: "refreshRoleMenuPermissions"
|
|
248
|
+
});
|
|
315
249
|
}
|
|
316
250
|
if (!Array.isArray(menuPaths)) {
|
|
317
|
-
|
|
251
|
+
throw new Error("menuPaths 参数不合法", {
|
|
252
|
+
cause: null,
|
|
253
|
+
code: "validation",
|
|
254
|
+
subsystem: "cache",
|
|
255
|
+
operation: "refreshRoleMenuPermissions"
|
|
256
|
+
});
|
|
318
257
|
}
|
|
319
258
|
|
|
320
|
-
const normalizedPaths = this.assertMenuPathList(menuPaths);
|
|
321
259
|
const roleKey = CacheKeys.roleMenus(roleCode);
|
|
322
260
|
|
|
323
261
|
// 空数组短路:保证清理残留
|
|
324
|
-
if (
|
|
262
|
+
if (menuPaths.length === 0) {
|
|
325
263
|
await this.redis.del(roleKey);
|
|
326
264
|
return;
|
|
327
265
|
}
|
|
328
266
|
|
|
329
|
-
const members = Array.from(new Set(
|
|
267
|
+
const members = Array.from(new Set(menuPaths));
|
|
330
268
|
|
|
331
269
|
await this.redis.del(roleKey);
|
|
332
270
|
if (members.length > 0) {
|
|
@@ -361,7 +299,12 @@ export class CacheHelper {
|
|
|
361
299
|
return apis || [];
|
|
362
300
|
} catch (error) {
|
|
363
301
|
Logger.error("获取接口缓存失败", error);
|
|
364
|
-
|
|
302
|
+
throw new Error("获取接口缓存失败", {
|
|
303
|
+
cause: error,
|
|
304
|
+
code: "runtime",
|
|
305
|
+
subsystem: "cache",
|
|
306
|
+
operation: "getApis"
|
|
307
|
+
});
|
|
365
308
|
}
|
|
366
309
|
}
|
|
367
310
|
|
|
@@ -375,7 +318,12 @@ export class CacheHelper {
|
|
|
375
318
|
return menus || [];
|
|
376
319
|
} catch (error) {
|
|
377
320
|
Logger.error("获取菜单缓存失败", error);
|
|
378
|
-
|
|
321
|
+
throw new Error("获取菜单缓存失败", {
|
|
322
|
+
cause: error,
|
|
323
|
+
code: "runtime",
|
|
324
|
+
subsystem: "cache",
|
|
325
|
+
operation: "getMenus"
|
|
326
|
+
});
|
|
379
327
|
}
|
|
380
328
|
}
|
|
381
329
|
|
|
@@ -390,7 +338,13 @@ export class CacheHelper {
|
|
|
390
338
|
return permissions || [];
|
|
391
339
|
} catch (error) {
|
|
392
340
|
Logger.error("获取角色权限缓存失败", error, { roleCode: roleCode });
|
|
393
|
-
|
|
341
|
+
throw new Error("获取角色权限缓存失败", {
|
|
342
|
+
cause: error,
|
|
343
|
+
code: "runtime",
|
|
344
|
+
subsystem: "cache",
|
|
345
|
+
operation: "getRolePermissions",
|
|
346
|
+
roleCode: roleCode
|
|
347
|
+
});
|
|
394
348
|
}
|
|
395
349
|
}
|
|
396
350
|
|
|
@@ -405,7 +359,13 @@ export class CacheHelper {
|
|
|
405
359
|
return permissions || [];
|
|
406
360
|
} catch (error) {
|
|
407
361
|
Logger.error("获取角色菜单权限缓存失败", error, { roleCode: roleCode });
|
|
408
|
-
|
|
362
|
+
throw new Error("获取角色菜单权限缓存失败", {
|
|
363
|
+
cause: error,
|
|
364
|
+
code: "runtime",
|
|
365
|
+
subsystem: "cache",
|
|
366
|
+
operation: "getRoleMenuPermissions",
|
|
367
|
+
roleCode: roleCode
|
|
368
|
+
});
|
|
409
369
|
}
|
|
410
370
|
}
|
|
411
371
|
|
|
@@ -422,7 +382,13 @@ export class CacheHelper {
|
|
|
422
382
|
return await this.redis.sismember(CacheKeys.roleApis(roleCode), value);
|
|
423
383
|
} catch (error) {
|
|
424
384
|
Logger.error("检查角色权限失败", error, { roleCode: roleCode });
|
|
425
|
-
|
|
385
|
+
throw new Error("检查角色权限失败", {
|
|
386
|
+
cause: error,
|
|
387
|
+
code: "runtime",
|
|
388
|
+
subsystem: "cache",
|
|
389
|
+
operation: "checkRolePermission",
|
|
390
|
+
roleCode: roleCode
|
|
391
|
+
});
|
|
426
392
|
}
|
|
427
393
|
}
|
|
428
394
|
|
|
@@ -439,7 +405,13 @@ export class CacheHelper {
|
|
|
439
405
|
return await this.redis.sismember(CacheKeys.roleMenus(roleCode), value);
|
|
440
406
|
} catch (error) {
|
|
441
407
|
Logger.error("检查角色菜单权限失败", error, { roleCode: roleCode });
|
|
442
|
-
|
|
408
|
+
throw new Error("检查角色菜单权限失败", {
|
|
409
|
+
cause: error,
|
|
410
|
+
code: "runtime",
|
|
411
|
+
subsystem: "cache",
|
|
412
|
+
operation: "checkRoleMenuPermission",
|
|
413
|
+
roleCode: roleCode
|
|
414
|
+
});
|
|
443
415
|
}
|
|
444
416
|
}
|
|
445
417
|
|
|
@@ -458,7 +430,13 @@ export class CacheHelper {
|
|
|
458
430
|
return false;
|
|
459
431
|
} catch (error) {
|
|
460
432
|
Logger.error("删除角色权限缓存失败", error, { roleCode: roleCode });
|
|
461
|
-
|
|
433
|
+
throw new Error("删除角色权限缓存失败", {
|
|
434
|
+
cause: error,
|
|
435
|
+
code: "runtime",
|
|
436
|
+
subsystem: "cache",
|
|
437
|
+
operation: "deleteRolePermissions",
|
|
438
|
+
roleCode: roleCode
|
|
439
|
+
});
|
|
462
440
|
}
|
|
463
441
|
}
|
|
464
442
|
|
|
@@ -477,7 +455,13 @@ export class CacheHelper {
|
|
|
477
455
|
return false;
|
|
478
456
|
} catch (error) {
|
|
479
457
|
Logger.error("删除角色菜单权限缓存失败", error, { roleCode: roleCode });
|
|
480
|
-
|
|
458
|
+
throw new Error("删除角色菜单权限缓存失败", {
|
|
459
|
+
cause: error,
|
|
460
|
+
code: "runtime",
|
|
461
|
+
subsystem: "cache",
|
|
462
|
+
operation: "deleteRoleMenuPermissions",
|
|
463
|
+
roleCode: roleCode
|
|
464
|
+
});
|
|
481
465
|
}
|
|
482
466
|
}
|
|
483
467
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "befly",
|
|
3
|
-
"version": "3.17.
|
|
4
|
-
"gitHead": "
|
|
3
|
+
"version": "3.17.7",
|
|
4
|
+
"gitHead": "ca8aa895dc70ae26bf073f62ceba61c52076f066",
|
|
5
5
|
"private": false,
|
|
6
6
|
"description": "Befly - 为 Bun 专属打造的 JavaScript API 接口框架核心引擎",
|
|
7
7
|
"keywords": [
|
package/sql/befly.sql
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS `befly_admin` (
|
|
2
|
+
`id` BIGINT NOT NULL,
|
|
3
|
+
`nickname` VARCHAR(50) NOT NULL DEFAULT '',
|
|
4
|
+
`username` VARCHAR(30) NOT NULL DEFAULT '',
|
|
5
|
+
`password` VARCHAR(500) NOT NULL DEFAULT '',
|
|
6
|
+
`email` VARCHAR(100) NOT NULL DEFAULT '',
|
|
7
|
+
`phone` VARCHAR(20) NOT NULL DEFAULT '',
|
|
8
|
+
`avatar` VARCHAR(500) NOT NULL DEFAULT '',
|
|
9
|
+
`role_code` VARCHAR(50) NOT NULL DEFAULT '',
|
|
10
|
+
`role_type` VARCHAR(5) NOT NULL DEFAULT 'user',
|
|
11
|
+
`last_login_time` BIGINT NOT NULL DEFAULT 0,
|
|
12
|
+
`last_login_ip` VARCHAR(50) NOT NULL DEFAULT '',
|
|
13
|
+
`state` TINYINT NOT NULL DEFAULT 1,
|
|
14
|
+
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
15
|
+
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
16
|
+
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
17
|
+
PRIMARY KEY (`id`)
|
|
18
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
19
|
+
|
|
20
|
+
CREATE TABLE IF NOT EXISTS `befly_api` (
|
|
21
|
+
`id` BIGINT NOT NULL,
|
|
22
|
+
`name` VARCHAR(100) NOT NULL DEFAULT '',
|
|
23
|
+
`auth` VARCHAR(200) NOT NULL DEFAULT '',
|
|
24
|
+
`path` VARCHAR(200) NOT NULL DEFAULT '',
|
|
25
|
+
`parent_path` VARCHAR(200) NOT NULL DEFAULT '',
|
|
26
|
+
`state` TINYINT NOT NULL DEFAULT 1,
|
|
27
|
+
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
28
|
+
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
29
|
+
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
30
|
+
PRIMARY KEY (`id`)
|
|
31
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
32
|
+
|
|
33
|
+
CREATE TABLE IF NOT EXISTS `befly_dict` (
|
|
34
|
+
`id` BIGINT NOT NULL,
|
|
35
|
+
`type_code` VARCHAR(50) NOT NULL DEFAULT '',
|
|
36
|
+
`key` VARCHAR(50) NOT NULL DEFAULT '',
|
|
37
|
+
`label` VARCHAR(100) NOT NULL DEFAULT '',
|
|
38
|
+
`sort` INT NOT NULL DEFAULT 0,
|
|
39
|
+
`remark` VARCHAR(200) NOT NULL DEFAULT '',
|
|
40
|
+
`state` TINYINT NOT NULL DEFAULT 1,
|
|
41
|
+
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
42
|
+
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
43
|
+
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
44
|
+
PRIMARY KEY (`id`)
|
|
45
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
46
|
+
|
|
47
|
+
CREATE TABLE IF NOT EXISTS `befly_dict_type` (
|
|
48
|
+
`id` BIGINT NOT NULL,
|
|
49
|
+
`code` VARCHAR(50) NOT NULL DEFAULT '',
|
|
50
|
+
`name` VARCHAR(50) NOT NULL DEFAULT '',
|
|
51
|
+
`description` VARCHAR(200) NOT NULL DEFAULT '',
|
|
52
|
+
`sort` INT NOT NULL DEFAULT 0,
|
|
53
|
+
`state` TINYINT NOT NULL DEFAULT 1,
|
|
54
|
+
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
55
|
+
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
56
|
+
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
57
|
+
PRIMARY KEY (`id`)
|
|
58
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
59
|
+
|
|
60
|
+
CREATE TABLE IF NOT EXISTS `befly_email_log` (
|
|
61
|
+
`id` BIGINT NOT NULL,
|
|
62
|
+
`admin_id` BIGINT NOT NULL DEFAULT 0,
|
|
63
|
+
`username` VARCHAR(100) NOT NULL DEFAULT '',
|
|
64
|
+
`nickname` VARCHAR(100) NOT NULL DEFAULT '',
|
|
65
|
+
`to_email` VARCHAR(200) NOT NULL DEFAULT '',
|
|
66
|
+
`subject` VARCHAR(200) NOT NULL DEFAULT '',
|
|
67
|
+
`content` TEXT NULL,
|
|
68
|
+
`cc_email` VARCHAR(500) NOT NULL DEFAULT '',
|
|
69
|
+
`bcc_email` VARCHAR(500) NOT NULL DEFAULT '',
|
|
70
|
+
`send_time` BIGINT NOT NULL DEFAULT 0,
|
|
71
|
+
`send_result` TINYINT NOT NULL DEFAULT 0,
|
|
72
|
+
`message_id` VARCHAR(200) NOT NULL DEFAULT '',
|
|
73
|
+
`fail_reason` VARCHAR(500) NOT NULL DEFAULT '',
|
|
74
|
+
`state` TINYINT NOT NULL DEFAULT 1,
|
|
75
|
+
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
76
|
+
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
77
|
+
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
78
|
+
PRIMARY KEY (`id`)
|
|
79
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
80
|
+
|
|
81
|
+
CREATE TABLE IF NOT EXISTS `befly_login_log` (
|
|
82
|
+
`id` BIGINT NOT NULL,
|
|
83
|
+
`admin_id` BIGINT NOT NULL DEFAULT 0,
|
|
84
|
+
`username` VARCHAR(50) NOT NULL DEFAULT '',
|
|
85
|
+
`nickname` VARCHAR(50) NOT NULL DEFAULT '',
|
|
86
|
+
`ip` VARCHAR(50) NOT NULL DEFAULT '',
|
|
87
|
+
`user_agent` VARCHAR(500) NOT NULL DEFAULT '',
|
|
88
|
+
`browser_name` VARCHAR(50) NOT NULL DEFAULT '',
|
|
89
|
+
`browser_version` VARCHAR(50) NOT NULL DEFAULT '',
|
|
90
|
+
`os_name` VARCHAR(50) NOT NULL DEFAULT '',
|
|
91
|
+
`os_version` VARCHAR(50) NOT NULL DEFAULT '',
|
|
92
|
+
`device_type` VARCHAR(20) NOT NULL DEFAULT '',
|
|
93
|
+
`device_vendor` VARCHAR(50) NOT NULL DEFAULT '',
|
|
94
|
+
`device_model` VARCHAR(50) NOT NULL DEFAULT '',
|
|
95
|
+
`engine_name` VARCHAR(50) NOT NULL DEFAULT '',
|
|
96
|
+
`cpu_architecture` VARCHAR(20) NOT NULL DEFAULT '',
|
|
97
|
+
`login_time` BIGINT NOT NULL DEFAULT 0,
|
|
98
|
+
`login_result` TINYINT NOT NULL DEFAULT 0,
|
|
99
|
+
`fail_reason` VARCHAR(200) NOT NULL DEFAULT '',
|
|
100
|
+
`state` TINYINT NOT NULL DEFAULT 1,
|
|
101
|
+
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
102
|
+
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
103
|
+
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
104
|
+
PRIMARY KEY (`id`)
|
|
105
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
106
|
+
|
|
107
|
+
CREATE TABLE IF NOT EXISTS `befly_menu` (
|
|
108
|
+
`id` BIGINT NOT NULL,
|
|
109
|
+
`name` VARCHAR(50) NOT NULL DEFAULT '',
|
|
110
|
+
`path` VARCHAR(150) NOT NULL DEFAULT '',
|
|
111
|
+
`sort` INT NOT NULL DEFAULT 0,
|
|
112
|
+
`parent_path` VARCHAR(200) NOT NULL DEFAULT '',
|
|
113
|
+
`state` TINYINT NOT NULL DEFAULT 1,
|
|
114
|
+
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
115
|
+
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
116
|
+
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
117
|
+
PRIMARY KEY (`id`)
|
|
118
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
119
|
+
|
|
120
|
+
CREATE TABLE IF NOT EXISTS `befly_operate_log` (
|
|
121
|
+
`id` BIGINT NOT NULL,
|
|
122
|
+
`admin_id` BIGINT NOT NULL DEFAULT 0,
|
|
123
|
+
`username` VARCHAR(50) NOT NULL DEFAULT '',
|
|
124
|
+
`nickname` VARCHAR(50) NOT NULL DEFAULT '',
|
|
125
|
+
`ip` VARCHAR(50) NOT NULL DEFAULT '',
|
|
126
|
+
`module` VARCHAR(50) NOT NULL DEFAULT '',
|
|
127
|
+
`action` VARCHAR(50) NOT NULL DEFAULT '',
|
|
128
|
+
`method` VARCHAR(10) NOT NULL DEFAULT '',
|
|
129
|
+
`path` VARCHAR(200) NOT NULL DEFAULT '',
|
|
130
|
+
`params` TEXT NULL,
|
|
131
|
+
`result` TINYINT NOT NULL DEFAULT 0,
|
|
132
|
+
`response` TEXT NULL,
|
|
133
|
+
`duration` BIGINT NOT NULL DEFAULT 0,
|
|
134
|
+
`operate_time` BIGINT NOT NULL DEFAULT 0,
|
|
135
|
+
`remark` VARCHAR(500) NOT NULL DEFAULT '',
|
|
136
|
+
`state` TINYINT NOT NULL DEFAULT 1,
|
|
137
|
+
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
138
|
+
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
139
|
+
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
140
|
+
PRIMARY KEY (`id`)
|
|
141
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
142
|
+
|
|
143
|
+
CREATE TABLE IF NOT EXISTS `befly_role` (
|
|
144
|
+
`id` BIGINT NOT NULL,
|
|
145
|
+
`name` VARCHAR(50) NOT NULL DEFAULT '',
|
|
146
|
+
`code` VARCHAR(50) NOT NULL DEFAULT '',
|
|
147
|
+
`description` VARCHAR(200) NOT NULL DEFAULT '',
|
|
148
|
+
`menus` JSON NULL,
|
|
149
|
+
`apis` JSON NULL,
|
|
150
|
+
`sort` INT NOT NULL DEFAULT 0,
|
|
151
|
+
`state` TINYINT NOT NULL DEFAULT 1,
|
|
152
|
+
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
153
|
+
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
154
|
+
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
155
|
+
PRIMARY KEY (`id`)
|
|
156
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
157
|
+
|
|
158
|
+
CREATE TABLE IF NOT EXISTS `befly_sys_config` (
|
|
159
|
+
`id` BIGINT NOT NULL,
|
|
160
|
+
`name` VARCHAR(50) NOT NULL DEFAULT '',
|
|
161
|
+
`code` VARCHAR(100) NOT NULL DEFAULT '',
|
|
162
|
+
`value` TEXT NULL,
|
|
163
|
+
`value_type` VARCHAR(20) NOT NULL DEFAULT '',
|
|
164
|
+
`group` VARCHAR(50) NOT NULL DEFAULT '',
|
|
165
|
+
`sort` INT NOT NULL DEFAULT 0,
|
|
166
|
+
`is_system` TINYINT NOT NULL DEFAULT 0,
|
|
167
|
+
`description` VARCHAR(500) NOT NULL DEFAULT '',
|
|
168
|
+
`state` TINYINT NOT NULL DEFAULT 1,
|
|
169
|
+
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
170
|
+
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
171
|
+
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
172
|
+
PRIMARY KEY (`id`)
|
|
173
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
package/sql/admin.sql
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
CREATE TABLE IF NOT EXISTS `admin` (
|
|
2
|
-
`id` BIGINT NOT NULL,
|
|
3
|
-
`nickname` VARCHAR(50) NOT NULL DEFAULT '',
|
|
4
|
-
`username` VARCHAR(30) NOT NULL DEFAULT '',
|
|
5
|
-
`password` VARCHAR(500) NOT NULL DEFAULT '',
|
|
6
|
-
`email` VARCHAR(100) NOT NULL DEFAULT '',
|
|
7
|
-
`phone` VARCHAR(20) NOT NULL DEFAULT '',
|
|
8
|
-
`avatar` VARCHAR(500) NOT NULL DEFAULT '',
|
|
9
|
-
`role_code` VARCHAR(50) NOT NULL DEFAULT '',
|
|
10
|
-
`role_type` VARCHAR(5) NOT NULL DEFAULT 'user',
|
|
11
|
-
`last_login_time` BIGINT NOT NULL DEFAULT 0,
|
|
12
|
-
`last_login_ip` VARCHAR(50) NOT NULL DEFAULT '',
|
|
13
|
-
`state` TINYINT NOT NULL DEFAULT 1,
|
|
14
|
-
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
15
|
-
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
16
|
-
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
17
|
-
PRIMARY KEY (`id`)
|
|
18
|
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
package/sql/api.sql
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
CREATE TABLE IF NOT EXISTS `api` (
|
|
2
|
-
`id` BIGINT NOT NULL,
|
|
3
|
-
`name` VARCHAR(100) NOT NULL DEFAULT '',
|
|
4
|
-
`auth` VARCHAR(200) NOT NULL DEFAULT '',
|
|
5
|
-
`path` VARCHAR(200) NOT NULL DEFAULT '',
|
|
6
|
-
`parent_path` VARCHAR(200) NOT NULL DEFAULT '',
|
|
7
|
-
`state` TINYINT NOT NULL DEFAULT 1,
|
|
8
|
-
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
9
|
-
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
10
|
-
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
11
|
-
PRIMARY KEY (`id`)
|
|
12
|
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
package/sql/dict.sql
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
CREATE TABLE IF NOT EXISTS `dict` (
|
|
2
|
-
`id` BIGINT NOT NULL,
|
|
3
|
-
`type_code` VARCHAR(50) NOT NULL DEFAULT '',
|
|
4
|
-
`key` VARCHAR(50) NOT NULL DEFAULT '',
|
|
5
|
-
`label` VARCHAR(100) NOT NULL DEFAULT '',
|
|
6
|
-
`sort` INT NOT NULL DEFAULT 0,
|
|
7
|
-
`remark` VARCHAR(200) NOT NULL DEFAULT '',
|
|
8
|
-
`state` TINYINT NOT NULL DEFAULT 1,
|
|
9
|
-
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
10
|
-
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
11
|
-
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
12
|
-
PRIMARY KEY (`id`)
|
|
13
|
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
package/sql/dictType.sql
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
CREATE TABLE IF NOT EXISTS `dict_type` (
|
|
2
|
-
`id` BIGINT NOT NULL,
|
|
3
|
-
`code` VARCHAR(50) NOT NULL DEFAULT '',
|
|
4
|
-
`name` VARCHAR(50) NOT NULL DEFAULT '',
|
|
5
|
-
`description` VARCHAR(200) NOT NULL DEFAULT '',
|
|
6
|
-
`sort` INT NOT NULL DEFAULT 0,
|
|
7
|
-
`state` TINYINT NOT NULL DEFAULT 1,
|
|
8
|
-
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
9
|
-
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
10
|
-
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
11
|
-
PRIMARY KEY (`id`)
|
|
12
|
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
package/sql/emailLog.sql
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
CREATE TABLE IF NOT EXISTS `email_log` (
|
|
2
|
-
`id` BIGINT NOT NULL,
|
|
3
|
-
`admin_id` BIGINT NOT NULL DEFAULT 0,
|
|
4
|
-
`username` VARCHAR(100) NOT NULL DEFAULT '',
|
|
5
|
-
`nickname` VARCHAR(100) NOT NULL DEFAULT '',
|
|
6
|
-
`to_email` VARCHAR(200) NOT NULL DEFAULT '',
|
|
7
|
-
`subject` VARCHAR(200) NOT NULL DEFAULT '',
|
|
8
|
-
`content` TEXT NULL,
|
|
9
|
-
`cc_email` VARCHAR(500) NOT NULL DEFAULT '',
|
|
10
|
-
`bcc_email` VARCHAR(500) NOT NULL DEFAULT '',
|
|
11
|
-
`send_time` BIGINT NOT NULL DEFAULT 0,
|
|
12
|
-
`send_result` TINYINT NOT NULL DEFAULT 0,
|
|
13
|
-
`message_id` VARCHAR(200) NOT NULL DEFAULT '',
|
|
14
|
-
`fail_reason` VARCHAR(500) NOT NULL DEFAULT '',
|
|
15
|
-
`state` TINYINT NOT NULL DEFAULT 1,
|
|
16
|
-
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
17
|
-
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
18
|
-
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
19
|
-
PRIMARY KEY (`id`)
|
|
20
|
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
package/sql/loginLog.sql
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
CREATE TABLE IF NOT EXISTS `login_log` (
|
|
2
|
-
`id` BIGINT NOT NULL,
|
|
3
|
-
`admin_id` BIGINT NOT NULL DEFAULT 0,
|
|
4
|
-
`username` VARCHAR(50) NOT NULL DEFAULT '',
|
|
5
|
-
`nickname` VARCHAR(50) NOT NULL DEFAULT '',
|
|
6
|
-
`ip` VARCHAR(50) NOT NULL DEFAULT '',
|
|
7
|
-
`user_agent` VARCHAR(500) NOT NULL DEFAULT '',
|
|
8
|
-
`browser_name` VARCHAR(50) NOT NULL DEFAULT '',
|
|
9
|
-
`browser_version` VARCHAR(50) NOT NULL DEFAULT '',
|
|
10
|
-
`os_name` VARCHAR(50) NOT NULL DEFAULT '',
|
|
11
|
-
`os_version` VARCHAR(50) NOT NULL DEFAULT '',
|
|
12
|
-
`device_type` VARCHAR(20) NOT NULL DEFAULT '',
|
|
13
|
-
`device_vendor` VARCHAR(50) NOT NULL DEFAULT '',
|
|
14
|
-
`device_model` VARCHAR(50) NOT NULL DEFAULT '',
|
|
15
|
-
`engine_name` VARCHAR(50) NOT NULL DEFAULT '',
|
|
16
|
-
`cpu_architecture` VARCHAR(20) NOT NULL DEFAULT '',
|
|
17
|
-
`login_time` BIGINT NOT NULL DEFAULT 0,
|
|
18
|
-
`login_result` TINYINT NOT NULL DEFAULT 0,
|
|
19
|
-
`fail_reason` VARCHAR(200) NOT NULL DEFAULT '',
|
|
20
|
-
`state` TINYINT NOT NULL DEFAULT 1,
|
|
21
|
-
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
22
|
-
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
23
|
-
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
24
|
-
PRIMARY KEY (`id`)
|
|
25
|
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
package/sql/menu.sql
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
CREATE TABLE IF NOT EXISTS `menu` (
|
|
2
|
-
`id` BIGINT NOT NULL,
|
|
3
|
-
`name` VARCHAR(50) NOT NULL DEFAULT '',
|
|
4
|
-
`path` VARCHAR(150) NOT NULL DEFAULT '',
|
|
5
|
-
`sort` INT NOT NULL DEFAULT 0,
|
|
6
|
-
`parent_path` VARCHAR(200) NOT NULL DEFAULT '',
|
|
7
|
-
`state` TINYINT NOT NULL DEFAULT 1,
|
|
8
|
-
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
9
|
-
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
10
|
-
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
11
|
-
PRIMARY KEY (`id`)
|
|
12
|
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
package/sql/operateLog.sql
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
CREATE TABLE IF NOT EXISTS `operate_log` (
|
|
2
|
-
`id` BIGINT NOT NULL,
|
|
3
|
-
`admin_id` BIGINT NOT NULL DEFAULT 0,
|
|
4
|
-
`username` VARCHAR(50) NOT NULL DEFAULT '',
|
|
5
|
-
`nickname` VARCHAR(50) NOT NULL DEFAULT '',
|
|
6
|
-
`ip` VARCHAR(50) NOT NULL DEFAULT '',
|
|
7
|
-
`module` VARCHAR(50) NOT NULL DEFAULT '',
|
|
8
|
-
`action` VARCHAR(50) NOT NULL DEFAULT '',
|
|
9
|
-
`method` VARCHAR(10) NOT NULL DEFAULT '',
|
|
10
|
-
`path` VARCHAR(200) NOT NULL DEFAULT '',
|
|
11
|
-
`params` TEXT NULL,
|
|
12
|
-
`result` TINYINT NOT NULL DEFAULT 0,
|
|
13
|
-
`response` TEXT NULL,
|
|
14
|
-
`duration` BIGINT NOT NULL DEFAULT 0,
|
|
15
|
-
`operate_time` BIGINT NOT NULL DEFAULT 0,
|
|
16
|
-
`remark` VARCHAR(500) NOT NULL DEFAULT '',
|
|
17
|
-
`state` TINYINT NOT NULL DEFAULT 1,
|
|
18
|
-
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
19
|
-
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
20
|
-
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
21
|
-
PRIMARY KEY (`id`)
|
|
22
|
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
package/sql/role.sql
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
CREATE TABLE IF NOT EXISTS `role` (
|
|
2
|
-
`id` BIGINT NOT NULL,
|
|
3
|
-
`name` VARCHAR(50) NOT NULL DEFAULT '',
|
|
4
|
-
`code` VARCHAR(50) NOT NULL DEFAULT '',
|
|
5
|
-
`description` VARCHAR(200) NOT NULL DEFAULT '',
|
|
6
|
-
`menus` JSON NULL,
|
|
7
|
-
`apis` JSON NULL,
|
|
8
|
-
`sort` INT NOT NULL DEFAULT 0,
|
|
9
|
-
`state` TINYINT NOT NULL DEFAULT 1,
|
|
10
|
-
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
11
|
-
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
12
|
-
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
13
|
-
PRIMARY KEY (`id`)
|
|
14
|
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
package/sql/sysConfig.sql
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
CREATE TABLE IF NOT EXISTS `sys_config` (
|
|
2
|
-
`id` BIGINT NOT NULL,
|
|
3
|
-
`name` VARCHAR(50) NOT NULL DEFAULT '',
|
|
4
|
-
`code` VARCHAR(100) NOT NULL DEFAULT '',
|
|
5
|
-
`value` TEXT NULL,
|
|
6
|
-
`value_type` VARCHAR(20) NOT NULL DEFAULT '',
|
|
7
|
-
`group` VARCHAR(50) NOT NULL DEFAULT '',
|
|
8
|
-
`sort` INT NOT NULL DEFAULT 0,
|
|
9
|
-
`is_system` TINYINT NOT NULL DEFAULT 0,
|
|
10
|
-
`description` VARCHAR(500) NOT NULL DEFAULT '',
|
|
11
|
-
`state` TINYINT NOT NULL DEFAULT 1,
|
|
12
|
-
`created_at` BIGINT NOT NULL DEFAULT 0,
|
|
13
|
-
`updated_at` BIGINT NOT NULL DEFAULT 0,
|
|
14
|
-
`deleted_at` BIGINT NULL DEFAULT NULL,
|
|
15
|
-
PRIMARY KEY (`id`)
|
|
16
|
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|