SpringCloud+Vue+Python人工智能(fastAPI,机器学习,深度学习)前后端架构各功能实现思路——SpringCloud后端——权限管理rbac接口实现

SpringCloud+Vue+Python人工智能(fastAPI,机器学习,深度学习)前后端架构各功能实现思路——主目录(持续更新):https://blog.csdn.net/grd_java/article/details/144986730
SpringCloud+Vue+Python人工智能(fastAPI,机器学习,深度学习)前后端架构各功能实现思路——SpringCloud后端——Sa-Token实现Security权限管理https://blog.csdn.net/grd_java/article/details/145013189

1. user相关接口

在这里插入图片描述

1.0 实体类

user实体类比较特殊,除了自动填充主键外,还有数据库表中不存在的字段,保存用户角色信息
在这里插入图片描述

package com.yd_oa_java_cloud.security.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.List;

import lombok.Getter;
import lombok.Setter;

/**
 * _*_ coding : utf-8 _*_
 * @Time : 2025/1/14 星期二 10:30
 * @Author : Taylor Sinclair(殷志鹏)
 * @File : ${NAME}
 * @Project : ${PROJECT_NAME}
 * @Description :
 */
@Getter
@Setter
@TableName("sys_user")
public class SysUser implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 用户id
     */
    @TableId(value = "id",type = IdType.ASSIGN_ID)
    private String id;

    /**
     * 用户名
     */
    @TableField("username")
    private String username;

    /**
     * 密码
     */
    @TableField("password")
    private String password;
    /**
     * 非数据库表中字段,封装角色信息
     */
    @TableField(exist = false)
    private List<SysRole> roles;
}

1.1 mapper

在这里插入图片描述

package com.yd_oa_java_cloud.security.mapper;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd_oa_java_cloud.security.entity.SysUser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import java.util.List;

/**
 * _*_ coding : utf-8 _*_
 * @Time : 2025/1/14 星期二 10:30
 * @Author : Taylor Sinclair(殷志鹏)
 * @File : ${NAME}
 * @Project : ${PROJECT_NAME}
 * @Description :
 */
public interface SysUserMapper extends BaseMapper<SysUser> {
    /**分页查询所有用户**/
    List<SysUser> getAllUserPage(Page<SysUser> sysUserPage);

    List<SysUser> getByUsername(String username);
    //精确匹配
    SysUser getByUsernameOne(String username);

    void insertRecord(String uid, String[] rids);
}

mapper.xml


在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd_oa_java_cloud.security.mapper.SysUserMapper">
    <!--分页查询所有用户-->
    <select id="getAllUserPage" resultType="com.yd_oa_java_cloud.security.entity.SysUser">
        select id,username,password from sys_user
    </select>
    <!--分页条件查询用户-->
    <select id="getAllUserPageByCondition" resultType="com.yd_oa_java_cloud.security.entity.SysUser" parameterType="com.yd_oa_java_cloud.security.entity.SysUser">
        select
            u.id as id,
            u.username as username,
            u.`password` as `password`,
            r.id as rid,
            r.`name` as rname,
            r.name_zh as rnameZh
        from
            sys_user as u
        left join
            sys_user_role as ur
        on
            u.id = ur.uid
        left join
            sys_role as r
        on
            ur.rid = r.id
        <where>
            <trim>
                <if test="sysUser.id != null  and sysUser.id != '' and sysUser.id!=0">and u.id = #{sysUser.id}</if>
                <if test="sysUser.username != null  and sysUser.username != ''">and u.username like concat('%', #{sysUser.username}, '%')</if>
                <if test="sysUser.roles != null">and r.name_zh like concat('%', #{sysUser.roles[0].nameZh}, '%')</if>
            </trim>
        </where>
    </select>
    <select id="getByUsername" resultType="com.yd_oa_java_cloud.security.entity.SysUser">
        select
            u1.id as id,
            u1.username as username,
            u1.password as password
        from
            sys_user as u1
        <where>
            <trim>
                <if test="username != null and username != ''">and u1.username like concat('%',#{username},'%')</if>
            </trim>
        </where>
    </select>
    <select id="getByUsernameOne" resultType="com.yd_oa_java_cloud.security.entity.SysUser">
        select
        u1.id as id,
        u1.username as username,
        u1.password as password
        from
        sys_user as u1
        <where>
            <trim>
                <if test="username != null and username != ''">and u1.username = #{username}</if>
            </trim>
        </where>
    </select>
</mapper>

1.2 service

service


在这里插入图片描述

package com.yd_oa_java_cloud.security.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd_oa_java_cloud.base.entity.vo.YdOaResult;
import com.yd_oa_java_cloud.security.entity.SysUser;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author Taylor Sinclair(殷志鹏)
 * @since 2025-01-10
 */
public interface ISysUserService extends IService<SysUser> {

    List<SysUser> getAllUserPage(Page<SysUser> sysUserPage);

    List<SysUser> getByUsername(String username);//模糊匹配
    SysUser getByUsernameOne(String username);//精确匹配

    boolean deleteById(String id);

    YdOaResult updateUserRole(String uid, String[] rids);
}

impl


在这里插入图片描述

package com.yd_oa_java_cloud.security.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd_oa_java_cloud.base.entity.vo.YdOaResult;
import com.yd_oa_java_cloud.security.entity.SysUser;
import com.yd_oa_java_cloud.security.entity.SysUserRole;
import com.yd_oa_java_cloud.security.mapper.SysUserMapper;
import com.yd_oa_java_cloud.security.mapper.SysUserRoleMapper;
import com.yd_oa_java_cloud.security.service.ISysUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author Taylor Sinclair(殷志鹏)
 * @since 2025-01-10
 */
@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService {

    @Autowired
    private SysUserMapper sysUserMapper;
    @Autowired
    private SysUserRoleMapper sysUserRoleMapper;
    @Override
    public List<SysUser> getAllUserPage(Page<SysUser> sysUserPage) {
        return sysUserMapper.getAllUserPage(sysUserPage);
    }

    @Override
    public List<SysUser> getByUsername(String username) {
        return sysUserMapper.getByUsername(username);
    }
    //精确匹配
    @Override
    public SysUser getByUsernameOne(String username) {
        return sysUserMapper.getByUsernameOne(username);
    }

    @Override
    @Transactional
    public boolean deleteById(String id) {
        return sysUserRoleMapper.deleteUserAndRoleById(id)>=1;
    }

    /**
     * 更新用户拥有的角色
     * @param uid 用户id
     * @param rids 用户要修改的角色id
     */
    @Override
    @Transactional//自己写更新的操作,一定要加事务
    public YdOaResult updateUserRole(String uid, String[] rids) {
        //要更新的菜单id为空,则直接返回
        if(null == rids||rids.length == 0){
            return YdOaResult.ok("更新用户角色成功");
        }
        //先全删了,否则得一次次判断,太费资源
        sysUserRoleMapper.delete(new QueryWrapper<SysUserRole>().eq("uid", uid));
        //如果传了菜单id过来,则更新
        sysUserMapper.insertRecord(uid,rids);
        return YdOaResult.ok("更新菜单成功");
    }
}

1.3 controller


在这里插入图片描述

package com.yd_oa_java_cloud.security.controller;

import cn.dev33.satoken.secure.BCrypt;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd_oa_java_cloud.base.entity.enums.ResponseCodeEnum;
import com.yd_oa_java_cloud.base.entity.vo.YdOaResult;
import com.yd_oa_java_cloud.security.entity.SysUser;
import com.yd_oa_java_cloud.security.entity.SysUserRole;
import com.yd_oa_java_cloud.security.service.ISysUserRoleService;
import com.yd_oa_java_cloud.security.service.ISysUserService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Objects;

/**
 * _*_ coding : utf-8 _*_
 * @Time : 2025/1/14 星期二 10:30
 * @Author : Taylor Sinclair(殷志鹏)
 * @File : ${NAME}
 * @Project : ${PROJECT_NAME}
 * @Description :
 */
@RestController
@RequestMapping("/sysUser")
@Log4j2
public class SysUserController {

    @Autowired
    private ISysUserService iSysUserService;

    /**分页获取用户**/
    @GetMapping("/page/{current}/{size}")
    public YdOaResult getAllUserPage(@PathVariable Integer current,@PathVariable Integer size){
        Page<SysUser> sysUserPage = new Page<>(current, size);//构建分页对象

        try {
            List<SysUser> sysUserList = iSysUserService.getAllUserPage(sysUserPage);//传入分页对象,分页查询
            return YdOaResult.ok()
                    .set("current",sysUserPage.getCurrent())//当前所在页
                    .set("pages",sysUserPage.getPages())//共可以分几页
                    .set("Size",sysUserPage.getSize())//每页记录数
                    .set("Total",sysUserPage.getTotal())//数据库表共有多少条数据
                    .set("hasNext",sysUserPage.hasNext())//是否有下一页
                    .set("hasPrevious",sysUserPage.hasPrevious())//是否有前一页
                    .setData(sysUserList)//放入查询结果
                    ;
        } catch (Exception e) {
            log.error("分页获取用户出错!!————",e);
            return YdOaResult.error().setMsg("查询出错!");
        }
    }
    /**根据用户名获取用户,模糊匹配**/
    @GetMapping("/getByUsername")
    public YdOaResult getByUsername(@RequestBody SysUser sysUser){
        if (!isUserHaveUsername(sysUser)){
            return YdOaResult.error().setMsg("请输入用户名");
        }
        try {
            List<SysUser> sysUserList = iSysUserService.getByUsername(sysUser.getUsername());
            if (sysUserList.isEmpty()) return YdOaResult.ok().setMsg("无相关结果").setData(null);//放入查询结果;
            return YdOaResult.ok().setData(sysUserList);//放入查询结果
        } catch (Exception e) {
            log.error("据用户名获取用户出错!!————",e);
            return YdOaResult.error().setCode(ResponseCodeEnum.CODE_503.getCode()).setMsg("查询出错!");
        }
    }
    /**添加用户**/
    @PostMapping("/add")
    public YdOaResult addUser (@RequestBody SysUser sysUser){
        if (!isUserHaveUsername(sysUser)){
            return YdOaResult.error().setMsg("请输入用户名!");
        }else if(!isUsernameValid(sysUser.getUsername())){
            return YdOaResult.error().setMsg("用户名长度应介于8-25之间");
        }
        try {
            List<SysUser> sysUserList = iSysUserService.getByUsername(sysUser.getUsername());
            if (!sysUserList.isEmpty()) return YdOaResult.error().setMsg("用户名已存在!");

            if (!isUserHavePassword(sysUser)){
                return YdOaResult.error().setMsg("请输入密码!");
            } else if (!isPasswordValid(sysUser.getPassword())) return YdOaResult.error().setMsg("密码长度因介于8-18之间!");

            sysUser.setId(null);//自动生成id

            //密码需要加密
            String strong_salt = BCrypt.gensalt(10);
            String password_salt = BCrypt.hashpw(sysUser.getPassword(),strong_salt);

            sysUser.setPassword(password_salt);

            if(iSysUserService.save(sysUser)){
                return YdOaResult.ok("添加成功");
            }
            return YdOaResult.error("添加失败");
        } catch (Exception e) {
            log.error("添加用户出错!!————",e);
            return YdOaResult.error().setCode(ResponseCodeEnum.CODE_503.getCode()).setMsg("添加用户出错!");
        }
    }
    /**修改用户**/
    @PutMapping("/update")
    public YdOaResult updateUser (@RequestBody SysUser sysUser){
        if (!isUserHaveId(sysUser)){
            return YdOaResult.error().setMsg("请指定要修改的用户id!");
        }
        try {
            if (!isUserHaveUsername(sysUser)){//如果是空串,不修改用户名
                sysUser.setUsername(null);
            }else if(!isUsernameValid(sysUser.getUsername())){//指定了用户名
                return YdOaResult.error().setMsg("用户名长度应介于8-25之间");
            }else{
                //判断是否是别人的用户名
                List<SysUser> sysUserList = iSysUserService.getByUsername(sysUser.getUsername());
                //如果用户名存在,且这个用户名是别人在用的话,不可以修改
                if (!sysUserList.isEmpty() && !Objects.equals(sysUserList.get(0).getId(), sysUser.getId())) return YdOaResult.error().setMsg("用户名已存在!");
            }
            if (!isUserHavePassword(sysUser)){
                sysUser.setPassword(null);
            } else if (!isPasswordValid(sysUser.getPassword()))
                return YdOaResult.error().setMsg("密码长度因介于8-18之间!");
            else{
                //密码需要加密
                String strong_salt = BCrypt.gensalt(10);
                String password_salt = BCrypt.hashpw(sysUser.getPassword(),strong_salt);

                sysUser.setPassword(password_salt);
            }

            if(iSysUserService.updateById(sysUser)){
                return YdOaResult.ok("修改成功");
            }
            return YdOaResult.error("修改失败");
        } catch (Exception e) {
            log.error("修改用户出错!!————",e);
            return YdOaResult.error().setCode(ResponseCodeEnum.CODE_503.getCode()).setMsg("修改用户出错!");
        }
    }
    @Autowired
    private ISysUserRoleService sysUserRoleService;
    /**删除用户**/
    @DeleteMapping("/delete")
    @Transactional
    public YdOaResult updateUser (@RequestParam String id){
        if (id.isEmpty()){
            return YdOaResult.error().setMsg("请指定要删除的用户id!");
        }else if(id.equals("1")) return YdOaResult.error().setMsg("无法删除的用户!");
        try {

            if(iSysUserService.deleteById(id)){
                sysUserRoleService.remove(new QueryWrapper<SysUserRole>().eq("uid",id));
                return YdOaResult.ok("删除成功");
            }
            return YdOaResult.error("删除失败");
        } catch (Exception e) {
            log.error("删除用户出错!!————",e);
            return YdOaResult.error().setCode(ResponseCodeEnum.CODE_503.getCode()).setMsg("删除用户出错!");
        }
    }

    /**
     * 用户输入信息是否有效
     */
    private boolean userHave(SysUser sysUser,boolean id,boolean username,boolean password){
        if (sysUser == null) return false;
        if ( id &&(sysUser.getId()==null || sysUser.getId().isEmpty())){
            return false;
        }
        if (username && (sysUser.getUsername()==null || sysUser.getUsername().isEmpty())) return false;
        return !password || (sysUser.getPassword() != null && !sysUser.getPassword().isEmpty());
    }
    private boolean isUserHaveId(SysUser sysUser){return userHave(sysUser,true,false,false);}
    private boolean isUserHaveUsername(SysUser sysUser){return userHave(sysUser,false,true,false);}
    private boolean isUserHavePassword(SysUser sysUser){return userHave(sysUser,false,false,true);}
    //用户名是否合法有效
    private boolean isUsernameValid(String username) {return username.length()>=8 && username.length()<=25;}
    private boolean isPasswordValid(String password) {return password.length()>=8 && password.length()<=18;}
}

2. user_role相关接口实现

在这里插入图片描述

2.0 实体类

在这里插入图片描述

package com.yd_oa_java_cloud.security.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Getter;
import lombok.Setter;

/**
 * _*_ coding : utf-8 _*_
 * @Time : 2025/1/14 星期二 10:30
 * @Author : Taylor Sinclair(殷志鹏)
 * @File : ${NAME}
 * @Project : ${PROJECT_NAME}
 * @Description :
 */
@Getter
@Setter
@TableName("sys_user_role")
public class SysUserRole implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 用户id
     */
    @TableField("uid")
    private String uid;

    /**
     * 角色id
     */
    @TableField("rid")
    private String rid;
}

2.1 mapper

在这里插入图片描述

package com.yd_oa_java_cloud.security.mapper;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd_oa_java_cloud.security.entity.SysRole;
import com.yd_oa_java_cloud.security.entity.SysUser;
import com.yd_oa_java_cloud.security.entity.SysUserRole;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import java.util.List;

/**
 * _*_ coding : utf-8 _*_
 * @Time : 2025/1/14 星期二 10:30
 * @Author : Taylor Sinclair(殷志鹏)
 * @File : ${NAME}
 * @Project : ${PROJECT_NAME}
 * @Description :
 */
public interface SysUserRoleMapper extends BaseMapper<SysUserRole> {
    List<SysRole> getRolesByUserId(String id);
    int deleteUserAndRoleById(String id);
}

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd_oa_java_cloud.security.mapper.SysUserRoleMapper">
    <resultMap id="SysUserResult" type="com.yd_oa_java_cloud.security.entity.SysUser">
        <result property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
        <collection property="roles" ofType="com.yd_oa_java_cloud.security.entity.SysRole">
            <id column="rid" property="id"/>
            <result column="rname" property="name"/>
            <result column="rnameZh" property="nameZh"/>
        </collection>
    </resultMap>
    <resultMap id="SysUserRoleResult" type="com.yd_oa_java_cloud.security.entity.SysUser" extends="SysUserResult">
        <collection property="roles" ofType="com.yd_oa_java_cloud.security.entity.SysRole">
            <id column="rid" property="id"/>
            <result column="rname" property="name"/>
            <result column="rnameZh" property="nameZh"/>
        </collection>
    </resultMap>


<!--    查询用户和角色权限,可以根据用户id,用户名,角色名查询,三者可以相互组合-->
    <select id="getSysUserRoleList" resultMap="SysUserResult" parameterType="com.yd_oa_java_cloud.security.entity.SysUser">
        select
            u.id as id,
            u.username as username,
            u.`password` as `password`,
            r.id as rid,
            r.`name` as rname,
            r.name_zh as rnameZh
        from
            sys_user as u
        left join
            sys_user_role as ur
        on
            u.id = ur.uid
        left join
            sys_role as r
        on
            ur.rid = r.id
<!--        <where>-->
<!--            <trim>-->
<!--                <if test="id != null  and id != '' and id!=0">and u.id = #{id}</if>-->
<!--                <if test="username != null  and username != ''">and u.username like concat('%', #{username}, '%')</if>-->
<!--                <if test="roles != null">and r.name_zh like concat('%', #{roles[0].nameZh}, '%')</if>-->
<!--            </trim>-->
<!--        </where>-->
    </select>
    <select id="getRolesByUserId" resultType="com.yd_oa_java_cloud.security.entity.SysRole">
        select
            *
        from
            sys_role as r
        left join
            sys_user_role as ur
        on
            ur.rid = r.id
        <where>
            <trim>
                <if test="id != null  and id != '' and id!=0">and ur.uid = #{id}</if>
            </trim>
        </where>
    </select>
    <delete id="deleteUserAndRoleById" parameterType="String">
        delete u,ur from
            sys_user as u
        LEFT JOIN
            sys_user_role as ur
        on
            ur.uid = u.id
        <where>
            <trim>
                <if test="id != null and id !=''">and u.id=#{id}</if>
            </trim>
        </where>
    </delete>
</mapper>

2.2 service

在这里插入图片描述

package com.yd_oa_java_cloud.security.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd_oa_java_cloud.security.entity.SysRole;
import com.yd_oa_java_cloud.security.entity.SysUser;
import com.yd_oa_java_cloud.security.entity.SysUserRole;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author Taylor Sinclair(殷志鹏)
 * @since 2025-01-10
 */
public interface ISysUserRoleService extends IService<SysUserRole> {

    List<SysRole> getRolesByUserId(String id);
}

在这里插入图片描述

package com.yd_oa_java_cloud.security.service.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd_oa_java_cloud.security.entity.SysRole;
import com.yd_oa_java_cloud.security.entity.SysUser;
import com.yd_oa_java_cloud.security.entity.SysUserRole;
import com.yd_oa_java_cloud.security.mapper.SysUserRoleMapper;
import com.yd_oa_java_cloud.security.service.ISysUserRoleService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author Taylor Sinclair(殷志鹏)
 * @since 2025-01-10
 */
@Service
public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUserRole> implements ISysUserRoleService {
    @Autowired
    private SysUserRoleMapper sysUserRoleMapper;

    @Override
    public List<SysRole> getRolesByUserId(String id) {
        return sysUserRoleMapper.getRolesByUserId(id);
    }
}

2.3 controller

在这里插入图片描述

package com.yd_oa_java_cloud.security.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd_oa_java_cloud.base.entity.vo.YdOaResult;
import com.yd_oa_java_cloud.security.entity.SysRole;
import com.yd_oa_java_cloud.security.entity.SysUser;
import com.yd_oa_java_cloud.security.entity.SysUserRole;
import com.yd_oa_java_cloud.security.service.ISysUserRoleService;
import com.yd_oa_java_cloud.security.service.ISysUserService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * _*_ coding : utf-8 _*_
 * @Time : 2025/1/14 星期二 10:30
 * @Author : Taylor Sinclair(殷志鹏)
 * @File : ${NAME}
 * @Project : ${PROJECT_NAME}
 * @Description :
 */
@RestController
@RequestMapping("/sysUserRole")
@Log4j2
public class SysUserRoleController {
    @Autowired
    private ISysUserRoleService sysUserRoleService;
    @Autowired
    private ISysUserService sysUserService;
    /**
     * 分页查询用户,并封装用户角色信息
     */
    @GetMapping("/getAllPage/{current}/{size}")
    public YdOaResult getAllPage(@PathVariable Integer current,@PathVariable Integer size){
        Page<SysUser> page = new Page<>(current, size);//构建分页对象

        try {
            List<SysUser> sysUserList = sysUserService.getAllUserPage(page);//传入分页对象,分页查询
            if (sysUserList.isEmpty()) return YdOaResult.error("没有查询到任何用户信息");
            for (int i = 0;i<sysUserList.size();i++){
                SysUser sysUser = sysUserList.get(i);
                List<SysRole> roles = sysUserRoleService.getRolesByUserId(sysUser.getId());
                sysUser.setRoles(roles);

            }
            return YdOaResult.ok()
                    .set("current",page.getCurrent())//当前所在页
                    .set("pages",page.getPages())//共可以分几页
                    .set("Size",page.getSize())//每页记录数
                    .set("Total",page.getTotal())//数据库表共有多少条数据
                    .set("hasNext",page.hasNext())//是否有下一页
                    .set("hasPrevious",page.hasPrevious())//是否有前一页
                    .setData(sysUserList)//放入查询结果
                    ;
        } catch (Exception e) {
            log.error("分页获取用户角色出错!!————",e);
            return YdOaResult.error().setMsg("查询出错!");
        }
    }
    /**
     * 根据用户id返回角色
     */
    @GetMapping("getById/{uid}")
    public YdOaResult getById(@PathVariable String uid){
        try {
            List<SysRole> roles = sysUserRoleService.getRolesByUserId(uid);
            return YdOaResult.ok()
                    .setData(roles)//放入查询结果
                    ;
        } catch (Exception e) {
            log.error("根据用户id返回角色出错!!————",e);
            return YdOaResult.error().setMsg("查询出错!");
        }
    }
    //"更新用户拥有的角色")
    @PutMapping("/updateUserRole")
    public YdOaResult updateUserRole(String uid,String[] rids){
        return sysUserService.updateUserRole(uid,rids);
    }
}

3. role相关接口

在这里插入图片描述

3.0 实体类

在这里插入图片描述

package com.yd_oa_java_cloud.security.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Getter;
import lombok.Setter;

/**
 * _*_ coding : utf-8 _*_
 * @Time : 2025/1/14 星期二 10:30
 * @Author : Taylor Sinclair(殷志鹏)
 * @File : ${NAME}
 * @Project : ${PROJECT_NAME}
 * @Description :
 */
@Getter
@Setter
@TableName("sys_role")
public class SysRole implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * id
     */
    @TableId(value = "id",type = IdType.ASSIGN_ID)
    private String id;

    /**
     * 角色名
     */
    @TableField("name")
    private String name;

    /**
     * 角色描述
     */
    @TableField("name_zh")
    private String nameZh;
}

3.1 mapper

无需编写

3.2 service

在这里插入图片描述

package com.yd_oa_java_cloud.security.service;

import com.yd_oa_java_cloud.security.entity.SysRole;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author Taylor Sinclair(殷志鹏)
 * @since 2025-01-10
 */
public interface ISysRoleService extends IService<SysRole> {
    /**
     * 删除角色,同时删除与菜单的对应关系
     */
    boolean deleteById(String id);
}

在这里插入图片描述

package com.yd_oa_java_cloud.security.service.impl;

import com.yd_oa_java_cloud.security.entity.SysRole;
import com.yd_oa_java_cloud.security.mapper.SysRoleMapper;
import com.yd_oa_java_cloud.security.mapper.SysRoleMenuMapper;
import com.yd_oa_java_cloud.security.service.ISysRoleService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author Taylor Sinclair(殷志鹏)
 * @since 2025-01-10
 */
@Service
public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements ISysRoleService {
    @Autowired
    private SysRoleMapper sysRoleMapper;
    @Autowired
    private SysRoleMenuMapper sysRoleMenuMapper;
    /**
     * 根据id,删除角色,同时删除与菜单的对应关系
     */
    @Override
    @Transactional//自己写增删改的操作,一定要加事务
    public boolean deleteById(String id) {
        return sysRoleMenuMapper.deleteRoleAndRoleMenuById(id)>=1;
    }
}

3.3 controller

在这里插入图片描述

package com.yd_oa_java_cloud.security.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd_oa_java_cloud.base.entity.vo.YdOaResult;
import com.yd_oa_java_cloud.security.entity.SysRole;
import com.yd_oa_java_cloud.security.entity.SysUser;
import com.yd_oa_java_cloud.security.entity.SysUserRole;
import com.yd_oa_java_cloud.security.service.ISysRoleService;
import com.yd_oa_java_cloud.security.service.ISysUserRoleService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * _*_ coding : utf-8 _*_
 * @Time : 2025/1/14 星期二 10:30
 * @Author : Taylor Sinclair(殷志鹏)
 * @File : ${NAME}
 * @Project : ${PROJECT_NAME}
 * @Description :
 */
@RestController
@RequestMapping("/sysRole")
@Log4j2
public class SysRoleController {
    @Autowired
    private ISysRoleService sysRoleService;
    @Autowired
    private ISysUserRoleService sysUserRoleService;

    //获取所有角色
    @GetMapping("/getAllRoles")
    public YdOaResult getAllRoles(){
        try {
            List<SysRole> list = sysRoleService.list();
            if(list.isEmpty()){
                return YdOaResult.error("没有获取的任何角色信息!!!");
            }
            return YdOaResult.ok().set("RoleAllList",list);
        } catch (Exception e) {
            log.error("获取所有角色出错!!————",e);
            return YdOaResult.error().setMsg("查询出错!");
        }
    }
    //分页获取所有角色
    @GetMapping("/page/{current}/{size}")
    public YdOaResult getAllRolesPage(@PathVariable Integer current, @PathVariable Integer size){
        Page<SysRole> page = new Page<>(current, size);//构建分页对象
        try {
            List<SysRole> list = sysRoleService.list(page);
            if(list.isEmpty()){
                return YdOaResult.error("没有获取的任何角色信息!!!");
            }
            return YdOaResult.ok()
                    .set("current",page.getCurrent())//当前所在页
                    .set("pages",page.getPages())//共可以分几页
                    .set("Size",page.getSize())//每页记录数
                    .set("Total",page.getTotal())//数据库表共有多少条数据
                    .set("hasNext",page.hasNext())//是否有下一页
                    .set("hasPrevious",page.hasPrevious())//是否有前一页
                    .setData(list)//放入查询结果
                    ;
        } catch (Exception e) {
            log.error("分页获取所有角色出错!!————",e);
            return YdOaResult.error().setMsg("查询出错!");
        }
    }
    //修改角色
    @PutMapping("/updateRole")
    public YdOaResult updateRole(@RequestBody SysRole sysRole){
        //如果角色名不是ROLE_打头,就补充上
        if(!sysRole.getName().startsWith("ROLE_")){
            sysRole.setName("ROLE_"+sysRole.getName());
        }
        try {
            if(sysRoleService.updateById(sysRole)){
                return YdOaResult.ok("修改成功");
            }
            return YdOaResult.error("修改失败");
        } catch (Exception e) {
            log.error("修改角色出错!!————",e);
            return YdOaResult.error().setMsg("修改出错!");
        }
    }
    //"添加角色"
    @PostMapping("/addRole")
    public YdOaResult addRole(@RequestBody SysRole sysRole){
        //如果角色名不是ROLE_打头,就补充上
        if(!sysRole.getName().startsWith("ROLE_")){
            sysRole.setName("ROLE_"+sysRole.getName());
        }
        try {
            sysRole.setId(null);
            if(sysRoleService.save(sysRole)){
                return YdOaResult.ok("添加成功");
            }
            return YdOaResult.error("添加失败");
        } catch (Exception e) {
            log.error("添加角色出错!!————",e);
            return YdOaResult.error().setMsg("添加出错!");
        }
    }

    //"删除角色"
    @DeleteMapping("/{id}")
    @Transactional
    public YdOaResult deleteRole(@PathVariable(value = "id",name = "id") String id){
        try {
            //删除角色的同时,要将角色和菜单对应表的数据删掉
            if(sysRoleService.deleteById(id)){
                sysUserRoleService.remove(new QueryWrapper<SysUserRole>().eq("rid",id));//用户与角色对应关系删除
                return YdOaResult.ok("删除成功");
            }
            return YdOaResult.error("删除失败");
        } catch (Exception e) {
            log.error("删除角色出错!!————",e);
            return YdOaResult.error().setMsg("删除出错!");
        }
    }
}

4. user_role相关接口

在这里插入图片描述

4.0 实体类

在这里插入图片描述

package com.yd_oa_java_cloud.security.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Getter;
import lombok.Setter;

/**
 * _*_ coding : utf-8 _*_
 * @Time : 2025/1/14 星期二 10:30
 * @Author : Taylor Sinclair(殷志鹏)
 * @File : ${NAME}
 * @Project : ${PROJECT_NAME}
 * @Description :
 */
@Getter
@Setter
@TableName("sys_user_role")
public class SysUserRole implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 用户id
     */
    @TableField("uid")
    private String uid;

    /**
     * 角色id
     */
    @TableField("rid")
    private String rid;
}

4.1 mapper

在这里插入图片描述

package com.yd_oa_java_cloud.security.mapper;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd_oa_java_cloud.security.entity.SysRole;
import com.yd_oa_java_cloud.security.entity.SysUser;
import com.yd_oa_java_cloud.security.entity.SysUserRole;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import java.util.List;

/**
 * _*_ coding : utf-8 _*_
 * @Time : 2025/1/14 星期二 10:30
 * @Author : Taylor Sinclair(殷志鹏)
 * @File : ${NAME}
 * @Project : ${PROJECT_NAME}
 * @Description :
 */
public interface SysUserRoleMapper extends BaseMapper<SysUserRole> {

    List<SysRole> getRolesByUserId(String id);

    int deleteUserAndRoleById(String id);
}

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd_oa_java_cloud.security.mapper.SysUserRoleMapper">
    <resultMap id="SysUserResult" type="com.yd_oa_java_cloud.security.entity.SysUser">
        <result property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
        <collection property="roles" ofType="com.yd_oa_java_cloud.security.entity.SysRole">
            <id column="rid" property="id"/>
            <result column="rname" property="name"/>
            <result column="rnameZh" property="nameZh"/>
        </collection>
    </resultMap>
    <resultMap id="SysUserRoleResult" type="com.yd_oa_java_cloud.security.entity.SysUser" extends="SysUserResult">
        <collection property="roles" ofType="com.yd_oa_java_cloud.security.entity.SysRole">
            <id column="rid" property="id"/>
            <result column="rname" property="name"/>
            <result column="rnameZh" property="nameZh"/>
        </collection>
    </resultMap>


<!--    查询用户和角色权限,可以根据用户id,用户名,角色名查询,三者可以相互组合-->
    <select id="getSysUserRoleList" resultMap="SysUserResult" parameterType="com.yd_oa_java_cloud.security.entity.SysUser">
        select
            distinct
            u.id as id,
            u.username as username,
            u.`password` as `password`,
            r.id as rid,
            r.`name` as rname,
            r.name_zh as rnameZh
        from
            sys_user as u
        left join
            sys_user_role as ur
        on
            u.id = ur.uid
        left join
            sys_role as r
        on
            ur.rid = r.id
<!--        <where>-->
<!--            <trim>-->
<!--                <if test="id != null  and id != '' and id!=0">and u.id = #{id}</if>-->
<!--                <if test="username != null  and username != ''">and u.username like concat('%', #{username}, '%')</if>-->
<!--                <if test="roles != null">and r.name_zh like concat('%', #{roles[0].nameZh}, '%')</if>-->
<!--            </trim>-->
<!--        </where>-->
    </select>
    <select id="getRolesByUserId" resultType="com.yd_oa_java_cloud.security.entity.SysRole">
        select
            *
        from
            sys_role as r
        left join
            sys_user_role as ur
        on
            ur.rid = r.id
        <where>
            <trim>
                <if test="id != null  and id != '' and id!=0">and ur.uid = #{id}</if>
            </trim>
        </where>
    </select>
    <delete id="deleteUserAndRoleById" parameterType="String">
        delete u,ur from
            sys_user as u
        LEFT JOIN
            sys_user_role as ur
        on
            ur.uid = u.id
        <where>
            <trim>
                <if test="id != null and id !=''">and u.id=#{id}</if>
            </trim>
        </where>
    </delete>
    <!--根据uid删除-->
    <delete id="deleteByUid" parameterType="String">
        delete from sys_user_role where uid = #{uid}
    </delete>

    <!--更新用户角色-->
    <insert id="insertRecord">
        insert into sys_user_role(uid,rid) values
        <foreach collection="rids" item="rid" separator=",">
            (#{uid},#{rid})
        </foreach>
    </insert>
</mapper>


4.2 service

在这里插入图片描述

package com.yd_oa_java_cloud.security.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd_oa_java_cloud.security.entity.SysRole;
import com.yd_oa_java_cloud.security.entity.SysUser;
import com.yd_oa_java_cloud.security.entity.SysUserRole;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author Taylor Sinclair(殷志鹏)
 * @since 2025-01-10
 */
public interface ISysUserRoleService extends IService<SysUserRole> {

    List<SysRole> getRolesByUserId(String id);
}

在这里插入图片描述

package com.yd_oa_java_cloud.security.service.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd_oa_java_cloud.security.entity.SysRole;
import com.yd_oa_java_cloud.security.entity.SysUser;
import com.yd_oa_java_cloud.security.entity.SysUserRole;
import com.yd_oa_java_cloud.security.mapper.SysUserRoleMapper;
import com.yd_oa_java_cloud.security.service.ISysUserRoleService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author Taylor Sinclair(殷志鹏)
 * @since 2025-01-10
 */
@Service
public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUserRole> implements ISysUserRoleService {
    @Autowired
    private SysUserRoleMapper sysUserRoleMapper;

    @Override
    public List<SysRole> getRolesByUserId(String id) {
        return sysUserRoleMapper.getRolesByUserId(id);
    }
}

4.3 controller

在这里插入图片描述

package com.yd_oa_java_cloud.security.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd_oa_java_cloud.base.entity.vo.YdOaResult;
import com.yd_oa_java_cloud.security.entity.SysRole;
import com.yd_oa_java_cloud.security.entity.SysUser;
import com.yd_oa_java_cloud.security.entity.SysUserRole;
import com.yd_oa_java_cloud.security.service.ISysUserRoleService;
import com.yd_oa_java_cloud.security.service.ISysUserService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * _*_ coding : utf-8 _*_
 * @Time : 2025/1/14 星期二 10:30
 * @Author : Taylor Sinclair(殷志鹏)
 * @File : ${NAME}
 * @Project : ${PROJECT_NAME}
 * @Description :
 */
@RestController
@RequestMapping("/sysUserRole")
@Log4j2
public class SysUserRoleController {
    @Autowired
    private ISysUserRoleService sysUserRoleService;
    @Autowired
    private ISysUserService sysUserService;
    /**
     * 分页查询用户,并封装用户角色信息
     */
    @GetMapping("/getAllPage/{current}/{size}")
    public YdOaResult getAllPage(@PathVariable Integer current,@PathVariable Integer size){
        Page<SysUser> page = new Page<>(current, size);//构建分页对象

        try {
            List<SysUser> sysUserList = sysUserService.getAllUserPage(page);//传入分页对象,分页查询
            if (sysUserList.isEmpty()) return YdOaResult.error("没有查询到任何用户信息");
            for (int i = 0;i<sysUserList.size();i++){
                SysUser sysUser = sysUserList.get(i);
                List<SysRole> roles = sysUserRoleService.getRolesByUserId(sysUser.getId());
                sysUser.setRoles(roles);

            }
            return YdOaResult.ok()
                    .set("current",page.getCurrent())//当前所在页
                    .set("pages",page.getPages())//共可以分几页
                    .set("Size",page.getSize())//每页记录数
                    .set("Total",page.getTotal())//数据库表共有多少条数据
                    .set("hasNext",page.hasNext())//是否有下一页
                    .set("hasPrevious",page.hasPrevious())//是否有前一页
                    .setData(sysUserList)//放入查询结果
                    ;
        } catch (Exception e) {
            log.error("分页获取用户角色出错!!————",e);
            return YdOaResult.error().setMsg("查询出错!");
        }
    }
    /**
     * 根据用户id返回角色
     */
    @GetMapping("getById/{uid}")
    public YdOaResult getById(@PathVariable String uid){
        try {
            List<SysRole> roles = sysUserRoleService.getRolesByUserId(uid);
            return YdOaResult.ok()
                    .setData(roles)//放入查询结果
                    ;
        } catch (Exception e) {
            log.error("根据用户id返回角色出错!!————",e);
            return YdOaResult.error().setMsg("查询出错!");
        }
    }
    //"更新用户拥有的角色")
    @PutMapping("/updateUserRole")
    public YdOaResult updateUserRole(String uid,String[] rids){
        return sysUserService.updateUserRole(uid,rids);
    }
}

5. menu相关接口

在这里插入图片描述

5.0 实体类

菜单接口最难,因为是树形结构的,实体类需要保存自己的子菜单


在这里插入图片描述

package com.yd_oa_java_cloud.security.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.List;

import lombok.Getter;
import lombok.Setter;

/**
 * _*_ coding : utf-8 _*_
 * @Time : 2025/1/14 星期二 10:30
 * @Author : Taylor Sinclair(殷志鹏)
 * @File : ${NAME}
 * @Project : ${PROJECT_NAME}
 * @Description :
 */
@Getter
@Setter
@TableName("sys_menu")
public class SysMenu implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * id
     */
    @TableId(value = "id",type = IdType.ASSIGN_ID)
    private String id;

    /**
     * 父菜单id
     */
    @TableField("pid")
    private String pid;

    /**
     * 菜单名
     */
    @TableField("name")
    private String name;

    /**
     * 菜单类型(目录,按钮)
     */
    @TableField("type")
    private String type;

    /**
     * 菜单权限
     */
    @TableField("permission")
    private String permission;

    /**
     * url
     */
    @TableField("url")
    private String url;

    /**
     * path
     */
    @TableField("path")
    private String path;

    /**
     * 组件
     */
    @TableField("component")
    private String component;

    /**
     * 图标
     */
    @TableField("iconCls")
    private String iconCls;

    /**
     * 是否保持激活
     */
    @TableField("keepAlive")
    private Boolean keepAlive;

    /**
     * 是否要求权限
     */
    @TableField("requireAuth")
    private Boolean requireAuth;

    /**
     * 是否启用
     */
    @TableField("enabled")
    private Boolean enabled;
    /**
     * 子菜单
     */

    @TableField(exist = false)//告诉Mybatis,表中没有这个字段,否则操作时会去数据库找这个字段
    private List<SysMenu> children;
}

5.1 mapper

在这里插入图片描述

package com.yd_oa_java_cloud.security.mapper;

import com.yd_oa_java_cloud.security.entity.SysMenu;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * _*_ coding : utf-8 _*_
 * @Time : 2025/1/14 星期二 10:30
 * @Author : Taylor Sinclair(殷志鹏)
 * @File : ${NAME}
 * @Project : ${PROJECT_NAME}
 * @Description :
 */
public interface SysMenuMapper extends BaseMapper<SysMenu> {

    List<SysMenu> getMenusByUserId(String id);
    /**
     * 更新角色菜单
     * 先将当前角色所有菜单都删除,然后再更新
     * @param rid 角色id
     * @param mids 要更新的菜单id
     */
    Integer insertRecord(String rid, String[] mids);
}

注意这里实现了将用户所有菜单(包括子菜单)返回出来(无论多少层级),但是只能返回成一个2级结构,所以还需要代码进行额外处理


在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd_oa_java_cloud.security.mapper.SysMenuMapper">
    <!-- DdMenu映射对象-->
    <resultMap id="BaseResultMap" type="com.yd_oa_java_cloud.security.entity.SysMenu">
        <id column="id" property="id" />
        <result column="pid" property="pid" />
        <result column="name" property="name" />
        <result column="type" property="type" />
        <result column="permission" property="permission" />
        <result column="url" property="url" />
        <result column="path" property="path" />
        <result column="component" property="component" />
        <result column="iconCls" property="iconCls" />
        <result column="keepAlive" property="keepAlive" />
        <result column="requireAuth" property="requireAuth" />
        <result column="enabled" property="enabled" />
    </resultMap>
    <!--子菜单,继承上面DdMenu映射对象-->
    <resultMap id="Menus" type="com.yd_oa_java_cloud.security.entity.SysMenu" extends="BaseResultMap">
        <collection property="children" ofType="com.yd_oa_java_cloud.security.entity.SysMenu">
            <id column="id2" property="id" />
            <result column="pid2" property="pid" />
            <result column="name2" property="name" />
            <result column="type2" property="type" />
            <result column="permission2" property="permission" />
            <result column="url2" property="url" />
            <result column="path2" property="path" />
            <result column="component2" property="component" />
            <result column="iconCls2" property="iconCls" />
            <result column="keepAlive2" property="keepAlive" />
            <result column="requireAuth2" property="requireAuth" />
            <result column="enabled2" property="enabled" />
        </collection>
    </resultMap>
    <select id="getMenusByUserId" resultMap="Menus">
        select
            distinct
            m1.*,
            m2.id as id2,
            m2.pid as pid2,
            m2.`name` as name2,
            m2.type as type2,
            m2.permission as permission2,
            m2.url as url2,
            m2.path as path2,
            m2.component as component2,
            m2.iconCls as iconCls2,
            m2.keepAlive as keepAlive2,
            m2.requireAuth as requireAuth,
            m2.enabled as enabled2
        from
            sys_menu as m1
        inner join
            sys_menu as m2
        on
            m1.id = m2.pid
        inner join
            sys_role_menu as rm
        on
            rm.mid = m2.id
        inner join
            sys_user_role as ur
        on
            ur.rid = rm.rid
        where
            ur.uid = #{id}
    </select>
    <!--更新角色菜单-->
    <insert id="insertRecord">
        insert into sys_role_menu(rid,mid) values
        <foreach collection="mids" item="mid" separator=",">
            (#{rid},#{mid})
        </foreach>
    </insert>
</mapper>

5.2 service

在这里插入图片描述

package com.yd_oa_java_cloud.security.service;

import com.yd_oa_java_cloud.base.entity.vo.YdOaResult;
import com.yd_oa_java_cloud.security.entity.SysMenu;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author Taylor Sinclair(殷志鹏)
 * @since 2025-01-10
 */
public interface ISysMenuService extends IService<SysMenu> {
    /**
     * 根据用户id获取菜单
     */
    List<SysMenu> getMenusByUserId(String id);
    //更新角色菜单
    YdOaResult updateMenuRole(String rid, String[] mids);

    List<SysMenu> getMenusByLoginId();

    List<SysMenu> listTree();
}

在这里插入图片描述

package com.yd_oa_java_cloud.security.service.impl;

import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.yd_oa_java_cloud.base.entity.vo.YdOaResult;
import com.yd_oa_java_cloud.security.entity.SysMenu;
import com.yd_oa_java_cloud.security.entity.SysRoleMenu;
import com.yd_oa_java_cloud.security.entity.SysUser;
import com.yd_oa_java_cloud.security.mapper.SysMenuMapper;
import com.yd_oa_java_cloud.security.mapper.SysRoleMenuMapper;
import com.yd_oa_java_cloud.security.service.ISysMenuService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang.SerializationUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

/**
 * _*_ coding : utf-8 _*_
 * @Time : 2025/1/14 星期二 10:30
 * @Author : Taylor Sinclair(殷志鹏)
 * @File : ${NAME}
 * @Project : ${PROJECT_NAME}
 * @Description :
 */
@Service
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements ISysMenuService {

    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private SysMenuMapper sysMenuMapper;
    @Autowired
    private SysRoleMenuMapper sysRoleMenuMapper;



    private List<SysMenu> treeData(List<SysMenu> menus){
        return treeData(menus,"0");
    }
    /**
     * 转换为树形结构
     * @param menus 数据列表
     * @param rootId 这个是根结点id,不是字段名,例如根结点是由0标识的
     * @return 转为树形结构的数据列表
     * >>>>>>>>>>>>>>>殷志鹏-2025-1-15
     */
    private List<SysMenu> treeData(List<SysMenu> menus,String rootId){
        //对源数据深拷贝
        Object clone = SerializationUtils.clone((Serializable) menus);
        ArrayList<SysMenu> deepCopy = new ArrayList<SysMenu>((List)clone);
        //最终结果
        List<SysMenu> ans = new ArrayList<>();
        ans = treeData(deepCopy,rootId,ans);
        return ans;
    }
    private List<SysMenu> treeData(List<SysMenu> deepCopy,String rootId,List<SysMenu> result){
        return deepCopy.stream().filter(father->{
            List<SysMenu> collect = deepCopy.stream().filter(child -> {
                return father.getId().equals(child.getPid());
            }).collect(Collectors.toList());
            if (!collect.isEmpty()) father.setChildren(collect);
            else father.setChildren(null);
            return father.getPid().equals(rootId);
        }).collect(Collectors.toList());
    }


    private List<SysMenu> unTreeData(List<SysMenu> menus){
        //对源数据深拷贝
        Object clone = SerializationUtils.clone((Serializable) menus);
        ArrayList<SysMenu> deepCopy = new ArrayList<SysMenu>((List)clone);
        //最终结果
        ArrayList<SysMenu> ans = new ArrayList<>();
        //递归
        unTreeData(deepCopy,ans);

        return ans;
    }
    private void unTreeData(List<SysMenu> source,List<SysMenu> result){
        for (SysMenu father:source) {
            if(father.getChildren()!=null){
                result.add(father);
                unTreeData(father.getChildren(),result);
                father.setChildren(null);
            } else {
                result.add(father);
            }
        }
    }
    /**
     * 根据登录用户id获取菜单
     */
    @Override
    public List<SysMenu> getMenusByLoginId() {
        //上下文获取user对象
        SysUser user = (SysUser)StpUtil.getSession().get("user");
//        //获取redis对象
//        ValueOperations<String,Object> valueOperations = redisTemplate.opsForValue();
//        //先从redis中查询
//        List<SysMenu> menus = (List<SysMenu>) valueOperations.get("menu_" + user.getId());
//        //如果redis没有,查mysql
//        if(CollectionUtils.isEmpty(menus)){
//            menus = sysMenuMapper.getMenusByUserId(user.getId());
//            valueOperations.set("menu_" + user.getId(),menus,30, TimeUnit.MINUTES);
//        }
        List<SysMenu> menus = sysMenuMapper.getMenusByUserId(user.getId());
        List<SysMenu> unTreeData = unTreeData(menus);
        List<SysMenu> treeData = treeData(unTreeData);
        return treeData;
    }

    /**
     * 获取树形结构
     * @return
     */
    @Override
    public List<SysMenu> listTree() {
        List<SysMenu> list = (List<SysMenu>)sysMenuMapper.selectList((Wrapper) Wrappers.emptyWrapper());
        List<SysMenu> treeData = treeData(list);
        return treeData;
    }

    /**
     * 根据用户id获取菜单,非菜单结构
     */
    @Override
    public List<SysMenu> getMenusByUserId(String id) {
        List<SysMenu> menus = sysMenuMapper.getMenusByUserId(id);
        List<SysMenu> unTreeData = unTreeData(menus);
        return unTreeData;
    }


    /**
     * 更新角色菜单
     * 先将当前角色所有菜单都删除,然后再更新
     * @param rid 角色id
     * @param mids 要更新的菜单id
     */
    @Override
    @Transactional//自己写更新的操作,一定要加事务,一个操作失败,则所有操作失败
    public YdOaResult updateMenuRole(String rid, String[] mids) {
        //要更新的菜单id为空,则直接返回
        if(null == mids||mids.length == 0){
            return YdOaResult.ok("更新菜单成功");
        }
        //先全删了,否则得一次次判断,太费资源
        sysRoleMenuMapper.delete(new QueryWrapper<SysRoleMenu>().eq("rid", rid));
        //如果传了菜单id过来,则更新
        sysMenuMapper.insertRecord(rid,mids);
        return YdOaResult.ok("更新菜单成功");
    }


}

5.3 controller

在这里插入图片描述

package com.yd_oa_java_cloud.security.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.yd_oa_java_cloud.base.entity.vo.YdOaResult;
import com.yd_oa_java_cloud.security.entity.SysMenu;
import com.yd_oa_java_cloud.security.entity.SysRoleMenu;
import com.yd_oa_java_cloud.security.service.ISysMenuService;
import com.yd_oa_java_cloud.security.service.ISysRoleMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * _*_ coding : utf-8 _*_
 * @Time : 2025/1/14 星期二 10:30
 * @Author : Taylor Sinclair(殷志鹏)
 * @File : ${NAME}
 * @Project : ${PROJECT_NAME}
 * @Description :
 */
@RestController
@RequestMapping("/sysMenu")
public class SysMenuController {
    @Autowired
    private ISysMenuService sysMenuService;
    @Autowired
    private ISysRoleMenuService sysRoleMenuService;
    //根据当前登录用户id获取菜单
    @GetMapping("/LoginMenu")
    public YdOaResult getMenusByLoginId(){
        List<SysMenu> list = sysMenuService.getMenusByLoginId();
//        if(list.isEmpty()){
//            return Result.error().message("没有菜单!!");
//        }
        return YdOaResult.ok().set("menus",list);
    }
    //根据用户id获取菜单
    @GetMapping("/getMenusByUserId/{id}")
    public YdOaResult getMenusByUserId(@PathVariable String id){
        List<SysMenu> list = sysMenuService.getMenusByUserId(id);
//        if(list.isEmpty()){
//            return Result.error().message("没有菜单!!");
//        }
        return YdOaResult.ok().set("menus",list);
    }
    //查询所有菜单
    @GetMapping("/menus")
    public YdOaResult getMenus(){
        List<SysMenu> list = sysMenuService.listTree();
        if(list.isEmpty()){
            return YdOaResult.error("没有菜单!!");
        }
        return YdOaResult.ok().set("menuAllList",list);
    }
    //"添加菜单"
    @PostMapping("/")
    public YdOaResult insertMenu(@RequestBody SysMenu sysMenu){
        sysMenu.setId(null);//自动生成
        if(sysMenuService.save(sysMenu)){
            return YdOaResult.ok("添加成功");
        }
        return YdOaResult.error("添加失败");
    }
    //"修改菜单"
    @PutMapping("/")
    public YdOaResult updateMenu(@RequestBody SysMenu ddMenu){
        if(sysMenuService.updateById(ddMenu)){
            return YdOaResult.ok("修改成功");
        }
        return YdOaResult.error("修改失败");
    }
    //"删除菜单"
    @DeleteMapping("/{id}")
    @Transactional
    public YdOaResult deleteRole(@PathVariable(value = "id",name = "id") String id){
        if(sysMenuService.removeById(id)){//删除菜单成功
            sysRoleMenuService.remove(new QueryWrapper<SysRoleMenu>().eq("mid",id));//删除对应关系
            return YdOaResult.ok("删除成功");
        }
        return YdOaResult.error("删除失败");
    }
    //"批量删除菜单"
    @DeleteMapping ("/ids")
    public YdOaResult deleteRoleList(String ids){
        System.out.println(ids);
        String[] split = ids.split(",");
        if(sysMenuService.removeByIds(Arrays.asList(split.clone()))){
            return YdOaResult.ok("删除成功");
        }
        return YdOaResult.error("删除失败");
    }
    //"根据角色id查询菜单id"
    @GetMapping("/menuIdByRoleId/{rid}")
    public YdOaResult getMenuIdByRoleId(@PathVariable String rid){
        List<String> mids = sysRoleMenuService.list(new QueryWrapper<SysRoleMenu>().eq("rid", rid))
                .stream().map(SysRoleMenu::getMid).collect(Collectors.toList());
        if(mids.isEmpty()){
            return YdOaResult.error("此用户还没有分配菜单");
        }
        return YdOaResult.ok().set("menuId",mids);
    }
    //"更新角色菜单"
    @PutMapping("/roleAndMenu")
    public YdOaResult updateMenuRole(String rid,String[] mids){
        return sysMenuService.updateMenuRole(rid,mids);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ydenergy_殷志鹏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值