imetting_backend/app/api/endpoints/admin.py

145 lines
5.2 KiB
Python

from fastapi import APIRouter, HTTPException, Depends
from app.core.auth import get_current_admin_user
from app.core.config import LLM_CONFIG, DEFAULT_RESET_PASSWORD, MAX_FILE_SIZE, MAX_IMAGE_SIZE
from pydantic import BaseModel
import os
import json
from pathlib import Path
router = APIRouter()
# 配置文件路径
CONFIG_FILE = Path(__file__).parent.parent.parent.parent / "config" / "system_config.json"
class SystemConfigModel(BaseModel):
model_name: str
system_prompt: str
DEFAULT_RESET_PASSWORD: str
MAX_FILE_SIZE: int # 字节为单位
MAX_IMAGE_SIZE: int # 字节为单位
class SystemConfigResponse(BaseModel):
model_name: str
system_prompt: str
DEFAULT_RESET_PASSWORD: str
MAX_FILE_SIZE: int
MAX_IMAGE_SIZE: int
message: str = ""
def load_config_from_file():
"""从文件加载配置,如果文件不存在则返回默认配置"""
try:
if CONFIG_FILE.exists():
with open(CONFIG_FILE, 'r', encoding='utf-8') as f:
return json.load(f)
except Exception:
pass
# 返回默认配置
return {
'model_name': LLM_CONFIG['model_name'],
'system_prompt': LLM_CONFIG['system_prompt'],
'DEFAULT_RESET_PASSWORD': DEFAULT_RESET_PASSWORD,
'MAX_FILE_SIZE': MAX_FILE_SIZE,
'MAX_IMAGE_SIZE': MAX_IMAGE_SIZE
}
def save_config_to_file(config_data):
"""将配置保存到文件"""
try:
# 确保配置目录存在
CONFIG_FILE.parent.mkdir(parents=True, exist_ok=True)
with open(CONFIG_FILE, 'w', encoding='utf-8') as f:
json.dump(config_data, f, ensure_ascii=False, indent=2)
return True
except Exception as e:
print(f"保存配置文件失败: {e}")
return False
@router.get("/admin/system-config", response_model=SystemConfigResponse)
async def get_system_config(current_user=Depends(get_current_admin_user)):
"""
获取系统配置
只有管理员才能访问
"""
try:
# 优先从文件加载配置,然后从内存配置补充
config = load_config_from_file()
return SystemConfigResponse(
model_name=config.get('model_name', LLM_CONFIG['model_name']),
system_prompt=config.get('system_prompt', LLM_CONFIG['system_prompt']),
DEFAULT_RESET_PASSWORD=config.get('DEFAULT_RESET_PASSWORD', DEFAULT_RESET_PASSWORD),
MAX_FILE_SIZE=config.get('MAX_FILE_SIZE', MAX_FILE_SIZE),
MAX_IMAGE_SIZE=config.get('MAX_IMAGE_SIZE', MAX_IMAGE_SIZE),
message="配置获取成功"
)
except Exception as e:
raise HTTPException(status_code=500, detail=f"获取配置失败: {str(e)}")
@router.put("/admin/system-config", response_model=SystemConfigResponse)
async def update_system_config(
config: SystemConfigModel,
current_user=Depends(get_current_admin_user)
):
"""
更新系统配置
只有管理员才能访问
"""
try:
# 准备要保存的配置数据
config_data = {
'model_name': config.model_name,
'system_prompt': config.system_prompt,
'DEFAULT_RESET_PASSWORD': config.DEFAULT_RESET_PASSWORD,
'MAX_FILE_SIZE': config.MAX_FILE_SIZE,
'MAX_IMAGE_SIZE': config.MAX_IMAGE_SIZE
}
# 保存到文件
if not save_config_to_file(config_data):
raise HTTPException(status_code=500, detail="配置保存到文件失败")
# 更新运行时配置
LLM_CONFIG['model_name'] = config.model_name
LLM_CONFIG['system_prompt'] = config.system_prompt
# 更新模块级别的配置
import app.core.config as config_module
config_module.DEFAULT_RESET_PASSWORD = config.DEFAULT_RESET_PASSWORD
config_module.MAX_FILE_SIZE = config.MAX_FILE_SIZE
config_module.MAX_IMAGE_SIZE = config.MAX_IMAGE_SIZE
return SystemConfigResponse(
model_name=config.model_name,
system_prompt=config.system_prompt,
DEFAULT_RESET_PASSWORD=config.DEFAULT_RESET_PASSWORD,
MAX_FILE_SIZE=config.MAX_FILE_SIZE,
MAX_IMAGE_SIZE=config.MAX_IMAGE_SIZE,
message="配置更新成功,重启服务后完全生效"
)
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500, detail=f"更新配置失败: {str(e)}")
# 在应用启动时加载配置
def load_system_config():
"""在应用启动时调用,加载保存的配置"""
try:
config = load_config_from_file()
# 更新运行时配置
LLM_CONFIG['model_name'] = config.get('model_name', LLM_CONFIG['model_name'])
LLM_CONFIG['system_prompt'] = config.get('system_prompt', LLM_CONFIG['system_prompt'])
# 更新其他配置
import app.core.config as config_module
config_module.DEFAULT_RESET_PASSWORD = config.get('DEFAULT_RESET_PASSWORD', DEFAULT_RESET_PASSWORD)
config_module.MAX_FILE_SIZE = config.get('MAX_FILE_SIZE', MAX_FILE_SIZE)
config_module.MAX_IMAGE_SIZE = config.get('MAX_IMAGE_SIZE', MAX_IMAGE_SIZE)
print(f"系统配置加载成功: model={config.get('model_name')}")
except Exception as e:
print(f"加载系统配置失败,使用默认配置: {e}")