from fastapi import APIRouter, Depends, HTTPException, UploadFile, File, Query from sqlalchemy.orm import Session from app.database import get_db from app.services.config_service import ConfigService from app.schemas.config_schema import ( ConfigBatchUpdate, ConfigListResponse, ConfigResponse ) from app.dependencies.auth import get_current_admin router = APIRouter(prefix="/api/admin", tags=["系统配置"]) @router.get("/config", response_model=ConfigListResponse) def get_all_configs( db: Session = Depends(get_db), admin = Depends(get_current_admin) ): """获取所有配置项""" service = ConfigService(db) configs = service.get_all_configs() return ConfigListResponse(data=configs) @router.put("/config", response_model=ConfigResponse) def update_configs( update_data: ConfigBatchUpdate, db: Session = Depends(get_db), admin = Depends(get_current_admin) ): """批量更新配置项""" service = ConfigService(db) try: service.update_configs(update_data.configs, admin.id) return ConfigResponse(message="配置更新成功", data=None) except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) @router.get("/config/{config_key}/history", response_model=ConfigResponse) def get_config_history( config_key: str, page: int = 1, size: int = 20, db: Session = Depends(get_db), admin = Depends(get_current_admin) ): """获取配置修改历史""" service = ConfigService(db) history = service.get_config_history(config_key, page, size) return ConfigResponse(data=history) @router.post("/config/{config_key}/reset", response_model=ConfigResponse) def reset_config( config_key: str, db: Session = Depends(get_db), admin = Depends(get_current_admin) ): """重置配置为默认值""" service = ConfigService(db) try: service.reset_config(config_key, admin.id) return ConfigResponse(message="配置重置成功", data=None) except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) @router.post("/oss/upload") async def admin_upload_file( file: UploadFile = File(...), prefix: str = Query(default="uploads"), admin = Depends(get_current_admin) ): """管理员上传文件到 OSS""" from app.services.oss_service import get_oss_service content = await file.read() if len(content) > 10 * 1024 * 1024: raise HTTPException(status_code=400, detail="文件大小不能超过 10MB") oss_service = get_oss_service() try: url = oss_service.upload_file(content, prefix, file.filename) return {"code": 200, "data": {"url": url, "filename": file.filename}} except Exception as e: raise HTTPException(status_code=500, detail=f"上传失败: {str(e)}")