Files
DP/Server/app/api/v1/admin_config.py

252 lines
8.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""
管理员配置接口
功能管理功能配置、VIP配置、签到配置
"""
from fastapi import APIRouter, Header, HTTPException, Depends
from typing import List, Optional
from pydantic import BaseModel
from sqlalchemy.orm import Session
from app.db import get_db
from app.models.business import FeatureConfig, VipConfig, CheckInConfig
from app.core.config import settings
router = APIRouter()
# ==================== 数据模型 ====================
class FeatureConfigCreate(BaseModel):
feature_key: str
feature_name: str
category: str = "general"
points_cost: int
vip_points_cost: int = 0
svip_points_cost: int = 0
description: Optional[str] = None
class FeatureConfigUpdate(BaseModel):
points_cost: Optional[int] = None
vip_points_cost: Optional[int] = None
svip_points_cost: Optional[int] = None
enabled: Optional[bool] = None
description: Optional[str] = None
class VIPConfigUpdate(BaseModel):
price: Optional[float] = None
daily_quota: Optional[int] = None
points_multiplier: Optional[float] = None
class CheckInConfigCreate(BaseModel):
consecutive_days: int
base_points: int
bonus_points: int
total_points: int
class CheckInConfigUpdate(BaseModel):
base_points: Optional[int] = None
bonus_points: Optional[int] = None
total_points: Optional[int] = None
# ==================== 辅助函数 ====================
def verify_admin_token(token: str):
"""验证管理员Token"""
if token != settings.ADMIN_TOKEN:
raise HTTPException(status_code=401, detail="管理员Token无效")
# ==================== 功能配置管理 ====================
@router.get("/admin/config/features")
async def get_features_config(token: str = Header(..., alias="x-admin-token"), db: Session = Depends(get_db)):
"""获取所有功能配置"""
verify_admin_token(token)
features = db.query(FeatureConfig).order_by(FeatureConfig.category, FeatureConfig.feature_key).all()
return features
@router.post("/admin/config/features")
async def create_feature_config(
data: FeatureConfigCreate,
token: str = Header(..., alias="x-admin-token"),
db: Session = Depends(get_db)
):
"""新增功能配置"""
verify_admin_token(token)
existing = db.query(FeatureConfig).filter(FeatureConfig.feature_key == data.feature_key).first()
if existing:
raise HTTPException(status_code=400, detail="功能标识已存在")
new_feature = FeatureConfig(
feature_key=data.feature_key,
feature_name=data.feature_name,
category=data.category,
points_cost=data.points_cost,
vip_points_cost=data.vip_points_cost,
svip_points_cost=data.svip_points_cost,
description=data.description
)
db.add(new_feature)
db.commit()
return {"code": 200, "message": "创建成功"}
@router.put("/admin/config/features/{feature_key}")
async def update_feature_config(
feature_key: str,
data: FeatureConfigUpdate,
token: str = Header(..., alias="x-admin-token"),
db: Session = Depends(get_db)
):
"""更新功能配置"""
verify_admin_token(token)
feature = db.query(FeatureConfig).filter(FeatureConfig.feature_key == feature_key).first()
if not feature:
raise HTTPException(status_code=404, detail="功能配置不存在")
if data.points_cost is not None:
feature.points_cost = data.points_cost
if data.vip_points_cost is not None:
feature.vip_points_cost = data.vip_points_cost
if data.svip_points_cost is not None:
feature.svip_points_cost = data.svip_points_cost
if data.enabled is not None:
feature.enabled = data.enabled
if data.description is not None:
feature.description = data.description
db.commit()
return {"code": 200, "message": "更新成功"}
@router.delete("/admin/config/features/{feature_key}")
async def delete_feature_config(
feature_key: str,
token: str = Header(..., alias="x-admin-token"),
db: Session = Depends(get_db)
):
"""删除功能配置"""
verify_admin_token(token)
feature = db.query(FeatureConfig).filter(FeatureConfig.feature_key == feature_key).first()
if not feature:
raise HTTPException(status_code=404, detail="功能配置不存在")
db.delete(feature)
db.commit()
return {"code": 200, "message": "删除成功"}
# ==================== VIP配置管理 ====================
@router.get("/admin/config/vip")
async def get_vip_config(token: str = Header(..., alias="x-admin-token"), db: Session = Depends(get_db)):
"""获取VIP配置"""
verify_admin_token(token)
# Sort order: vip, svip
# We can fetch all and sort in python or rely on insertion order/id
configs = db.query(VipConfig).all()
# Simple sort
configs.sort(key=lambda x: 0 if x.vip_type == 'vip' else 1)
return configs
@router.put("/admin/config/vip/{vip_type}")
async def update_vip_config(
vip_type: str,
data: VIPConfigUpdate,
token: str = Header(..., alias="x-admin-token"),
db: Session = Depends(get_db)
):
"""更新VIP配置"""
verify_admin_token(token)
if vip_type not in ['vip', 'svip']:
raise HTTPException(status_code=400, detail="VIP类型必须是vip或svip")
config = db.query(VipConfig).filter(VipConfig.vip_type == vip_type).first()
if not config:
raise HTTPException(status_code=404, detail="VIP配置不存在")
if data.price is not None:
config.price = data.price
if data.daily_quota is not None:
config.daily_quota = data.daily_quota
if data.points_multiplier is not None:
config.points_multiplier = data.points_multiplier
db.commit()
return {"code": 200, "message": "更新成功"}
# ==================== 签到配置管理 ====================
@router.get("/admin/config/checkin")
async def get_checkin_config(token: str = Header(..., alias="x-admin-token"), db: Session = Depends(get_db)):
"""获取签到配置"""
verify_admin_token(token)
configs = db.query(CheckInConfig).filter(CheckInConfig.enabled == True).order_by(CheckInConfig.consecutive_days).all()
return configs
@router.post("/admin/config/checkin")
async def create_checkin_config(
data: CheckInConfigCreate,
token: str = Header(..., alias="x-admin-token"),
db: Session = Depends(get_db)
):
"""新增签到档位"""
verify_admin_token(token)
existing = db.query(CheckInConfig).filter(CheckInConfig.consecutive_days == data.consecutive_days).first()
if existing:
raise HTTPException(status_code=400, detail="该连续天数配置已存在")
new_config = CheckInConfig(
consecutive_days=data.consecutive_days,
base_points=data.base_points,
bonus_points=data.bonus_points,
total_points=data.total_points
)
db.add(new_config)
db.commit()
return {"code": 200, "message": "创建成功"}
@router.put("/admin/config/checkin/{consecutive_days}")
async def update_checkin_config(
consecutive_days: int,
data: CheckInConfigUpdate,
token: str = Header(..., alias="x-admin-token"),
db: Session = Depends(get_db)
):
"""更新签到档位"""
verify_admin_token(token)
config = db.query(CheckInConfig).filter(CheckInConfig.consecutive_days == consecutive_days).first()
if not config:
raise HTTPException(status_code=404, detail="签到配置不存在")
if data.base_points is not None:
config.base_points = data.base_points
if data.bonus_points is not None:
config.bonus_points = data.bonus_points
if data.total_points is not None:
config.total_points = data.total_points
db.commit()
return {"code": 200, "message": "更新成功"}
@router.delete("/admin/config/checkin/{consecutive_days}")
async def delete_checkin_config(
consecutive_days: int,
token: str = Header(..., alias="x-admin-token"),
db: Session = Depends(get_db)
):
"""删除签到档位"""
verify_admin_token(token)
config = db.query(CheckInConfig).filter(CheckInConfig.consecutive_days == consecutive_days).first()
if not config:
raise HTTPException(status_code=404, detail="签到配置不存在")
db.delete(config)
db.commit()
return {"code": 200, "message": "删除成功"}