befly-tpl 3.2.6 → 3.3.2
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/.env.development +3 -3
- package/apis/article/articleDel.ts +2 -2
- package/apis/article/articleDetail.ts +2 -2
- package/apis/article/articleList.ts +2 -4
- package/apis/article/articleUpd.ts +2 -2
- package/apis/article/increment.ts +2 -2
- package/apis/user/login.ts +3 -3
- package/apis/user/userList.ts +3 -5
- package/package.json +6 -10
- package/pm2.config.cjs +3 -3
- package/tables/user.json +1 -1
- package/addons/_template/README.md +0 -123
- package/addons/_template/addon.config.json +0 -17
- package/addons/_template/apis/example.ts +0 -33
- package/addons/_template/checks/example.ts +0 -23
- package/addons/_template/config/default.ts +0 -12
- package/addons/_template/plugins/example.ts +0 -39
- package/addons/_template/tables/example.json +0 -7
- package/addons/_template/types/index.d.ts +0 -21
- package/addons/admin/README.md +0 -179
- package/addons/admin/addon.config.json +0 -13
- package/addons/admin/apis/adminDel.ts +0 -37
- package/addons/admin/apis/adminInfo.ts +0 -50
- package/addons/admin/apis/adminIns.ts +0 -70
- package/addons/admin/apis/adminList.ts +0 -24
- package/addons/admin/apis/adminRoleDetail.ts +0 -38
- package/addons/admin/apis/adminRoleSave.ts +0 -40
- package/addons/admin/apis/adminUpd.ts +0 -54
- package/addons/admin/apis/apiAll.ts +0 -38
- package/addons/admin/apis/cacheRefresh.ts +0 -36
- package/addons/admin/apis/dashboardAddonList.ts +0 -16
- package/addons/admin/apis/dashboardChangelog.ts +0 -41
- package/addons/admin/apis/dashboardConfigStatus.ts +0 -56
- package/addons/admin/apis/dashboardEnvironmentInfo.ts +0 -48
- package/addons/admin/apis/dashboardPerformanceMetrics.ts +0 -25
- package/addons/admin/apis/dashboardPermissionStats.ts +0 -33
- package/addons/admin/apis/dashboardServiceStatus.ts +0 -84
- package/addons/admin/apis/dashboardSystemInfo.ts +0 -34
- package/addons/admin/apis/dashboardSystemOverview.ts +0 -34
- package/addons/admin/apis/dashboardSystemResources.ts +0 -119
- package/addons/admin/apis/dictAll.ts +0 -26
- package/addons/admin/apis/dictDel.ts +0 -27
- package/addons/admin/apis/dictDetail.ts +0 -28
- package/addons/admin/apis/dictIns.ts +0 -38
- package/addons/admin/apis/dictList.ts +0 -27
- package/addons/admin/apis/dictUpd.ts +0 -44
- package/addons/admin/apis/login.ts +0 -123
- package/addons/admin/apis/logout.ts +0 -23
- package/addons/admin/apis/menuAll.ts +0 -70
- package/addons/admin/apis/menuDel.ts +0 -40
- package/addons/admin/apis/menuIns.ts +0 -31
- package/addons/admin/apis/menuList.ts +0 -26
- package/addons/admin/apis/menuUpd.ts +0 -41
- package/addons/admin/apis/register.ts +0 -50
- package/addons/admin/apis/roleApiDetail.ts +0 -34
- package/addons/admin/apis/roleApiSave.ts +0 -44
- package/addons/admin/apis/roleDel.ts +0 -48
- package/addons/admin/apis/roleDetail.ts +0 -28
- package/addons/admin/apis/roleIns.ts +0 -40
- package/addons/admin/apis/roleList.ts +0 -18
- package/addons/admin/apis/roleMenuDetail.ts +0 -33
- package/addons/admin/apis/roleMenuSave.ts +0 -39
- package/addons/admin/apis/roleSave.ts +0 -45
- package/addons/admin/apis/roleUpd.ts +0 -53
- package/addons/admin/apis/sendSmsCode.ts +0 -36
- package/addons/admin/checks/admin.ts +0 -36
- package/addons/admin/config/index.ts +0 -45
- package/addons/admin/config/menu.json +0 -44
- package/addons/admin/scripts/syncApi.ts +0 -285
- package/addons/admin/scripts/syncDev.ts +0 -203
- package/addons/admin/scripts/syncMenu.ts +0 -210
- package/addons/admin/tables/admin.json +0 -14
- package/addons/admin/tables/api.json +0 -8
- package/addons/admin/tables/dict.json +0 -8
- package/addons/admin/tables/menu.json +0 -8
- package/addons/admin/tables/role.json +0 -8
- package/addons/admin/types/index.ts +0 -44
- package/addons/admin/util.ts +0 -266
- package/addons/befly/addon.config.json +0 -13
- package/addons/befly/apis/health/info.ts +0 -77
- package/addons/befly/apis/tool/tokenCheck.ts +0 -52
- package/addons/demo/README.md +0 -62
- package/addons/demo/addon.config.json +0 -13
- package/addons/demo/apis/demoIns.ts +0 -36
- package/addons/demo/apis/demoList.ts +0 -36
- package/addons/demo/checks/demo.ts +0 -30
- package/addons/demo/config/default.ts +0 -17
- package/addons/demo/plugins/tool.ts +0 -61
- package/addons/demo/tables/todo.json +0 -6
- package/addons/demo/types/index.d.ts +0 -56
- package/tests/core.test.ts +0 -13
package/addons/admin/README.md
DELETED
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
# Admin 管理后台插件
|
|
2
|
-
|
|
3
|
-
## 功能说明
|
|
4
|
-
|
|
5
|
-
提供管理后台的基础功能,包括:
|
|
6
|
-
|
|
7
|
-
- 管理员注册
|
|
8
|
-
- 管理员登录(支持邮箱和手机号两种方式)
|
|
9
|
-
- 发送短信验证码
|
|
10
|
-
- 获取用户信息
|
|
11
|
-
- 退出登录
|
|
12
|
-
|
|
13
|
-
## API 接口
|
|
14
|
-
|
|
15
|
-
所有接口路由前缀: `/api/admin/`
|
|
16
|
-
|
|
17
|
-
### 1. 注册接口
|
|
18
|
-
|
|
19
|
-
**路由**: `POST /api/admin/register`
|
|
20
|
-
|
|
21
|
-
**请求参数**:
|
|
22
|
-
|
|
23
|
-
```json
|
|
24
|
-
{
|
|
25
|
-
"name": "管理员姓名",
|
|
26
|
-
"email": "admin@example.com",
|
|
27
|
-
"password": "密码(至少6位)"
|
|
28
|
-
}
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
**响应**:
|
|
32
|
-
|
|
33
|
-
```json
|
|
34
|
-
{
|
|
35
|
-
"code": 0,
|
|
36
|
-
"msg": "注册成功",
|
|
37
|
-
"data": {
|
|
38
|
-
"id": 1,
|
|
39
|
-
"name": "管理员姓名",
|
|
40
|
-
"email": "admin@example.com"
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
### 2. 登录接口
|
|
46
|
-
|
|
47
|
-
**路由**: `POST /api/admin/login`
|
|
48
|
-
|
|
49
|
-
**邮箱登录**:
|
|
50
|
-
|
|
51
|
-
```json
|
|
52
|
-
{
|
|
53
|
-
"email": "admin@example.com",
|
|
54
|
-
"password": "密码"
|
|
55
|
-
}
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
**手机号登录**:
|
|
59
|
-
|
|
60
|
-
```json
|
|
61
|
-
{
|
|
62
|
-
"phone": "13800138000",
|
|
63
|
-
"code": "验证码"
|
|
64
|
-
}
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
**响应**:
|
|
68
|
-
|
|
69
|
-
```json
|
|
70
|
-
{
|
|
71
|
-
"code": 0,
|
|
72
|
-
"msg": "登录成功",
|
|
73
|
-
"data": {
|
|
74
|
-
"token": "JWT Token",
|
|
75
|
-
"userInfo": {
|
|
76
|
-
"id": 1,
|
|
77
|
-
"name": "管理员姓名",
|
|
78
|
-
"email": "admin@example.com",
|
|
79
|
-
"role": "admin",
|
|
80
|
-
"status": 1
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
### 3. 发送短信验证码
|
|
87
|
-
|
|
88
|
-
**路由**: `POST /api/admin/sendSmsCode`
|
|
89
|
-
|
|
90
|
-
**请求参数**:
|
|
91
|
-
|
|
92
|
-
```json
|
|
93
|
-
{
|
|
94
|
-
"phone": "13800138000"
|
|
95
|
-
}
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
**响应**:
|
|
99
|
-
|
|
100
|
-
```json
|
|
101
|
-
{
|
|
102
|
-
"code": 0,
|
|
103
|
-
"msg": "验证码已发送",
|
|
104
|
-
"data": {
|
|
105
|
-
"code": "123456" // 仅开发环境返回
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
### 4. 获取用户信息
|
|
111
|
-
|
|
112
|
-
**路由**: `GET /api/admin/userInfo`
|
|
113
|
-
|
|
114
|
-
**请求头**:
|
|
115
|
-
|
|
116
|
-
```
|
|
117
|
-
Authorization: Bearer {token}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
**响应**:
|
|
121
|
-
|
|
122
|
-
```json
|
|
123
|
-
{
|
|
124
|
-
"code": 0,
|
|
125
|
-
"msg": "获取成功",
|
|
126
|
-
"data": {
|
|
127
|
-
"id": 1,
|
|
128
|
-
"name": "管理员姓名",
|
|
129
|
-
"email": "admin@example.com",
|
|
130
|
-
"role": "admin",
|
|
131
|
-
"status": 1
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
### 5. 退出登录
|
|
137
|
-
|
|
138
|
-
**路由**: `POST /api/admin/logout`
|
|
139
|
-
|
|
140
|
-
**请求头**:
|
|
141
|
-
|
|
142
|
-
```
|
|
143
|
-
Authorization: Bearer {token}
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
**响应**:
|
|
147
|
-
|
|
148
|
-
```json
|
|
149
|
-
{
|
|
150
|
-
"code": 0,
|
|
151
|
-
"msg": "退出成功",
|
|
152
|
-
"data": null
|
|
153
|
-
}
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
## 数据库表
|
|
157
|
-
|
|
158
|
-
### admin_admin 表
|
|
159
|
-
|
|
160
|
-
| 字段 | 类型 | 说明 |
|
|
161
|
-
| --------------- | -------------------- | ------------------- |
|
|
162
|
-
| id | int | 主键 ID |
|
|
163
|
-
| name | varchar(50) | 姓名 |
|
|
164
|
-
| email | varchar(100) | 邮箱 |
|
|
165
|
-
| phone | varchar(20) | 手机号 |
|
|
166
|
-
| password | varchar(255) | 密码(加密) |
|
|
167
|
-
| role | enum('admin','user') | 角色 |
|
|
168
|
-
| status | tinyint(1) | 状态(1-启用 0-禁用) |
|
|
169
|
-
| last_login_time | datetime | 最后登录时间 |
|
|
170
|
-
| last_login_ip | varchar(50) | 最后登录 IP |
|
|
171
|
-
| created_at | datetime | 创建时间 |
|
|
172
|
-
| updated_at | datetime | 更新时间 |
|
|
173
|
-
|
|
174
|
-
## 注意事项
|
|
175
|
-
|
|
176
|
-
1. 短信验证码功能需要配置短信服务提供商
|
|
177
|
-
2. 建议在生产环境配置 Redis 来存储验证码和 token 黑名单
|
|
178
|
-
3. 密码使用 bcrypt 加密存储
|
|
179
|
-
4. Token 有效期默认为 7 天
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "admin",
|
|
3
|
-
"title": "管理后台",
|
|
4
|
-
"version": "1.0.0",
|
|
5
|
-
"description": "提供管理后台的基础功能,包括管理员注册、登录、用户信息管理等",
|
|
6
|
-
"author": {
|
|
7
|
-
"name": "Befly Team"
|
|
8
|
-
},
|
|
9
|
-
"keywords": ["admin", "backend", "management"],
|
|
10
|
-
"entry": "index.ts",
|
|
11
|
-
"enabled": true,
|
|
12
|
-
"license": "MIT"
|
|
13
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 删除管理员
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Yes, No, Fields } from 'befly';
|
|
6
|
-
|
|
7
|
-
export default {
|
|
8
|
-
name: '删除管理员',
|
|
9
|
-
fields: {
|
|
10
|
-
id: Fields._id
|
|
11
|
-
},
|
|
12
|
-
required: ['id'],
|
|
13
|
-
handler: async (befly, ctx) => {
|
|
14
|
-
// 检查管理员是否存在
|
|
15
|
-
const admin = await befly.db.getOne({
|
|
16
|
-
table: 'addon_admin_admin',
|
|
17
|
-
where: { id: ctx.body.id }
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
if (!admin) {
|
|
21
|
-
return No('管理员不存在');
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// 不能删除 dev 角色的管理员
|
|
25
|
-
if (admin.roleCode === 'dev') {
|
|
26
|
-
return No('不能删除开发者账号');
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// 删除管理员
|
|
30
|
-
await befly.db.delData({
|
|
31
|
-
table: 'addon_admin_admin',
|
|
32
|
-
where: { id: ctx.body.id }
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
return Yes('删除成功');
|
|
36
|
-
}
|
|
37
|
-
};
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 获取用户信息接口
|
|
3
|
-
*
|
|
4
|
-
* @returns 返回 admin 表的字段(不含 password)以及关联的角色信息(小驼峰格式):
|
|
5
|
-
* - id, name, email, phone, roleId, roleCode, state
|
|
6
|
-
* - lastLoginTime, lastLoginIp
|
|
7
|
-
* - createdAt, updatedAt
|
|
8
|
-
* - role: 角色完整信息(包含 menus 和 apis 权限)
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { Yes, No } from 'befly';
|
|
12
|
-
|
|
13
|
-
export default {
|
|
14
|
-
name: '获取用户信息',
|
|
15
|
-
handler: async (befly, ctx) => {
|
|
16
|
-
// 从 JWT token 中获取用户ID
|
|
17
|
-
const userId = ctx.user?.id;
|
|
18
|
-
|
|
19
|
-
if (!userId) {
|
|
20
|
-
return No('未授权');
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// 查询用户信息(框架自动转换为小驼峰)
|
|
24
|
-
const admin = await befly.db.getOne({
|
|
25
|
-
table: 'addon_admin_admin',
|
|
26
|
-
where: { id: userId }
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
if (!admin) {
|
|
30
|
-
return No('用户不存在');
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// 查询角色信息(使用 roleCode 而非 roleId,框架自动转换为小驼峰)
|
|
34
|
-
let roleInfo = null;
|
|
35
|
-
if (admin.roleCode) {
|
|
36
|
-
roleInfo = await befly.db.getOne({
|
|
37
|
-
table: 'addon_admin_role',
|
|
38
|
-
where: { code: admin.roleCode }
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// 返回用户信息(不包含密码,字段已是小驼峰格式)
|
|
43
|
-
const { password: _, ...userWithoutPassword } = admin;
|
|
44
|
-
|
|
45
|
-
return Yes('获取成功', {
|
|
46
|
-
...userWithoutPassword,
|
|
47
|
-
role: roleInfo
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
};
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 添加管理员
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Yes, No, Fields, Crypto2 } from 'befly';
|
|
6
|
-
import adminTable from '../tables/admin.json';
|
|
7
|
-
|
|
8
|
-
export default {
|
|
9
|
-
name: '添加管理员',
|
|
10
|
-
fields: {
|
|
11
|
-
username: adminTable.username,
|
|
12
|
-
email: adminTable.email,
|
|
13
|
-
password: adminTable.password,
|
|
14
|
-
name: adminTable.name,
|
|
15
|
-
nickname: adminTable.nickname,
|
|
16
|
-
phone: adminTable.phone,
|
|
17
|
-
roleId: adminTable.roleId,
|
|
18
|
-
roleCode: adminTable.roleCode,
|
|
19
|
-
roleType: adminTable.roleType
|
|
20
|
-
},
|
|
21
|
-
required: ['username', 'email', 'password'],
|
|
22
|
-
handler: async (befly, ctx) => {
|
|
23
|
-
// 检查用户名是否已存在
|
|
24
|
-
if (ctx.body.username) {
|
|
25
|
-
const existingByUsername = await befly.db.getOne({
|
|
26
|
-
table: 'addon_admin_admin',
|
|
27
|
-
where: { username: ctx.body.username }
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
if (existingByUsername) {
|
|
31
|
-
return No('用户名已被使用');
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// 检查邮箱是否已存在
|
|
36
|
-
const existingByEmail = await befly.db.getOne({
|
|
37
|
-
table: 'addon_admin_admin',
|
|
38
|
-
where: { email: ctx.body.email }
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
if (existingByEmail) {
|
|
42
|
-
return No('邮箱已被使用');
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// 加密密码
|
|
46
|
-
const hashedPassword = await Crypto2.hashPassword(ctx.body.password);
|
|
47
|
-
|
|
48
|
-
// 创建管理员
|
|
49
|
-
const adminId = await befly.db.insData({
|
|
50
|
-
table: 'addon_admin_admin',
|
|
51
|
-
data: {
|
|
52
|
-
username: ctx.body.username,
|
|
53
|
-
email: ctx.body.email,
|
|
54
|
-
password: hashedPassword,
|
|
55
|
-
name: ctx.body.name,
|
|
56
|
-
nickname: ctx.body.nickname,
|
|
57
|
-
phone: ctx.body.phone,
|
|
58
|
-
roleId: ctx.body.roleId || 0,
|
|
59
|
-
roleCode: ctx.body.roleCode || '',
|
|
60
|
-
roleType: ctx.body.roleType || 'user'
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
return Yes('添加成功', {
|
|
65
|
-
id: adminId,
|
|
66
|
-
username: ctx.body.username,
|
|
67
|
-
email: ctx.body.email
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
};
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 获取管理员列表
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Yes, Fields } from 'befly';
|
|
6
|
-
|
|
7
|
-
export default {
|
|
8
|
-
name: '获取管理员列表',
|
|
9
|
-
fields: {
|
|
10
|
-
page: Fields.page,
|
|
11
|
-
limit: Fields.limit
|
|
12
|
-
},
|
|
13
|
-
handler: async (befly, ctx) => {
|
|
14
|
-
// 查询所有管理员(框架自动排除password字段,自动转换字段名为小驼峰)
|
|
15
|
-
const result = await befly.db.getList({
|
|
16
|
-
table: 'addon_admin_admin',
|
|
17
|
-
page: ctx.body.page || 1,
|
|
18
|
-
limit: ctx.body.limit || 10,
|
|
19
|
-
orderBy: ['createdAt#DESC']
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
return Yes('获取成功', result);
|
|
23
|
-
}
|
|
24
|
-
};
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 获取管理员的角色(单角色模式)
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Yes, No, Fields } from 'befly';
|
|
6
|
-
|
|
7
|
-
export default {
|
|
8
|
-
name: '获取管理员角色',
|
|
9
|
-
fields: {
|
|
10
|
-
adminId: Fields._id
|
|
11
|
-
},
|
|
12
|
-
handler: async (befly, ctx) => {
|
|
13
|
-
// 查询管理员信息(框架自动转换为小驼峰)
|
|
14
|
-
const admin = await befly.db.getOne({
|
|
15
|
-
table: 'addon_admin_admin',
|
|
16
|
-
where: { id: ctx.body.adminId }
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
if (!admin) {
|
|
20
|
-
return No('管理员不存在');
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// 如果有角色编码,查询角色详细信息(使用 roleCode 而非 roleId)
|
|
24
|
-
let roleInfo = null;
|
|
25
|
-
if (admin.roleCode) {
|
|
26
|
-
roleInfo = await befly.db.getOne({
|
|
27
|
-
table: 'addon_admin_role',
|
|
28
|
-
where: { code: admin.roleCode }
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return Yes('操作成功', {
|
|
33
|
-
roleId: admin.roleId,
|
|
34
|
-
roleCode: admin.roleCode,
|
|
35
|
-
role: roleInfo
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
};
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 保存管理员的角色(单角色模式)
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Yes, No, Fields } from 'befly';
|
|
6
|
-
|
|
7
|
-
export default {
|
|
8
|
-
name: '保存管理员角色',
|
|
9
|
-
fields: {
|
|
10
|
-
adminId: Fields._id,
|
|
11
|
-
roleCode: '角色编码|string|2|50|null|1|^[a-zA-Z0-9_]+$'
|
|
12
|
-
},
|
|
13
|
-
handler: async (befly, ctx) => {
|
|
14
|
-
// 查询角色是否存在(使用 roleCode 而非 roleId)
|
|
15
|
-
const role = await befly.db.getOne({
|
|
16
|
-
table: 'addon_admin_role',
|
|
17
|
-
where: { code: ctx.body.roleCode }
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
if (!role) {
|
|
21
|
-
return No('角色不存在');
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// 根据角色编码判断角色类型(硬编码规则)
|
|
25
|
-
const roleType = role.code === 'dev' || role.code === 'admin' ? 'admin' : 'user';
|
|
26
|
-
|
|
27
|
-
// 更新管理员的角色ID、角色编码和角色类型
|
|
28
|
-
await befly.db.updData({
|
|
29
|
-
table: 'addon_admin_admin',
|
|
30
|
-
where: { id: ctx.body.adminId },
|
|
31
|
-
data: {
|
|
32
|
-
roleId: role.id,
|
|
33
|
-
roleCode: role.code,
|
|
34
|
-
roleType: roleType
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
return Yes('操作成功');
|
|
39
|
-
}
|
|
40
|
-
};
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 更新管理员信息
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Yes, No, Fields } from 'befly';
|
|
6
|
-
import { Fields } from 'befly';
|
|
7
|
-
import adminTable from '../tables/admin.json';
|
|
8
|
-
|
|
9
|
-
export default {
|
|
10
|
-
name: '更新管理员',
|
|
11
|
-
fields: {
|
|
12
|
-
id: Fields._id,
|
|
13
|
-
name: adminTable.name,
|
|
14
|
-
nickname: adminTable.nickname,
|
|
15
|
-
email: adminTable.email,
|
|
16
|
-
phone: adminTable.phone,
|
|
17
|
-
state: Fields._state
|
|
18
|
-
},
|
|
19
|
-
required: ['id'],
|
|
20
|
-
handler: async (befly, ctx) => {
|
|
21
|
-
const { id, ...updateData } = ctx.body;
|
|
22
|
-
|
|
23
|
-
// 检查管理员是否存在
|
|
24
|
-
const admin = await befly.db.getOne({
|
|
25
|
-
table: 'addon_admin_admin',
|
|
26
|
-
where: { id }
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
if (!admin) {
|
|
30
|
-
return No('管理员不存在');
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// 如果更新邮箱,检查是否重复
|
|
34
|
-
if (updateData.email && updateData.email !== admin.email) {
|
|
35
|
-
const existingAdmin = await befly.db.getOne({
|
|
36
|
-
table: 'addon_admin_admin',
|
|
37
|
-
where: { email: updateData.email }
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
if (existingAdmin) {
|
|
41
|
-
return No('邮箱已被使用');
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// 更新管理员信息
|
|
46
|
-
await befly.db.updData({
|
|
47
|
-
table: 'addon_admin_admin',
|
|
48
|
-
data: updateData,
|
|
49
|
-
where: { id }
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
return Yes('更新成功');
|
|
53
|
-
}
|
|
54
|
-
};
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 获取所有接口列表
|
|
3
|
-
* 说明:用于角色权限配置,返回所有接口信息
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { Yes, No } from 'befly';
|
|
7
|
-
|
|
8
|
-
export default {
|
|
9
|
-
name: '获取所有接口',
|
|
10
|
-
auth: true,
|
|
11
|
-
handler: async (befly, ctx) => {
|
|
12
|
-
try {
|
|
13
|
-
// 从 Redis 缓存读取所有接口
|
|
14
|
-
let allApis = await befly.redis.getObject<any[]>('apis:all');
|
|
15
|
-
|
|
16
|
-
// 如果缓存不存在,从数据库查询
|
|
17
|
-
if (!allApis || allApis.length === 0) {
|
|
18
|
-
befly.logger.info('接口缓存未命中,从数据库查询');
|
|
19
|
-
allApis = await befly.db.getAll({
|
|
20
|
-
table: 'addon_admin_api',
|
|
21
|
-
fields: ['id', 'name', 'path', 'method', 'description', 'addonName', 'addonTitle'],
|
|
22
|
-
orderBy: ['addonName#ASC', 'path#ASC']
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
// 回写缓存
|
|
26
|
-
if (allApis.length > 0) {
|
|
27
|
-
await befly.redis.setObject('apis:all', allApis);
|
|
28
|
-
}
|
|
29
|
-
return Yes('操作成功', { lists: allApis, from: '来自数据库' });
|
|
30
|
-
} else {
|
|
31
|
-
return Yes('操作成功', { lists: allApis, from: '来自缓存' });
|
|
32
|
-
}
|
|
33
|
-
} catch (error: any) {
|
|
34
|
-
befly.logger.error('获取接口列表失败:', error);
|
|
35
|
-
return No('获取接口列表失败');
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
};
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 刷新所有缓存到 Redis
|
|
3
|
-
* 说明:手动触发缓存刷新,无需重启服务器
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type { ApiRoute } from 'befly/types/api';
|
|
7
|
-
import { Yes, No } from 'befly/utils';
|
|
8
|
-
import { CacheManager } from 'befly/lifecycle/cacheManager';
|
|
9
|
-
import { Fields } from 'befly/config/fields';
|
|
10
|
-
|
|
11
|
-
export default {
|
|
12
|
-
name: '刷新缓存',
|
|
13
|
-
method: 'POST',
|
|
14
|
-
auth: true,
|
|
15
|
-
fields: {},
|
|
16
|
-
required: [],
|
|
17
|
-
handler: async (befly, ctx) => {
|
|
18
|
-
try {
|
|
19
|
-
// 检查权限(仅 dev 角色可执行)
|
|
20
|
-
if (ctx.user?.role !== 'dev') {
|
|
21
|
-
return No('无权限执行此操作');
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// 执行缓存刷新
|
|
25
|
-
await CacheManager.cacheAll(befly.apiRoutes, befly);
|
|
26
|
-
|
|
27
|
-
return Yes('缓存刷新成功', {
|
|
28
|
-
message: '已重新缓存接口、菜单和角色权限'
|
|
29
|
-
});
|
|
30
|
-
} catch (error: any) {
|
|
31
|
-
return No('缓存刷新失败', {
|
|
32
|
-
error: error.message
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
} as ApiRoute;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 获取插件列表
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Yes } from 'befly';
|
|
6
|
-
import { getAddonList } from '../util.js';
|
|
7
|
-
|
|
8
|
-
export default {
|
|
9
|
-
name: '获取插件列表',
|
|
10
|
-
auth: true,
|
|
11
|
-
fields: {},
|
|
12
|
-
handler: async (befly, ctx) => {
|
|
13
|
-
const addonList = getAddonList();
|
|
14
|
-
return Yes('获取成功', addonList);
|
|
15
|
-
}
|
|
16
|
-
};
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 获取更新日志
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Yes, Fields } from 'befly';
|
|
6
|
-
|
|
7
|
-
export default {
|
|
8
|
-
name: '获取更新日志',
|
|
9
|
-
auth: true,
|
|
10
|
-
fields: {
|
|
11
|
-
limit: Fields.limit
|
|
12
|
-
},
|
|
13
|
-
handler: async (befly, ctx) => {
|
|
14
|
-
// 更新日志数据(实际项目中可以从配置文件或数据库读取)
|
|
15
|
-
const changelog = [
|
|
16
|
-
{
|
|
17
|
-
version: 'v1.0.0',
|
|
18
|
-
date: '2025-10-25',
|
|
19
|
-
changes: ['新增角色权限管理功能', '新增菜单权限分配功能', '新增接口权限管理功能', '优化菜单同步性能', '优化字段类型验证', '修复数组类型字段验证bug']
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
version: 'v0.9.0',
|
|
23
|
-
date: '2025-10-20',
|
|
24
|
-
changes: ['初始版本发布', '完成基础框架搭建', '实现用户认证功能', '实现RBAC权限系统']
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
version: 'v0.8.0',
|
|
28
|
-
date: '2025-10-15',
|
|
29
|
-
changes: ['完成数据库设计', '实现核心API', '添加字段验证器', '集成Redis缓存']
|
|
30
|
-
}
|
|
31
|
-
];
|
|
32
|
-
|
|
33
|
-
// 根据 limit 参数返回指定数量的日志
|
|
34
|
-
const limit = ctx.body.limit || 5;
|
|
35
|
-
const lists = changelog.slice(0, limit);
|
|
36
|
-
|
|
37
|
-
return Yes('获取成功', {
|
|
38
|
-
lists: lists
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
};
|