table_game/backend/app/services/user_getInfo_service.py
2025-03-10 08:35:19 +08:00

125 lines
3.9 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.

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()