feat(api): 将万川平台配置迁移至后端存储

- 移除前端localStorage依赖,改用后端SQLite作为唯一数据源
- 新增getWanchuanConfig和saveWanchuanConfig函数用于配置读写
- 添加getBoundKnowledgeBase函数统一获取绑定知识库信息
- 支持桌面应用端口变化时正确读取配置

refactor(settings): 重构万川平台配置管理逻辑

- 移除localStorage配置存储,改为后端API调用
- 实现配置自动恢复和防抖保存机制
- 添加token过期自动重登功能
- 优化知识库选择和连接状态管理

fix(knowledge): 修复知识库上传异步问题

- 将getBoundKnowledgeBase调用改为await异步处理
- 统一各页面的知识库信息获取方式
- 修正上传接口datasetId使用逻辑

feat(electron): 添加chatlog.exe存在性检查

- 新增ensureChatlogExe函数验证执行文件存在
- 防止杀毒软件误删导致的ENONENT错误
- 提供用户友好的错误提示和解决方案
This commit is contained in:
2026-06-24 10:13:20 +08:00
parent f9f8a7b13d
commit eecbe4172e
8 changed files with 13596 additions and 13278 deletions

View File

@@ -1,6 +1,7 @@
from fastapi import APIRouter, Depends
from pydantic import BaseModel
from typing import Optional
from typing import Optional, Any
import json
import aiosqlite
from database import get_db
@@ -11,6 +12,11 @@ EDITABLE_KEYS = [
"vision_model", "voice_model", "topic_analysis_prompt",
]
# 万川 AI 平台对接配置整体作为一条 JSON 存储,独立于上面的 AI 模型配置。
# 存到后端 SQLiteapp_settings 表)后,配置不再依赖前端 localStorage 的 origin
# 桌面应用exe即便后端端口/origin 变化也能跨次启动恢复平台地址、账号、密码与已选知识库。
WANCHUAN_KEY = "wanchuan_config"
def _mask_key(value: str) -> str:
if not value or len(value) <= 8:
@@ -62,3 +68,32 @@ async def update_settings(body: SettingsUpdate, db: aiosqlite.Connection = Depen
from services.runtime_settings import invalidate_cache
invalidate_cache()
return {"status": "ok"}
# ── 万川 AI 平台对接配置(整体 JSON 持久化) ──────────────────
# 前端把 { platformUrl, username, password, selectedKbId, selectedKbInfo } 整体存这里。
# 桌面应用 origin 变化不影响该配置(不依赖 localStorage
@router.get("/wanchuan")
async def get_wanchuan_config(db: aiosqlite.Connection = Depends(get_db)):
async with db.execute(
"SELECT value FROM app_settings WHERE key = ?", (WANCHUAN_KEY,)
) as cur:
row = await cur.fetchone()
if not row or not row["value"]:
return {}
try:
return json.loads(row["value"])
except (ValueError, TypeError):
return {}
@router.put("/wanchuan")
async def update_wanchuan_config(body: dict[str, Any], db: aiosqlite.Connection = Depends(get_db)):
value = json.dumps(body, ensure_ascii=False)
await db.execute(
"INSERT INTO app_settings (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = ?",
(WANCHUAN_KEY, value, value),
)
await db.commit()
return {"status": "ok"}