From 36b8cc80a50dbc76889340fe0cc307f335c88d8e Mon Sep 17 00:00:00 2001 From: Wenjie Zhang Date: Mon, 5 May 2025 19:40:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=85=8D=E7=BD=AE=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/routers/base_router.py | 9 ++++++ src/config/__init__.py | 4 +++ web/src/apis/admin_api.js | 10 +++--- web/src/stores/config.js | 18 +++++++++-- web/src/views/SettingView.vue | 60 ++++++++++++++++++++++------------- 5 files changed, 73 insertions(+), 28 deletions(-) diff --git a/server/routers/base_router.py b/server/routers/base_router.py index 632e4685..ea70877b 100644 --- a/server/routers/base_router.py +++ b/server/routers/base_router.py @@ -28,6 +28,15 @@ async def update_config( config.save() return config.dump_config() +@base.post("/config/update") +async def update_config_item( + items: dict = Body(...), + current_user: User = Depends(get_admin_user) +) -> dict: + config.update(items) + config.save() + return config.dump_config() + @base.post("/restart") async def restart(current_user: User = Depends(get_superadmin_user)): knowledge_base.restart() diff --git a/src/config/__init__.py b/src/config/__init__.py index 38dee3ef..6bc14fdd 100644 --- a/src/config/__init__.py +++ b/src/config/__init__.py @@ -29,6 +29,10 @@ class SimpleConfig(dict): def __dict__(self): return {k: v for k, v in self.items()} + def update(self, other): + for key, value in other.items(): + self[key] = value + class Config(SimpleConfig): diff --git a/web/src/apis/admin_api.js b/web/src/apis/admin_api.js index 8b48d896..10265634 100644 --- a/web/src/apis/admin_api.js +++ b/web/src/apis/admin_api.js @@ -257,14 +257,16 @@ export const systemConfigApi = { return apiGet('/api/config', {}, true) }, + /** - * 更新系统配置 - * @param {Object} config - 配置项 + * 更新某个配置 + * @param {Object} items - 配置项 * @returns {Promise} - 更新结果 */ - updateSystemConfig: async (config) => { + updateConfigItems: async (items) => { checkAdminPermission() - return apiPut('/api/config', config, {}, true) + console.log("updateConfigItems", items) + return apiPost('/api/config/update', items, {}, true) }, /** diff --git a/web/src/stores/config.js b/web/src/stores/config.js index 44496a9e..91b78a54 100644 --- a/web/src/stores/config.js +++ b/web/src/stores/config.js @@ -21,7 +21,21 @@ export const useConfigStore = defineStore('config', () => { function setConfigValue(key, value) { config.value[key] = value - systemConfigApi.updateSystemConfig({ key, value }) + systemConfigApi.updateConfigItems({ [key]: value }) + .then(data => { + console.debug('Success:', data) + setConfig(data) + }) + } + + function setConfigValues(items) { + // 更新本地配置 + for (const key in items) { + config.value[key] = items[key] + } + + // 发送到服务器 + systemConfigApi.updateConfigItems(items) .then(data => { console.debug('Success:', data) setConfig(data) @@ -36,5 +50,5 @@ export const useConfigStore = defineStore('config', () => { }) } - return { config, setConfig, setConfigValue, refreshConfig } + return { config, setConfig, setConfigValue, refreshConfig, setConfigValues } }) \ No newline at end of file diff --git a/web/src/views/SettingView.vue b/web/src/views/SettingView.vue index 0a0fd6ae..f4c32856 100644 --- a/web/src/views/SettingView.vue +++ b/web/src/views/SettingView.vue @@ -92,7 +92,7 @@
{{ item.name }}
@@ -181,7 +181,7 @@
{{ model }}
@@ -470,7 +470,7 @@ const handleModelLocalPathsUpdate = (config) => { handleChange('model_local_paths', config) } -const handleChange = (key, e) => { +const preHandleChange = (key, e) => { if (key == 'enable_knowledge_graph' && e && !configStore.config.enable_knowledge_base) { message.error('启动知识图谱必须请先启用知识库功能') return @@ -481,29 +481,45 @@ const handleChange = (key, e) => { return } - // 这些都是需要重启的配置 - if (key == 'enable_reranker' - || key == 'enable_knowledge_graph' - || key == 'enable_knowledge_base' - || key == 'enable_web_search' - || key == 'embed_model' - || key == 'reranker' - || key == 'model_local_paths') { - if (!isNeedRestart.value) { - isNeedRestart.value = true - notification.info({ - message: '需要重新加载模型', - description: '请点击右下角按钮重新加载模型', - placement: 'topLeft', - duration: 0, - btn: h(Button, { type: 'primary', onClick: sendRestart }, '立即重新加载') - }) - } + if (key == 'enable_reranker' && e && !configStore.config.enable_reranker) { + message.error('启动重排序必须请先启用重排序功能') + return } + if (key == 'enable_reranker' + || key == 'enable_knowledge_graph' + || key == 'enable_knowledge_base' + || key == 'embed_model' + || key == 'reranker' + || key == 'model_local_paths') { + isNeedRestart.value = true + notification.info({ + message: '需要重新加载模型', + description: '请点击右下角按钮重新加载模型', + placement: 'topLeft', + duration: 0, + btn: h(Button, { type: 'primary', onClick: sendRestart }, '立即重新加载') + }) + } + return true +} + +const handleChange = (key, e) => { + if (!preHandleChange(key, e)) { + return + } configStore.setConfigValue(key, e) } +const handleChanges = (items) => { + for (const key in items) { + if (!preHandleChange(key, items[key])) { + return + } + } + configStore.setConfigValues(items) +} + const handleAddOrEditCustomModel = async () => { if (!customModel.name || !customModel.api_base) { message.error('请填写完整的模型名称和API Base信息。') @@ -585,7 +601,7 @@ onUnmounted(() => { const sendRestart = () => { console.log('Restarting...') message.loading({ content: '重新加载模型中', key: "restart", duration: 0 }); - + systemConfigApi.restartServer() .then(() => { console.log('Restarted')