befly-tpl 3.2.1 → 3.2.3
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 +240 -14
- package/package.json +22 -4
- package/addon-loader.example.ts +0 -99
- package/bun.lock +0 -140
- package/logs/2025-08-22.0.log +0 -197
- package/logs/2025-08-23.0.log +0 -151
- package/logs/2025-08-24.0.log +0 -296
- package/logs/2025-08-25.0.log +0 -162
- package/logs/2025-08-26.0.log +0 -19
- package/logs/2025-08-27.0.log +0 -63
- package/logs/2025-08-28.0.log +0 -286
- package/logs/2025-08-30.0.log +0 -1
- package/logs/2025-09-01.0.log +0 -296
- package/logs/2025-09-02.0.log +0 -298
- package/logs/2025-10-11.0.log +0 -2718
- package/logs/2025-10-12.0.log +0 -4374
- package/logs/2025-10-13.0.log +0 -759
- package/logs/2025-10-14.0.log +0 -2350
- package/logs/2025-10-15.0.log +0 -2386
- package/logs/2025-10-16.0.log +0 -2807
- package/logs/2025-10-17.0.log +0 -1143
- package/logs/2025-10-18.0.log +0 -1292
- package/logs/2025-10-19.0.log +0 -1752
- package/logs/2025-10-20.0.log +0 -722
- package/logs/2025-10-21.0.log +0 -1075
- package/logs/2025-10-23.0.log +0 -3291
- package/logs/2025-10-24.0.log +0 -2341
- package/logs/2025-10-25.0.log +0 -1367
- package/logs/debug.0.log +0 -25174
- package/temp/addon-route-prefix-migration.md +0 -400
- package/temp/api-route-conflict-analysis.md +0 -441
- package/temp/interactive-cli-guide.md +0 -199
- package/temp/missing-apis-fix.md +0 -362
- package/temp/remove-status-field.md +0 -239
- package/temp/roleid-to-rolecode-optimization.md +0 -321
- package/temp/status-to-state-migration-complete.md +0 -176
- package/temp/syncMenu-guide.md +0 -235
- package/temp/test-admin-menus-cache.ts +0 -125
- package/temp/test-admin-menus.ts +0 -110
- package/temp/test-interactive-cli.ps1 +0 -14
|
@@ -1,321 +0,0 @@
|
|
|
1
|
-
# RoleId → RoleCode 查询优化报告
|
|
2
|
-
|
|
3
|
-
**日期**:2025-10-19
|
|
4
|
-
**状态**:✅ 已完成
|
|
5
|
-
|
|
6
|
-
## 📋 背景
|
|
7
|
-
|
|
8
|
-
用户要求将角色查询从使用 `roleId`(数据库主键)改为使用 `roleCode`(业务唯一标识符),原因如下:
|
|
9
|
-
|
|
10
|
-
1. **业务稳定性**:`roleCode` 是业务层面的唯一标识,不会因数据迁移等操作而改变
|
|
11
|
-
2. **可读性更好**:代码中的 `'dev'`、`'admin'` 等角色编码比数字 ID 更有意义
|
|
12
|
-
3. **解耦数据库**:减少对数据库主键的依赖,提高系统灵活性
|
|
13
|
-
|
|
14
|
-
## 🎯 修改目标
|
|
15
|
-
|
|
16
|
-
将所有通过 `roleId` 查询角色的地方改为使用 `roleCode`:
|
|
17
|
-
|
|
18
|
-
```typescript
|
|
19
|
-
// ❌ 修改前:使用 roleId
|
|
20
|
-
where: {
|
|
21
|
-
id: admin.roleId;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// ✅ 修改后:使用 roleCode
|
|
25
|
-
where: {
|
|
26
|
-
code: admin.roleCode;
|
|
27
|
-
}
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## ✅ 完成的修改
|
|
31
|
-
|
|
32
|
-
### 1. adminMenus.ts - 获取用户菜单
|
|
33
|
-
|
|
34
|
-
**修改内容**:
|
|
35
|
-
|
|
36
|
-
- 判断条件:`admin.roleId` → `admin.roleCode`
|
|
37
|
-
- 查询条件:`where: { id: admin.roleId }` → `where: { code: admin.roleCode }`
|
|
38
|
-
|
|
39
|
-
**修改前**:
|
|
40
|
-
|
|
41
|
-
```typescript
|
|
42
|
-
if (!admin || !admin.roleId) {
|
|
43
|
-
return Yes('获取菜单成功', []);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
const role = await befly.db.getOne({
|
|
47
|
-
table: 'addon_admin_role',
|
|
48
|
-
where: { id: admin.roleId }
|
|
49
|
-
});
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
**修改后**:
|
|
53
|
-
|
|
54
|
-
```typescript
|
|
55
|
-
if (!admin || !admin.roleCode) {
|
|
56
|
-
return Yes('获取菜单成功', []);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const role = await befly.db.getOne({
|
|
60
|
-
table: 'addon_admin_role',
|
|
61
|
-
where: { code: admin.roleCode }
|
|
62
|
-
});
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### 2. roleSave.ts - 保存用户角色
|
|
66
|
-
|
|
67
|
-
**修改内容**:
|
|
68
|
-
|
|
69
|
-
- API 参数:`roleId: Fields._id` → `roleCode: '角色编码|string|2|50|null|1|^[a-zA-Z0-9_]+$'`
|
|
70
|
-
- 查询条件:`where: { id: ctx.body.roleId }` → `where: { code: ctx.body.roleCode }`
|
|
71
|
-
- 数据更新:`roleId: ctx.body.roleId` → `roleId: role.id`(从查询结果获取)
|
|
72
|
-
|
|
73
|
-
**修改前**:
|
|
74
|
-
|
|
75
|
-
```typescript
|
|
76
|
-
fields: {
|
|
77
|
-
adminId: Fields._id,
|
|
78
|
-
roleId: Fields._id
|
|
79
|
-
},
|
|
80
|
-
handler: async (befly, ctx) => {
|
|
81
|
-
const role = await befly.db.getOne({
|
|
82
|
-
table: 'addon_admin_role',
|
|
83
|
-
where: { id: ctx.body.roleId }
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
await befly.db.updData({
|
|
87
|
-
table: 'addon_admin_admin',
|
|
88
|
-
where: { id: ctx.body.adminId },
|
|
89
|
-
data: {
|
|
90
|
-
roleId: ctx.body.roleId,
|
|
91
|
-
roleCode: role.code,
|
|
92
|
-
roleType: roleType
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
**修改后**:
|
|
99
|
-
|
|
100
|
-
```typescript
|
|
101
|
-
fields: {
|
|
102
|
-
adminId: Fields._id,
|
|
103
|
-
roleCode: '角色编码|string|2|50|null|1|^[a-zA-Z0-9_]+$'
|
|
104
|
-
},
|
|
105
|
-
handler: async (befly, ctx) => {
|
|
106
|
-
const role = await befly.db.getOne({
|
|
107
|
-
table: 'addon_admin_role',
|
|
108
|
-
where: { code: ctx.body.roleCode }
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
await befly.db.updData({
|
|
112
|
-
table: 'addon_admin_admin',
|
|
113
|
-
where: { id: ctx.body.adminId },
|
|
114
|
-
data: {
|
|
115
|
-
roleId: role.id,
|
|
116
|
-
roleCode: role.code,
|
|
117
|
-
roleType: roleType
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
### 3. roleGet.ts - 获取用户角色
|
|
124
|
-
|
|
125
|
-
**修改内容**:
|
|
126
|
-
|
|
127
|
-
- 判断条件:`admin.roleId` → `admin.roleCode`
|
|
128
|
-
- 查询条件:`where: { id: admin.roleId }` → `where: { code: admin.roleCode }`
|
|
129
|
-
|
|
130
|
-
**修改前**:
|
|
131
|
-
|
|
132
|
-
```typescript
|
|
133
|
-
let roleInfo = null;
|
|
134
|
-
if (admin.roleId) {
|
|
135
|
-
roleInfo = await befly.db.getOne({
|
|
136
|
-
table: 'addon_admin_role',
|
|
137
|
-
where: { id: admin.roleId }
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
**修改后**:
|
|
143
|
-
|
|
144
|
-
```typescript
|
|
145
|
-
let roleInfo = null;
|
|
146
|
-
if (admin.roleCode) {
|
|
147
|
-
roleInfo = await befly.db.getOne({
|
|
148
|
-
table: 'addon_admin_role',
|
|
149
|
-
where: { code: admin.roleCode }
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
### 4. adminInfo.ts - 获取用户信息
|
|
155
|
-
|
|
156
|
-
**修改内容**:
|
|
157
|
-
|
|
158
|
-
- 判断条件:`admin.roleId` → `admin.roleCode`
|
|
159
|
-
- 查询条件:`where: { id: admin.roleId }` → `where: { code: admin.roleCode }`
|
|
160
|
-
|
|
161
|
-
**修改前**:
|
|
162
|
-
|
|
163
|
-
```typescript
|
|
164
|
-
let roleInfo = null;
|
|
165
|
-
if (admin.roleId) {
|
|
166
|
-
roleInfo = await befly.db.getOne({
|
|
167
|
-
table: 'addon_admin_role',
|
|
168
|
-
where: { id: admin.roleId }
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
**修改后**:
|
|
174
|
-
|
|
175
|
-
```typescript
|
|
176
|
-
let roleInfo = null;
|
|
177
|
-
if (admin.roleCode) {
|
|
178
|
-
roleInfo = await befly.db.getOne({
|
|
179
|
-
table: 'addon_admin_role',
|
|
180
|
-
where: { code: admin.roleCode }
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
## 🔍 验证结果
|
|
186
|
-
|
|
187
|
-
使用 `grep` 搜索确认所有 `roleId` 查询已替换:
|
|
188
|
-
|
|
189
|
-
```bash
|
|
190
|
-
grep -rE "where:\s*\{\s*id:\s*.*\.roleId" packages/tpl/addons/admin/**/*.ts
|
|
191
|
-
# 结果:No matches found ✅
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
## 📊 修改统计
|
|
195
|
-
|
|
196
|
-
- **修改文件总数**:4 个
|
|
197
|
-
- **修改 API 接口**:4 个
|
|
198
|
-
- adminMenus.ts
|
|
199
|
-
- roleSave.ts
|
|
200
|
-
- roleGet.ts
|
|
201
|
-
- adminInfo.ts
|
|
202
|
-
|
|
203
|
-
## 🎓 优化要点
|
|
204
|
-
|
|
205
|
-
### 1. 为什么使用 roleCode 更好?
|
|
206
|
-
|
|
207
|
-
**稳定性**:
|
|
208
|
-
|
|
209
|
-
```typescript
|
|
210
|
-
// ❌ roleId 可能因数据迁移、导入导出等操作而改变
|
|
211
|
-
// 如果数据库重建,ID 会重新生成
|
|
212
|
-
|
|
213
|
-
// ✅ roleCode 是业务标识,始终保持不变
|
|
214
|
-
// 'dev', 'admin', 'user' 等编码在任何环境都一致
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
**可读性**:
|
|
218
|
-
|
|
219
|
-
```typescript
|
|
220
|
-
// ❌ 使用 ID,不知道具体是什么角色
|
|
221
|
-
if (admin.roleId === 1) { ... }
|
|
222
|
-
|
|
223
|
-
// ✅ 使用编码,一目了然
|
|
224
|
-
if (admin.roleCode === 'admin') { ... }
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
**解耦**:
|
|
228
|
-
|
|
229
|
-
```typescript
|
|
230
|
-
// ❌ 紧耦合数据库主键
|
|
231
|
-
// 多环境(开发/测试/生产)ID 可能不一致
|
|
232
|
-
|
|
233
|
-
// ✅ 使用业务标识
|
|
234
|
-
// 所有环境都使用相同的 roleCode
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
### 2. admin 表同时保留 roleId 和 roleCode 的原因
|
|
238
|
-
|
|
239
|
-
**roleId(数字)**:
|
|
240
|
-
|
|
241
|
-
- 数据库外键关联
|
|
242
|
-
- 查询性能优化(数字索引更快)
|
|
243
|
-
- 保持数据完整性
|
|
244
|
-
|
|
245
|
-
**roleCode(字符串)**:
|
|
246
|
-
|
|
247
|
-
- 业务逻辑判断
|
|
248
|
-
- 跨系统数据同步
|
|
249
|
-
- 代码可读性和维护性
|
|
250
|
-
|
|
251
|
-
### 3. 最佳实践
|
|
252
|
-
|
|
253
|
-
```typescript
|
|
254
|
-
// ✅ 推荐:查询时使用 roleCode
|
|
255
|
-
const role = await befly.db.getOne({
|
|
256
|
-
table: 'addon_admin_role',
|
|
257
|
-
where: { code: admin.roleCode }
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
// ✅ 推荐:更新时同时更新 roleId 和 roleCode
|
|
261
|
-
await befly.db.updData({
|
|
262
|
-
table: 'addon_admin_admin',
|
|
263
|
-
where: { id: adminId },
|
|
264
|
-
data: {
|
|
265
|
-
roleId: role.id, // 保持外键关联
|
|
266
|
-
roleCode: role.code, // 保持业务标识
|
|
267
|
-
roleType: roleType
|
|
268
|
-
}
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
// ✅ 推荐:业务逻辑判断使用 roleCode
|
|
272
|
-
if (admin.roleCode === 'dev' || admin.roleCode === 'admin') {
|
|
273
|
-
// 管理员权限
|
|
274
|
-
}
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
## 🚀 后续建议
|
|
278
|
-
|
|
279
|
-
1. **统一查询规范**:
|
|
280
|
-
- 所有角色相关查询都使用 `roleCode`
|
|
281
|
-
- 数据库关联可以保留 `roleId`
|
|
282
|
-
|
|
283
|
-
2. **数据完整性**:
|
|
284
|
-
- 确保 admin 表的 `roleCode` 字段始终与对应角色同步
|
|
285
|
-
- 在 `roleSave.ts` 中已实现同步更新逻辑
|
|
286
|
-
|
|
287
|
-
3. **前端适配**:
|
|
288
|
-
- 前端传参改为使用 `roleCode` 而非 `roleId`
|
|
289
|
-
- 下拉选择等组件显示 `code + name` 组合
|
|
290
|
-
|
|
291
|
-
4. **文档更新**:
|
|
292
|
-
- 更新 API 文档,说明使用 `roleCode` 参数
|
|
293
|
-
- 在 AGENTS.md 中添加角色查询规范
|
|
294
|
-
|
|
295
|
-
## 📝 影响范围
|
|
296
|
-
|
|
297
|
-
### API 接口变更
|
|
298
|
-
|
|
299
|
-
**roleSave.ts**:
|
|
300
|
-
|
|
301
|
-
- 参数变更:`roleId` → `roleCode`
|
|
302
|
-
- 调用方需要传递 `roleCode` 而非 `roleId`
|
|
303
|
-
|
|
304
|
-
### 内部查询优化
|
|
305
|
-
|
|
306
|
-
- adminMenus.ts:内部查询优化,不影响接口
|
|
307
|
-
- roleGet.ts:内部查询优化,不影响接口
|
|
308
|
-
- adminInfo.ts:内部查询优化,不影响接口
|
|
309
|
-
|
|
310
|
-
## ✅ 测试建议
|
|
311
|
-
|
|
312
|
-
1. **登录测试**:验证用户登录后菜单权限正常
|
|
313
|
-
2. **角色分配**:测试 `roleSave` 接口使用 `roleCode` 参数
|
|
314
|
-
3. **用户信息**:验证 `adminInfo` 接口返回正确的角色信息
|
|
315
|
-
4. **菜单缓存**:确认 Redis 缓存的菜单数据正常
|
|
316
|
-
|
|
317
|
-
---
|
|
318
|
-
|
|
319
|
-
**优化负责人**:AI Assistant
|
|
320
|
-
**审核状态**:✅ 已完成
|
|
321
|
-
**最后更新**:2025-10-19
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
# Status → State 字段迁移完成报告
|
|
2
|
-
|
|
3
|
-
**日期**:2025-10-19
|
|
4
|
-
**状态**:✅ 已完成
|
|
5
|
-
|
|
6
|
-
## 📋 背景
|
|
7
|
-
|
|
8
|
-
用户指出项目中自定义的 `status` 字段与框架保留的 `state` 字段功能重复,违反了框架设计规范。框架已提供统一的 `state` 字段来管理所有记录状态:
|
|
9
|
-
|
|
10
|
-
- `state = 0`:已删除(软删除)
|
|
11
|
-
- `state = 1`:正常/激活(默认)
|
|
12
|
-
- `state = 2`:已禁用
|
|
13
|
-
|
|
14
|
-
## 🎯 迁移目标
|
|
15
|
-
|
|
16
|
-
1. 删除所有表定义中的自定义 `status` 字段
|
|
17
|
-
2. 更新所有 API 代码,移除 `status` 字段的引用
|
|
18
|
-
3. 统一使用框架的 `state` 字段进行状态管理
|
|
19
|
-
4. 更新类型定义和注释说明
|
|
20
|
-
|
|
21
|
-
## ✅ 完成的修改
|
|
22
|
-
|
|
23
|
-
### 1. 表定义文件(已在之前完成)
|
|
24
|
-
|
|
25
|
-
| 文件 | 修改内容 |
|
|
26
|
-
| ------------------- | ------------------------- |
|
|
27
|
-
| `tables/menu.json` | ✅ 删除 `status` 字段定义 |
|
|
28
|
-
| `tables/role.json` | ✅ 删除 `status` 字段定义 |
|
|
29
|
-
| `tables/admin.json` | ✅ 删除 `status` 字段定义 |
|
|
30
|
-
|
|
31
|
-
### 2. 脚本文件
|
|
32
|
-
|
|
33
|
-
| 文件 | 修改内容 |
|
|
34
|
-
| --------------------- | ------------------------------------------------------------------------- |
|
|
35
|
-
| `scripts/syncMenu.ts` | ✅ 移除 `status` 字段操作<br>✅ 更新注释说明<br>✅ 查询和缓存改用 `state` |
|
|
36
|
-
| `scripts/syncDev.ts` | ✅ 移除 `status: 1` 赋值 |
|
|
37
|
-
|
|
38
|
-
### 3. API 文件(本次完成)
|
|
39
|
-
|
|
40
|
-
| 文件 | 修改内容 |
|
|
41
|
-
| -------------------- | ------------------------------------------------------------------------------------------------------------------- |
|
|
42
|
-
| `apis/menuCreate.ts` | ✅ 移除 `status: adminMenuTable.status`<br>✅ 添加注释说明 state 自动管理 |
|
|
43
|
-
| `apis/menuUpdate.ts` | ✅ 移除 `status` 字段验证<br>✅ 移除 `status: ctx.body.status` 更新<br>✅ 添加注释说明禁用/启用用法 |
|
|
44
|
-
| `apis/menuList.ts` | ✅ 将 fields 中的 `'status'` 改为 `'state'` |
|
|
45
|
-
| `apis/roleCreate.ts` | ✅ 移除 `status: adminRoleTable.status`<br>✅ 移除 `status: ctx.body.status` 插入<br>✅ 添加注释说明 state 自动管理 |
|
|
46
|
-
| `apis/roleUpdate.ts` | ✅ 移除 `status` 字段验证<br>✅ 移除 `status: ctx.body.status` 更新<br>✅ 添加注释说明禁用/启用用法 |
|
|
47
|
-
| `apis/login.ts` | ✅ 改为检查 `state === 2`(已在之前完成) |
|
|
48
|
-
| `apis/register.ts` | ✅ 移除 `status: 1` 赋值(已在之前完成) |
|
|
49
|
-
| `apis/adminMenus.ts` | ✅ 移除 `status` 查询(已在之前完成) |
|
|
50
|
-
| `apis/adminInfo.ts` | ✅ 更新注释,将 `status` 改为 `state` |
|
|
51
|
-
|
|
52
|
-
### 4. 类型定义
|
|
53
|
-
|
|
54
|
-
| 文件 | 修改内容 |
|
|
55
|
-
| ---------------- | ------------------------------------------------------------------------------------- |
|
|
56
|
-
| `types/index.ts` | ✅ Admin 接口:`status: 0 \| 1` → `state: 0 \| 1 \| 2`<br>✅ 添加注释说明各状态值含义 |
|
|
57
|
-
|
|
58
|
-
## 🔍 验证结果
|
|
59
|
-
|
|
60
|
-
使用 `grep` 搜索确认所有 `status` 引用已清理:
|
|
61
|
-
|
|
62
|
-
```bash
|
|
63
|
-
grep -r "status" packages/tpl/addons/admin/**/*.ts
|
|
64
|
-
# 结果:No matches found ✅
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
## 📊 迁移统计
|
|
68
|
-
|
|
69
|
-
- **修改文件总数**:13 个
|
|
70
|
-
- **删除字段定义**:3 个表
|
|
71
|
-
- **更新 API 接口**:9 个
|
|
72
|
-
- **更新脚本文件**:2 个
|
|
73
|
-
- **更新类型定义**:1 个
|
|
74
|
-
|
|
75
|
-
## 🎓 关键要点
|
|
76
|
-
|
|
77
|
-
### 1. 框架自动管理的字段
|
|
78
|
-
|
|
79
|
-
以下字段由框架自动添加和管理,**禁止**在表定义 JSON 中声明:
|
|
80
|
-
|
|
81
|
-
- `id` - 主键 ID(由 Redis `genTimeID()` 生成)
|
|
82
|
-
- `created_at` - 创建时间戳
|
|
83
|
-
- `updated_at` - 更新时间戳
|
|
84
|
-
- `deleted_at` - 删除时间戳(软删除)
|
|
85
|
-
- `state` - 状态字段(0/1/2)
|
|
86
|
-
|
|
87
|
-
### 2. State 字段使用规范
|
|
88
|
-
|
|
89
|
-
```typescript
|
|
90
|
-
// ✅ 正常记录(默认)
|
|
91
|
-
await befly.db.insData({
|
|
92
|
-
table: 'addon_admin_menu',
|
|
93
|
-
data: { name: '菜单名' }
|
|
94
|
-
// state 自动设置为 1
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
// ✅ 禁用记录
|
|
98
|
-
await befly.db.updData({
|
|
99
|
-
table: 'addon_admin_menu',
|
|
100
|
-
where: { id: menuId },
|
|
101
|
-
data: { state: 2 } // 手动设置为禁用
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
// ✅ 启用记录
|
|
105
|
-
await befly.db.updData({
|
|
106
|
-
table: 'addon_admin_menu',
|
|
107
|
-
where: { id: menuId },
|
|
108
|
-
data: { state: 1 } // 恢复为正常
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
// ✅ 软删除
|
|
112
|
-
await befly.db.delData({
|
|
113
|
-
table: 'addon_admin_menu',
|
|
114
|
-
where: { id: menuId }
|
|
115
|
-
// 自动设置 state=0, deleted_at=当前时间
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
// ✅ 查询时自动过滤已删除记录
|
|
119
|
-
const menus = await befly.db.getAll({
|
|
120
|
-
table: 'addon_admin_menu'
|
|
121
|
-
// 自动添加 where: { state$gt: 0 }
|
|
122
|
-
});
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### 3. 禁止事项
|
|
126
|
-
|
|
127
|
-
❌ **禁止在表 JSON 中定义 state 字段**:
|
|
128
|
-
|
|
129
|
-
```json
|
|
130
|
-
// ❌ 错误
|
|
131
|
-
{
|
|
132
|
-
"status": "状态|number|0|1|1|1|null",
|
|
133
|
-
"state": "状态|number|0|2|1|1|null"
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// ✅ 正确:不定义任何状态字段,由框架自动添加
|
|
137
|
-
{
|
|
138
|
-
"name": "名称|string|2|50|null|1|null"
|
|
139
|
-
}
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
❌ **禁止手动设置 state=0**:
|
|
143
|
-
|
|
144
|
-
```typescript
|
|
145
|
-
// ❌ 错误:不要手动设置 state=0
|
|
146
|
-
await befly.db.updData({
|
|
147
|
-
table: 'addon_admin_menu',
|
|
148
|
-
where: { id: menuId },
|
|
149
|
-
data: { state: 0 }
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
// ✅ 正确:使用 delData 方法
|
|
153
|
-
await befly.db.delData({
|
|
154
|
-
table: 'addon_admin_menu',
|
|
155
|
-
where: { id: menuId }
|
|
156
|
-
});
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
## 🚀 后续建议
|
|
160
|
-
|
|
161
|
-
1. **统一状态管理**:所有 addon 和业务表都应遵循 state 字段规范
|
|
162
|
-
2. **文档更新**:更新 AGENTS.md,明确禁止自定义状态字段
|
|
163
|
-
3. **代码审查**:定期检查是否有新的自定义状态字段
|
|
164
|
-
4. **前端适配**:前端组件需要适配 state 字段(0/1/2)而非旧的 status 字段
|
|
165
|
-
|
|
166
|
-
## 📝 参考资料
|
|
167
|
-
|
|
168
|
-
- 框架规范:`core/docs/` 目录
|
|
169
|
-
- 迁移指南:`temp/remove-status-field.md`
|
|
170
|
-
- 总指令文件:`AGENTS.md`
|
|
171
|
-
|
|
172
|
-
---
|
|
173
|
-
|
|
174
|
-
**迁移负责人**:AI Assistant
|
|
175
|
-
**审核状态**:✅ 已完成
|
|
176
|
-
**最后更新**:2025-10-19
|