from fastapi import HTTPException from ..db import get_connection from ..utils.jwt_handler import verify_token from pydantic import BaseModel from datetime import datetime from typing import List # 基础信息模型 class UserBasicInfo(BaseModel): username: str phone_number: str points: int # 订单模型 class OrderHistory(BaseModel): order_id: int order_date: datetime start_time: datetime end_time: datetime | None = None # 允许为空 payable_amount: float | None = None # 允许空值 paid_amount: float | None = None # 允许为空 game_table_number: str order_status: str # 新增状态字段 # 积分变动模型 class PointsHistory(BaseModel): change_time: datetime change_amount: int reason: str def _get_user_info(token: str): """公共方法:验证token并获取用户完整信息""" try: payload = verify_token(token) phone_number = payload["sub"] print(f"Verified phone_number: {phone_number}") except ValueError as e: raise HTTPException(401, str(e)) conn = get_connection() try: cursor = conn.cursor(dictionary=True) cursor.execute(""" SELECT username, phone_number, points FROM users WHERE phone_number = %s """, (phone_number,)) user = cursor.fetchone() if not user: raise HTTPException(404, "用户不存在") return user # 返回完整的用户记录 finally: cursor.close() conn.close() def get_basic_info(token: str): """获取基础信息""" user = _get_user_info(token) # 脱敏处理 phone = user['phone_number'] masked_phone = phone[:3] + "****" + phone[-4:] if phone else "" return UserBasicInfo( username=user['username'], # 从数据库查询结果获取 phone_number=masked_phone, points=user['points'] # 从数据库查询结果获取 ) def get_order_history(token: str): """获取订单历史""" try: payload = verify_token(token) phone_number = payload["sub"] print(f"Verified phone_number: {phone_number}") except ValueError as e: raise HTTPException(401, str(e)) conn = get_connection() try: cursor = conn.cursor(dictionary=True) cursor.execute(""" SELECT o.order_id, o.order_date, o.start_datetime AS start_time, o.end_datetime AS end_time, o.payable_price AS payable_amount, o.paid_price AS paid_amount, g.game_table_number, o.order_status # 新增状态字段 FROM orders o LEFT JOIN game_tables g ON o.game_table_id = g.table_id WHERE o.user_id = (SELECT user_id FROM users WHERE phone_number = %s) AND o.order_status= 'completed' ORDER BY o.order_date DESC """, (phone_number,)) return [OrderHistory(**row) for row in cursor.fetchall()] finally: cursor.close() conn.close() def get_points_history(token: str): """获取积分变动""" try: payload = verify_token(token) phone_number = payload["sub"] print(f"Verified phone_number: {phone_number}") except ValueError as e: raise HTTPException(401, str(e)) conn = get_connection() try: cursor = conn.cursor(dictionary=True) cursor.execute(""" SELECT created_at as change_time, change_amount, reason FROM points_history WHERE user_id = (SELECT user_id FROM users WHERE phone_number = %s) # 改为phone_number """, (phone_number,)) # 参数改为phone_number return [PointsHistory(**row) for row in cursor.fetchall()] finally: cursor.close() conn.close()