当前位置: 首页 > news >正文

企业级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

http://www.gsyq.cn/news/1640902.html

相关文章:

  • [MAF工作流框架揭秘-10]基于Open-Telemetry的调用链跟踪
  • 零基础可视化看板搭建:从交互到下钻全流程
  • 智谱 GLM-5.2 凌晨上新,Code Arena 全球第一意味着什么?
  • AI 导出鸭实操指南:智谱清言生成 word 文档指令落地使用技巧
  • CSUR:城市天际线道路系统的终极解决方案,告别单调道路设计
  • 阴极发光在 SEM 分析中的应用
  • AI果蔬清洗分拣工段智能控制系统
  • Claude 怎么把表格导出|AI 导出鸭一站式表格导出操作全教程
  • 发送http请求的自定义函数库文件
  • 【关注可白嫖源码】--课程设计--毕业设计--springboot微博客户端[编号:project34944](案例分析)
  • FlexASIO终极指南:让普通音频设备拥有专业级ASIO性能
  • 如何快速配置开源Android电视播放器:VLC电视版完整操作指南
  • 【关注可白嫖源码】--课程设计+毕业设计+springbootDream car车辆租赁系统[编号:project37878](案例分析)
  • 5个理由告诉你为什么VIA是机械键盘配置的终极选择
  • 终极Wand-Enhancer完全指南:5分钟解锁游戏修改器完整高级功能
  • ZLMediaKit 9.0版本下载编译
  • AWS、微软、谷歌和 Anthropic 悄悄做了同一件事:Session 正在取代请求,成为 Agent 的新计算单元
  • 不同进程的线程切换**不一定引起进程切换**,但**必然涉及进程上下文切换(即进程切换)**——这里需要明确概念辨析
  • 2026年7月亲测,汽修引流这样干超有效!
  • 从0到1用C#开发ABB机器人上位机:PC SDK通信+运动控制+状态监控
  • TVA在具身智能商业化部署中的技术突破(10)
  • 论文学习:2.Semi-Supervised Classification with Graph Convolutional Networks(1)
  • Python练习题2
  • merge、concat、join:三张表合并搞崩你的不是语法是逻辑
  • TPA3128D2音频放大器与PIC18F4458微控制器的集成应用
  • Cangaroo:免费开源CAN总线分析软件的完整指南
  • TVA对具身智能领域的核心技术支撑(19)
  • 跨平台macOS组件下载神器:gibMacOS完全指南
  • 基于计算机视觉的课堂行为分析:从姿态估计到专注度评估实战
  • Py-GCMS 与 FTIR 的性能比较