"""系统配置路由: - GET /api/config/ui 公开 UI 配置(前端启动时拉取,无需登录) - GET /api/admin/config 管理端读取配置(admin) - PUT /api/admin/config 管理端保存配置(admin) - GET /api/admin/stats 管理端统计(admin) """ import json from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel from sqlalchemy.orm import Session from ..core.deps import get_current_user from ..core.response import ok from ..database import get_db from ..models import Agent, ChatMessage, ChatSession, Project, Task, User from ..services.chat_service import get_ui_config from ..services.default_config import DEFAULT_UI_CONFIG router = APIRouter(tags=["配置"]) def require_admin(user: User = Depends(get_current_user)) -> User: if user.role != "admin": raise HTTPException(status_code=403, detail="需要管理员权限") return user @router.get("/config/ui") def ui_config(db: Session = Depends(get_db)): """公开:前端渲染所需的界面配置。""" return ok(get_ui_config(db)) @router.get("/admin/config") def get_admin_config(user: User = Depends(require_admin), db: Session = Depends(get_db)): from ..models import AppConfig row = db.get(AppConfig, "ui") stored = {} if row and row.value: try: stored = json.loads(row.value) except json.JSONDecodeError: stored = {} return ok({"defaults": DEFAULT_UI_CONFIG, "stored": stored, "effective": get_ui_config(db)}) class AdminConfigBody(BaseModel): config: dict @router.put("/admin/config") def put_admin_config(body: AdminConfigBody, user: User = Depends(require_admin), db: Session = Depends(get_db)): from ..models import AppConfig row = db.get(AppConfig, "ui") if not row: row = AppConfig(key="ui", value="{}") db.add(row) row.value = json.dumps(body.config, ensure_ascii=False) db.commit() return ok(get_ui_config(db), "已保存") @router.get("/admin/stats") def admin_stats(user: User = Depends(require_admin), db: Session = Depends(get_db)): return ok({ "users": db.query(User).count(), "sessions": db.query(ChatSession).count(), "messages": db.query(ChatMessage).count(), "projects": db.query(Project).count(), "tasks": db.query(Task).count(), "agents": db.query(Agent).count(), "likes": db.query(ChatMessage).filter(ChatMessage.feedback == "like").count(), "dislikes": db.query(ChatMessage).filter(ChatMessage.feedback == "dislike").count(), })