74 lines
2.3 KiB
Python
74 lines
2.3 KiB
Python
from fastapi import APIRouter, Depends
|
|
from sqlalchemy.orm import Session
|
|
from app.models.point import PointRecordDB, PointRecordCreate, PointRecordInfo
|
|
from app.models.user import UserDB
|
|
from app.models.database import get_db
|
|
from app.api.deps import get_current_user, get_admin_user
|
|
from app.core.response import success_response, error_response, ResponseModel
|
|
from typing import List
|
|
from decimal import Decimal
|
|
|
|
router = APIRouter()
|
|
|
|
@router.post("", response_model=ResponseModel)
|
|
async def add_points(
|
|
record: PointRecordCreate,
|
|
db: Session = Depends(get_db),
|
|
admin: UserDB = Depends(get_admin_user) # 仅管理员可操作
|
|
):
|
|
"""增加用户积分"""
|
|
user = db.query(UserDB).filter(UserDB.userid == record.user_id).first()
|
|
|
|
if not user:
|
|
return error_response(code=404, message="用户不存在")
|
|
|
|
# 创建积分记录
|
|
point_record = PointRecordDB(
|
|
user_id=record.user_id,
|
|
points=record.points,
|
|
type=record.type,
|
|
description=record.description
|
|
)
|
|
db.add(point_record)
|
|
|
|
# 更新用户积分
|
|
user.points = user.points + Decimal(str(record.points))
|
|
|
|
try:
|
|
db.commit()
|
|
db.refresh(point_record)
|
|
return success_response(data=PointRecordInfo.model_validate(point_record))
|
|
except Exception as e:
|
|
db.rollback()
|
|
return error_response(code=500, message=f"操作失败: {str(e)}")
|
|
|
|
@router.get("/records", response_model=ResponseModel)
|
|
async def get_point_records(
|
|
skip: int = 0,
|
|
limit: int = 20,
|
|
db: Session = Depends(get_db),
|
|
current_user: UserDB = Depends(get_current_user)
|
|
):
|
|
"""积分明细"""
|
|
# 获取总记录数
|
|
total = db.query(PointRecordDB).filter(
|
|
PointRecordDB.user_id == current_user.userid
|
|
).count()
|
|
|
|
# 获取分页数据
|
|
records = db.query(PointRecordDB).filter(
|
|
PointRecordDB.user_id == current_user.userid
|
|
).order_by(
|
|
PointRecordDB.create_time.desc()
|
|
).offset(skip).limit(limit).all()
|
|
|
|
# 获取用户当前总积分
|
|
total_points = db.query(UserDB.points).filter(
|
|
UserDB.userid == current_user.userid
|
|
).scalar()
|
|
|
|
return success_response(data={
|
|
"total": total, # 总记录数
|
|
"total_points": total_points, # 当前总积分
|
|
"items": [PointRecordInfo.model_validate(r) for r in records] # 积分记录列表
|
|
}) |