feat(deploy): 添加一键部署和更新脚本

添加交互式安装脚本 install.js 和一键更新脚本 update.js
更新部署文档和 README 以支持新功能
优化数据库初始化流程和系统设置默认值
This commit is contained in:
zhang1106
2026-02-05 12:35:50 +08:00
parent a4206ac474
commit 1438909d62
9 changed files with 2004 additions and 114 deletions
+2 -9
View File
@@ -185,15 +185,8 @@ const defaultDeviceFields = [
async function initDeviceFields() {
try {
console.log('开始初始化设备字段配置...');
// 连接数据库
await sequelize.authenticate();
console.log('数据库连接成功');
// 同步表结构
await sequelize.sync();
console.log('数据库表结构同步完成');
// 注意:数据库连接和表结构同步已在 server.js 中完成,这里直接初始化数据
// 批量创建默认字段
for (const field of defaultDeviceFields) {
// 检查字段是否已存在
+19 -6
View File
@@ -17,7 +17,7 @@ const initDefaultSettings = async () => {
{ 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 },
{ settingKey: 'secondary_color', settingValue: JSON.stringify('#764ba2'), settingType: 'string', category: 'appearance', description: '主题辅助色调', isEditable: true },
@@ -25,7 +25,7 @@ const initDefaultSettings = async () => {
{ settingKey: 'sidebar_collapsed', settingValue: JSON.stringify(false), settingType: 'boolean', category: 'appearance', description: '侧边栏默认折叠', isEditable: true },
{ settingKey: 'table_row_height', settingValue: JSON.stringify('default'), settingType: 'string', category: 'appearance', description: '表格行高: small/default/middle/large', isEditable: true },
{ settingKey: 'animation_enabled', settingValue: JSON.stringify(true), settingType: 'boolean', category: 'appearance', description: '启用动画效果', isEditable: true },
// 关于页面
{ settingKey: 'app_version', settingValue: JSON.stringify('1.0.0'), settingType: 'string', category: 'about', description: '应用版本', isEditable: false },
{ settingKey: 'company_name', settingValue: JSON.stringify(''), settingType: 'string', category: 'about', description: '公司/组织名称', isEditable: true },
@@ -36,21 +36,34 @@ const initDefaultSettings = async () => {
{ settingKey: 'privacy_policy', settingValue: JSON.stringify(''), settingType: 'string', category: 'about', description: '隐私政策URL', isEditable: true },
{ settingKey: 'terms_of_service', settingValue: JSON.stringify(''), settingType: 'string', category: 'about', description: '服务条款URL', isEditable: true },
];
let createdCount = 0;
let updatedCount = 0;
let errorCount = 0;
for (const setting of defaultSettings) {
try {
const existing = await SystemSetting.findByPk(setting.settingKey);
if (!existing) {
await SystemSetting.create(setting);
createdCount++;
} else if (existing.description !== setting.description) {
// 更新描述(用于修复英文描述问题)
await existing.update({ description: setting.description });
updatedCount++;
}
} catch (error) {
console.error(`初始化设置 ${setting.settingKey} 失败:`, error);
console.error(`初始化设置 ${setting.settingKey} 失败:`, error.message);
errorCount++;
}
}
console.log(`系统设置初始化结果: 创建 ${createdCount} 个, 更新 ${updatedCount} 个, 失败 ${errorCount}`);
return { createdCount, updatedCount, errorCount };
};
// 初始化默认设置
initDefaultSettings();
// 注意:初始化现在由 server.js 统一调用,避免重复初始化
// initDefaultSettings();
// 获取所有设置
router.get('/', async (req, res) => {
+4
View File
@@ -1,6 +1,10 @@
/**
* 数据库初始化脚本
* 用于生产环境首次部署时创建表结构
*
* 注意:此脚本为独立运行脚本,与 server.js 的初始化逻辑重复
* 如果 server.js 已能正常完成初始化,则无需单独运行此脚本
* 如需单独运行:node backend/scripts/init-database.js
*/
const { sequelize } = require('../db');
+9
View File
@@ -44,6 +44,15 @@ sequelize.authenticate()
const SystemSetting = require('./models/SystemSetting');
return SystemSetting.sync();
})
.then(() => {
// 初始化系统设置默认值(关键:确保部署时数据正确初始化)
console.log('开始初始化系统设置默认值...');
const { initDefaultSettings } = require('./routes/systemSettings');
return initDefaultSettings();
})
.then(() => {
console.log('系统设置初始化完成');
})
.catch(err => console.error('数据库操作失败:', err));
// 导入路由