mirror of
https://github.com/dqzboy/Docker-Proxy.git
synced 2026-01-12 16:25:42 +08:00
234 lines
6.0 KiB
JavaScript
234 lines
6.0 KiB
JavaScript
/**
|
|
* 基于SQLite的配置服务模块
|
|
*/
|
|
const logger = require('../logger');
|
|
const database = require('../database/database');
|
|
|
|
class ConfigServiceDB {
|
|
/**
|
|
* 获取配置项
|
|
*/
|
|
async getConfig(key = null) {
|
|
try {
|
|
if (key) {
|
|
const config = await database.get('SELECT * FROM configs WHERE key = ?', [key]);
|
|
if (config) {
|
|
return JSON.parse(config.value);
|
|
}
|
|
return null;
|
|
} else {
|
|
// 获取所有配置
|
|
const configs = await database.all('SELECT * FROM configs');
|
|
const result = {};
|
|
for (const config of configs) {
|
|
result[config.key] = JSON.parse(config.value);
|
|
}
|
|
return result;
|
|
}
|
|
} catch (error) {
|
|
logger.error('获取配置失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 保存配置项
|
|
*/
|
|
async saveConfig(key, value, description = null) {
|
|
try {
|
|
const valueString = JSON.stringify(value);
|
|
const valueType = typeof value;
|
|
|
|
const existingConfig = await database.get('SELECT id FROM configs WHERE key = ?', [key]);
|
|
|
|
if (existingConfig) {
|
|
// 更新现有配置
|
|
await database.run(
|
|
'UPDATE configs SET value = ?, type = ?, description = ?, updated_at = ? WHERE key = ?',
|
|
[valueString, valueType, description, new Date().toISOString(), key]
|
|
);
|
|
} else {
|
|
// 创建新配置
|
|
await database.run(
|
|
'INSERT INTO configs (key, value, type, description, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?)',
|
|
[key, valueString, valueType, description, new Date().toISOString(), new Date().toISOString()]
|
|
);
|
|
}
|
|
|
|
// 移除详细的配置保存日志,减少日志噪音
|
|
} catch (error) {
|
|
logger.error('保存配置失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 批量保存配置
|
|
*/
|
|
async saveConfigs(configs) {
|
|
try {
|
|
const configCount = Object.keys(configs).length;
|
|
for (const [key, value] of Object.entries(configs)) {
|
|
await this.saveConfig(key, value);
|
|
}
|
|
logger.info(`批量保存配置完成,共 ${configCount} 项配置`);
|
|
} catch (error) {
|
|
logger.error('批量保存配置失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 删除配置项
|
|
*/
|
|
async deleteConfig(key) {
|
|
try {
|
|
await database.run('DELETE FROM configs WHERE key = ?', [key]);
|
|
// 删除配置时仍保留日志,因为这是重要操作
|
|
logger.info(`配置 ${key} 已删除`);
|
|
} catch (error) {
|
|
logger.error('删除配置失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取系统默认配置
|
|
*/
|
|
getDefaultConfig() {
|
|
return {
|
|
theme: 'light',
|
|
language: 'zh_CN',
|
|
notifications: true,
|
|
autoRefresh: true,
|
|
refreshInterval: 30000,
|
|
dockerHost: 'localhost',
|
|
dockerPort: 2375,
|
|
useHttps: false,
|
|
proxyDomain: 'registry-1.docker.io',
|
|
logo: '',
|
|
menuItems: [
|
|
{
|
|
text: "首页",
|
|
link: "/",
|
|
newTab: false
|
|
},
|
|
{
|
|
text: "文档",
|
|
link: "https://dqzboy.github.io/docs/",
|
|
newTab: true
|
|
},
|
|
{
|
|
text: "推广",
|
|
link: "https://dqzboy.github.io/proxyui/zanzhu",
|
|
newTab: true
|
|
},
|
|
{
|
|
text: "GitHub",
|
|
link: "https://github.com/dqzboy/Docker-Proxy",
|
|
newTab: true
|
|
}
|
|
],
|
|
monitoringConfig: {
|
|
notificationType: 'wechat',
|
|
webhookUrl: '',
|
|
telegramToken: '',
|
|
telegramChatId: '',
|
|
monitorInterval: 60,
|
|
isEnabled: false
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* 初始化默认配置
|
|
*/
|
|
async initializeDefaultConfig() {
|
|
try {
|
|
const defaultConfig = this.getDefaultConfig();
|
|
let newConfigCount = 0;
|
|
|
|
for (const [key, value] of Object.entries(defaultConfig)) {
|
|
const existingConfig = await database.get('SELECT id FROM configs WHERE key = ?', [key]);
|
|
if (!existingConfig) {
|
|
await this.saveConfig(key, value, `默认${key}配置`);
|
|
newConfigCount++;
|
|
}
|
|
}
|
|
} catch (error) {
|
|
logger.error('初始化默认配置失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取监控配置
|
|
*/
|
|
async getMonitoringConfig() {
|
|
try {
|
|
return await this.getConfig('monitoringConfig') || this.getDefaultConfig().monitoringConfig;
|
|
} catch (error) {
|
|
logger.error('获取监控配置失败:', error);
|
|
return this.getDefaultConfig().monitoringConfig;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 保存监控配置
|
|
*/
|
|
async saveMonitoringConfig(config) {
|
|
try {
|
|
await this.saveConfig('monitoringConfig', config, '监控系统配置');
|
|
} catch (error) {
|
|
logger.error('保存监控配置失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取菜单项配置
|
|
*/
|
|
async getMenuItems() {
|
|
try {
|
|
const menuItems = await database.all(
|
|
'SELECT text, link, new_tab, sort_order, enabled FROM menu_items WHERE enabled = 1 ORDER BY sort_order'
|
|
);
|
|
|
|
return menuItems.map(item => ({
|
|
text: item.text,
|
|
link: item.link,
|
|
newTab: Boolean(item.new_tab)
|
|
}));
|
|
} catch (error) {
|
|
logger.error('获取菜单项失败:', error);
|
|
return [];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 保存菜单项配置
|
|
*/
|
|
async saveMenuItems(menuItems) {
|
|
try {
|
|
// 先清空现有菜单项
|
|
await database.run('DELETE FROM menu_items');
|
|
|
|
// 插入新的菜单项
|
|
for (let i = 0; i < menuItems.length; i++) {
|
|
const item = menuItems[i];
|
|
await database.run(
|
|
'INSERT INTO menu_items (text, link, new_tab, sort_order, enabled, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?)',
|
|
[item.text, item.link, item.newTab ? 1 : 0, i + 1, 1, new Date().toISOString(), new Date().toISOString()]
|
|
);
|
|
}
|
|
|
|
logger.info('菜单项配置保存成功');
|
|
} catch (error) {
|
|
logger.error('保存菜单项失败:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = new ConfigServiceDB();
|