init_db.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. """
  2. 数据库初始化脚本
  3. """
  4. import asyncio
  5. import sys
  6. import os
  7. # 添加项目根目录到Python路径
  8. sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'src'))
  9. # 加载环境变量
  10. from dotenv import load_dotenv
  11. load_dotenv()
  12. from app.config.database import init_db, engine
  13. from app.models import * # 导入所有模型
  14. from app.utils.security import hash_password, generate_app_key, generate_app_secret
  15. from sqlalchemy.ext.asyncio import AsyncSession
  16. from datetime import datetime
  17. import uuid
  18. async def create_default_data():
  19. """创建默认数据"""
  20. async with AsyncSession(engine) as session:
  21. try:
  22. # 创建默认超级管理员
  23. admin_password = "Admin123456" # 使用较短的密码
  24. admin_user = User(
  25. id=str(uuid.uuid4()),
  26. username="admin",
  27. email="admin@example.com",
  28. password_hash=hash_password(admin_password),
  29. is_active=True,
  30. is_superuser=True,
  31. created_at=datetime.utcnow(),
  32. updated_at=datetime.utcnow()
  33. )
  34. session.add(admin_user)
  35. # 创建默认角色
  36. admin_role = Role(
  37. id=str(uuid.uuid4()),
  38. name="超级管理员",
  39. code="super_admin",
  40. description="系统超级管理员角色",
  41. is_active=True,
  42. created_at=datetime.utcnow(),
  43. updated_at=datetime.utcnow()
  44. )
  45. session.add(admin_role)
  46. user_role = Role(
  47. id=str(uuid.uuid4()),
  48. name="普通用户",
  49. code="user",
  50. description="普通用户角色",
  51. is_active=True,
  52. created_at=datetime.utcnow(),
  53. updated_at=datetime.utcnow()
  54. )
  55. session.add(user_role)
  56. # 创建默认权限
  57. permissions = [
  58. ("用户管理", "user:manage", "管理用户", "user", "manage"),
  59. ("用户查看", "user:view", "查看用户", "user", "view"),
  60. ("应用管理", "app:manage", "管理应用", "app", "manage"),
  61. ("应用查看", "app:view", "查看应用", "app", "view"),
  62. ("系统管理", "system:manage", "系统管理", "system", "manage"),
  63. ]
  64. permission_objects = []
  65. for name, code, desc, resource, action in permissions:
  66. permission = Permission(
  67. id=str(uuid.uuid4()),
  68. name=name,
  69. code=code,
  70. description=desc,
  71. resource=resource,
  72. action=action,
  73. is_active=True,
  74. created_at=datetime.utcnow(),
  75. updated_at=datetime.utcnow()
  76. )
  77. session.add(permission)
  78. permission_objects.append(permission)
  79. await session.flush() # 获取ID
  80. # 分配用户角色
  81. user_role_rel = UserRole(
  82. id=str(uuid.uuid4()),
  83. user_id=admin_user.id,
  84. role_id=admin_role.id,
  85. created_at=datetime.utcnow(),
  86. updated_at=datetime.utcnow()
  87. )
  88. session.add(user_role_rel)
  89. # 分配角色权限
  90. for permission in permission_objects:
  91. role_permission = RolePermission(
  92. id=str(uuid.uuid4()),
  93. role_id=admin_role.id,
  94. permission_id=permission.id,
  95. created_at=datetime.utcnow(),
  96. updated_at=datetime.utcnow()
  97. )
  98. session.add(role_permission)
  99. # 创建默认测试应用
  100. test_app = App(
  101. id=str(uuid.uuid4()),
  102. name="测试应用",
  103. app_key=generate_app_key(),
  104. app_secret=generate_app_secret(),
  105. description="用于测试的默认应用",
  106. redirect_uris=["http://localhost:3000/callback", "http://localhost:8080/callback"],
  107. scope=["profile", "email"],
  108. is_active=True,
  109. is_trusted=True,
  110. access_token_expires=7200,
  111. refresh_token_expires=2592000,
  112. created_by=admin_user.id,
  113. created_at=datetime.utcnow(),
  114. updated_at=datetime.utcnow()
  115. )
  116. session.add(test_app)
  117. await session.commit()
  118. print("✅ 默认数据创建成功")
  119. print(f"管理员账号: admin")
  120. print(f"管理员密码: {admin_password}")
  121. print(f"测试应用Key: {test_app.app_key}")
  122. print(f"测试应用Secret: {test_app.app_secret}")
  123. except Exception as e:
  124. await session.rollback()
  125. print(f"❌ 创建默认数据失败: {e}")
  126. raise
  127. async def main():
  128. """主函数"""
  129. print("🚀 开始初始化数据库...")
  130. try:
  131. # 创建所有表
  132. await init_db()
  133. print("✅ 数据库表创建成功")
  134. # 创建默认数据
  135. await create_default_data()
  136. print("🎉 数据库初始化完成!")
  137. except Exception as e:
  138. print(f"❌ 数据库初始化失败: {e}")
  139. sys.exit(1)
  140. if __name__ == "__main__":
  141. asyncio.run(main())