users.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. """
  2. 用户管理接口
  3. """
  4. from fastapi import APIRouter, Depends, Query
  5. from sqlalchemy.orm import Session
  6. from sqlalchemy import or_, and_
  7. from datetime import datetime
  8. from app.database import get_db
  9. from app.api.deps import get_current_admin
  10. from app.models.user import User
  11. from app.models.admin import Admin
  12. router = APIRouter()
  13. @router.get("")
  14. async def get_users(
  15. page: int = Query(1, ge=1),
  16. page_size: int = Query(10, ge=1, le=100),
  17. keyword: str = Query(None, description="搜索关键词(用户名、邮箱、机器码)"),
  18. status: int = Query(None, description="状态筛选:1-正常,0-禁用"),
  19. expire_status: str = Query(None, description="有效期状态:valid-有效,expired-已过期,none-无有效期"),
  20. machine_code: str = Query(None, description="机器码筛选"),
  21. db: Session = Depends(get_db),
  22. current_admin: Admin = Depends(get_current_admin)
  23. ):
  24. """获取用户列表"""
  25. offset = (page - 1) * page_size
  26. query = db.query(User)
  27. # 搜索
  28. if keyword:
  29. query = query.filter(
  30. or_(
  31. User.username.like(f"%{keyword}%"),
  32. User.email.like(f"%{keyword}%"),
  33. User.machine_code.like(f"%{keyword}%")
  34. )
  35. )
  36. # 筛选
  37. if status is not None:
  38. query = query.filter(User.status == status)
  39. if machine_code:
  40. query = query.filter(User.machine_code == machine_code)
  41. # 有效期状态筛选
  42. now = datetime.now()
  43. if expire_status == "valid":
  44. query = query.filter(User.expire_time > now)
  45. elif expire_status == "expired":
  46. query = query.filter(User.expire_time <= now)
  47. elif expire_status == "none":
  48. query = query.filter(User.expire_time.is_(None))
  49. # 排序
  50. query = query.order_by(User.created_at.desc())
  51. users = query.offset(offset).limit(page_size).all()
  52. total = query.count()
  53. return {
  54. "code": 200,
  55. "msg": "成功",
  56. "data": [
  57. {
  58. "id": u.id,
  59. "username": u.username,
  60. "email": u.email,
  61. "machine_code": u.machine_code,
  62. "expire_time": u.expire_time.isoformat() if u.expire_time else None,
  63. "last_login_time": u.last_login_time.isoformat() if u.last_login_time else None,
  64. "last_login_ip": u.last_login_ip,
  65. "status": u.status,
  66. "created_at": u.created_at.isoformat() if u.created_at else None
  67. }
  68. for u in users
  69. ],
  70. "total": total,
  71. "page": page,
  72. "page_size": page_size
  73. }
  74. @router.get("/{user_id}")
  75. async def get_user(
  76. user_id: int,
  77. db: Session = Depends(get_db),
  78. current_admin: Admin = Depends(get_current_admin)
  79. ):
  80. """获取用户详情"""
  81. from app.models.card import Card
  82. from app.models.recharge_record import RechargeRecord
  83. user = db.query(User).filter(User.id == user_id).first()
  84. if not user:
  85. return {"code": 404, "msg": "用户不存在"}
  86. # 获取当前卡密信息
  87. card_info = None
  88. if user.card_id:
  89. card = db.query(Card).filter(Card.id == user.card_id).first()
  90. if card:
  91. card_info = {
  92. "id": card.id,
  93. "card_code": card.card_code,
  94. "software_code": card.software_code,
  95. "days": card.days,
  96. "activated_at": card.activated_at.isoformat() if card.activated_at else None,
  97. "expire_time": card.expire_time.isoformat() if card.expire_time else None,
  98. }
  99. # 获取充值记录
  100. recharge_records = db.query(RechargeRecord).filter(
  101. RechargeRecord.user_id == user_id
  102. ).order_by(RechargeRecord.created_at.desc()).limit(10).all()
  103. return {
  104. "code": 200,
  105. "msg": "成功",
  106. "data": {
  107. "id": user.id,
  108. "username": user.username,
  109. "email": user.email,
  110. "machine_code": user.machine_code,
  111. "card_id": user.card_id,
  112. "card_info": card_info,
  113. "expire_time": user.expire_time.isoformat() if user.expire_time else None,
  114. "last_login_time": user.last_login_time.isoformat() if user.last_login_time else None,
  115. "last_login_ip": user.last_login_ip,
  116. "status": user.status,
  117. "created_at": user.created_at.isoformat() if user.created_at else None,
  118. "updated_at": user.updated_at.isoformat() if user.updated_at else None,
  119. "recharge_records": [
  120. {
  121. "id": r.id,
  122. "card_code": r.card.card_code if r.card else None,
  123. "software_code": r.card.software_code if r.card else None,
  124. "days": r.card.days if r.card else None,
  125. "activated_at": r.created_at.isoformat() if r.created_at else None,
  126. }
  127. for r in recharge_records
  128. ]
  129. }
  130. }
  131. @router.put("/{user_id}/status")
  132. async def update_user_status(
  133. user_id: int,
  134. status: int = Query(..., description="状态:1-正常,0-禁用"),
  135. db: Session = Depends(get_db),
  136. current_admin: Admin = Depends(get_current_admin)
  137. ):
  138. """启用/禁用用户"""
  139. user = db.query(User).filter(User.id == user_id).first()
  140. if not user:
  141. return {"code": 404, "msg": "用户不存在"}
  142. user.status = status
  143. user.updated_at = datetime.now()
  144. db.commit()
  145. return {"code": 200, "msg": "状态更新成功"}
  146. @router.delete("/{user_id}")
  147. async def delete_user(
  148. user_id: int,
  149. db: Session = Depends(get_db),
  150. current_admin: Admin = Depends(get_current_admin)
  151. ):
  152. """删除用户"""
  153. user = db.query(User).filter(User.id == user_id).first()
  154. if not user:
  155. return {"code": 404, "msg": "用户不存在"}
  156. db.delete(user)
  157. db.commit()
  158. return {"code": 200, "msg": "删除成功"}