feat: 添加系统设置中修改前端端口并自动重启功能

- 后端:添加 frontend_port 配置项和重启API
- 前端:添加端口设置表单和自动重启交互
- 添加前端服务管理脚本支持启动/停止/重启
- 优化重启流程,避免Network Error提示
This commit is contained in:
zhang1106
2026-02-05 10:32:10 +08:00
parent ad67233bf9
commit d398673f74
4 changed files with 449 additions and 6 deletions
+75
View File
@@ -16,6 +16,7 @@ const initDefaultSettings = async () => {
{ settingKey: 'session_timeout', settingValue: JSON.stringify(30), settingType: 'number', category: 'general', description: '会话超时时间(分钟)', isEditable: true },
{ settingKey: 'max_login_attempts', settingValue: JSON.stringify(5), settingType: 'number', category: 'general', description: '最大登录尝试次数', isEditable: true },
{ settingKey: 'maintenance_mode', settingValue: JSON.stringify(false), settingType: 'boolean', category: 'general', description: '维护模式', isEditable: true },
{ settingKey: 'frontend_port', settingValue: JSON.stringify(3000), settingType: 'number', category: 'general', description: '前端服务端口(修改后需重启前端服务)', isEditable: true },
// 外观设置
{ settingKey: 'primary_color', settingValue: JSON.stringify('#667eea'), settingType: 'string', category: 'appearance', description: '主题主色调', isEditable: true },
@@ -227,6 +228,7 @@ router.post('/reset/:key', async (req, res) => {
session_timeout: 30,
max_login_attempts: 5,
maintenance_mode: false,
frontend_port: 3000,
primary_color: '#667eea',
secondary_color: '#764ba2',
compact_mode: false,
@@ -518,4 +520,77 @@ router.get('/system/info', async (req, res) => {
}
});
// 获取前端端口配置(供 vite.config.js 使用)
router.get('/frontend/port', async (req, res) => {
try {
const portSetting = await SystemSetting.findByPk('frontend_port');
const port = portSetting ? JSON.parse(portSetting.settingValue) : 3000;
res.json({ port });
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// 同步前端端口到配置文件(供前端保存设置后调用)
router.post('/frontend/port/sync', async (req, res) => {
try {
const fs = require('fs');
const path = require('path');
const portSetting = await SystemSetting.findByPk('frontend_port');
const port = portSetting ? JSON.parse(portSetting.settingValue) : 3000;
// 写入前端配置文件
const frontendDir = path.join(__dirname, '../../frontend');
const configPath = path.join(frontendDir, '.frontend-port');
fs.writeFileSync(configPath, port.toString(), 'utf-8');
res.json({
message: '前端端口配置已同步',
port,
configPath: '.frontend-port',
notice: '配置已更新,请重启前端服务以应用新端口'
});
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// 重启前端服务
router.post('/frontend/restart', async (req, res) => {
try {
const { restartFrontend, getStatus } = require('../../scripts/frontend-manager');
// 先获取当前状态
const beforeStatus = await getStatus();
// 执行重启
const result = await restartFrontend();
res.json({
message: '前端服务重启成功',
before: beforeStatus,
after: {
pid: result.pid,
port: result.port,
url: `http://localhost:${result.port}`
}
});
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// 获取前端服务状态
router.get('/frontend/status', async (req, res) => {
try {
const { getStatus } = require('../../scripts/frontend-manager');
const status = await getStatus();
res.json(status);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
module.exports = router;