125 lines
3.9 KiB
Python
125 lines
3.9 KiB
Python
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()
|