Vue+Element+Springboot实现权限控制及三级菜单的动态显示

前言

之前写过一个简单的图书管理项目,用前后端分离的模式来实现的,前端采用vue+element-ui,后端采用springboot。因为那篇文章只是作为效果展示,这里给大家介绍一下前后端分离如何实现权限控制,以及三级菜单的动态渲染。这篇文章包括数据库设计,后端处理,前端处理,这么的一个由低向上的一个过程。整个项目源代码在最后的项目地址链接里边。


效果展示

管理员用户

为了直观地让大家感受到效果,先把效果图放出来,如下所示。
在这里插入图片描述
在这里插入图片描述

普通用户

在这里插入图片描述

其实这样的一个骨架搭建出来,后面就是前端处理每个功能组件的开发,后端实现功能接口这样的一个过程了。

实现思路

这个简单系统是基于我之前做的简单图书管理系统来做的,图书管理系统采用前后端分离的模式来实现。因为前端的菜单数据是根据用户的角色动态返回的,所以这里实现的过程总体来说有三个步骤,如下所示。

  • 数据库的设计,设计用户表,用户角色表,角色菜单表,菜单表(这里的设计其实是一个解耦的思想,方便后续的维护和扩展)。
  • 用户登录时,把角色信息传给后台,后台根据用户角色获取对应菜单数据返回给前端。
  • 前端再动态解析为vue-router所需的路由格式,最后再动态渲染为三级菜单。

整体来说,就是这样的一个思路,下面我将介绍一下每个步骤的主要实现代码,完整代码可参照系统地址,有整个系统的前端后端以及数据库sql文件。

数据库处理
用户表的创建

创建用户表的语句如下所示,这里创建了两个用户,admin为管理员的角色(密码为123456),张三为普通用户的角色(密码为123)。

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `salt` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `phone` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `enabled` tinyint(1) NULL DEFAULT NULL,
  PRIMARY KEY (`id`, `username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'admin', '1013d5a6d92f8da3d0144e7067c091e9', '8O+vDNr2sI3N82BI31fu1A==', '系统管理员', '111222222', 'admin@163.com', 1);
INSERT INTO `user` VALUES (2, '张三', '97380f5d9a4a4ce2773b101f54245bf7', 'bRQSLsfC2p7fHkR2smU8gg==', '普通用户', '12345678910', 'zhangsan@163.com', 1);
用户角色表的创建

创建用户角色表的sql代码如下所示,这里只设置了两个角色,后面有需要的话,只需要再插入对应的数据就可以。

-- ----------------------------
-- Table structure for admin_user_role
-- ----------------------------
DROP TABLE IF EXISTS `admin_user_role`;
CREATE TABLE `admin_user_role`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `usertype` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `rid` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `fk_operator_role_operator_1`(`usertype`) USING BTREE,
  INDEX `fk_operator_role_role_1`(`rid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of admin_user_role
-- ----------------------------
INSERT INTO `admin_user_role` VALUES (1, '系统管理员', 1);
INSERT INTO `admin_user_role` VALUES (2, '普通用户', 2);
菜单表的创建
-- ----------------------------
-- Table structure for admin_menu
-- ----------------------------
DROP TABLE IF EXISTS `admin_menu`;
CREATE TABLE `admin_menu`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `path` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `nameZh` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `iconcls` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `component` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `parentid` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 31 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
  • 10
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
首先,你需要在后端(SpringBoot)写一个接口来从数据库中取出相应的值。假设你的值存储在一个名为"options"的表中,你可以定义一个RestController来实现这个接口: ```java @RestController @RequestMapping("/options") public class OptionController { @Autowired private OptionRepository optionRepository; @GetMapping("/all") public List<Option> getAllOptions(){ return optionRepository.findAll(); } } ``` 这里使用了Spring Data JPA来查询数据库。你需要创建一个名为"Option"的类来映射数据库中的表: ```java @Entity @Table(name = "options") public class Option { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; // getters and setters } ``` 现在你可以在前端(Vue+Element)中调用这个接口,并将结果渲染到页面上。你可以使用ElementUI中的多选框组件来实现多选功能。假设你已经安装了ElementUI,并且你的Vue组件中有一个名为"selectedOptions"的数组来存储选中的选项,你可以这样写: ```vue <template> <div> <el-checkbox-group v-model="selectedOptions"> <el-checkbox v-for="option in options" :label="option.id" :key="option.id">{{ option.name }}</el-checkbox> </el-checkbox-group> </div> </template> <script> import axios from 'axios' export default { name: 'MyComponent', data(){ return { options: [], selectedOptions: [] } }, mounted(){ axios.get('/options/all') .then(res => { this.options = res.data }) } } </script> ``` 这里使用了axios来调用后端接口,获取所有的选项。然后将选项渲染到多选框组件中,当用户勾选选项时,Vue会自动将选中的选项的id存储到"selectedOptions"数组中。你可以在表单提交时将"selectedOptions"数组传回后端,处理选中的选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值