使用v-for用户菜单渲染

前端页面的菜单渲染,是项目开发中的很重要一部分,设计思路需要我们好好斟酌一下。

因为我们要根据登录用户的角色,去渲染对应的菜单。如下:

目录

一、数据库设计

1.1 创建menu表

练习1:从menu表中,根据父菜单id(parent_id为0的那种)查询出子菜单

1.2 创建role表 

1.3 创建rolemenu表

练习2:从rolemenu表,根据role_id(角色id)查询出menu_id(父菜单id)

1.4 在user表中,填入role_id字段,来声明该用户是什么角色

练习3:查询所有用户的角色名称

二、后端查取全部用户信息(携带菜单数据)

2.1 创建实体类Menu

2.2 创建RoleMenuMapper

2.3 创建MenuMapper

2.4 修改实体类User

2.5 在UserServiceImpl中,编写查询登录用户菜单的业务逻辑

2.6 使用apifox,发送请求,查看返回的登录用户信息

三、前端使用v-for渲染菜单

3.1 使用pinia,存储登录用户的个人信息

3.2 登录页面后,查询pinia中的登录用户信息

3.3 使用pinia存储的登录用户信息中的菜单信息,渲染菜单

四、查看效果

4.1 登录角色:挂号收费员

4.2 登录角色:门诊医生

4.3 登录角色:医技医生

4.4 登录角色:药房操作员

4.5 登录角色:财务管理员

结语


一、数据库设计

1.1 创建menu表

①menu_name:菜单名称,如:"门诊挂号收费"、”现场挂号“

②menu_icon:菜单的图标名称(来自element-plus)

③菜单对应的路由路径(vue路由),如:/registration/onsite_registration
    注意:只有子菜单才有路由。而父菜单没路由信息,不跳转。

④parent_id:菜单的父菜单id,这是构成层次的关键。(两级菜单:父菜单、子菜单)。如果某个菜单是父菜单(即:该菜单没有父菜单),那么此时parent_id设为0。

根据前端页面,给menu表填充数据:

练习1:从menu表中,根据父菜单id(parent_id为0的那种)查询出子菜单

查询父菜单【门诊挂号收费】的所有子菜单:

查询父菜单【门诊医生工作站】的所有子菜单: 

查询父菜单【门诊医技工作站】的所有子菜单:

查询父菜单【门诊药房工作站】的所有子菜单:

查询父菜单【门诊财务管理】的所有子菜单:

1.2 创建role表 

1.3 创建rolemenu表

练习2:从rolemenu表,根据role_id(角色id)查询出menu_id(父菜单id)

1.4 在user表中,填入role_id字段,来声明该用户是什么角色

练习3:查询所有用户的角色名称

SELECT 
    u.*,
    r.rolename
FROM 
    user u
JOIN 
    role r ON u.role_id = r.id

二、后端查取全部用户信息(携带菜单数据)

2.1 创建实体类Menu

2.2 创建RoleMenuMapper

2.3 创建MenuMapper

2.4 修改实体类User

2.5 在UserServiceImpl中,编写查询登录用户菜单的业务逻辑

@Service //表明这是一个service层
public class UserServiceImpl implements UserService {//注入UserMapper的实例@Autowiredprivate UserMapper userMapper;@Autowiredprivate RolemenuMapper rolemenuMapper;@Autowiredprivate MenuMapper menuMapper;@Overridepublic User login(User user) {//1.查询出当前登录用户loginUserUser loginUser = userMapper.login(user);if(loginUser!=null){//2.给该用户添加菜单//2.1现在已知role_id,根据role_id从rolemenu表查询父菜单idInteger fatherMenuId = rolemenuMapper.queryMenuId(loginUser.getRoleId());//2.2根据fatherMenuId(父菜单id),从menu表查询出父菜单fatherMenuMenu fatherMenu = menuMapper.queryMenuById(fatherMenuId);//2.3根据fatherMenuId(父菜单id),从menu表查询出所有子菜单List<Menu> sonMenus = menuMapper.queryAllMenusByFatherId(fatherMenu.getId());//2.4将子菜单集合sonMenus,添加到父菜单fatherMenu中fatherMenu.setChildren(sonMenus);//2.5将父菜单fatherMenu,添加到登录用户user中loginUser.setFatherMenu(fatherMenu);}return loginUser;}
}

2.6 使用apifox,发送请求,查看返回的登录用户信息

发送请求:

响应数据: 

{

    "code": 200,

    "message": "登录成功",

    "data": {

        "id": 6,

        "username": "money",

        "password": "123",

        "avatar": null,

        "nickname": "钱雷",

        "roleId": 5,

        "rolename": "财务管理员",

        "fatherMenu": {

            "id": 25,

            "menuName": "门诊财务管理",

            "menuIcon": null,

            "menuPath": null,

            "parentId": 0,

            "children": [

                {

                    "id": 26,

                    "menuName": "费用科目管理",

                    "menuIcon": null,

                    "menuPath": null,

                    "parentId": 25,

                    "children": null

                },

                {

                    "id": 27,

                    "menuName": "门诊科室工作量统计",

                    "menuIcon": null,

                    "menuPath": null,

                    "parentId": 25,

                    "children": null

                }

            ]

        }

    }

}

可见此时登录的用户是“钱雷”,角色是“财务管理员”,拥有的菜单如下:

三、前端使用v-for渲染菜单

接下来,我们需要将后端返回的菜单数据,渲染到前端页面上。

3.1 使用pinia,存储登录用户的个人信息

3.2 登录页面后,查询pinia中的登录用户信息

登录页面时,会向后端发送登录请求,并将返回的登录用户信息存入pinia中:

3.3 使用pinia存储的登录用户信息中的菜单信息,渲染菜单

获取pinia的登录用户信息

 使用登录用户的菜单信息,渲染element-plus菜单组件

  <!-- 左侧菜单 --><el-menudefault-active="2"class="el-menu-vertical-demo"background-color="#143f6b"text-color="#fff"active-text-color="#ffd04b"@open="handleOpen"@close="handleClose"><!-- 【首页】 --><el-menu-item index="1"><el-icon><HomeFilled /></el-icon><span>首页</span></el-menu-item><!-- 【父菜单】 --><el-sub-menu index="2"><!--菜单标题--><template #title><!-- 小图标 --><!-- <el-icon><location /></el-icon> --><span>{{user.fatherMenu.menuName}}</span></template><!-- 子菜单 --><!-- <el-menu-item index="2-1">现场挂号</el-menu-item><el-menu-item index="2-2">收费</el-menu-item><el-menu-item index="2-3">退号</el-menu-item><el-menu-item index="2-4">患者费用查询</el-menu-item><el-menu-item index="2-5">收费员日结</el-menu-item> --><!-- 使用v-for来渲染子菜单 --><el-menu-itemv-for="childrenMenu in user.fatherMenu.children" :key="childrenMenu.menuName" :index="childrenMenu.menuName">{{childrenMenu.menuName}}</el-menu-item></el-sub-menu></el-menu>

四、查看效果

4.1 登录角色:挂号收费员

4.2 登录角色:门诊医生

4.3 登录角色:医技医生

4.4 登录角色:药房操作员

4.5 登录角色:财务管理员

结语

以上就是使用v-for渲染前端菜单的全部流程。

如果有不懂的点,可以私信博主,博主看到就会耐心解答~

喜欢本篇文章的话,可以留个免费的关注~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/25972.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实战-使用 Playbook 批量部署多台 LAMP 环境

实战-使用 Playbook 批量部署多台 LAMP 环境 playbooks 使用步骤 playbook 是一个不同于使用 ansible 命令行执行方式的模式&#xff0c;功能更强大更灵活。 1、在 playbooks 中定义任务&#xff1a; - name&#xff1a; task description #任务描述信息 module_name: modul…

当JMeter遇见AI:性能测试进入智能时代(附实战案例)

性能测试作为软件开发中的关键环节&#xff0c;确保系统在高负载下仍能高效运行。JMeter 是一种广泛使用的开源工具&#xff0c;用于负载测试和性能测量&#xff0c;但传统方法往往效率低下。AI 的引入&#xff0c;为性能测试带来了智能化升级。本文将探讨 JMeter 与 AI 的结合…

筑牢安全防线:工商业场所燃气泄漏防护新方案

燃气安全是企业经营不可逾越的生命线。在餐饮后厨、化工车间、酒店锅炉房等场所&#xff0c;可燃气体一旦泄漏&#xff0c;极易引发严重事故。如何实现精准监测、快速响应&#xff0c;成为工业及商业领域安全管理的核心诉求。旭华智能深耕安全监测领域&#xff0c;推出的工业及…

docker本地镜像源搭建

最近Deepseek大火后&#xff0c;接到任务就是帮客户装Dify&#xff0c;每次都头大&#xff0c;因为docker源不能用&#xff0c;实在没办法&#xff0c;只好自己搭要给本地源。话不多说具体如下&#xff1a; 1、更改docker的配置文件&#xff0c;添加自己的私库地址&#xff0c…

数据结构(初阶)(四)----双向链表

双向链表初始化尾插打印尾删头插头删查找在pos位置之后插入数据在pos位置之前插入数据删除pos结点销毁链表 双向链表 链表分类:8种&#xff08;2*2*2&#xff09; 带头&#xff0c;不带头 单向&#xff0c;双向 循环&#xff0c;不循环 最常用的是两种&#xff1a; 单链表…

python-leetcode-寻找重复数

287. 寻找重复数 - 力扣&#xff08;LeetCode&#xff09; class Solution:def findDuplicate(self, nums: List[int]) -> int:# Step 1: 找到环的相遇点slow nums[0]fast nums[0]# 使用快慢指针&#xff0c;直到相遇while True:slow nums[slow] # 慢指针走一步fast nu…

赋能农业数字化转型 雏森科技助力“聚农拼”平台建设

赋能农业数字化转型&#xff0c;雏森助力“聚农拼”平台建设 在数字化浪潮席卷各行业的今天&#xff0c;农业领域也在积极探索转型升级之路。中农集团一直以“根植大地&#xff0c;服务三农”为核心&#xff0c;以“乡村振兴&#xff0c;农民增收”为目标&#xff0c;及时响应…

自然语言处理:词频-逆文档频率

介绍 大家好&#xff0c;博主又来给大家分享知识了。本来博主计划完成稠密向量表示的内容分享后&#xff0c;就开启自然语言处理中文本表示的讲解。可在整理分享资料的时候&#xff0c;博主发现还有个知识点&#xff0c;必须得单独拎出来好好说道说道。 这就是TF-IDF&#xf…

如何修改安全帽/反光衣检测AI边缘计算智能分析网关V4的IP地址?

TSINGSEE青犀推出的智能分析网关V4&#xff0c;是一款集成了BM1684芯片的高性能AI边缘计算智能硬件。其内置的高性能8核ARM A53处理器&#xff0c;主频可高达2.3GHz&#xff0c;INT8峰值算力更是达到了惊人的17.6Tops。此外&#xff0c;该硬件还预装了近40种AI算法模型&#xf…

原生家庭独立的艺术:找到自我与家庭的平衡点

原生家庭独立的艺术&#xff1a;找到自我与家庭的平衡点 &#x1f331; 引言 &#x1f308; 小林刚刚和父母结束了一次激烈的电话对峙。父母坚持认为他应该回到家乡工作&#xff0c;“这样我们也能照顾你”&#xff0c;而他则努力解释自己在大城市的职业规划。挂掉电话后&…

flink系列之:使用flink cdc3从mysql数据库同步数据到doris和starrocks

flink系列之&#xff1a;使用flink cdc3从mysql数据库同步数据到doris和starrocks 一、下载部署flink二、下载部署flink cdc3三、下载mysql-connector-java到flink和flink cdc的lib目录四、flink设置checkpoint支持增量同步数据五、mysql到doris和starrocks的yaml配置文件六、启…

xr-frame 3D Marker识别,扬州古牌坊 3D识别技术稳定调研

目录 识别物体规范 3D Marker 识别目标文件 map 生成 生成任务状态解析 服务耗时&#xff1a; 对传入的视频有如下要求&#xff1a; 对传入的视频建议&#xff1a; 识别物体规范 为提高Marker质量&#xff0c;保证算法识别效果&#xff0c;可参考Marker规范文档 Marker规…

【pytest框架源码分析一】pluggy源码分析之hook常用方法

简单看一下pytest的源码&#xff0c;其实很多地方是依赖pluggy来实现的。这里我们先看一下pluggy的源码。 pluggy的目录结构如下&#xff1a; 这里主要介绍下_callers.py, _hooks.py, _manager.py&#xff0c;其中_callers.py主要是提供具体调用的功能&#xff0c;_hooks.py提…

一周学会Flask3 Python Web开发-Jinja2模板过滤器使用

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在Jinja2中&#xff0c;过滤器(filter)是一些可以用来修改和过滤变量值的特殊函数&#xff0c;过滤器和变量用一个竖线 | &a…

【官方配图】win10/win11 安装cuda 和 cudnn

文章目录 参考资料1.安装cuda toolkit1. 下载安装包2.安装验证 2. 安装cudnn下载cudnn安装包安装cudnn安装后的配置 参考资料 官方nvidia安装cuda官方nvidia安装cudnn 1.安装cuda toolkit 1. 下载安装包 下载地址 https://developer.nvidia.com/cuda-downloads?target_osW…

Linux Mem -- 关于AArch64 MTE功能的疑问

目录 1.虚拟地址和物理地址映射完成后&#xff0c;才可以设置虚拟地址对应的memory tag &#xff1f; 2.各种memory allocator中的address tag从哪来&#xff0c;怎么产生&#xff1f; 2.1 vmalloc allocator 2.2 slub分配器 2.3 用户可以指定IRG指令产生的address tag 3.kasan…

FS800DTU联动OneNET平台数据可视化View

目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件环境 2.3 硬件连接 3 注册OneNET云平台并建立物模型 3.1 参数获取 3.2 连接OneNET 3.3上报数据 4 数据可视化View 4.1 用户信息获取 4.2 启用数据可视化View 4.3 创建项目 4.4 编辑项目 4.5 新增数据源 4.6 数据过滤器配置 4.6 项…

vscode脚本 shell 调试

插件&#xff0c;按照图片

纯代码实战--用Deepseek+SQLite+Ollama搭建数据库助手

如何用Python调用本地模型实现DeepSeek提示词模板&#xff1a;一步步教你高效解决13种应用场景 从零到一&#xff1a;纯代码联合PyQt5、Ollama、Deepseek打造简易版智能聊天助手 用外接知识库武装大模型&#xff1a;基于Deepseek、Ollama、LangChain的RAG实战解析 纯代码实战–…

Qt监控系统远程回放/录像文件远程下载/录像文件打上水印/批量多线程极速下载

一、前言说明 在做这个功能的时候&#xff0c;着实费了点心思&#xff0c;好在之前做ffmpeg加密解密的时候&#xff0c;已经打通了极速加密保存文件&#xff0c;主要就是之前的类中新增了进度提示信号&#xff0c;比如当前已经处理到哪个position位置&#xff0c;发个信号出来…