init_test_data.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. """
  2. 初始化测试数据
  3. """
  4. from sqlalchemy.orm import Session
  5. from app.database import SessionLocal
  6. from app.models.user import User
  7. from app.models.card import Card
  8. from app.models.software import Software
  9. from app.models.announcement import Announcement
  10. import bcrypt
  11. from datetime import datetime, timedelta
  12. import random
  13. import string
  14. def generate_random_string(length=8):
  15. """生成随机字符串"""
  16. return ''.join(random.choices(string.ascii_letters + string.digits, k=length))
  17. def init_test_data():
  18. """初始化测试数据"""
  19. db = SessionLocal()
  20. try:
  21. # 检查是否已有用户数据
  22. user_count = db.query(User).count()
  23. if user_count > 0:
  24. print(f"数据库中已有 {user_count} 个用户,跳过初始化")
  25. return
  26. # 获取软件列表
  27. software_list = db.query(Software).all()
  28. if not software_list:
  29. print("警告:没有找到软件数据,请先创建软件")
  30. return
  31. software = software_list[0]
  32. print(f"使用软件: {software.name} ({software.code})")
  33. # 创建测试用户
  34. print("正在创建测试用户...")
  35. test_users = []
  36. for i in range(1, 21): # 创建20个测试用户
  37. username = f"testuser{i:02d}"
  38. email = f"test{i}@example.com"
  39. machine_code = f"MACHINE{generate_random_string(8).upper()}"
  40. # 随机设置过期时间
  41. if i % 3 == 0:
  42. expire_time = None # 无有效期
  43. elif i % 3 == 1:
  44. expire_time = datetime.now() + timedelta(days=30) # 有效
  45. else:
  46. expire_time = datetime.now() - timedelta(days=1) # 已过期
  47. # 随机状态
  48. status = 1 if i % 5 != 0 else 0 # 大部分正常,少数禁用
  49. # 生成密码哈希
  50. password_hash = bcrypt.hashpw("123456".encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
  51. user = User(
  52. username=username,
  53. password=password_hash, # 默认密码
  54. email=email,
  55. machine_code=machine_code,
  56. expire_time=expire_time,
  57. status=status,
  58. created_at=datetime.now() - timedelta(days=random.randint(1, 90)),
  59. updated_at=datetime.now()
  60. )
  61. db.add(user)
  62. test_users.append(user)
  63. db.flush() # 获取用户ID
  64. # 创建测试卡密
  65. print("正在创建测试卡密...")
  66. for i in range(1, 11): # 创建10个测试卡密
  67. card_code = f"CARD{generate_random_string(10).upper()}"
  68. days = random.choice([7, 30, 90, 180, 365])
  69. # 随机分配给用户
  70. user = random.choice(test_users) if test_users else None
  71. card = Card(
  72. card_code=card_code,
  73. software_code=software.code,
  74. days=days,
  75. discount=random.choice([100, 95, 90, 85]), # 折扣
  76. user_id=user.id if user else None,
  77. activated_at=datetime.now() - timedelta(days=random.randint(1, 30)) if user else None,
  78. expire_time=datetime.now() + timedelta(days=days) if user else None,
  79. status=1 if user else 0, # 已激活或未激活
  80. created_at=datetime.now() - timedelta(days=random.randint(1, 60)),
  81. updated_at=datetime.now()
  82. )
  83. db.add(card)
  84. # 如果卡密已激活,更新用户的卡密ID和过期时间
  85. if user:
  86. user.card_id = card.id
  87. user.expire_time = card.expire_time
  88. # 创建测试公告
  89. print("正在创建测试公告...")
  90. announcements = [
  91. {
  92. "title": "系统维护通知",
  93. "content": "系统将于本周六晚上进行维护,预计维护时间2小时,期间可能无法正常使用,请提前做好准备。",
  94. "priority": 1,
  95. "is_active": 1
  96. },
  97. {
  98. "title": "新功能上线",
  99. "content": "我们很高兴地宣布,新版本已经上线,包含以下新功能:\n1. 优化了用户体验\n2. 增加了新的功能模块\n3. 修复了已知问题",
  100. "priority": 2,
  101. "is_active": 1
  102. },
  103. {
  104. "title": "优惠活动",
  105. "content": "限时优惠活动正在进行中,购买年卡可享受8折优惠,活动时间有限,请抓紧时间!",
  106. "priority": 3,
  107. "is_active": 1
  108. }
  109. ]
  110. for ann_data in announcements:
  111. announcement = Announcement(
  112. title=ann_data["title"],
  113. content=ann_data["content"],
  114. priority=ann_data["priority"],
  115. is_active=ann_data["is_active"],
  116. publish_time=datetime.now() - timedelta(days=random.randint(1, 30)),
  117. created_at=datetime.now() - timedelta(days=random.randint(1, 30)),
  118. updated_at=datetime.now()
  119. )
  120. db.add(announcement)
  121. db.commit()
  122. print("测试数据初始化完成!")
  123. print(f"- 创建了 {len(test_users)} 个测试用户")
  124. print(f"- 创建了 10 个测试卡密")
  125. print(f"- 创建了 {len(announcements)} 条测试公告")
  126. print("\n测试用户账号信息:")
  127. print("用户名格式: testuser01, testuser02, ...")
  128. print("默认密码: 123456")
  129. except Exception as e:
  130. db.rollback()
  131. print(f"初始化失败: {e}")
  132. import traceback
  133. traceback.print_exc()
  134. raise
  135. finally:
  136. db.close()
  137. if __name__ == "__main__":
  138. init_test_data()