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);
}
}