根据用户权限和角色拼接菜单

本文介绍如何根据后台用户的角色(管理员、超级管理员)和权限,实现动态生成用户可操作的菜单。超级管理员不受权限限制,而管理员则需要通过权限控制来决定其能访问的菜单项。
摘要由CSDN通过智能技术生成

后台分管理员与超级管理员,超级管理员不走权限控制,管理员走权限控制,去获取管理员能操作的菜单,管理员通过权限控制控制用户的菜单。

function Getmenuinfo(id){

var url = $WEB_ROOT_PATH+"/mainPage/mainPageCtrl!menuinfomation.htm?dto.accountId="+id;
$.getJSON(url, function(d){
var mainul=$("#main-menu");
pages =  new Array();
for (var k in d){
if (d[k].funcName=="云诊所系统"){
firstURL = d[k].children[0].securityUrl;
firstTitle = d[k].children[0].funcName;
//changeUrl(firstURL,firstTitle);
for(var j in d[k].children){
var src=d[k].children[j].securityUrl;
src= src == null || src == "" ? "" : $WEB_ROOT_PATH+"/"+src;
var name=d[k].children[j].funcName;
if(firstURL == null || firstURL == ""){
firstURL = d[k].children[j].securityUrl;
firstTitle = name;
}
var li = '<li id="menu-item-8" class="slef" style="margin:0;margin-top:5px;">';
var a ;
if(name=="诊疗管理"){
treatmentURL = src;
}
if(d[k].children[j].children.le
1. 创建数据库和数据表(以Mysql数据库为例) 创建数据库: ``` CREATE DATABASE IF NOT EXISTS `permission_management` DEFAULT CHARSET utf8 COLLATE utf8_general_ci; ``` 创建用户表: ``` CREATE TABLE IF NOT EXISTS `user_info` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID', `user_name` varchar(255) NOT NULL COMMENT '用户名称', `user_pwd` varchar(255) NOT NULL COMMENT '用户密码', `user_sex` varchar(255) NOT NULL COMMENT '用户性别', `user_school` varchar(255) NOT NULL COMMENT '用户学校', `user_address` varchar(255) NOT NULL COMMENT '用户地址', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表'; ``` 创建角色表: ``` CREATE TABLE IF NOT EXISTS `role_info` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色ID', `role_name` varchar(255) NOT NULL COMMENT '角色名称', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色表'; ``` 创建菜单表: ``` CREATE TABLE IF NOT EXISTS `menu_info` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜单ID', `menu_name` varchar(255) NOT NULL COMMENT '菜单名称', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='菜单表'; ``` 创建用户角色表: ``` CREATE TABLE IF NOT EXISTS `user_role` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户角色ID', `user_id` int(11) NOT NULL COMMENT '用户ID', `role_id` int(11) NOT NULL COMMENT '角色ID', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户角色表'; ``` 创建角色菜单表: ``` CREATE TABLE IF NOT EXISTS `role_menu` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色菜单ID', `role_id` int(11) NOT NULL COMMENT '角色ID', `menu_id` int(11) NOT NULL COMMENT '菜单ID', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色菜单表'; ``` 2. 使用Mybaits构建用户角色菜单的映射关系 创建用户表对应的实体类: ``` public class UserInfo { private Integer id; private String userName; private String userPwd; private String userSex; private String userSchool; private String userAddress; // getter and setter } ``` 创建角色表对应的实体类: ``` public class RoleInfo { private Integer id; private String roleName; // getter and setter } ``` 创建菜单表对应的实体类: ``` public class MenuInfo { private Integer id; private String menuName; // getter and setter } ``` 创建用户角色表对应的实体类: ``` public class UserRole { private Integer id; private Integer userId; private Integer roleId; // getter and setter } ``` 创建角色菜单表对应的实体类: ``` public class RoleMenu { private Integer id; private Integer roleId; private Integer menuId; // getter and setter } ``` 创建用户角色菜单的Mapper类: ``` public interface UserInfoMapper { UserInfo getUserInfoById(Integer id); List<UserInfo> getUserInfoListByRoleId(Integer roleId); List<UserInfo> getUserInfoListByUserNameAndUserAddressAndUserSex(@Param("userName") String userName, @Param("userAddress") String userAddress, @Param("userSex") String userSex); } public interface RoleInfoMapper { RoleInfo getRoleInfoById(Integer id); List<RoleInfo> getRoleInfoListByUserId(Integer userId); } public interface MenuInfoMapper { MenuInfo getMenuInfoById(Integer id); List<MenuInfo> getMenuInfoListByRoleId(Integer roleId); } public interface UserRoleMapper { UserRole getUserRoleById(Integer id); List<UserRole> getUserRoleListByUserId(Integer userId); List<UserRole> getUserRoleListByRoleId(Integer roleId); } public interface RoleMenuMapper { RoleMenu getRoleMenuById(Integer id); List<RoleMenu> getRoleMenuListByRoleId(Integer roleId); List<RoleMenu> getRoleMenuListByMenuId(Integer menuId); } ``` 在Mybatis的配置文件中,分别加入上述Mapper类的配置。 3. 用户角色之间的关系查询 查询某个用户所具有的角色: ``` SELECT r.* FROM role_info r LEFT JOIN user_role ur ON r.id = ur.role_id WHERE ur.user_id = #{userId} ``` 查询某个角色所对应的用户列表: ``` SELECT u.* FROM user_info u LEFT JOIN user_role ur ON u.id = ur.user_id WHERE ur.role_id = #{roleId} ``` 4. 角色菜单之间的关系查询 查询某个角色所具有的菜单: ``` SELECT m.* FROM menu_info m LEFT JOIN role_menu rm ON m.id = rm.menu_id WHERE rm.role_id = #{roleId} ``` 查询某个菜单所对应的角色列表: ``` SELECT r.* FROM role_info r LEFT JOIN role_menu rm ON r.id = rm.role_id WHERE rm.menu_id = #{menuId} ``` 5. 编写单元测试用例 创建测试类: ``` @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = Application.class) public class PermissionManagementTest { @Autowired private UserInfoMapper userInfoMapper; @Autowired private RoleInfoMapper roleInfoMapper; @Autowired private MenuInfoMapper menuInfoMapper; @Autowired private UserRoleMapper userRoleMapper; @Autowired private RoleMenuMapper roleMenuMapper; @Test public void testGetUserInfoById() { UserInfo userInfo = userInfoMapper.getUserInfoById(1); System.out.println(userInfo.getUserName()); } @Test public void testGetRoleInfoById() { RoleInfo roleInfo = roleInfoMapper.getRoleInfoById(1); System.out.println(roleInfo.getRoleName()); } @Test public void testGetMenuInfoById() { MenuInfo menuInfo = menuInfoMapper.getMenuInfoById(1); System.out.println(menuInfo.getMenuName()); } @Test public void testGetUserInfoListByRoleId() { List<UserInfo> userInfoList = userInfoMapper.getUserInfoListByRoleId(1); for (UserInfo userInfo : userInfoList) { System.out.println(userInfo.getUserName()); } } @Test public void testGetRoleInfoListByUserId() { List<RoleInfo> roleInfoList = roleInfoMapper.getRoleInfoListByUserId(1); for (RoleInfo roleInfo : roleInfoList) { System.out.println(roleInfo.getRoleName()); } } @Test public void testGetMenuInfoListByRoleId() { List<MenuInfo> menuInfoList = menuInfoMapper.getMenuInfoListByRoleId(1); for (MenuInfo menuInfo : menuInfoList) { System.out.println(menuInfo.getMenuName()); } } @Test public void testGetUserRoleListByUserId() { List<UserRole> userRoleList = userRoleMapper.getUserRoleListByUserId(1); for (UserRole userRole : userRoleList) { System.out.println(userRole.getRoleId()); } } @Test public void testGetUserRoleListByRoleId() { List<UserRole> userRoleList = userRoleMapper.getUserRoleListByRoleId(1); for (UserRole userRole : userRoleList) { System.out.println(userRole.getUserId()); } } @Test public void testGetRoleMenuListByRoleId() { List<RoleMenu> roleMenuList = roleMenuMapper.getRoleMenuListByRoleId(1); for (RoleMenu roleMenu : roleMenuList) { System.out.println(roleMenu.getMenuId()); } } @Test public void testGetRoleMenuListByMenuId() { List<RoleMenu> roleMenuList = roleMenuMapper.getRoleMenuListByMenuId(1); for (RoleMenu roleMenu : roleMenuList) { System.out.println(roleMenu.getRoleId()); } } } ``` 6. 使用动态sql拼接的方式实现在一个接口内进行用户名、用户地址、用户性别的筛选 在UserInfoMapper接口中添加如下方法: ``` List<UserInfo> getUserInfoListByCondition(@Param("userName") String userName, @Param("userAddress") String userAddress, @Param("userSex") String userSex); ``` 在UserInfoMapper.xml中添加如下SQL: ``` <select id="getUserInfoListByCondition" parameterType="java.util.Map" resultType="com.example.demo.model.UserInfo"> SELECT * FROM user_info WHERE 1=1 <if test="userName != null and userName != ''"> AND user_name = #{userName} </if> <if test="userAddress != null and userAddress != ''"> AND user_address = #{userAddress} </if> <if test="userSex != null and userSex != ''"> AND user_sex = #{userSex} </if> </select> ``` 在UserService中调用该方法: ``` public List<UserInfo> getUserInfoListByCondition(String userName, String userAddress, String userSex) { return userInfoMapper.getUserInfoListByCondition(userName, userAddress, userSex); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值