当前位置: 首页 > 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.jsqmd.com/news/1128920/

相关文章:

  • FinalBurn Neo完整指南:打造完美街机游戏模拟体验的终极教程
  • AI 导出鸭实操教程:怎么把 Grok 生成的表格导出,零基础快速搞定表格转存
  • 2026 AI 开发者生存指南(8):AI 视频、音乐、图像生成工具链——从文本生成到商业化应用
  • [MAF工作流框架揭秘-10]基于Open-Telemetry的调用链跟踪
  • 三星固件下载终极指南:为什么Bifrost是你的最佳选择?
  • 零基础可视化看板搭建:从交互到下钻全流程
  • Java 全套基础体系博客终篇|全系列内容完整复盘 + 学习路线收尾总结
  • AI 应用的多模型路由策略:怎么用最少的钱调用最合适的模型?
  • CloudSSH 开源项目:借助 Cloudflare Workers 打造免费 Web SSH 终端,用浏览器丝滑远程服务器,连接信息云端同步,一键部署还不花一分钱
  • 面试口述版:个人对 Prometheus 完整理解
  • 智谱 GLM-5.2 凌晨上新,Code Arena 全球第一意味着什么?
  • AI 导出鸭实操教程:ChatGPT 数学公式如何正确粘贴,文档导出转换一步到位
  • C语言 用递归实现revserse_string详解(附有画图)
  • 阴极发光在 SEM 分析中的应用
  • AI 全栈开发实战(8):前端开发(二)——流式对话界面与 Markdown 渲染
  • vue3 错误记录
  • AI果蔬清洗分拣工段智能控制系统
  • CSUR:城市天际线道路系统的终极解决方案,告别单调道路设计
  • 2026年渗透测试实战工具链:从信息收集到权限维持的完整作战手册
  • AI 导出鸭实操指南:智谱清言生成 word 文档指令落地使用技巧
  • FastbootEnhance:Windows平台Android设备分区管理与Payload解析的专业解决方案
  • SMB服务安全实战:从漏洞赏金视角剖析攻击链与防御
  • web-第7次课后作业-2
  • Windows安全拦截实战:从日志与签名验证AI桌面应用安装
  • Python流程控制练习题001篇
  • 发送http请求的自定义函数库文件
  • 【关注可白嫖源码】--课程设计--毕业设计--springboot微博客户端[编号:project34944](案例分析)
  • 5个理由告诉你为什么Altium Designer元件库能让你告别设计焦虑
  • Claude 怎么把表格导出|AI 导出鸭一站式表格导出操作全教程
  • YD/T 6770—2026《人工智能 关键基础技术 具身智能基准测试方法》