cards.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. """
  2. 卡密管理接口
  3. """
  4. from fastapi import APIRouter, Depends, Query
  5. from sqlalchemy.orm import Session
  6. from pydantic import BaseModel
  7. import secrets
  8. import string
  9. from app.database import get_db
  10. from app.api.deps import get_current_admin
  11. from app.models.card import Card
  12. from datetime import datetime
  13. router = APIRouter()
  14. class CardGenerateRequest(BaseModel):
  15. """生成卡密请求"""
  16. software_code: str
  17. days: int
  18. discount: float
  19. count: int
  20. def generate_card_code() -> str:
  21. """生成卡密代码"""
  22. characters = string.ascii_uppercase + string.digits
  23. return ''.join(secrets.choice(characters) for _ in range(16))
  24. @router.post("/generate")
  25. async def generate_cards(
  26. req: CardGenerateRequest,
  27. db: Session = Depends(get_db),
  28. current_admin = Depends(get_current_admin)
  29. ):
  30. """生成卡密"""
  31. cards = []
  32. for _ in range(req.count):
  33. card_code = generate_card_code()
  34. # 确保卡密唯一
  35. while db.query(Card).filter(Card.card_code == card_code).first():
  36. card_code = generate_card_code()
  37. card = Card(
  38. card_code=card_code,
  39. software_code=req.software_code,
  40. days=req.days,
  41. discount=req.discount,
  42. status=0,
  43. created_at=datetime.now(),
  44. updated_at=datetime.now()
  45. )
  46. db.add(card)
  47. cards.append(card)
  48. db.commit()
  49. return {
  50. "code": 200,
  51. "msg": "生成成功",
  52. "data": {
  53. "count": len(cards),
  54. "cards": [c.card_code for c in cards]
  55. }
  56. }
  57. @router.get("")
  58. async def get_cards(
  59. page: int = Query(1, ge=1),
  60. page_size: int = Query(10, ge=1, le=100),
  61. keyword: str = Query(None, description="搜索关键词(卡密代码)"),
  62. software_code: str = Query(None, description="软件特征码筛选"),
  63. status: int = Query(None, description="状态筛选:0-未激活,1-已激活,2-已过期"),
  64. db: Session = Depends(get_db),
  65. current_admin = Depends(get_current_admin)
  66. ):
  67. """获取卡密列表"""
  68. from sqlalchemy import or_
  69. offset = (page - 1) * page_size
  70. query = db.query(Card)
  71. # 搜索
  72. if keyword:
  73. query = query.filter(Card.card_code.like(f"%{keyword}%"))
  74. # 筛选
  75. if software_code:
  76. query = query.filter(Card.software_code == software_code)
  77. if status is not None:
  78. query = query.filter(Card.status == status)
  79. # 排序
  80. query = query.order_by(Card.created_at.desc())
  81. cards = query.offset(offset).limit(page_size).all()
  82. total = query.count()
  83. return {
  84. "code": 200,
  85. "msg": "成功",
  86. "data": [
  87. {
  88. "id": c.id,
  89. "card_code": c.card_code,
  90. "software_code": c.software_code,
  91. "days": c.days,
  92. "discount": float(c.discount),
  93. "status": c.status,
  94. "user_id": c.user_id,
  95. "activated_at": c.activated_at.isoformat() if c.activated_at else None,
  96. "expire_time": c.expire_time.isoformat() if c.expire_time else None,
  97. "created_at": c.created_at.isoformat() if c.created_at else None,
  98. "updated_at": c.updated_at.isoformat() if c.updated_at else None
  99. }
  100. for c in cards
  101. ],
  102. "total": total,
  103. "page": page,
  104. "page_size": page_size
  105. }
  106. @router.get("/{card_id}")
  107. async def get_card_detail(
  108. card_id: int,
  109. db: Session = Depends(get_db),
  110. current_admin = Depends(get_current_admin)
  111. ):
  112. """获取卡密详情"""
  113. from app.models.user import User
  114. card = db.query(Card).filter(Card.id == card_id).first()
  115. if not card:
  116. return {"code": 404, "msg": "卡密不存在"}
  117. user_info = None
  118. if card.user_id:
  119. user = db.query(User).filter(User.id == card.user_id).first()
  120. if user:
  121. user_info = {
  122. "id": user.id,
  123. "username": user.username,
  124. "email": user.email,
  125. "machine_code": user.machine_code,
  126. }
  127. return {
  128. "code": 200,
  129. "msg": "成功",
  130. "data": {
  131. "id": card.id,
  132. "card_code": card.card_code,
  133. "software_code": card.software_code,
  134. "days": card.days,
  135. "discount": float(card.discount),
  136. "status": card.status,
  137. "user_id": card.user_id,
  138. "user_info": user_info,
  139. "activated_at": card.activated_at.isoformat() if card.activated_at else None,
  140. "expire_time": card.expire_time.isoformat() if card.expire_time else None,
  141. "created_at": card.created_at.isoformat() if card.created_at else None,
  142. "updated_at": card.updated_at.isoformat() if card.updated_at else None
  143. }
  144. }
  145. @router.get("/{card_id}/activate")
  146. async def get_card_activate_info(
  147. card_id: int,
  148. db: Session = Depends(get_db),
  149. current_admin = Depends(get_current_admin)
  150. ):
  151. """获取卡密激活信息"""
  152. card = db.query(Card).filter(Card.id == card_id).first()
  153. if not card:
  154. return {"code": 404, "msg": "卡密不存在"}
  155. return {
  156. "code": 200,
  157. "msg": "成功",
  158. "data": {
  159. "card_code": card.card_code,
  160. "user_id": card.user_id,
  161. "activated_at": card.activated_at.isoformat() if card.activated_at else None,
  162. "expire_time": card.expire_time.isoformat() if card.expire_time else None
  163. }
  164. }