76 lines
2.6 KiB
Python
76 lines
2.6 KiB
Python
"""系统配置路由:
|
|
- 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(),
|
|
})
|