Qwen2API-A / src /routes /settings.js
github-actions[bot]
Sync from GitHub Viciy2023/Qwen2API-A@72fd99becfe162580b4156779601adcd284bcba9
f91fed0
const express = require('express')
const router = express.Router()
const config = require('../config')
const { apiKeyVerify, adminKeyVerify } = require('../middlewares/authorization')
const { logger } = require('../utils/logger')
router.get('/settings', adminKeyVerify, async (req, res) => {
// 分离管理员密钥和普通密钥
const regularKeys = config.apiKeys.filter(key => key !== config.adminKey)
res.json({
apiKey: config.apiKey, // 保持向后兼容
adminKey: config.adminKey,
regularKeys: regularKeys,
defaultHeaders: config.defaultHeaders,
defaultCookie: config.defaultCookie,
autoRefresh: config.autoRefresh,
autoRefreshInterval: config.autoRefreshInterval,
outThink: config.outThink,
searchInfoMode: config.searchInfoMode,
simpleModelMap: config.simpleModelMap
})
})
// 添加普通API Key
router.post('/addRegularKey', adminKeyVerify, async (req, res) => {
try {
const { apiKey } = req.body
if (!apiKey) {
return res.status(400).json({ error: 'API Key不能为空' })
}
// 检查是否已存在
if (config.apiKeys.includes(apiKey)) {
return res.status(409).json({ error: 'API Key已存在' })
}
// 添加到配置中
config.apiKeys.push(apiKey)
res.json({ message: 'API Key添加成功' })
} catch (error) {
logger.error('添加API Key失败', 'CONFIG', '', error)
res.status(500).json({ error: error.message })
}
})
// 删除普通API Key
router.post('/deleteRegularKey', adminKeyVerify, async (req, res) => {
try {
const { apiKey } = req.body
if (!apiKey) {
return res.status(400).json({ error: 'API Key不能为空' })
}
// 不能删除管理员密钥
if (apiKey === config.adminKey) {
return res.status(403).json({ error: '不能删除管理员密钥' })
}
// 从配置中移除
const index = config.apiKeys.indexOf(apiKey)
if (index === -1) {
return res.status(404).json({ error: 'API Key不存在' })
}
config.apiKeys.splice(index, 1)
res.json({ message: 'API Key删除成功' })
} catch (error) {
logger.error('删除API Key失败', 'CONFIG', '', error)
res.status(500).json({ error: error.message })
}
})
// 更新自动刷新设置
router.post('/setAutoRefresh', adminKeyVerify, async (req, res) => {
try {
const { autoRefresh, autoRefreshInterval } = req.body
if (typeof autoRefresh !== 'boolean') {
return res.status(400).json({ error: '无效的自动刷新设置' })
}
if (autoRefreshInterval !== undefined) {
const interval = parseInt(autoRefreshInterval)
if (isNaN(interval) || interval < 0) {
return res.status(400).json({ error: '无效的自动刷新间隔' })
}
}
config.autoRefresh = autoRefresh
config.autoRefreshInterval = autoRefreshInterval || 6 * 60 * 60
res.json({
status: true,
message: '自动刷新设置更新成功'
})
} catch (error) {
logger.error('更新自动刷新设置失败', 'CONFIG', '', error)
res.status(500).json({ error: error.message })
}
})
// 更新思考输出设置
router.post('/setOutThink', adminKeyVerify, async (req, res) => {
try {
const { outThink } = req.body;
if (typeof outThink !== 'boolean') {
return res.status(400).json({ error: '无效的思考输出设置' })
}
config.outThink = outThink
res.json({
status: true,
message: '思考输出设置更新成功'
})
} catch (error) {
logger.error('更新思考输出设置失败', 'CONFIG', '', error)
res.status(500).json({ error: error.message })
}
})
// 更新搜索信息模式
router.post('/search-info-mode', adminKeyVerify, async (req, res) => {
try {
const { searchInfoMode } = req.body
if (!['table', 'text'].includes(searchInfoMode)) {
return res.status(400).json({ error: '无效的搜索信息模式' })
}
config.searchInfoMode = searchInfoMode
res.json({
status: true,
message: '搜索信息模式更新成功'
})
} catch (error) {
logger.error('更新搜索信息模式失败', 'CONFIG', '', error)
res.status(500).json({ error: error.message })
}
})
// 更新简化模型映射设置
router.post('/simple-model-map', adminKeyVerify, async (req, res) => {
try {
const { simpleModelMap } = req.body
if (typeof simpleModelMap !== 'boolean') {
return res.status(400).json({ error: '无效的简化模型映射设置' })
}
config.simpleModelMap = simpleModelMap
res.json({
status: true,
message: '简化模型映射设置更新成功'
})
} catch (error) {
logger.error('更新简化模型映射设置失败', 'CONFIG', '', error)
res.status(500).json({ error: error.message })
}
})
router.get('/logs', adminKeyVerify, async (req, res) => {
try {
res.json({
logs: logger.getMemoryLogs(),
fileLogEnabled: logger.isFileLogEnabled(),
runtimeLogEnabled: logger.isRuntimeLogEnabled()
})
} catch (error) {
logger.error('读取日志失败', 'CONFIG', '', error)
res.status(500).json({ error: error.message })
}
})
router.post('/logs/clear', adminKeyVerify, async (req, res) => {
try {
logger.clearMemoryLogs()
res.json({ message: '日志已清空' })
} catch (error) {
logger.error('清空日志失败', 'CONFIG', '', error)
res.status(500).json({ error: error.message })
}
})
router.post('/logs/file-log', adminKeyVerify, async (req, res) => {
try {
const { enabled } = req.body
if (typeof enabled !== 'boolean') {
return res.status(400).json({ error: 'enabled 必须是布尔值' })
}
logger.setFileLogEnabled(enabled)
res.json({
message: enabled ? '已启用文件日志' : '已关闭文件日志',
fileLogEnabled: logger.isFileLogEnabled()
})
} catch (error) {
logger.error('切换文件日志失败', 'CONFIG', '', error)
res.status(500).json({ error: error.message })
}
})
router.post('/logs/runtime-log', adminKeyVerify, async (req, res) => {
try {
const { enabled } = req.body
if (typeof enabled !== 'boolean') {
return res.status(400).json({ error: 'enabled 必须是布尔值' })
}
logger.setRuntimeLogEnabled(enabled)
res.json({
message: enabled ? '已启用运行日志' : '已关闭运行日志',
runtimeLogEnabled: logger.isRuntimeLogEnabled()
})
} catch (error) {
logger.error('切换运行日志失败', 'CONFIG', '', error)
res.status(500).json({ error: error.message })
}
})
module.exports = router