【优化】优化登录查询

This commit is contained in:
徐玉祥 2021-06-29 13:57:26 +08:00
parent 44b5239f34
commit 68234a112e
6 changed files with 92 additions and 50 deletions

View File

@ -41,6 +41,7 @@ import vip.xiaonuo.core.exception.enums.abs.AbstractBaseExceptionEnum;
import vip.xiaonuo.core.pojo.response.ErrorResponseData;
import vip.xiaonuo.core.sms.modular.aliyun.exp.AliyunSmsException;
import vip.xiaonuo.core.sms.modular.tencent.exp.TencentSmsException;
import vip.xiaonuo.core.util.HttpServletUtil;
import vip.xiaonuo.core.util.ResponseUtil;
import org.apache.ibatis.exceptions.PersistenceException;
import org.mybatis.spring.MyBatisSystemException;
@ -173,8 +174,8 @@ public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.NOT_FOUND)
@ResponseBody
public ErrorResponseData notFound(NoHandlerFoundException e) {
log.error(">>> 资源不存在异常,请求号为:{},具体信息为:{}", RequestNoContext.get(), e.getMessage());
return renderJson(PermissionExceptionEnum.URL_NOT_EXIST);
log.error(">>> 资源不存在异常,请求号为:{},具体信息为:{}", RequestNoContext.get(), e.getMessage() +",请求地址为:" + HttpServletUtil.getRequest().getRequestURI());
return renderJson(PermissionExceptionEnum.URL_NOT_EXIST.getCode(), PermissionExceptionEnum.URL_NOT_EXIST.getMessage() +",请求地址为:" + HttpServletUtil.getRequest().getRequestURI());
}
/**
@ -227,8 +228,8 @@ public class GlobalExceptionHandler {
@ExceptionHandler(PermissionException.class)
@ResponseBody
public ErrorResponseData noPermission(PermissionException e) {
log.error(">>> 权限异常,请求号为:{},具体信息为:{}", RequestNoContext.get(), e.getMessage());
return renderJson(e.getCode(), e.getErrorMessage());
log.error(">>> 权限异常,请求号为:{},具体信息为:{}", RequestNoContext.get(), e.getMessage() +",请求地址为:" + HttpServletUtil.getRequest().getRequestURI());
return renderJson(e.getCode(), e.getErrorMessage() + ",请求地址为:" + HttpServletUtil.getRequest().getRequestURI());
}
/**

View File

@ -25,6 +25,7 @@ Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意
package vip.xiaonuo.sys.modular.auth.factory;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
@ -36,6 +37,7 @@ import vip.xiaonuo.core.exception.ServiceException;
import vip.xiaonuo.core.exception.enums.ServerExceptionEnum;
import vip.xiaonuo.core.pojo.login.LoginEmpInfo;
import vip.xiaonuo.core.pojo.login.SysLoginUser;
import vip.xiaonuo.core.pojo.node.LoginMenuTreeNode;
import vip.xiaonuo.core.tenant.consts.TenantConstants;
import vip.xiaonuo.core.tenant.context.TenantCodeHolder;
import vip.xiaonuo.core.tenant.context.TenantDbNameHolder;
@ -44,12 +46,16 @@ import vip.xiaonuo.core.util.IpAddressUtil;
import vip.xiaonuo.core.util.UaUtil;
import vip.xiaonuo.sys.modular.app.service.SysAppService;
import vip.xiaonuo.sys.modular.emp.service.SysEmpService;
import vip.xiaonuo.sys.modular.menu.entity.SysMenu;
import vip.xiaonuo.sys.modular.menu.service.SysMenuService;
import vip.xiaonuo.sys.modular.role.service.SysRoleMenuService;
import vip.xiaonuo.sys.modular.role.service.SysRoleService;
import vip.xiaonuo.sys.modular.user.service.SysUserService;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 登录用户工厂类
@ -69,6 +75,8 @@ public class LoginUserFactory {
private static final SysRoleService sysRoleService = SpringUtil.getBean(SysRoleService.class);
private static final SysRoleMenuService sysRoleMenuService = SpringUtil.getBean(SysRoleMenuService.class);
/**
* 填充登录用户相关信息
*
@ -93,8 +101,14 @@ public class LoginUserFactory {
List<Dict> roles = sysRoleService.getLoginRoles(userId);
sysLoginUser.setRoles(roles);
// 获取角色id集合
List<Long> roleIdList = roles.stream().map(dict -> Convert.toLong(dict.get(CommonConstant.ID))).collect(Collectors.toList());
// 获取菜单id集合
List<Long> menuIdList = sysRoleMenuService.getRoleMenuIdList(roleIdList);
// 权限信息
List<String> permissions = sysMenuService.getLoginPermissions(userId);
List<String> permissions = sysMenuService.getLoginPermissions(userId, menuIdList);
sysLoginUser.setPermissions(permissions);
// 数据范围信息
@ -102,7 +116,7 @@ public class LoginUserFactory {
sysLoginUser.setDataScopes(dataScopes);
// 具备应用信息多系统默认激活一个可根据系统切换菜单,返回的结果中第一个为激活的系统
List<Dict> apps = sysAppService.getLoginApps(userId);
List<Dict> apps = sysAppService.getLoginApps(userId, roleIdList);
sysLoginUser.setApps(apps);
// 如果根本没有应用信息则没有菜单信息
@ -111,7 +125,11 @@ public class LoginUserFactory {
} else {
//AntDesign菜单信息根据人获取用于登录后展示菜单树默认获取默认激活的系统的菜单
String defaultActiveAppCode = apps.get(0).getStr(CommonConstant.CODE);
sysLoginUser.setMenus(sysMenuService.getLoginMenusAntDesign(userId, defaultActiveAppCode));
List<SysMenu> loginMenus = sysMenuService.getLoginMenus(userId, defaultActiveAppCode, menuIdList);
Map<String, List<SysMenu>> collect = loginMenus.stream().collect(Collectors.groupingBy(SysMenu::getApplication));
List<SysMenu> tempList = collect.get(defaultActiveAppCode);
List<LoginMenuTreeNode> loginMenuTreeNodes = sysMenuService.convertSysMenuToLoginMenu(tempList);
sysLoginUser.setMenus(loginMenuTreeNodes);
}
//如果开启了多租户功能则设置当前登录用户的租户标识

View File

@ -28,8 +28,10 @@ import vip.xiaonuo.core.annotion.BusinessLog;
import vip.xiaonuo.core.annotion.Permission;
import vip.xiaonuo.core.context.login.LoginContextHolder;
import vip.xiaonuo.core.enums.LogAnnotionOpTypeEnum;
import vip.xiaonuo.core.pojo.node.LoginMenuTreeNode;
import vip.xiaonuo.core.pojo.response.ResponseData;
import vip.xiaonuo.core.pojo.response.SuccessResponseData;
import vip.xiaonuo.sys.modular.menu.entity.SysMenu;
import vip.xiaonuo.sys.modular.menu.param.SysMenuParam;
import vip.xiaonuo.sys.modular.menu.service.SysMenuService;
import org.springframework.validation.annotation.Validated;
@ -37,8 +39,11 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import vip.xiaonuo.sys.modular.role.service.SysRoleMenuService;
import vip.xiaonuo.sys.modular.user.service.SysUserRoleService;
import javax.annotation.Resource;
import java.util.List;
/**
* 系统菜单控制器
@ -52,6 +57,12 @@ public class SysMenuController {
@Resource
private SysMenuService sysMenuService;
@Resource
private SysRoleMenuService sysRoleMenuService;
@Resource
private SysUserRoleService sysUserRoleService;
/**
* 系统菜单列表
*
@ -156,6 +167,11 @@ public class SysMenuController {
@BusinessLog(title = "系统菜单_切换", opType = LogAnnotionOpTypeEnum.TREE)
public ResponseData change(@RequestBody @Validated(SysMenuParam.change.class) SysMenuParam sysMenuParam) {
Long sysLoginUserId = LoginContextHolder.me().getSysLoginUserId();
return new SuccessResponseData(sysMenuService.getLoginMenusAntDesign(sysLoginUserId, sysMenuParam.getApplication()));
List<Long> userRoleIdList = sysUserRoleService.getUserRoleIdList(sysLoginUserId);
List<Long> menuIdList = sysRoleMenuService.getRoleMenuIdList(userRoleIdList);
//转换成登录菜单
List<SysMenu> sysMenuList = sysMenuService.getLoginMenus(sysLoginUserId, sysMenuParam.getApplication(), menuIdList);
List<LoginMenuTreeNode> menuTreeNodeList = sysMenuService.convertSysMenuToLoginMenu(sysMenuList);
return new SuccessResponseData(menuTreeNodeList);
}
}

View File

@ -44,32 +44,35 @@ public interface SysMenuService extends IService<SysMenu> {
* 获取用户权限相关信息
*
* @param userId 用户id
* @param menuIdList 菜单id集合
* @return 权限集合
* @author xuyuxiang
* @date 2020/3/13 16:26
*/
List<String> getLoginPermissions(Long userId);
List<String> getLoginPermissions(Long userId, List<Long> menuIdList);
/**
* 获取用户AntDesign菜单相关信息前端使用
*
* @param userId 用户id
* @param appCode 应用编码
* @param menuIdList 菜单id集合
* @return AntDesign菜单信息结果集
* @author yubaoshan
* @date 2020/4/17 17:48
*/
List<LoginMenuTreeNode> getLoginMenusAntDesign(Long userId, String appCode);
List<SysMenu> getLoginMenus(Long userId, String appCode, List<Long> menuIdList);
/**
* 获取用户菜单所属的应用编码集合
*
* @param userId 用户id
* @param roleIdList 角色id集合
* @return 用户菜单所属的应用编码集合
* @author xuyuxiang
* @date 2020/3/21 11:01
*/
List<String> getUserMenuAppCodeList(Long userId);
List<String> getUserMenuAppCodeList(Long userId, List<Long> roleIdList);
/**
* 系统菜单列表树表
@ -147,4 +150,14 @@ public interface SysMenuService extends IService<SysMenu> {
* @date 2020/6/28 12:14
*/
boolean hasMenu(String appCode);
/**
* 将SysMenu格式菜单转换为LoginMenuTreeNode菜单
*
* @author xuyuxiang
* @date 2021/6/29 13:43
* @param sysMenuList 原始菜单集合
* @return LoginMenuTreeNode菜单集合
*/
List<LoginMenuTreeNode> convertSysMenuToLoginMenu(List<SysMenu> sysMenuList);
}

View File

@ -27,6 +27,7 @@ package vip.xiaonuo.sys.modular.menu.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -59,6 +60,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* 系统菜单service接口实现类
@ -83,26 +85,28 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
private ResourceCache resourceCache;
@Override
public List<String> getLoginPermissions(Long userId) {
public List<String> getLoginPermissions(Long userId, List<Long> menuIdList) {
Set<String> permissions = CollectionUtil.newHashSet();
List<Long> roleIdList = sysUserRoleService.getUserRoleIdList(userId);
if (ObjectUtil.isNotEmpty(roleIdList)) {
List<Long> menuIdList = sysRoleMenuService.getRoleMenuIdList(roleIdList);
if (ObjectUtil.isNotEmpty(menuIdList)) {
LambdaQueryWrapper<SysMenu> queryWrapper = new LambdaQueryWrapper<>();
if (ObjectUtil.isNotEmpty(menuIdList)) {
LambdaQueryWrapper<SysMenu> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(SysMenu::getId, menuIdList).ne(SysMenu::getType, MenuTypeEnum.DIR.getCode())
.eq(SysMenu::getStatus, CommonStatusEnum.ENABLE.getCode());
queryWrapper.in(SysMenu::getId, menuIdList).eq(SysMenu::getType, MenuTypeEnum.BTN.getCode())
.eq(SysMenu::getStatus, CommonStatusEnum.ENABLE.getCode());
this.list(queryWrapper).forEach(sysMenu -> permissions.add(sysMenu.getPermission()));
}
this.list(queryWrapper).forEach(sysMenu -> {
if(MenuTypeEnum.BTN.getCode().equals(sysMenu.getType())) {
permissions.add(sysMenu.getPermission());
} else {
String removePrefix = StrUtil.removePrefix(sysMenu.getRouter(), SymbolConstant.LEFT_DIVIDE);
String permission = removePrefix.replaceAll(SymbolConstant.LEFT_DIVIDE, SymbolConstant.COLON);
permissions.add(permission);
}
});
}
return CollectionUtil.newArrayList(permissions);
}
@Override
public List<LoginMenuTreeNode> getLoginMenusAntDesign(Long userId, String appCode) {
List<SysMenu> sysMenuList;
public List<SysMenu> getLoginMenus(Long userId, String appCode, List<Long> menuIdList) {
//如果是超级管理员则展示所有系统权重菜单不能展示业务权重菜单
SysUser sysUser = sysUserService.getById(userId);
Integer adminType = sysUser.getAdminType();
@ -120,29 +124,19 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
} else {
//非超级管理员则获取自己角色所拥有的菜单集合
List<Long> roleIdList = sysUserRoleService.getUserRoleIdList(userId);
if (ObjectUtil.isNotEmpty(roleIdList)) {
List<Long> menuIdList = sysRoleMenuService.getRoleMenuIdList(roleIdList);
if (ObjectUtil.isNotEmpty(menuIdList)) {
queryWrapper.in(SysMenu::getId, menuIdList)
.eq(SysMenu::getStatus, CommonStatusEnum.ENABLE.getCode())
.eq(SysMenu::getApplication, appCode)
.notIn(SysMenu::getType, MenuTypeEnum.BTN.getCode())
.orderByAsc(SysMenu::getSort);
} else {
//如果角色的菜单为空则查不到菜单
return CollectionUtil.newArrayList();
}
if (ObjectUtil.isNotEmpty(menuIdList)) {
queryWrapper.in(SysMenu::getId, menuIdList)
.eq(SysMenu::getStatus, CommonStatusEnum.ENABLE.getCode())
.eq(SysMenu::getApplication, appCode)
.notIn(SysMenu::getType, MenuTypeEnum.BTN.getCode())
.orderByAsc(SysMenu::getSort);
} else {
//如果角色为空则根本没菜单
//如果角色的菜单为空则查不到菜单
return CollectionUtil.newArrayList();
}
}
//查询列表
sysMenuList = this.list(queryWrapper);
//转换成登录菜单
return this.convertSysMenuToLoginMenu(sysMenuList);
return this.list(queryWrapper);
}
/**
@ -151,7 +145,8 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
* @author xuyuxiang
* @date 2020/4/17 17:53
*/
private List<LoginMenuTreeNode> convertSysMenuToLoginMenu(List<SysMenu> sysMenuList) {
@Override
public List<LoginMenuTreeNode> convertSysMenuToLoginMenu(List<SysMenu> sysMenuList) {
List<LoginMenuTreeNode> antDesignMenuTreeNodeList = CollectionUtil.newArrayList();
sysMenuList.forEach(sysMenu -> {
LoginMenuTreeNode loginMenuTreeNode = new LoginMenuTreeNode();
@ -182,9 +177,8 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
}
@Override
public List<String> getUserMenuAppCodeList(Long userId) {
public List<String> getUserMenuAppCodeList(Long userId, List<Long> roleIdList) {
Set<String> appCodeSet = CollectionUtil.newHashSet();
List<Long> roleIdList = sysUserRoleService.getUserRoleIdList(userId);
if (ObjectUtil.isNotEmpty(roleIdList)) {
List<Long> menuIdList = sysRoleMenuService.getRoleMenuIdList(roleIdList);
@ -193,8 +187,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
LambdaQueryWrapper<SysMenu> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(SysMenu::getId, menuIdList)
.eq(SysMenu::getStatus, CommonStatusEnum.ENABLE.getCode());
this.list(queryWrapper).forEach(sysMenu -> appCodeSet.add(sysMenu.getApplication()));
appCodeSet = this.list(queryWrapper).stream().map(SysMenu::getApplication).collect(Collectors.toSet());
}
}

View File

@ -55,6 +55,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* 系统角色service接口实现类
@ -86,13 +87,13 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
LambdaQueryWrapper<SysRole> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(SysRole::getId, roleIdList).eq(SysRole::getStatus, CommonStatusEnum.ENABLE.getCode());
//根据角色id集合查询并返回结果
this.list(queryWrapper).forEach(sysRole -> {
dictList = this.list(queryWrapper).stream().map(sysRole -> {
Dict dict = Dict.create();
dict.put(CommonConstant.ID, sysRole.getId());
dict.put(CommonConstant.CODE, sysRole.getCode());
dict.put(CommonConstant.NAME, sysRole.getName());
dictList.add(dict);
});
return dict;
}).collect(Collectors.toList());
}
return dictList;
}