系统说明
本系统采用前后端分离的方式实现,本系统以用户,菜单,权限,角色完美实现用户权限分配问题。
使用工具
JDK1.8,springboot,mysql8,mybatis-plus,Redis,spring security,vue
数据库设计
表名称 | 描述 |
---|---|
sys_user | 用户表 |
sys_menu | 菜单表 |
sys_role | 角色表 |
sys_role_menu | 角色与菜单关系表 |
sys_user_role | 用户与角色关系表表 |
菜单,角色,用户关系分析
项目部分代码展示
菜单实现类:
package com.ly.system.service.impl;
import com.ly.model.system.SysMenu;
import com.ly.model.system.SysRoleMenu;
import com.ly.model.vo.AssginMenuVo;
import com.ly.model.vo.RouterVo;
import com.ly.system.exception.GuiguException;
import com.ly.system.mapper.SysMenuMapper;
import com.ly.system.mapper.SysRoleMenuMapper;
import com.ly.system.service.SysMenuService;
import com.ly.system.utils.MenuHelper;
import com.ly.system.utils.RouterHelper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* <p>
* 菜单表 服务实现类
* </p>
*
* @author atguigu
* @since 2022-09-29
*/
@Service
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {
@Autowired
private SysRoleMenuMapper sysRoleMenuMapper;
//菜单列表(树形)
@Override
public List<SysMenu> findNodes() {
//获取所有菜单
List<SysMenu> sysMenuList = baseMapper.selectList(null);
//所有菜单数据转换要求数据格式
List<SysMenu> resultList = MenuHelper.bulidTree(sysMenuList);
return resultList;
}
//删除菜单
@Override
public void removeMenuById(String id) {
//查询当前删除菜单下面是否子菜单
//根据id = parentid
QueryWrapper<SysMenu> wrapper = new QueryWrapper<>();
wrapper.eq("parent_id",id);
Integer count = baseMapper.selectCount(wrapper);
if(count > 0) {//有子菜单
throw new GuiguException(201,"请先删除子菜单");
}
//调用删除
baseMapper.deleteById(id);
}
//根据角色分配菜单
@Override
public List<SysMenu> findMenuByRoleId(String roleId) {
//获取所有菜单 status=1
QueryWrapper<SysMenu> wrapperMenu = new QueryWrapper<>();
wrapperMenu.eq("status",1);
List<SysMenu> menuList = baseMapper.selectList(wrapperMenu);
//根据角色id查询 角色分配过的菜单列表
QueryWrapper<SysRoleMenu> wrapperRoleMenu = new QueryWrapper<>();
wrapperRoleMenu.eq("role_id",roleId);
List<SysRoleMenu> roleMenus = sysRoleMenuMapper.selectList(wrapperRoleMenu);
//从第二步查询列表中,获取角色分配所有菜单id
List<String> roleMenuIds = new ArrayList<>();
for (SysRoleMenu sysRoleMenu:roleMenus) {
String menuId = sysRoleMenu.getMenuId();
roleMenuIds.add(menuId);
}
//数据处理:isSelect 如果菜单选中 true,否则false
// 拿着分配菜单id 和 所有菜单比对,有相同的,让isSelect值true
for (SysMenu sysMenu:menuList) {
if(roleMenuIds.contains(sysMenu.getId())) {
sysMenu.setSelect(true);
} else {
sysMenu.setSelect(false);
}
}
//转换成树形结构为了最终显示 MenuHelper方法实现
List<SysMenu> sysMenus = MenuHelper.bulidTree(menuList);
return sysMenus;
}
//给角色分配菜单权限
@Override
public void doAssign(AssginMenuVo assginMenuVo) {
//根据角色id删除菜单权限
QueryWrapper<SysRoleMenu> wrapper = new QueryWrapper<>();
wrapper.eq("role_id",assginMenuVo.getRoleId());
sysRoleMenuMapper.delete(wrapper);
//遍历菜单id列表,一个一个进行添加
List<String> menuIdList = assginMenuVo.getMenuIdList();
for (String menuId:menuIdList) {
SysRoleMenu sysRoleMenu = new SysRoleMenu();
sysRoleMenu.setMenuId(menuId);
sysRoleMenu.setRoleId(assginMenuVo.getRoleId());
sysRoleMenuMapper.insert(sysRoleMenu);
}
}
//根据userid查询菜单权限值
@Override
public List<RouterVo> getUserMenuList(String userId) {
//admin是超级管理员,操作所有内容
List<SysMenu> sysMenuList = null;
//判断userid值是1代表超级管理员,查询所有权限数据
if("1".equals(userId)) {
QueryWrapper<SysMenu> wrapper = new QueryWrapper<>();
wrapper.eq("status",1);
wrapper.orderByAsc("sort_value");
sysMenuList = baseMapper.selectList(wrapper);
} else {
//如果userid不是1,其他类型用户,查询这个用户权限
sysMenuList = baseMapper.findMenuListUserId(userId);
}
//构建是树形结构
List<SysMenu> sysMenuTreeList = MenuHelper.bulidTree(sysMenuList);
//转换成前端路由要求格式数据
List<RouterVo> routerVoList = RouterHelper.buildRouters(sysMenuTreeList);
return routerVoList;
}
//根据userid查询按钮权限值
@Override
public List<String> getUserButtonList(String userId) {
List<SysMenu> sysMenuList = null;
//判断是否管理员
if("1".equals(userId)) {
sysMenuList =
baseMapper.selectList(new QueryWrapper<SysMenu>().eq("status",1));
} else {
sysMenuList = baseMapper.findMenuListUserId(userId);
}
//sysMenuList遍历
List<String> permissionList = new ArrayList<>();
for (SysMenu sysMenu:sysMenuList) {
// type=2
if(sysMenu.getType()==2) {
String perms = sysMenu.getPerms();
permissionList.add(perms);
}
}
return permissionList;
}
}
角色实现类:
package com.ly.system.service.impl;
import com.ly.model.system.SysRole;
import com.ly.model.system.SysUserRole;
import com.ly.model.vo.AssginRoleVo;
import com.ly.model.vo.SysRoleQueryVo;
import com.ly.system.mapper.SysRoleMapper;
import com.ly.system.mapper.SysUserRoleMapper;
import com.ly.system.service.SysRoleService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements SysRoleService {
@Autowired
private SysUserRoleMapper sysUserRoleMapper;
//条件分页查询
@Override
public IPage<SysRole> selectPage(Page<SysRole> pageParam, SysRoleQueryVo sysRoleQueryVo) {
IPage<SysRole> pageModel = baseMapper.selectPage(pageParam,sysRoleQueryVo);
return pageModel;
}
//获取用户的角色数据
@Override
public Map<String, Object> getRolesByUserId(String userId) {
//获取所有角色
List<SysRole> roles = baseMapper.selectList(null);
//根据用户id查询,已经分配角色
QueryWrapper<SysUserRole> wrapper = new QueryWrapper<>();
wrapper.eq("user_id",userId);
List<SysUserRole> userRolesList = sysUserRoleMapper.selectList(wrapper);
//从userRoles集合获取所有角色id
List<String> userRoleIds = new ArrayList<>();
for (SysUserRole userRole:userRolesList) {
String roleId = userRole.getRoleId();
userRoleIds.add(roleId);
}
//封装到map集合
Map<String, Object> returnMap = new HashMap<>();
returnMap.put("allRoles",roles);//所有角色
returnMap.put("userRoleIds",userRoleIds);//用户分配角色id集合
return returnMap;
}
//用户分配角色
@Override
public void doAssign(AssginRoleVo assginRoleVo) {
//根据用户id删除之前分配角色
QueryWrapper<SysUserRole> wrapper = new QueryWrapper<>();
wrapper.eq("user_id",assginRoleVo.getUserId());
sysUserRoleMapper.delete(wrapper);
//获取所有角色id,添加角色用户关系表
//角色id列表
List<String> roleIdList = assginRoleVo.getRoleIdList();
for (String roleId:roleIdList) {
SysUserRole userRole = new SysUserRole();
userRole.setUserId(assginRoleVo.getUserId());
userRole.setRoleId(roleId);
sysUserRoleMapper.insert(userRole);
}
}
}
用户实现类:
package com.ly.system.service.impl;
import com.ly.model.system.SysUser;
import com.ly.model.vo.RouterVo;
import com.ly.model.vo.SysUserQueryVo;
import com.ly.system.mapper.SysUserMapper;
import com.ly.system.service.SysMenuService;
import com.ly.system.service.SysUserService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
* 用户表 服务实现类
* </p>
*
* @author atguigu
* @since 2022-09-28
*/
@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements SysUserService {
@Autowired
private SysMenuService sysMenuService;
//用户列表
@Override
public IPage<SysUser> selectPage(Page<SysUser> pageParam, SysUserQueryVo sysUserQueryVo) {
return baseMapper.selectPage(pageParam,sysUserQueryVo);
}
//更改用户状态
@Override
public void updateStatus(String id, Integer status) {
//根据用户id查询
SysUser sysUser = baseMapper.selectById(id);
//设置修改状态
sysUser.setStatus(status);
//调用方法修改
baseMapper.updateById(sysUser);
}
//username查询
@Override
public SysUser getUserInfoByUserName(String username) {
QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
wrapper.eq("username",username);
return baseMapper.selectOne(wrapper);
}
//根据用户名称获取用户信息(基本信息 和 菜单权限 和 按钮权限数据)
@Override
public Map<String, Object> getUserInfo(String username) {
//根据username查询用户基本信息
SysUser sysUser = this.getUserInfoByUserName(username);
//根据userid查询菜单权限值
List<RouterVo> routerVolist = sysMenuService.getUserMenuList(sysUser.getId());
//根据userid查询按钮权限值
List<String> permsList = sysMenuService.getUserButtonList(sysUser.getId());
Map<String,Object> result = new HashMap<>();
result.put("name",username);
result.put("avatar","https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif");
result.put("roles","[\"admin\"]");
//菜单权限数据
result.put("routers",routerVolist);
//按钮权限数据
result.put("buttons",permsList);
return result;
}
}
项目图片展示
系统登录界面:
菜单管理界面:
添加目录节点界面:
添加下级节点:
角色管理界面:
给角色分配权限界面:
用户管理界面:
给用户授权界面:
源代码获取
链接:Redis-windows工具获取
提取码:glyl
链接:前后台代码获取
提取码:glyl
链接:数据库以及资料获取
提取码:glyl
- 此次分享到此结束,喜欢此系统的留个关注,留个点赞,我们共同努力,加油!