云e办(后端)——权限角色和权限菜单功能的实现
一、权限概念:
对于我们云e办的后端数据库来说权限的意思就是你能看到的菜单有什么:
举例:
---- 用户到角色:
admin用户表:测试员在用户表中id=6
admin_role用户角色表:id=6对应用户角色表中是adminId=6。adminId=6所对应角色rid=8
role角色表:rid=8对应的角色表中是测试管理员的角色
—角色到菜单:
menu_role菜单角色表:rid=8所对应的mid=7/23/25/26
menu菜单表:7/23/25/26:基本资料、基础信息、权限组、操作员。
也就是说明:测试管理员角色能访问的菜单有:基本资料、基础、权限、操作员
二、角色功能实现
角色功能的相关操作:查询角色、添加角色、删除角色。
controller/PermissController
package com.xxxx.server.controller;
import com.xxxx.server.pojo.RespBean;
import com.xxxx.server.pojo.Role;
import com.xxxx.server.service.IRoleService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 权限组:
*/
@RestController
@RequestMapping("/system/basic/permiss")
public class PermissController {
@Autowired
private IRoleService iRoleService;
@ApiOperation(value = "获取所有角色")
@GetMapping("/")
public List<Role> getAllRole(){
return iRoleService.list();
}
@ApiOperation(value = "添加角色")
@PostMapping("/")
public RespBean addRole(@RequestBody Role role){
//由于security遵循必须有role_开头,判断插入的数据如果没有role_开头,则自动添加前缀
if (!role.getName().startsWith("ROLE_")){
role.setName("ROLE_"+role.getName());
}
if (iRoleService.save(role)){
return RespBean.success("添加成功");
}
return RespBean.error("添加失败");
}
@ApiOperation(value = "删除角色")
@DeleteMapping("/role/{rid}")
public RespBean deleteRole(@PathVariable Integer rid){
if (iRoleService.removeById(rid)){
return RespBean.success("删除成功");
}
return RespBean.error("删除失败");
}
}
三、菜单功能实现
菜单功能的相关操作:查询所有菜单、根据角色查询菜单、更新角色的菜单
因为菜单有子菜单,我们查询所有菜单等需要返回list集合类型,Mybatisplus返回集合比较麻烦,所以我们就自己动手写,不能像写职位和职称那样简单。
菜单表:有三级菜单。需要子关联三次
查询所有菜单
1.controller
//菜单:
@ApiOperation(value = "查询所有的菜单")
@GetMapping("/menus")
public List<Menu> getAllMenus(){
return iMenuService.getAllMenus();
}
2.service
/**
* 查询所有的菜单
* @return
*/
List<Menu> getAllMenus();
---------------
@Override
public List<Menu> getAllMenus() {
return menuMapper.getAllMenus();
}
3.mapper
/**
* 获取所有菜单列表
* @return
*/
List<Menu> getAllMenus();
-----
<resultMap id="MenusWithChildren" type="com.xxxx.server.pojo.Menu" extends="BaseResultMap">
<id column="id1" property="id"/>
<result column="name1" property="name"/>
<collection property="children" ofType="com.xxxx.server.pojo.Menu">
<id column="id2" property="id"/>
<result column="name2" property="name"/>
<collection property="children" ofType="com.xxxx.server.pojo.Menu">
<id column="id3" property="id"/>
<result column="name3" property="name"/>
</collection>
</collection>
</resultMap>
------------------------------
<!-- 获取所有菜单列表-->
<select id="getAllMenus" resultMap="MenusWithChildren">
SELECT
m1.id AS id1,
m1.`name` AS name1,
m2.id AS id2,
m2.`name` AS name2,
m3.id AS id3,
m3.`name` AS name3
FROM
t_menu m1,
t_menu m2,
t_menu m3
WHERE
m1.id = m2.parentId
AND m2.id = m3.parentId
AND m3.enabled = TRUE
</select>
根据角色id查询菜单id
@ApiOperation(value = "根据角色id查询菜单id")
@GetMapping("/mid/{rid}")
public List<Integer> getMidByRid(@PathVariable Integer rid){
List<MenuRole> rid1 = iMenuRoleService.list(new QueryWrapper<MenuRole>().eq("rid", rid));
List<Integer> collect = rid1.stream().map(MenuRole::getMid).collect(Collectors.toList());
return collect;
}
更新角色菜单
1.controller
@ApiOperation(value = "更新角色菜单")
@PutMapping("/")
//要传两个id,一个是角色id, 菜单id的数组
public RespBean updateMenuRole(Integer rid,Integer[] mids){
return iMenuRoleService.updateMenuRole(rid,mids);
}
}
2.service
我的思路是把所有的菜单都给删除掉,然后去添加我们想给它的菜单
/**
* 更新角色菜单
* @param rid
* @param mids
* @return
*/
RespBean updateMenuRole(Integer rid, Integer[] mids);
@Service
public class MenuRoleServiceImpl extends ServiceImpl<MenuRoleMapper, MenuRole> implements IMenuRoleService {
@Autowired
private MenuRoleMapper menuRoleMapper;
/**
* 更新角色菜单
* @param rid
* @param mids
* @return
*/
@Override
//事务的注解
@Transactional
public RespBean updateMenuRole(Integer rid, Integer[] mids) {
//删除菜单
menuRoleMapper.delete(new QueryWrapper<MenuRole>().eq("rid",rid));
//添加菜单:
if(null == mids || 0==mids.length){
return RespBean.success("更新成功");
}
Integer integer = menuRoleMapper.insertRecord(rid, mids);
if(integer == mids.length){
return RespBean.success("更新成功");
}
return RespBean.error("更新失败");
}
3.mapper
Integer insertRecord(@Param("rid") Integer rid, @Param("mids") Integer[] mids);
--------------------------
<!--
* 更新角色菜单
* @param rid
* @param mids
* @return
*/-->
<insert id="insertRecord">
insert into t_menu_role(mid,rid) value
<foreach collection="mids" item="mid" separator=",">
(#{mid},#{rid})
</foreach>
</insert>