399 lines
12 KiB
Python
399 lines
12 KiB
Python
"""
|
||
数据库初始化脚本
|
||
用于创建数据库表并插入基础数据
|
||
"""
|
||
import sys
|
||
import os
|
||
import asyncio
|
||
from pathlib import Path
|
||
|
||
# 添加项目根目录到 Python 路径
|
||
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||
|
||
from sqlalchemy import text
|
||
from app.core.database import engine, async_session
|
||
from app.models.user import User
|
||
from app.models.role import Role
|
||
from app.models.menu import SystemMenu
|
||
from app.models.project import Project, ProjectMember
|
||
from app.core.security import get_password_hash
|
||
|
||
|
||
async def init_tables():
|
||
"""创建所有数据库表"""
|
||
print("正在创建数据库表...")
|
||
|
||
# 导入所有模型以确保它们被注册
|
||
from app.models import Base
|
||
|
||
async with engine.begin() as conn:
|
||
# 创建所有表
|
||
await conn.run_sync(Base.metadata.create_all)
|
||
|
||
print("✓ 数据库表创建成功")
|
||
|
||
|
||
async def init_roles():
|
||
"""初始化系统角色"""
|
||
print("正在初始化系统角色...")
|
||
|
||
async with async_session() as session:
|
||
# 检查是否已存在角色
|
||
result = await session.execute(text("SELECT COUNT(*) FROM roles"))
|
||
count = result.scalar()
|
||
|
||
if count > 0:
|
||
print(" 角色已存在,跳过初始化")
|
||
return
|
||
|
||
# 创建默认角色
|
||
roles = [
|
||
Role(
|
||
role_name="超级管理员",
|
||
role_code="super_admin",
|
||
description="系统超级管理员,拥有所有权限",
|
||
status=1
|
||
),
|
||
Role(
|
||
role_name="管理员",
|
||
role_code="admin",
|
||
description="系统管理员",
|
||
status=1
|
||
),
|
||
Role(
|
||
role_name="普通用户",
|
||
role_code="user",
|
||
description="普通用户",
|
||
status=1
|
||
),
|
||
]
|
||
|
||
for role in roles:
|
||
session.add(role)
|
||
|
||
await session.commit()
|
||
print("✓ 系统角色初始化成功")
|
||
|
||
|
||
async def init_menus():
|
||
"""初始化系统菜单"""
|
||
print("正在初始化系统菜单...")
|
||
|
||
async with async_session() as session:
|
||
# 检查是否已存在菜单
|
||
result = await session.execute(text("SELECT COUNT(*) FROM system_menus"))
|
||
count = result.scalar()
|
||
|
||
if count > 0:
|
||
print(" 菜单已存在,跳过初始化")
|
||
return
|
||
|
||
# 创建系统菜单
|
||
menus = [
|
||
# 一级菜单
|
||
SystemMenu(
|
||
id=1,
|
||
parent_id=0,
|
||
menu_name="项目空间",
|
||
menu_code="projects",
|
||
menu_type=0,
|
||
path="/projects",
|
||
icon="ProjectOutlined",
|
||
sort_order=3,
|
||
visible=1,
|
||
status=1
|
||
),
|
||
SystemMenu(
|
||
id=8,
|
||
parent_id=0,
|
||
menu_name="个人桌面",
|
||
menu_code="desktop",
|
||
menu_type=1,
|
||
path="/desktop",
|
||
component="Desktop",
|
||
icon="DesktopOutlined",
|
||
sort_order=1,
|
||
visible=1,
|
||
status=1
|
||
),
|
||
SystemMenu(
|
||
id=9,
|
||
parent_id=0,
|
||
menu_name="管理面板",
|
||
menu_code="dashboard",
|
||
menu_type=1,
|
||
path="/dashboard",
|
||
component="Dashboard",
|
||
icon="DashboardOutlined",
|
||
sort_order=2,
|
||
visible=1,
|
||
status=1
|
||
),
|
||
SystemMenu(
|
||
id=10,
|
||
parent_id=0,
|
||
menu_name="知识库空间",
|
||
menu_code="knowledge",
|
||
menu_type=0,
|
||
path="/knowledge",
|
||
icon="BookOutlined",
|
||
sort_order=4,
|
||
visible=1,
|
||
status=1
|
||
),
|
||
SystemMenu(
|
||
id=20,
|
||
parent_id=0,
|
||
menu_name="系统管理",
|
||
menu_code="system",
|
||
menu_type=0,
|
||
path="/system",
|
||
icon="SettingOutlined",
|
||
sort_order=5,
|
||
visible=1,
|
||
status=1
|
||
),
|
||
|
||
# 项目空间子菜单
|
||
SystemMenu(
|
||
id=2,
|
||
parent_id=1,
|
||
menu_name="我的项目",
|
||
menu_code="projects:my",
|
||
menu_type=1,
|
||
path="/projects",
|
||
component="MyProjects",
|
||
icon="FolderOutlined",
|
||
sort_order=1,
|
||
visible=1,
|
||
status=1
|
||
),
|
||
|
||
# 我的项目子菜单(按钮权限)
|
||
SystemMenu(
|
||
id=3,
|
||
parent_id=2,
|
||
menu_name="创建项目",
|
||
menu_code="projects:create",
|
||
menu_type=2,
|
||
permission="projects:create",
|
||
sort_order=1,
|
||
visible=1,
|
||
status=1
|
||
),
|
||
SystemMenu(
|
||
id=4,
|
||
parent_id=2,
|
||
menu_name="编辑项目",
|
||
menu_code="projects:edit",
|
||
menu_type=2,
|
||
permission="projects:edit",
|
||
sort_order=2,
|
||
visible=1,
|
||
status=1
|
||
),
|
||
SystemMenu(
|
||
id=5,
|
||
parent_id=2,
|
||
menu_name="删除项目",
|
||
menu_code="projects:delete",
|
||
menu_type=2,
|
||
permission="projects:delete",
|
||
sort_order=3,
|
||
visible=1,
|
||
status=1
|
||
),
|
||
|
||
# 知识库空间子菜单
|
||
SystemMenu(
|
||
id=11,
|
||
parent_id=10,
|
||
menu_name="我的知识库",
|
||
menu_code="knowledge:my",
|
||
menu_type=1,
|
||
path="/knowledge",
|
||
component="MyKnowledge",
|
||
icon="ReadOutlined",
|
||
sort_order=1,
|
||
visible=1,
|
||
status=1
|
||
),
|
||
|
||
# 我的知识库子菜单(按钮权限)
|
||
SystemMenu(
|
||
id=12,
|
||
parent_id=11,
|
||
menu_name="编辑知识库",
|
||
menu_code="knowledge:edit",
|
||
menu_type=2,
|
||
permission="knowledge:edit",
|
||
sort_order=1,
|
||
visible=1,
|
||
status=1
|
||
),
|
||
SystemMenu(
|
||
id=13,
|
||
parent_id=11,
|
||
menu_name="删除知识库",
|
||
menu_code="knowledge:delete",
|
||
menu_type=2,
|
||
permission="knowledge:delete",
|
||
sort_order=2,
|
||
visible=1,
|
||
status=1
|
||
),
|
||
|
||
# 系统管理子菜单
|
||
SystemMenu(
|
||
id=14,
|
||
parent_id=20,
|
||
menu_name="权限管理",
|
||
menu_code="system:permissions",
|
||
menu_type=1,
|
||
path="/system/permissions",
|
||
component="System/Permissions",
|
||
icon="SafetyOutlined",
|
||
sort_order=3,
|
||
visible=1,
|
||
status=1
|
||
),
|
||
SystemMenu(
|
||
id=15,
|
||
parent_id=20,
|
||
menu_name="用户管理",
|
||
menu_code="system:users",
|
||
menu_type=1,
|
||
path="/system/users",
|
||
component="System/Users",
|
||
icon="UserOutlined",
|
||
sort_order=1,
|
||
visible=1,
|
||
status=1
|
||
),
|
||
SystemMenu(
|
||
id=16,
|
||
parent_id=20,
|
||
menu_name="角色管理",
|
||
menu_code="system:roles",
|
||
menu_type=1,
|
||
path="/system/roles",
|
||
component="System/Roles",
|
||
icon="TeamOutlined",
|
||
sort_order=2,
|
||
visible=1,
|
||
status=1
|
||
),
|
||
]
|
||
|
||
for menu in menus:
|
||
session.add(menu)
|
||
|
||
await session.commit()
|
||
print("✓ 系统菜单初始化成功")
|
||
|
||
|
||
async def init_admin_user():
|
||
"""初始化管理员用户"""
|
||
print("正在初始化管理员账号...")
|
||
|
||
# 从环境变量获取管理员信息
|
||
admin_username = os.getenv("ADMIN_USERNAME", "admin")
|
||
admin_password = os.getenv("ADMIN_PASSWORD", "admin@123")
|
||
admin_email = os.getenv("ADMIN_EMAIL", "admin@unisspace.com")
|
||
admin_nickname = os.getenv("ADMIN_NICKNAME", "系统管理员")
|
||
|
||
async with async_session() as session:
|
||
# 检查管理员是否已存在
|
||
result = await session.execute(
|
||
text("SELECT COUNT(*) FROM users WHERE username = :username"),
|
||
{"username": admin_username}
|
||
)
|
||
count = result.scalar()
|
||
|
||
if count > 0:
|
||
print(f" 管理员账号 {admin_username} 已存在,跳过初始化")
|
||
return
|
||
|
||
# 创建管理员用户
|
||
admin_user = User(
|
||
username=admin_username,
|
||
password_hash=get_password_hash(admin_password),
|
||
nickname=admin_nickname,
|
||
email=admin_email,
|
||
status=1,
|
||
is_superuser=True
|
||
)
|
||
|
||
session.add(admin_user)
|
||
await session.flush()
|
||
|
||
# 获取超级管理员角色
|
||
result = await session.execute(
|
||
text("SELECT id FROM roles WHERE role_code = 'super_admin' LIMIT 1")
|
||
)
|
||
role_id = result.scalar()
|
||
|
||
if role_id:
|
||
# 分配角色
|
||
await session.execute(
|
||
text("INSERT INTO user_roles (user_id, role_id) VALUES (:user_id, :role_id)"),
|
||
{"user_id": admin_user.id, "role_id": role_id}
|
||
)
|
||
|
||
# 为超级管理员角色分配菜单权限:ID 9、20 及其所有子菜单
|
||
# ID 9: 管理面板
|
||
# ID 20: 系统管理及其子菜单 (14, 15, 16)
|
||
authorized_menu_ids = [9, 20, 14, 15, 16]
|
||
|
||
if role_id:
|
||
for menu_id in authorized_menu_ids:
|
||
await session.execute(
|
||
text("INSERT INTO role_menus (role_id, menu_id) VALUES (:role_id, :menu_id)"),
|
||
{"role_id": role_id, "menu_id": menu_id}
|
||
)
|
||
|
||
await session.commit()
|
||
|
||
print("✓ 管理员账号初始化成功")
|
||
print(f" 用户名: {admin_username}")
|
||
print(f" 密码: {admin_password}")
|
||
print(f" 邮箱: {admin_email}")
|
||
print(f" 已授权菜单: ID {', '.join(map(str, authorized_menu_ids))}")
|
||
print(" ⚠️ 请登录后及时修改默认密码!")
|
||
|
||
|
||
async def main():
|
||
"""主函数"""
|
||
print("=" * 60)
|
||
print("NEX Docus 数据库初始化")
|
||
print("=" * 60)
|
||
|
||
try:
|
||
# 1. 创建数据库表
|
||
await init_tables()
|
||
|
||
# 2. 初始化角色
|
||
await init_roles()
|
||
|
||
# 3. 初始化菜单
|
||
await init_menus()
|
||
|
||
# 4. 初始化管理员
|
||
await init_admin_user()
|
||
|
||
print("\n" + "=" * 60)
|
||
print("✓ 数据库初始化完成!")
|
||
print("=" * 60)
|
||
|
||
except Exception as e:
|
||
print(f"\n✗ 初始化失败: {str(e)}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
sys.exit(1)
|
||
finally:
|
||
await engine.dispose()
|
||
|
||
|
||
if __name__ == "__main__":
|
||
asyncio.run(main())
|