云e办(后端)——权限角色和权限菜单功能的实现

云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>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真真最可爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值