befly 3.5.7 → 3.7.0
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.ts → check.ts} +14 -17
- package/lib/addon.ts +77 -0
- package/lib/logger.ts +6 -15
- package/lifecycle/checker.ts +22 -48
- package/lifecycle/lifecycle.ts +7 -5
- package/lifecycle/loader.ts +5 -6
- package/main.ts +12 -1
- package/package.json +3 -14
- package/paths.ts +5 -54
- package/plugins/cache.ts +0 -1
- package/plugins/db.ts +0 -1
- package/plugins/logger.ts +0 -1
- package/plugins/redis.ts +0 -6
- package/util.ts +1 -83
- package/apis/admin/del.ts +0 -35
- package/apis/admin/info.ts +0 -50
- package/apis/admin/ins.ts +0 -61
- package/apis/admin/list.ts +0 -20
- package/apis/admin/roleDetail.ts +0 -35
- package/apis/admin/roleSave.ts +0 -40
- package/apis/admin/upd.ts +0 -51
- package/apis/api/all.ts +0 -37
- package/apis/auth/login.ts +0 -78
- package/apis/auth/logout.ts +0 -23
- package/apis/auth/register.ts +0 -50
- package/apis/auth/sendSmsCode.ts +0 -36
- package/apis/cache/refresh.ts +0 -34
- package/apis/dashboard/addonList.ts +0 -47
- package/apis/dashboard/changelog.ts +0 -37
- package/apis/dashboard/configStatus.ts +0 -54
- package/apis/dashboard/environmentInfo.ts +0 -46
- package/apis/dashboard/performanceMetrics.ts +0 -23
- package/apis/dashboard/permissionStats.ts +0 -31
- package/apis/dashboard/serviceStatus.ts +0 -82
- package/apis/dashboard/systemInfo.ts +0 -26
- package/apis/dashboard/systemOverview.ts +0 -32
- package/apis/dashboard/systemResources.ts +0 -119
- package/apis/dict/all.ts +0 -25
- package/apis/dict/del.ts +0 -19
- package/apis/dict/detail.ts +0 -21
- package/apis/dict/ins.ts +0 -27
- package/apis/dict/list.ts +0 -18
- package/apis/dict/upd.ts +0 -31
- package/apis/menu/all.ts +0 -68
- package/apis/menu/del.ts +0 -37
- package/apis/menu/ins.ts +0 -20
- package/apis/menu/list.ts +0 -21
- package/apis/menu/upd.ts +0 -29
- package/apis/role/apiDetail.ts +0 -30
- package/apis/role/apiSave.ts +0 -41
- package/apis/role/del.ts +0 -44
- package/apis/role/detail.ts +0 -24
- package/apis/role/ins.ts +0 -39
- package/apis/role/list.ts +0 -14
- package/apis/role/menuDetail.ts +0 -30
- package/apis/role/menuSave.ts +0 -38
- package/apis/role/save.ts +0 -44
- package/apis/role/upd.ts +0 -40
- package/bin/index.ts +0 -34
- package/checks/conflict.ts +0 -351
- package/commands/index.ts +0 -73
- package/commands/sync.ts +0 -88
- package/commands/syncApi.ts +0 -316
- package/commands/syncDb/apply.ts +0 -171
- package/commands/syncDb/constants.ts +0 -77
- package/commands/syncDb/ddl.ts +0 -191
- package/commands/syncDb/helpers.ts +0 -173
- package/commands/syncDb/index.ts +0 -217
- package/commands/syncDb/schema.ts +0 -199
- package/commands/syncDb/sqlite.ts +0 -50
- package/commands/syncDb/state.ts +0 -112
- package/commands/syncDb/table.ts +0 -214
- package/commands/syncDb/tableCreate.ts +0 -149
- package/commands/syncDb/types.ts +0 -92
- package/commands/syncDb/version.ts +0 -73
- package/commands/syncDb.ts +0 -34
- package/commands/syncDev.ts +0 -237
- package/commands/syncMenu.ts +0 -349
- package/commands/util.ts +0 -58
- package/entry.ts +0 -9
- package/tables/admin.json +0 -14
- package/tables/api.json +0 -8
- package/tables/dict.json +0 -8
- package/tables/menu.json +0 -8
- package/tables/role.json +0 -8
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 获取插件列表
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Yes, scanAddons, getAddonDir } from '../../util.js';
|
|
6
|
-
import { readFileSync } from 'node:fs';
|
|
7
|
-
|
|
8
|
-
export default {
|
|
9
|
-
name: '获取插件列表',
|
|
10
|
-
handler: async (befly, ctx) => {
|
|
11
|
-
const addonList: Array<{ name: string; title: string; version: string; description: string; enabled: boolean }> = [];
|
|
12
|
-
|
|
13
|
-
// 使用 scanAddons 扫描所有 addon
|
|
14
|
-
const addonNames = scanAddons();
|
|
15
|
-
|
|
16
|
-
for (const addonName of addonNames) {
|
|
17
|
-
// addonName 格式: admin, demo 等
|
|
18
|
-
|
|
19
|
-
// 读取插件配置文件
|
|
20
|
-
const configPath = getAddonDir(addonName, 'addon.config.json');
|
|
21
|
-
|
|
22
|
-
try {
|
|
23
|
-
const configContent = readFileSync(configPath, 'utf-8');
|
|
24
|
-
const config = JSON.parse(configContent);
|
|
25
|
-
|
|
26
|
-
addonList.push({
|
|
27
|
-
name: config.name || addonName,
|
|
28
|
-
title: config.title || addonName,
|
|
29
|
-
version: config.version || '1.0.0',
|
|
30
|
-
description: config.description || '',
|
|
31
|
-
enabled: true
|
|
32
|
-
});
|
|
33
|
-
} catch (error) {
|
|
34
|
-
// 配置文件不存在或解析失败,使用默认值
|
|
35
|
-
addonList.push({
|
|
36
|
-
name: addonName,
|
|
37
|
-
title: addonName,
|
|
38
|
-
version: '1.0.0',
|
|
39
|
-
description: '',
|
|
40
|
-
enabled: true
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
return Yes('获取成功', addonList);
|
|
46
|
-
}
|
|
47
|
-
};
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 获取更新日志
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Yes } from '../../util.js';
|
|
6
|
-
|
|
7
|
-
export default {
|
|
8
|
-
name: '获取更新日志',
|
|
9
|
-
handler: async (befly, ctx) => {
|
|
10
|
-
// 更新日志数据(实际项目中可以从配置文件或数据库读取)
|
|
11
|
-
const changelog = [
|
|
12
|
-
{
|
|
13
|
-
version: 'v1.0.0',
|
|
14
|
-
date: '2025-10-25',
|
|
15
|
-
changes: ['新增角色权限管理功能', '新增菜单权限分配功能', '新增接口权限管理功能', '优化菜单同步性能', '优化字段类型验证', '修复数组类型字段验证bug']
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
version: 'v0.9.0',
|
|
19
|
-
date: '2025-10-20',
|
|
20
|
-
changes: ['初始版本发布', '完成基础框架搭建', '实现用户认证功能', '实现RBAC权限系统']
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
version: 'v0.8.0',
|
|
24
|
-
date: '2025-10-15',
|
|
25
|
-
changes: ['完成数据库设计', '实现核心API', '添加字段验证器', '集成Redis缓存']
|
|
26
|
-
}
|
|
27
|
-
];
|
|
28
|
-
|
|
29
|
-
// 根据 limit 参数返回指定数量的日志
|
|
30
|
-
const limit = ctx.body.limit || 5;
|
|
31
|
-
const lists = changelog.slice(0, limit);
|
|
32
|
-
|
|
33
|
-
return Yes('获取成功', {
|
|
34
|
-
lists: lists
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
};
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 获取系统配置状态
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Yes } from '../../util.js';
|
|
6
|
-
|
|
7
|
-
export default {
|
|
8
|
-
name: '获取配置状态',
|
|
9
|
-
handler: async (befly, ctx) => {
|
|
10
|
-
const status = {
|
|
11
|
-
database: { status: 'ok', latency: 0 },
|
|
12
|
-
redis: { status: 'ok', latency: 0 },
|
|
13
|
-
fileSystem: { status: 'ok' },
|
|
14
|
-
email: { status: 'warning', message: '未配置' },
|
|
15
|
-
oss: { status: 'warning', message: '未配置' }
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
// 检查数据库连接
|
|
19
|
-
try {
|
|
20
|
-
const startTime = Date.now();
|
|
21
|
-
await befly.db.query('SELECT 1');
|
|
22
|
-
status.database.latency = Date.now() - startTime;
|
|
23
|
-
status.database.status = 'ok';
|
|
24
|
-
} catch (error) {
|
|
25
|
-
status.database.status = 'error';
|
|
26
|
-
status.database.message = '连接失败';
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// 检查 Redis 连接
|
|
30
|
-
try {
|
|
31
|
-
const startTime = Date.now();
|
|
32
|
-
await befly.redis.ping();
|
|
33
|
-
status.redis.latency = Date.now() - startTime;
|
|
34
|
-
status.redis.status = 'ok';
|
|
35
|
-
} catch (error) {
|
|
36
|
-
status.redis.status = 'error';
|
|
37
|
-
status.redis.message = '连接失败';
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// 检查邮件配置
|
|
41
|
-
if (process.env.SMTP_HOST && process.env.SMTP_PORT) {
|
|
42
|
-
status.email.status = 'ok';
|
|
43
|
-
status.email.message = '已配置';
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// 检查 OSS 配置
|
|
47
|
-
if (process.env.OSS_ACCESS_KEY && process.env.OSS_SECRET_KEY) {
|
|
48
|
-
status.oss.status = 'ok';
|
|
49
|
-
status.oss.message = '已配置';
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return Yes('获取成功', status);
|
|
53
|
-
}
|
|
54
|
-
};
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 获取运行环境信息
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Yes } from '../../util.js';
|
|
6
|
-
import os from 'node:os';
|
|
7
|
-
|
|
8
|
-
export default {
|
|
9
|
-
name: '获取运行环境信息',
|
|
10
|
-
handler: async (befly, ctx) => {
|
|
11
|
-
// 获取数据库版本
|
|
12
|
-
let databaseVersion = 'Unknown';
|
|
13
|
-
try {
|
|
14
|
-
const versionResult = await befly.db.query({
|
|
15
|
-
sql: 'SELECT VERSION() as version',
|
|
16
|
-
type: 'one'
|
|
17
|
-
});
|
|
18
|
-
databaseVersion = versionResult.version || 'Unknown';
|
|
19
|
-
} catch (error) {
|
|
20
|
-
// 忽略错误
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// 获取 Redis 版本
|
|
24
|
-
let redisVersion = '未配置';
|
|
25
|
-
if (befly.redis) {
|
|
26
|
-
try {
|
|
27
|
-
const info = await befly.redis.info('server');
|
|
28
|
-
const match = info.match(/redis_version:([^\r\n]+)/);
|
|
29
|
-
if (match) {
|
|
30
|
-
redisVersion = match[1];
|
|
31
|
-
}
|
|
32
|
-
} catch (error) {
|
|
33
|
-
redisVersion = '未知';
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return Yes('获取成功', {
|
|
38
|
-
os: `${os.type()} ${os.arch()}`,
|
|
39
|
-
server: `${os.platform()} ${os.release()}`,
|
|
40
|
-
nodeVersion: process.version,
|
|
41
|
-
database: `MySQL ${databaseVersion}`,
|
|
42
|
-
cache: `Redis ${redisVersion}`,
|
|
43
|
-
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
};
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 获取性能指标
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Yes } from '../../util.js';
|
|
6
|
-
|
|
7
|
-
export default {
|
|
8
|
-
name: '获取性能指标',
|
|
9
|
-
handler: async (befly, ctx) => {
|
|
10
|
-
// 实际项目中,这些数据应该从监控系统或日志中获取
|
|
11
|
-
// 这里提供示例数据结构
|
|
12
|
-
return Yes('获取成功', {
|
|
13
|
-
avgResponseTime: 125,
|
|
14
|
-
qps: 856,
|
|
15
|
-
errorRate: 0.8,
|
|
16
|
-
activeConnections: 45,
|
|
17
|
-
slowestApi: {
|
|
18
|
-
path: '/addon/admin/menuList',
|
|
19
|
-
time: 450
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
};
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 获取权限统计信息
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Yes } from '../../util.js';
|
|
6
|
-
|
|
7
|
-
export default {
|
|
8
|
-
name: '获取权限统计',
|
|
9
|
-
handler: async (befly, ctx) => {
|
|
10
|
-
// 统计菜单数量
|
|
11
|
-
const menuCount = await befly.db.count({
|
|
12
|
-
table: 'core_menu'
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
// 统计接口数量
|
|
16
|
-
const apiCount = await befly.db.count({
|
|
17
|
-
table: 'core_api'
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
// 统计角色数量
|
|
21
|
-
const roleCount = await befly.db.count({
|
|
22
|
-
table: 'core_role'
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
return Yes('获取成功', {
|
|
26
|
-
menuCount: menuCount,
|
|
27
|
-
apiCount: apiCount,
|
|
28
|
-
roleCount: roleCount
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
};
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 获取服务状态
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Yes } from '../../util.js';
|
|
6
|
-
import { Env } from '../../env.js';
|
|
7
|
-
|
|
8
|
-
export default {
|
|
9
|
-
name: '获取服务状态',
|
|
10
|
-
handler: async (befly, ctx) => {
|
|
11
|
-
const services = [];
|
|
12
|
-
|
|
13
|
-
// 数据库状态
|
|
14
|
-
try {
|
|
15
|
-
const startTime = Date.now();
|
|
16
|
-
await befly.db.query('SELECT 1');
|
|
17
|
-
const responseTime = Date.now() - startTime;
|
|
18
|
-
services.push({
|
|
19
|
-
name: '数据库',
|
|
20
|
-
status: 'running',
|
|
21
|
-
responseTime: `${responseTime}ms`
|
|
22
|
-
});
|
|
23
|
-
} catch (error) {
|
|
24
|
-
befly.logger.error('数据库状态检测失败:', error);
|
|
25
|
-
services.push({
|
|
26
|
-
name: '数据库',
|
|
27
|
-
status: 'stopped',
|
|
28
|
-
responseTime: '-'
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// Redis 状态
|
|
33
|
-
if (Env.REDIS_ENABLE === 1 && befly.redis) {
|
|
34
|
-
try {
|
|
35
|
-
const startTime = Date.now();
|
|
36
|
-
await befly.redis.ping();
|
|
37
|
-
const responseTime = Date.now() - startTime;
|
|
38
|
-
services.push({
|
|
39
|
-
name: 'Redis',
|
|
40
|
-
status: 'running',
|
|
41
|
-
responseTime: `${responseTime}ms`
|
|
42
|
-
});
|
|
43
|
-
} catch (error) {
|
|
44
|
-
befly.logger.error('Redis状态检测失败:', error);
|
|
45
|
-
services.push({
|
|
46
|
-
name: 'Redis',
|
|
47
|
-
status: 'stopped',
|
|
48
|
-
responseTime: '-'
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
} else {
|
|
52
|
-
services.push({
|
|
53
|
-
name: 'Redis',
|
|
54
|
-
status: 'stopped',
|
|
55
|
-
responseTime: '-'
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// 文件系统状态
|
|
60
|
-
services.push({
|
|
61
|
-
name: '文件系统',
|
|
62
|
-
status: 'running',
|
|
63
|
-
responseTime: '-'
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
// 邮件服务状态(示例)
|
|
67
|
-
services.push({
|
|
68
|
-
name: '邮件服务',
|
|
69
|
-
status: 'unconfigured',
|
|
70
|
-
responseTime: '-'
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
// OSS存储状态(示例)
|
|
74
|
-
services.push({
|
|
75
|
-
name: 'OSS存储',
|
|
76
|
-
status: 'unconfigured',
|
|
77
|
-
responseTime: '-'
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
return Yes('获取成功', { services });
|
|
81
|
-
}
|
|
82
|
-
};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 获取系统信息
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Yes } from '../../util.js';
|
|
6
|
-
import { Env } from '../../env.js';
|
|
7
|
-
|
|
8
|
-
export default {
|
|
9
|
-
name: '获取系统信息',
|
|
10
|
-
handler: async (befly, ctx) => {
|
|
11
|
-
// 系统启动时间(从进程启动时间计算)
|
|
12
|
-
const startTime = Date.now() - Math.floor(process.uptime() * 1000);
|
|
13
|
-
|
|
14
|
-
// 运行时长(毫秒)
|
|
15
|
-
const uptime = Math.floor(process.uptime() * 1000);
|
|
16
|
-
|
|
17
|
-
// 环境
|
|
18
|
-
const environment = Env.NODE_ENV || 'development';
|
|
19
|
-
|
|
20
|
-
return Yes('获取成功', {
|
|
21
|
-
environment: environment,
|
|
22
|
-
startTime: startTime,
|
|
23
|
-
uptime: uptime
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
};
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 获取系统概览数据
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Yes } from '../../util.js';
|
|
6
|
-
|
|
7
|
-
export default {
|
|
8
|
-
name: '获取系统概览数据',
|
|
9
|
-
handler: async (befly, ctx) => {
|
|
10
|
-
// 权限统计
|
|
11
|
-
const menuCount = await befly.db.getCount({
|
|
12
|
-
table: 'core_menu',
|
|
13
|
-
where: { state: 1 }
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
const roleCount = await befly.db.getCount({
|
|
17
|
-
table: 'core_role',
|
|
18
|
-
where: { state: 1 }
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
const apiCount = await befly.db.getCount({
|
|
22
|
-
table: 'core_api',
|
|
23
|
-
where: { state: 1 }
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
return Yes('获取成功', {
|
|
27
|
-
menuCount,
|
|
28
|
-
roleCount,
|
|
29
|
-
apiCount
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
};
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 获取系统资源使用情况
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import os from 'node:os';
|
|
6
|
-
import fs from 'node:fs';
|
|
7
|
-
import { Yes } from '../../util.js';
|
|
8
|
-
import { promisify } from 'node:util';
|
|
9
|
-
|
|
10
|
-
export default {
|
|
11
|
-
name: '获取系统资源',
|
|
12
|
-
auth: true,
|
|
13
|
-
fields: {},
|
|
14
|
-
handler: async (befly, ctx) => {
|
|
15
|
-
// CPU 使用率
|
|
16
|
-
const cpus = os.cpus();
|
|
17
|
-
const cpuCount = cpus.length; // 逻辑核心数(包括超线程)
|
|
18
|
-
|
|
19
|
-
// 计算 CPU 使用率(需要两次采样)
|
|
20
|
-
// 第一次采样
|
|
21
|
-
const startMeasure = cpus.map((cpu) => {
|
|
22
|
-
let total = 0;
|
|
23
|
-
for (const type in cpu.times) {
|
|
24
|
-
total += cpu.times[type];
|
|
25
|
-
}
|
|
26
|
-
return {
|
|
27
|
-
idle: cpu.times.idle,
|
|
28
|
-
total
|
|
29
|
-
};
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
// 等待 100ms
|
|
33
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
34
|
-
|
|
35
|
-
// 第二次采样
|
|
36
|
-
const endCpus = os.cpus();
|
|
37
|
-
const endMeasure = endCpus.map((cpu) => {
|
|
38
|
-
let total = 0;
|
|
39
|
-
for (const type in cpu.times) {
|
|
40
|
-
total += cpu.times[type];
|
|
41
|
-
}
|
|
42
|
-
return {
|
|
43
|
-
idle: cpu.times.idle,
|
|
44
|
-
total
|
|
45
|
-
};
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
// 计算平均 CPU 使用率
|
|
49
|
-
let totalIdle = 0;
|
|
50
|
-
let totalTick = 0;
|
|
51
|
-
for (let i = 0; i < startMeasure.length; i++) {
|
|
52
|
-
const idleDiff = endMeasure[i].idle - startMeasure[i].idle;
|
|
53
|
-
const totalDiff = endMeasure[i].total - startMeasure[i].total;
|
|
54
|
-
totalIdle += idleDiff;
|
|
55
|
-
totalTick += totalDiff;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const cpuUsage = totalTick > 0 ? Math.round(((totalTick - totalIdle) / totalTick) * 100) : 0;
|
|
59
|
-
|
|
60
|
-
// 内存使用率
|
|
61
|
-
const totalMem = os.totalmem();
|
|
62
|
-
const freeMem = os.freemem();
|
|
63
|
-
const usedMem = totalMem - freeMem;
|
|
64
|
-
const memoryPercentage = totalMem > 0 ? Math.round((usedMem / totalMem) * 100) : 0;
|
|
65
|
-
|
|
66
|
-
// 磁盘使用率(使用 fs.statfs 获取当前工作目录所在磁盘)
|
|
67
|
-
let diskPercentage = 0;
|
|
68
|
-
let diskUsed = 0;
|
|
69
|
-
let diskTotal = 0;
|
|
70
|
-
|
|
71
|
-
try {
|
|
72
|
-
// 检查是否有 statfs 方法(Node.js 19+ 或 Bun)
|
|
73
|
-
if (fs.statfs) {
|
|
74
|
-
const statfsAsync = promisify(fs.statfs);
|
|
75
|
-
const stats = await statfsAsync(process.cwd());
|
|
76
|
-
|
|
77
|
-
// 计算磁盘使用情况
|
|
78
|
-
// bsize: 文件系统块大小
|
|
79
|
-
// blocks: 总块数
|
|
80
|
-
// bfree: 可用块数
|
|
81
|
-
const totalSpace = stats.blocks * stats.bsize;
|
|
82
|
-
const freeSpace = stats.bfree * stats.bsize;
|
|
83
|
-
const usedSpace = totalSpace - freeSpace;
|
|
84
|
-
|
|
85
|
-
if (totalSpace > 0) {
|
|
86
|
-
diskTotal = Math.round(totalSpace / 1024 / 1024 / 1024);
|
|
87
|
-
diskUsed = Math.round(usedSpace / 1024 / 1024 / 1024);
|
|
88
|
-
diskPercentage = Math.round((usedSpace / totalSpace) * 100);
|
|
89
|
-
}
|
|
90
|
-
} else {
|
|
91
|
-
// statfs 不可用,返回默认值
|
|
92
|
-
befly.logger.warn('fs.statfs 不可用,无法获取磁盘信息');
|
|
93
|
-
}
|
|
94
|
-
} catch (error) {
|
|
95
|
-
befly.logger.warn('获取磁盘信息失败', error);
|
|
96
|
-
// 获取失败时返回 0
|
|
97
|
-
diskPercentage = 0;
|
|
98
|
-
diskUsed = 0;
|
|
99
|
-
diskTotal = 0;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
return Yes('获取成功', {
|
|
103
|
-
cpu: {
|
|
104
|
-
usage: cpuUsage,
|
|
105
|
-
cores: cpuCount
|
|
106
|
-
},
|
|
107
|
-
memory: {
|
|
108
|
-
used: (usedMem / 1024 / 1024 / 1024).toFixed(1),
|
|
109
|
-
total: (totalMem / 1024 / 1024 / 1024).toFixed(1),
|
|
110
|
-
percentage: memoryPercentage
|
|
111
|
-
},
|
|
112
|
-
disk: {
|
|
113
|
-
used: diskUsed,
|
|
114
|
-
total: diskTotal,
|
|
115
|
-
percentage: diskPercentage
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
};
|
package/apis/dict/all.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { Yes, No } from '../../util.js';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* 获取所有字典(不分页)
|
|
5
|
-
*/
|
|
6
|
-
export default {
|
|
7
|
-
name: '获取所有字典',
|
|
8
|
-
handler: async (befly, ctx) => {
|
|
9
|
-
try {
|
|
10
|
-
const dicts = await befly.db.getAll({
|
|
11
|
-
table: 'core_dict',
|
|
12
|
-
fields: ['id', 'name', 'code', 'value', 'sort', 'pid', 'description', 'state', 'created_at', 'updated_at'],
|
|
13
|
-
orderBy: [
|
|
14
|
-
{ field: 'sort', direction: 'ASC' },
|
|
15
|
-
{ field: 'id', direction: 'ASC' }
|
|
16
|
-
]
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
return Yes('操作成功', dicts);
|
|
20
|
-
} catch (error) {
|
|
21
|
-
befly.logger.error('获取所有字典失败:', error);
|
|
22
|
-
return No('操作失败');
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
};
|
package/apis/dict/del.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Field, Yes, No } from '../../util.js';
|
|
2
|
-
export default {
|
|
3
|
-
name: '删除字典',
|
|
4
|
-
handler: async (befly, ctx) => {
|
|
5
|
-
try {
|
|
6
|
-
await befly.db.delData({
|
|
7
|
-
table: 'core_dict',
|
|
8
|
-
where: {
|
|
9
|
-
id: ctx.body.id
|
|
10
|
-
}
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
return Yes('操作成功');
|
|
14
|
-
} catch (error) {
|
|
15
|
-
befly.logger.error('删除字典失败:', error);
|
|
16
|
-
return No('操作失败');
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
};
|
package/apis/dict/detail.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Yes, No } from '../../util.js';
|
|
2
|
-
|
|
3
|
-
export default {
|
|
4
|
-
name: '获取字典详情',
|
|
5
|
-
handler: async (befly, ctx) => {
|
|
6
|
-
try {
|
|
7
|
-
const dict = await befly.db.getDetail({
|
|
8
|
-
table: 'core_dict',
|
|
9
|
-
fields: ['id', 'name', 'code', 'value', 'sort', 'pid', 'description', 'state', 'created_at', 'updated_at'],
|
|
10
|
-
where: {
|
|
11
|
-
id: ctx.body.id
|
|
12
|
-
}
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
return Yes('操作成功', dict);
|
|
16
|
-
} catch (error) {
|
|
17
|
-
befly.logger.error('获取字典详情失败:', error);
|
|
18
|
-
return No('操作失败');
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
};
|
package/apis/dict/ins.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { Yes, No } from '../../util.js';
|
|
2
|
-
import adminDictTable from '../../tables/dict.json';
|
|
3
|
-
|
|
4
|
-
export default {
|
|
5
|
-
name: '添加字典',
|
|
6
|
-
fields: adminDictTable,
|
|
7
|
-
handler: async (befly, ctx) => {
|
|
8
|
-
try {
|
|
9
|
-
const dictId = await befly.db.insData({
|
|
10
|
-
table: 'core_dict',
|
|
11
|
-
data: {
|
|
12
|
-
name: ctx.body.name,
|
|
13
|
-
code: ctx.body.code,
|
|
14
|
-
value: ctx.body.value,
|
|
15
|
-
sort: ctx.body.sort,
|
|
16
|
-
pid: ctx.body.pid,
|
|
17
|
-
description: ctx.body.description
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
return Yes('操作成功', { id: dictId });
|
|
22
|
-
} catch (error) {
|
|
23
|
-
befly.logger.error('添加字典失败:', error);
|
|
24
|
-
return No('操作失败');
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
};
|
package/apis/dict/list.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { Yes, No } from '../../util.js';
|
|
2
|
-
export default {
|
|
3
|
-
name: '获取字典列表',
|
|
4
|
-
handler: async (befly, ctx) => {
|
|
5
|
-
const result = await befly.db.getList({
|
|
6
|
-
table: 'core_dict',
|
|
7
|
-
fields: ['id', 'name', 'code', 'value', 'sort', 'pid', 'description', 'state', 'created_at', 'updated_at'],
|
|
8
|
-
page: ctx.body.page,
|
|
9
|
-
limit: ctx.body.limit,
|
|
10
|
-
orderBy: [
|
|
11
|
-
{ field: 'sort', direction: 'ASC' },
|
|
12
|
-
{ field: 'id', direction: 'ASC' }
|
|
13
|
-
]
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
return Yes('操作成功', result);
|
|
17
|
-
}
|
|
18
|
-
};
|
package/apis/dict/upd.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { Yes, No } from '../../util.js';
|
|
2
|
-
import adminDictTable from '../../tables/dict.json';
|
|
3
|
-
|
|
4
|
-
export default {
|
|
5
|
-
name: '更新字典',
|
|
6
|
-
fields: adminDictTable,
|
|
7
|
-
handler: async (befly, ctx) => {
|
|
8
|
-
try {
|
|
9
|
-
await befly.db.updData({
|
|
10
|
-
table: 'core_dict',
|
|
11
|
-
data: {
|
|
12
|
-
name: ctx.body.name,
|
|
13
|
-
code: ctx.body.code,
|
|
14
|
-
value: ctx.body.value,
|
|
15
|
-
sort: ctx.body.sort,
|
|
16
|
-
pid: ctx.body.pid,
|
|
17
|
-
description: ctx.body.description,
|
|
18
|
-
state: ctx.body.state
|
|
19
|
-
},
|
|
20
|
-
where: {
|
|
21
|
-
id: ctx.body.id
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
return Yes('操作成功');
|
|
26
|
-
} catch (error) {
|
|
27
|
-
befly.logger.error('更新字典失败:', error);
|
|
28
|
-
return No('操作失败');
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
};
|