befly 3.9.30 → 3.9.32
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/table.md +12 -12
- package/package.json +3 -3
- package/sync/syncDb/helpers.ts +1 -1
- package/sync/syncDev.ts +79 -29
package/docs/table.md
CHANGED
|
@@ -126,17 +126,17 @@ interface FieldDefinition {
|
|
|
126
126
|
|
|
127
127
|
### 可选属性
|
|
128
128
|
|
|
129
|
-
| 属性 | 类型 | 默认值
|
|
130
|
-
| ---------- | ---------------- |
|
|
131
|
-
| `detail` | `string` | `''`
|
|
132
|
-
| `min` | `number \| null` | `0`
|
|
133
|
-
| `max` | `number \| null` | `100`
|
|
134
|
-
| `default` | `any` | `null`
|
|
135
|
-
| `index` | `boolean` | `false`
|
|
136
|
-
| `unique` | `boolean` | `false`
|
|
137
|
-
| `nullable` | `boolean` | `false`
|
|
138
|
-
| `unsigned` | `boolean` | `true`
|
|
139
|
-
| `regexp` | `string \| null` | `null`
|
|
129
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
130
|
+
| ---------- | ---------------- | ---------------------------------------------- | ----------------------------------------------------------------------- |
|
|
131
|
+
| `detail` | `string` | `''` | 字段详细说明 |
|
|
132
|
+
| `min` | `number \| null` | `0` | 最小值(number)或最小长度(string) |
|
|
133
|
+
| `max` | `number \| null` | `100` (string) <br> `999999999999999` (number) | 最大值(number)或最大长度(string),number 类型默认为 999999999999999 |
|
|
134
|
+
| `default` | `any` | `null` | 默认值 |
|
|
135
|
+
| `index` | `boolean` | `false` | 是否创建普通索引 |
|
|
136
|
+
| `unique` | `boolean` | `false` | 是否唯一约束 |
|
|
137
|
+
| `nullable` | `boolean` | `false` | 是否允许 NULL |
|
|
138
|
+
| `unsigned` | `boolean` | `true` | 是否无符号(仅 number 类型有效) |
|
|
139
|
+
| `regexp` | `string \| null` | `null` | 正则验证规则(内置或自定义) |
|
|
140
140
|
|
|
141
141
|
---
|
|
142
142
|
|
|
@@ -188,7 +188,6 @@ interface FieldDefinition {
|
|
|
188
188
|
"name": "角色ID",
|
|
189
189
|
"type": "number",
|
|
190
190
|
"min": 1,
|
|
191
|
-
"max": 999999999999999,
|
|
192
191
|
"index": true
|
|
193
192
|
}
|
|
194
193
|
}
|
|
@@ -197,6 +196,7 @@ interface FieldDefinition {
|
|
|
197
196
|
**约束规则:**
|
|
198
197
|
|
|
199
198
|
- `min` 和 `max` 用于输入验证
|
|
199
|
+
- `max` 默认为 `999999999999999`(如未指定或为 null)
|
|
200
200
|
- `unsigned` 默认为 `true`(无符号,仅 MySQL 有效)
|
|
201
201
|
- 默认值为 `0`
|
|
202
202
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "befly",
|
|
3
|
-
"version": "3.9.
|
|
3
|
+
"version": "3.9.32",
|
|
4
4
|
"description": "Befly - 为 Bun 专属打造的 TypeScript API 接口框架核心引擎",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"bun": ">=1.3.0"
|
|
66
66
|
},
|
|
67
67
|
"dependencies": {
|
|
68
|
-
"befly-shared": "^1.2.
|
|
68
|
+
"befly-shared": "^1.2.7",
|
|
69
69
|
"chalk": "^5.6.2",
|
|
70
70
|
"es-toolkit": "^1.42.0",
|
|
71
71
|
"fast-jwt": "^6.1.0",
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"pino": "^10.1.0",
|
|
75
75
|
"pino-roll": "^4.0.0"
|
|
76
76
|
},
|
|
77
|
-
"gitHead": "
|
|
77
|
+
"gitHead": "7287680c89b51f165086410727cd4e769e87cd46",
|
|
78
78
|
"devDependencies": {
|
|
79
79
|
"typescript": "^5.9.3"
|
|
80
80
|
}
|
package/sync/syncDb/helpers.ts
CHANGED
|
@@ -77,7 +77,7 @@ export function formatFieldList(fields: string[]): string {
|
|
|
77
77
|
export function applyFieldDefaults(fieldDef: any): void {
|
|
78
78
|
fieldDef.detail = fieldDef.detail ?? '';
|
|
79
79
|
fieldDef.min = fieldDef.min ?? 0;
|
|
80
|
-
fieldDef.max = fieldDef.max ?? 100;
|
|
80
|
+
fieldDef.max = fieldDef.max ?? (fieldDef.type === 'number' ? 999999999999999 : 100);
|
|
81
81
|
fieldDef.default = fieldDef.default ?? null;
|
|
82
82
|
fieldDef.index = fieldDef.index ?? false;
|
|
83
83
|
fieldDef.unique = fieldDef.unique ?? false;
|
package/sync/syncDev.ts
CHANGED
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
* - 邮箱: 通过 DEV_EMAIL 环境变量配置(默认 dev@qq.com)
|
|
4
4
|
* - 姓名: 开发者
|
|
5
5
|
* - 密码: 使用 bcrypt 加密,通过 DEV_PASSWORD 环境变量配置
|
|
6
|
-
* - 角色:
|
|
6
|
+
* - 角色: 同步 dev, user, admin, guest 四个角色
|
|
7
|
+
* - dev: 拥有所有菜单和接口权限
|
|
8
|
+
* - user, admin, guest: 菜单和接口权限为空
|
|
7
9
|
* - 表名: addon_admin_admin
|
|
8
10
|
*/
|
|
9
11
|
|
|
@@ -85,38 +87,86 @@ export async function syncDevCommand(options: SyncDevOptions = {}): Promise<void
|
|
|
85
87
|
}
|
|
86
88
|
}
|
|
87
89
|
|
|
88
|
-
//
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
90
|
+
// 定义四个角色的配置
|
|
91
|
+
const roles = [
|
|
92
|
+
{
|
|
93
|
+
code: 'dev',
|
|
94
|
+
name: '开发者角色',
|
|
95
|
+
description: '拥有所有菜单和接口权限的开发者角色',
|
|
96
|
+
menus: menuIds,
|
|
97
|
+
apis: apiIds,
|
|
98
|
+
sort: 0
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
code: 'user',
|
|
102
|
+
name: '用户角色',
|
|
103
|
+
description: '普通用户角色',
|
|
104
|
+
menus: '',
|
|
105
|
+
apis: '',
|
|
106
|
+
sort: 1
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
code: 'admin',
|
|
110
|
+
name: '管理员角色',
|
|
111
|
+
description: '管理员角色',
|
|
112
|
+
menus: '',
|
|
113
|
+
apis: '',
|
|
114
|
+
sort: 2
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
code: 'guest',
|
|
118
|
+
name: '访客角色',
|
|
119
|
+
description: '访客角色',
|
|
120
|
+
menus: '',
|
|
121
|
+
apis: '',
|
|
122
|
+
sort: 3
|
|
123
|
+
}
|
|
124
|
+
];
|
|
93
125
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
126
|
+
// 同步所有角色
|
|
127
|
+
let devRole = null;
|
|
128
|
+
for (const roleConfig of roles) {
|
|
129
|
+
const existingRole = await helper.getOne({
|
|
97
130
|
table: 'addon_admin_role',
|
|
98
|
-
where: { code:
|
|
99
|
-
data: {
|
|
100
|
-
name: '开发者角色',
|
|
101
|
-
description: '拥有所有菜单和接口权限的开发者角色',
|
|
102
|
-
menus: menuIds,
|
|
103
|
-
apis: apiIds
|
|
104
|
-
}
|
|
131
|
+
where: { code: roleConfig.code }
|
|
105
132
|
});
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
133
|
+
|
|
134
|
+
if (existingRole) {
|
|
135
|
+
// 检查字段是否有变化
|
|
136
|
+
const hasChanges = existingRole.name !== roleConfig.name || existingRole.description !== roleConfig.description || existingRole.menus !== roleConfig.menus || existingRole.apis !== roleConfig.apis || existingRole.sort !== roleConfig.sort;
|
|
137
|
+
|
|
138
|
+
if (hasChanges) {
|
|
139
|
+
// 更新现有角色
|
|
140
|
+
await helper.updData({
|
|
141
|
+
table: 'addon_admin_role',
|
|
142
|
+
where: { code: roleConfig.code },
|
|
143
|
+
data: {
|
|
144
|
+
name: roleConfig.name,
|
|
145
|
+
description: roleConfig.description,
|
|
146
|
+
menus: roleConfig.menus,
|
|
147
|
+
apis: roleConfig.apis,
|
|
148
|
+
sort: roleConfig.sort
|
|
149
|
+
}
|
|
150
|
+
});
|
|
117
151
|
}
|
|
118
|
-
|
|
119
|
-
|
|
152
|
+
if (roleConfig.code === 'dev') {
|
|
153
|
+
devRole = existingRole;
|
|
154
|
+
}
|
|
155
|
+
} else {
|
|
156
|
+
// 创建新角色
|
|
157
|
+
const roleId = await helper.insData({
|
|
158
|
+
table: 'addon_admin_role',
|
|
159
|
+
data: roleConfig
|
|
160
|
+
});
|
|
161
|
+
if (roleConfig.code === 'dev') {
|
|
162
|
+
devRole = { id: roleId };
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (!devRole) {
|
|
168
|
+
Logger.error('dev 角色不存在,无法创建开发者账号');
|
|
169
|
+
return;
|
|
120
170
|
}
|
|
121
171
|
|
|
122
172
|
// 先对密码进行 SHA-256 + 盐值 哈希(模拟前端加密),再用 bcrypt 存储
|