企业级FastAPI后端模板搭建(五)初始化数据
搭建文件结构
创建core/insert_data.py文件,代码如下:
fromlogimportloggerasyncdefinit_dept():logger.info("🔧 开始新增部门...")asyncdefinit_superuser():logger.info("🔧 开始初始化超级管理员用户...")asyncdefinit_menus():logger.info("🔧 开始初始化系统菜单...")asyncdefinit_apis():logger.info("🔧 开始初始化API数据...")asyncdefinit_roles():logger.info("🔧 开始初始化用户角色...")asyncdefinit_insert_data():awaitinit_dept()awaitinit_superuser()awaitinit_menus()awaitinit_apis()awaitinit_roles()修改core/init_app.py文件:
from.insert_dataimportinit_insert_data ···asyncdefinit_data():logger.info("🚀 系统初始化开始...")logger.info("🔧 开始数据库初始化和迁移...")awaitinit_db()logger.info("✅ 数据库初始化完成")awaitinit_insert_data()logger.info("🎉 系统初始化完成!")初始化部门数据
frommodels.adminimportDept...asyncdefinit_dept():logger.info("🔧 开始新增部门...")depts=awaitDept.exists()ifnotdepts:awaitDept.create(name='研发部门',code="YFBM",parent_id=0,tree_path=0,sort=1,)logger.info("✅ 部门创建成功 - 部门: 研发部门")else:logger.info("ℹ️ 部门已存在,跳过创建")运行之后,数据库会添加对应数据:
初始化超级管理员用户
frommodels.adminimportDept,User...asyncdefinit_superuser():logger.info("🔧 开始初始化超级管理员用户...")user=awaitUser.exists()ifnotuser:awaitUser.create(account="admin",username="超级管理员",email="admin@admin.com",password="abcd1234",dept_id=1,is_active=True,is_superuser=True,)logger.info("✅ 超级管理员用户创建成功 - 用户名: admin")else:logger.info("ℹ️ 超级管理员用户已存在,跳过创建")运行之后,数据库会添加对应数据:
初始化系统菜单
frommodels.adminimportDept,User,Menufromschemas.menusimportMenuType...asyncdefinit_menus():logger.info("🔧 开始初始化系统菜单...")menus=awaitMenu.exists()ifnotmenus:parent_menu=awaitMenu.create(type=MenuType.CATALOG,title="系统管理",path="/system",sort=1,parent_id=0,visible=True,component="Layout",keep_alive=False,redirect="/system/user",)children_menu=[Menu(type=MenuType.MENU,title="用户管理",path="user",sort=1,parent_id=parent_menu.id,visible=True,component="system/user/index",keep_alive=False,),Menu(type=MenuType.MENU,title="角色管理",path="role",sort=2,parent_id=parent_menu.id,visible=True,component="system/role/index",keep_alive=False,),Menu(type=MenuType.MENU,title="菜单管理",path="menu",sort=3,parent_id=parent_menu.id,visible=True,component="system/menu/index",keep_alive=False,),Menu(type=MenuType.MENU,title="API管理",path="api",sort=4,parent_id=parent_menu.id,visible=True,component="system/api/index",keep_alive=False,),Menu(type=MenuType.MENU,title="部门管理",path="dept",sort=5,parent_id=parent_menu.id,visible=True,component="system/dept/index",keep_alive=False,),Menu(type=MenuType.MENU,title="操作日志",path="log",sort=6,parent_id=parent_menu.id,visible=True,component="system/log/index",keep_alive=False,),]awaitMenu.bulk_create(children_menu)logger.info("✅ 系统菜单初始化成功 - 菜单数量: 7")else:logger.info("ℹ️ 系统菜单已存在,跳过初始化")运行之后,数据库会添加对应数据:
初始化API
frommodels.adminimportDept,User,Menu,Apifromfastapi.routingimportAPIRoute...asyncdefinit_apis():logger.info("🔧 开始初始化API数据...")apis=awaitApi.exists()ifnotapis:frommainimportapp routes=app.routesforrouteinroutes:ifisinstance(route,APIRoute):method=list(route.methods)[0]path=route.path_format summary=route.summary tags=list(route.tags)[0]awaitApi.create(**dict(method=method,path=path,summary=summary,tags=tags,))else:api_count=awaitApi.all().count()logger.info(f"ℹ️ API数据已存在,跳过初始化 - 当前API数量:{api_count}")运行之后,数据库会添加对应数据:
初始化用户角色
frommodels.adminimportDept,User,Menu,Api,Rolefromtortoise.expressionsimportQ...asyncdefinit_roles():logger.info("🔧 开始初始化用户角色...")roles=awaitRole.exists()ifnotroles:admin_role=awaitRole.create(name="系统管理员",code="ADMIN",sort=1,desc="系统管理员",)user_role=awaitRole.create(name="普通用户",code="GUEST",sort=2,desc="普通用户",)# 分配所有API给管理员角色all_apis=awaitApi.all()awaitadmin_role.apis.add(*all_apis)# 分配所有菜单给管理员和普通用户all_menus=awaitMenu.all()awaitadmin_role.menus.add(*all_menus)awaituser_role.menus.add(*all_menus)# 为普通用户分配基本APIbasic_apis=awaitApi.filter(Q(method__in=["GET"])|Q(tags="基础模块"))awaituser_role.apis.add(*basic_apis)logger.info("✅ 用户角色初始化成功 - 角色: 管理员, 普通用户")else:role_count=awaitRole.all().count()logger.info(f"ℹ️ 用户角色已存在,跳过初始化 - 当前角色数量:{role_count}")运行之后,数据库会添加对应数据:sys_role表
sys_role_api表
sys_role_menu表
