Files
autoAiWorkSys/api/controller_admin/system_config.js
张成 5d7444cd65 1
2025-11-24 13:23:42 +08:00

499 lines
12 KiB
JavaScript

/**
* 系统配置管理API - 后台管理
* 提供系统配置的CRUD操作
*/
const Framework = require("../../framework/node-core-framework.js");
const normalizeConfigValue = (config) => {
if (!config) {
return config;
}
const normalized = { ...config };
if (normalized.configType === 'json' && normalized.configValue) {
normalized.configValue = JSON.parse(normalized.configValue);
} else if (normalized.configType === 'boolean') {
normalized.configValue = normalized.configValue === 'true' || normalized.configValue === '1';
} else if (normalized.configType === 'number') {
normalized.configValue = parseFloat(normalized.configValue) || 0;
}
return normalized;
};
const formatConfigValueForSave = (configType, configValue) => {
if (configType === 'json' && typeof configValue === 'object') {
return JSON.stringify(configValue);
}
if (configType === 'boolean') {
return configValue ? 'true' : 'false';
}
return String(configValue);
};
module.exports = {
/**
* @swagger
* /admin_api/config/list:
* post:
* summary: 获取配置列表
* description: 分页获取系统配置列表
* tags: [后台-系统配置]
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* properties:
* page:
* type: integer
* description: 页码
* pageSize:
* type: integer
* description: 每页数量
* category:
* type: string
* description: 配置分类(可选)
* responses:
* 200:
* description: 获取成功
*/
'POST /config/list': async (ctx) => {
const models = Framework.getModels();
const { system_config, op } = models;
const body = ctx.getBody();
const { category, searchText} = ctx.getBody();
// 获取分页参数
const { limit, offset, page, pageSize } = ctx.getPageSize();
const where = {};
if (category) where.category = category;
// 支持搜索配置键或名称
if (searchText) {
where[op.or] = [
{ configKey: { [op.like]: `%${searchText}%` } },
{ configName: { [op.like]: `%${searchText}%` } }
];
}
const result = await system_config.findAndCountAll({
where,
limit,
offset,
order: [
['category', 'ASC'],
['sortOrder', 'ASC'],
['configId', 'ASC']
]
});
const list = result.rows.map(item => normalizeConfigValue(item.toJSON()));
return ctx.success({
total: result.count,
page,
pageSize,
list
});
},
/**
* @swagger
* /admin_api/config/get:
* get:
* summary: 获取配置详情
* description: 根据配置键获取配置详情
* tags: [后台-系统配置]
* parameters:
* - in: query
* name: configKey
* required: true
* schema:
* type: string
* description: 配置键
* responses:
* 200:
* description: 获取成功
*/
'GET /config/get': async (ctx) => {
const models = Framework.getModels();
const { system_config } = models;
const { configKey } = ctx.query;
if (!configKey) {
return ctx.fail('配置键不能为空');
}
const config = await system_config.findOne({ where: { configKey } });
if (!config) {
return ctx.fail('配置不存在');
}
const configData = normalizeConfigValue(config.toJSON());
return ctx.success(configData);
},
/**
* @swagger
* /admin_api/config/add:
* post:
* summary: 添加配置
* description: 添加新的系统配置
* tags: [后台-系统配置]
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* required:
* - configKey
* - configValue
* - category
* properties:
* configKey:
* type: string
* description: 配置键
* configValue:
* type: string
* description: 配置值
* configType:
* type: string
* description: 配置类型
* category:
* type: string
* description: 配置分类
* configName:
* type: string
* description: 配置名称
* description:
* type: string
* description: 配置描述
* responses:
* 200:
* description: 添加成功
*/
'POST /config/add': async (ctx) => {
const models = Framework.getModels();
const { system_config } = models;
const body = ctx.getBody();
const {
configKey,
configValue,
configType = 'string',
category,
configName,
description,
defaultValue,
sortOrder = 0,
isActive = true,
isSystem = false
} = body;
if (!configKey || configValue === undefined || !category) {
return ctx.fail('配置键、配置值和分类不能为空');
}
const existingConfig = await system_config.findOne({ where: { configKey } });
if (existingConfig) {
return ctx.fail('配置键已存在');
}
const finalValue = formatConfigValueForSave(configType, configValue);
await system_config.create({
configKey,
configValue: finalValue,
configType,
category,
configName: configName || configKey,
description: description || '',
defaultValue: defaultValue || finalValue,
sortOrder,
isActive,
isSystem,
isVisible: true,
});
return ctx.success({ message: '配置添加成功' });
},
/**
* @swagger
* /admin_api/config/update:
* post:
* summary: 更新配置
* description: 更新系统配置
* tags: [后台-系统配置]
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* required:
* - configKey
* properties:
* configKey:
* type: string
* description: 配置键
* configValue:
* type: string
* description: 配置值
* description:
* type: string
* description: 配置描述
* responses:
* 200:
* description: 更新成功
*/
'POST /config/update': async (ctx) => {
const models = Framework.getModels();
const { system_config } = models;
const body = ctx.getBody();
const {
configKey,
configValue,
configName,
description,
sortOrder,
isActive
} = body;
if (!configKey) {
return ctx.fail('配置键不能为空');
}
const config = await system_config.findOne({ where: { configKey } });
if (!config) {
return ctx.fail('配置不存在');
}
const updateData = {};
if (configValue !== undefined) {
updateData.configValue = formatConfigValueForSave(config.configType, configValue);
}
if (configName) updateData.configName = configName;
if (description) updateData.description = description;
if (sortOrder !== undefined) updateData.sortOrder = sortOrder;
if (isActive !== undefined) updateData.isActive = isActive;
await system_config.update(updateData, { where: { configKey } });
return ctx.success({ message: '配置更新成功' });
},
/**
* @swagger
* /admin_api/config/delete:
* post:
* summary: 删除配置
* description: 删除系统配置(系统配置不可删除)
* tags: [后台-系统配置]
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* required:
* - configKey
* properties:
* configKey:
* type: string
* description: 配置键
* responses:
* 200:
* description: 删除成功
*/
'POST /config/delete': async (ctx) => {
const models = Framework.getModels();
const { system_config } = models;
const body = ctx.getBody();
const { configKey } = body;
if (!configKey) {
return ctx.fail('配置键不能为空');
}
const config = await system_config.findOne({ where: { configKey } });
if (!config) {
return ctx.fail('配置不存在');
}
if (config.isSystem) {
return ctx.fail('系统配置不可删除');
}
await system_config.destroy({ where: { configKey } });
return ctx.success({ message: '配置删除成功' });
},
/**
* @swagger
* /admin_api/config/categories:
* get:
* summary: 获取配置分类列表
* description: 获取所有配置分类
* tags: [后台-系统配置]
* responses:
* 200:
* description: 获取成功
*/
'GET /config/categories': async (ctx) => {
const models = Framework.getModels();
const { system_config } = models;
const categories = await system_config.findAll({
attributes: [
'category',
[models.sequelize.fn('COUNT', models.sequelize.col('*')), 'count']
],
group: ['category'],
raw: true
});
return ctx.success(categories);
},
/**
* @swagger
* /admin_api/config/reset:
* post:
* summary: 重置配置为默认值
* description: 将配置重置为默认值
* tags: [后台-系统配置]
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* required:
* - configKey
* properties:
* configKey:
* type: string
* description: 配置键
* responses:
* 200:
* description: 重置成功
*/
'POST /config/reset': async (ctx) => {
const models = Framework.getModels();
const { system_config } = models;
const body = ctx.getBody();
const { configKey } = body;
if (!configKey) {
return ctx.fail('配置键不能为空');
}
const config = await system_config.findOne({ where: { configKey } });
if (!config) {
return ctx.fail('配置不存在');
}
if (!config.defaultValue) {
return ctx.fail('该配置没有默认值');
}
await system_config.update({
configValue: config.defaultValue,
}, { where: { configKey } });
return ctx.success({ message: '配置已重置为默认值' });
},
/**
* @swagger
* /admin_api/config/batch-update:
* post:
* summary: 批量更新配置
* description: 批量更新多个配置
* tags: [后台-系统配置]
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* required:
* - configs
* properties:
* configs:
* type: array
* description: 配置数组
* responses:
* 200:
* description: 更新成功
*/
'POST /config/batch-update': async (ctx) => {
const models = Framework.getModels();
const { system_config } = models;
const body = ctx.getBody();
const { configs } = body;
if (!configs || !Array.isArray(configs) || configs.length === 0) {
return ctx.fail('配置数组不能为空');
}
let successCount = 0;
let failedCount = 0;
for (const item of configs) {
const { configKey, configValue } = item;
if (!configKey || configValue === undefined) {
failedCount++;
continue;
}
const config = await system_config.findOne({ where: { configKey } });
if (!config) {
failedCount++;
continue;
}
const finalValue = formatConfigValueForSave(config.configType, configValue);
await system_config.update({
configValue: finalValue,
}, { where: { configKey } });
successCount++;
}
return ctx.success({
message: '批量更新完成',
total: configs.length,
success: successCount,
failed: failedCount
});
}
};