init_db.py 5.7 KB

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