【优化】优化登录查询
This commit is contained in:
parent
44b5239f34
commit
68234a112e
@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
//如果开启了多租户功能,则设置当前登录用户的租户标识
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user