Browse Source

fix: 优化门户登陆逻辑

master_tdsql
hxh 11 months ago
parent
commit
f05b1d9f23
  1. 162
      shuili-admin/src/main/java/com/kms/aspect/WebLogAspect.java
  2. 231
      shuili-admin/src/main/java/com/kms/web/controller/system/SysLoginController.java
  3. 57
      shuili-admin/src/main/java/com/kms/web/utils/WaterRequestUtil.java
  4. 25
      shuili-admin/src/main/java/com/kms/web/utils/WaterResultV2.java
  5. 7
      shuili-system/src/main/java/com/kms/framework/web/service/SysPermissionService.java
  6. 35
      shuili-system/src/main/java/com/kms/system/service/SysMenuService.java

162
shuili-admin/src/main/java/com/kms/aspect/WebLogAspect.java

@ -0,0 +1,162 @@
package com.kms.aspect;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
/**
* 接口日志界面
*
* @author hxh
**/
@Aspect
@Component
@Slf4j
public class WebLogAspect implements EnvironmentAware, InitializingBean {
private boolean printResponseEnable;
private Environment environment;
/**
* 切点
*/
@Pointcut("@within(org.springframework.web.bind.annotation.RestController) || @within(org.springframework.stereotype.Controller)")
public void webLog() {
}
/**
* 环绕切面
*
* @param joinPoint ProceedingJoinPoint
* @return 结果
* @throws Throwable 异常
*/
@Around("webLog()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (servletRequestAttributes == null) {
return joinPoint.proceed();
}
HttpServletRequest request = servletRequestAttributes.getRequest();
Class<?> targetCls = joinPoint.getTarget().getClass();
MethodSignature ms = (MethodSignature) joinPoint.getSignature();
//获取目标方法上的注解指定的操作名称
Method targetMethod =
targetCls.getDeclaredMethod(
ms.getName(),
ms.getParameterTypes());
String uri = request.getRequestURI();
String httpMethod = request.getMethod();
Object requestParams = getRequestParameter(request, joinPoint);
log.info("[{}] \"{}\" begin, params:{}", httpMethod, uri,
JSON.toJSONString(requestParams));
Object result;
try {
result = joinPoint.proceed();
if (printResponseEnable) {
log.info("[{}] \"{}\" response:{}", httpMethod, uri, JSON.toJSONString(result));
}
return result;
} catch (Throwable ex) {
log.error("[{}] \"{}\" error:{}", httpMethod, uri, ex.getMessage());
throw ex;
} finally {
log.info("[{}] \"{}\" end, use time:{}ms", httpMethod, uri, System.currentTimeMillis() - startTime);
}
}
/**
* 获取请求参数
*
* @param request HttpServletRequest
* @param joinPoint JoinPoint
* @return 结果
*/
private Object getRequestParameter(HttpServletRequest request, JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
Parameter[] parameters = method.getParameters();
Map<String, Object> params = new HashMap<>(parameters.length);
//json数据
for (int i = 0; i < parameters.length; i++) {
if (isFilterObject(args[i])) {
continue;
}
RequestBody requestBody = parameters[i].getAnnotation(RequestBody.class);
if (requestBody != null) {
//一个接口只会有一个RequestBody
return args[i];
}
}
//表单提交或url拼接
Enumeration<String> paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String key = paramNames.nextElement();
params.put(key, request.getParameter(key));
}
return !params.isEmpty() ? params : null;
}
/**
* 是否需要过滤
*
* @param obj Object
* @return true or false
*/
private boolean isFilterObject(final Object obj) {
if (obj == null) {
return true;
}
Class<?> clazz = obj.getClass();
if (clazz.isArray()) {
return clazz.getComponentType().isAssignableFrom(MultipartFile.class);
} else if (Collection.class.isAssignableFrom(clazz)) {
Collection collection = (Collection) obj;
for (Object o : collection) {
return o instanceof MultipartFile;
}
} else if (Map.class.isAssignableFrom(clazz)) {
Map map = (Map) obj;
for (Object o : map.entrySet()) {
Map.Entry entry = (Map.Entry) o;
return entry.getValue() instanceof MultipartFile;
}
}
return obj instanceof MultipartFile || obj instanceof HttpServletRequest || obj instanceof HttpServletResponse;
}
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
@Override
public void afterPropertiesSet() {
printResponseEnable = environment.getProperty("sy.public.log-config.print-response", Boolean.class, false);
}
}

231
shuili-admin/src/main/java/com/kms/web/controller/system/SysLoginController.java

@ -3,7 +3,6 @@ package com.kms.web.controller.system;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.kms.common.utils.UserUtils;
@ -12,11 +11,9 @@ import com.kms.framework.manager.factory.AsyncFactory;
import com.kms.framework.web.service.SysPermissionService;
import com.kms.framework.web.service.SysPermissionService.MenuDto;
import com.kms.system.service.SysMenuService;
import com.kms.system.service.SysRoleMenuService;
import com.kms.system.service.SysRoleService;
import com.kms.system.service.SysUserService;
import com.kms.web.utils.WaterRequestUtil;
import com.kms.web.utils.WaterResult;
import com.kms.web.utils.WaterResultV2;
import com.kms.web.utils.singleDomain.SingleMenu;
import com.shuili.common.constant.Constants;
import com.shuili.common.constant.YesOrNo;
@ -28,16 +25,17 @@ import com.shuili.common.core.domain.model.LoginBody;
import com.shuili.common.core.redis.RedisCache;
import com.shuili.common.enums.UserStatus;
import com.shuili.common.exception.BaseException;
import com.shuili.common.exception.CustomException;
import com.shuili.common.mybaitsplus.BeanToWrapper;
import com.shuili.common.utils.StringUtils;
import com.shuili.common.utils.password.PasswordUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;
@ -45,13 +43,11 @@ import org.springframework.web.servlet.view.RedirectView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 登录验证
@ -167,11 +163,15 @@ public class SysLoginController extends BaseController {
if (user == null) {
return AjaxResult.error("用户未登录");
}
List<SysMenu> menus = menuService.selectMenuTreeByUserId(user.getId(), permissionService.getUserMenuFromPortal(user.getId()));
return AjaxResult.success(menuService.buildMenus(menus));
List<SysMenu> portalMenus = permissionService.getUserMenuFromPortal(user.getId());
if (CollectionUtil.isNotEmpty(portalMenus)) {
return AjaxResult.success(menuService.buildMenus(portalMenus));
} else {
List<SysMenu> menus = menuService.selectMenuTreeByUserId(user.getId());
return AjaxResult.success(menuService.buildMenus(menus));
}
}
/**
* 门户单点认证登录
*
@ -182,26 +182,68 @@ public class SysLoginController extends BaseController {
HttpServletResponse response,
@RequestParam(name = "page", required = false) String page,
@RequestParam(name = "token") String token) throws IOException {
WaterResult waterResult;
CountDownLatch countDownLatch = new CountDownLatch(1);
try {
waterResult = waterRequestUtil.authUser(token);
} catch (Exception e) {
log.error(e.getMessage());
throw new CustomException("登录失败");
CompletableFuture<List<MenuDto>> menusFuture = CompletableFuture.supplyAsync(() -> portalMenu(token));
CompletableFuture<SimpleUser> userFuture = CompletableFuture.supplyAsync(() -> innerLogin(token));
CompletableFuture.allOf(menusFuture, userFuture).join();
List<MenuDto> menus = menusFuture.join();
SimpleUser simpleUser = userFuture.join();
if (simpleUser == null) {
throw new BaseException("账号异常,登陆失败");
}
JSONObject jsonObject = JSONObject.parseObject(waterResult.getData());
String user = jsonObject.getString("user");
JSONObject userJsonObject = JSONObject.parseObject(user);
String uid = userJsonObject.getString("id");
permissionService.setUserMenuFromPortal(simpleUser.getId(), menus);
RedirectView redirectView = new RedirectView(redirect + "?token=" + simpleUser.getToken() + "&page=" + page);
return new ModelAndView(redirectView);
}
private List<MenuDto> portalMenu(String token) {
WaterResultV2<List<SingleMenu>> source = waterRequestUtil.getUserResource(token);
List<SingleMenu> sMenus = source.getData();
return sMenus.stream().flatMap(item -> {
if (item.getChildren() != null) {
return Stream.concat(Stream.of(item), item.getChildren().stream());
} else {
return Stream.of(item);
}
}).map(item -> MenuDto.builder()
.code(item.getCode())
.visible(item.getVisible().equals("1") ? "0" : "1")
.seq(item.getSeq())
.status(item.getStatus().equals("1") ? "0" : "1")
.build()).collect(Collectors.toList());
}
private SimpleUser innerLogin(String token) {
WaterResultV2<WaterRequestUtil.WaterUser> user = waterRequestUtil.authUser(token);
String uid = user.getData().getUser().getId();
QueryWrapper<SysUser> query = Wrappers.query();
query.eq("single_user_id", uid);
List<SysUser> list = userService.list(query);
if (CollectionUtil.isEmpty(list)) {
throw new CustomException("数据异常,登录失败");
return null;
}
AjaxResult ajax = AjaxResult.success();
SysUser sysUser = list.get(0);
try {
checkUser(sysUser);
} catch (Exception e) {
return null;
}
CompletableFuture<Void> loginFuture = CompletableFuture.runAsync(() -> StpUtil.login(sysUser.getId()));
CompletableFuture<Void> sectionFuture = CompletableFuture.runAsync(() -> StpUtil.getSession().set("jianwei-user", sysUser));
CompletableFuture<Void> permissionFuture = CompletableFuture.runAsync(() -> permissionService.setUserPermissionFromPortal(sysUser.getId(), user.getData().getFunctionPerms()));
CompletableFuture.allOf(loginFuture, sectionFuture, permissionFuture).join();
return new SimpleUser(sysUser.getId(), StpUtil.getTokenValue());
}
@Data
@AllArgsConstructor
@NoArgsConstructor
private static class SimpleUser {
private String id;
private String token;
}
private void checkUser(SysUser sysUser) {
if (UserStatus.DELETED.getCode().equals(sysUser.getDelFlag())) {
log.info(" :{} 已被删除.", sysUser.getUserName());
AsyncManager.me().execute(AsyncFactory.recordLogininfor(sysUser.getUserName(), Constants.LOGIN_FAIL, "账户已删除"));
@ -211,143 +253,6 @@ public class SysLoginController extends BaseController {
AsyncManager.me().execute(AsyncFactory.recordLogininfor(sysUser.getUserName(), Constants.LOGIN_FAIL, "账户已停用"));
throw new BaseException("对不起,您的账号:" + sysUser.getUserName() + " 已停用");
}
//异步执行菜单同步
executorService.submit(new RolePerms(token, waterResult, countDownLatch, sysUser.getId()));
AsyncManager.me().execute(AsyncFactory.recordLogininfor(sysUser.getUserName(), Constants.LOGIN_SUCCESS, "登录成功"));
StpUtil.login(sysUser.getId());
StpUtil.getSession().set("jianwei-user", sysUser);
String tokenValue = StpUtil.getTokenValue();
userService.updateWithReids(sysUser);
ajax.put("token", tokenValue);
ajax.put("authorization", token);
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
// if(StringUtils.isEmpty(page)){
// List<SysMenu> menus = menuService.selectMenuTreeByUserId(sysUser.getId());
// List<RouterVo> routerVos = menuService.buildMenus(menus);
// StringBuffer stringBuffer = new StringBuffer();
// for (RouterVo routerVo : routerVos) {
// stringBuffer.append("/"+routerVo.getPath());
// List<RouterVo> children = routerVo.getChildren();
// if(CollectionUtil.isEmpty(children)){
// continue;
// }else {
// RouterVo vo = children.get(0);
// List<RouterVo> childrenTwo = vo.getChildren();
// if(CollectionUtil.isEmpty(childrenTwo)){
//
// }
// }
// }
// }
RedirectView redirectView = new RedirectView(redirect + "?token=" + tokenValue + "&page=" + page);
ModelAndView modelAndView = new ModelAndView(redirectView);
return modelAndView;
}
@Autowired
SysRoleService sysRoleService;
@Autowired
SysRoleMenuService sysRoleMenuService;
@Autowired
SysMenuService sysMenuService;
ExecutorService executorService = Executors.newFixedThreadPool(5);
/**
* 根据用户token获取资源权限
*
* @param
* @return
*/
// @GetMapping("/getSingleRotes/{token}")
// public AjaxResult getSingleRotes(@PathVariable String token){
// WaterResult waterResult = waterRequestUtil.authUser(token);
// String data = waterResult.getData();
// JSONObject jsonObject = JSONObject.parseObject(data);
// List<String> functionPerms = jsonObject.getJSONArray("functionPerms").toJavaList(String.class);
// List<String> roles = jsonObject.getJSONArray("roles").toJavaList(String.class);
// QueryWrapper<SysRole> query = Wrappers.query();
// query.in("role_key",roles);
// List<SysRole> roleList = sysRoleService.list(query);
// QueryWrapper<SysMenu> menuQueryWrapper = Wrappers.query();
// menuQueryWrapper.in("perms",functionPerms);
// List<SysMenu> menus = sysMenuService.list(menuQueryWrapper);
//
// return AjaxResult.success(menuService.buildMenus(menus));
// }
class RolePerms implements Runnable {
private final String token;
private final WaterResult waterResult;
private final CountDownLatch countDownLatch;
private final String userId;
public RolePerms(String token, WaterResult waterResult, CountDownLatch countDownLatch, String userId) {
this.token = token;
this.waterResult = waterResult;
this.countDownLatch = countDownLatch;
this.userId = userId;
}
@Override
@Transactional
public void run() {
try {
WaterResult result = waterRequestUtil.getUserResource(token);
List<SingleMenu> singleMenus = JSONObject.parseArray(result.getData(), SingleMenu.class);
List<SingleMenu> singleAllMenus = new ArrayList<>();
setChildren(singleMenus, singleAllMenus);
String data = waterResult.getData();
JSONObject datajson = JSONObject.parseObject(data);
List<String> functionPerms = datajson.getJSONArray("functionPerms").toJavaList(String.class);
List<MenuDto> menuCode = singleAllMenus.stream().map(item -> MenuDto.builder()
.code(item.getCode())
.visible(item.getVisible().equals("1") ? "0" : "1")
.seq(item.getSeq())
.status(item.getStatus().equals("1") ? "0" : "1")
.build()).distinct().collect(Collectors.toList());
permissionService.setUserPermissionFromPortal(userId, functionPerms);
permissionService.setUserMenuFromPortal(userId, menuCode);
} catch (Exception e) {
log.error("同步菜单权限失败:" + e.getMessage());
throw e;
} finally {
countDownLatch.countDown();
}
}
}
public static void setChildren(List<SingleMenu> singleMenus, List<SingleMenu> singleAllMenus) {
if (CollectionUtil.isNotEmpty(singleMenus)) {
for (SingleMenu singleMenu : singleMenus) { //剔除掉不符合的
if (singleMenu.getVisible() != null && singleMenu.getStatus() != null) {
if (singleMenu.getStatus().equals("1")) {
singleAllMenus.add(singleMenu);
}
}
if (CollectionUtil.isNotEmpty(singleMenu.getChildren())) {
List<SingleMenu> children = singleMenu.getChildren();
for (SingleMenu child : children) {
if (singleMenu.getVisible() != null && singleMenu.getStatus() != null) {
if (singleMenu.getStatus().equals("1")) {
singleAllMenus.add(child);
}
}
if (CollectionUtil.isNotEmpty(child.getChildren())) {
setChildren(child.getChildren(), singleAllMenus);
}
}
}
}
}
}
}

57
shuili-admin/src/main/java/com/kms/web/utils/WaterRequestUtil.java

@ -3,8 +3,12 @@ package com.kms.web.utils;
import cn.hutool.core.util.IdUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.kms.web.utils.singleDomain.SingleMenu;
import com.shuili.common.exception.CustomException;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
@ -12,6 +16,7 @@ import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@Component
public class WaterRequestUtil {
@ -195,22 +200,38 @@ public class WaterRequestUtil {
* @param authorization
* @return
*/
public WaterResult authUser(String authorization) {
log.info("--------请求统一门户用户验证,请求地址为:" + userUrl);
public WaterResultV2<WaterUser> authUser(String authorization) {
long startTime = System.currentTimeMillis();
log.info("--------请求统一门户用户验证,请求地址为:{}", userUrl);
HttpRequest get = createGet(userUrl, authUserServiceId, authUserAppsecret);
String body;
try (HttpResponse response = get.header("Authorization", authorization)
.execute()) {
body = response.body();
}
WaterResult waterResult = JSONObject.parseObject(body, WaterResult.class);
long endTime = System.currentTimeMillis();
log.info("--------请求统一门户用户验证,耗时{}毫秒,返回结果为:{}", endTime - startTime, body);
WaterResultV2<WaterUser> waterResult = JSON.parseObject(body, new TypeReference<WaterResultV2<WaterUser>>() {
});
isSuccess(waterResult);
return waterResult;
}
@Data
public static class WaterUser {
private WaterUserInfo user;
private List<String> functionPerms;
}
@Data
public static class WaterUserInfo {
private String id;
}
public WaterResult getOrgPage() {
log.info("--------请求获取门户组织信息,请求地址为:" + orgUrl);
log.info("--------请求获取门户组织信息,请求地址为:{}", orgUrl);
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("page", 1);
hashMap.put("size", 100);
@ -238,19 +259,20 @@ public class WaterRequestUtil {
}
public WaterResult getUserResource(String authorization) {
log.info("--------请求获取门户角色信息,请求地址为:" + resourceUrl);
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("systemCode", systemCode);
public WaterResultV2<List<SingleMenu>> getUserResource(String authorization) {
//计算请求消耗的时间
long startTime = System.currentTimeMillis();
log.info("--------请求获取门户用户资源信息,请求地址为:{}", resourceUrl);
HttpRequest get = createPost(resourceUrl + "?systemCode=" + systemCode, resourceServiceId, resourceAppsecret);
// HttpRequest get = createPost(resourceUrl,resourceServiceId,resourceAppsecret);
get.header("Authorization", authorization);
String body;
try (HttpResponse response = get.execute()) {
body = response.body();
}
log.info("--------请求获取门户用户资源信息,返回结果为:" + body);
WaterResult waterResult = JSONObject.parseObject(body, WaterResult.class);
long endTime = System.currentTimeMillis();
log.info("--------请求获取门户用户资源信息,耗时{}毫秒,返回结果为:{}", endTime - startTime, body);
WaterResultV2<List<SingleMenu>> waterResult = JSON.parseObject(body, new TypeReference<WaterResultV2<List<SingleMenu>>>() {
});
isSuccess(waterResult);
//{\"total\":1,\"size\":100,\"records\":[{\"area\":\"440000\",\"systemList\":[{\"area\":\"440000\",\"code\":\"sgc-jg\",\"name\":\"水工程应用-水利工程建设管理模块\",\"id\":\"1732648267643097090\"}],\"code\":\"YW00013\",\"level\":\"1d\",\"dataConfig\":\"none\",\"type\":\"BUSINESS\",\"posts\":[],\"users\":[{\"id\":\"20231225000006\"},{\"id\":\"20240119000002\"}],\"name\":\"水利工程应用-水利工程建设管理模块角色\",\"id\":\"20231213000001\",\"category\":\"BUSINESS\",\"businesses\":[{\"parent\":\"1762458920822599682\",\"businessCode\":\"YWSLGCJSGL0008\",\"parentName\":\"水利工程建设管理\",\"businessName\":\"水利工程建设管理\",\"description\":\"\",\"id\":\"1705128209926942721\",\"delFlag\":0}],\"status\":\"1\"}],\"page\":1}
return waterResult;
@ -258,7 +280,7 @@ public class WaterRequestUtil {
public WaterResult getRolePage() {
log.info("--------请求获取门户角色信息,请求地址为:" + roleUrl);
log.info("--------请求获取门户角色信息,请求地址为:{}", roleUrl);
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("page", 1);
hashMap.put("size", 100);
@ -277,7 +299,7 @@ public class WaterRequestUtil {
public WaterResult usersPage() {
log.info("--------请求获取门户用户信息,请求地址为:" + usersUrl);
log.info("--------请求获取门户用户信息,请求地址为:{}", usersUrl);
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("page", 1);
hashMap.put("size", 100);
@ -303,5 +325,14 @@ public class WaterRequestUtil {
}
}
private void isSuccess(WaterResultV2<?> waterResult) {
if (waterResult == null) {
throw new CustomException("请求异常");
}
if (waterResult.getCode() != 200 || !waterResult.getSuccess()) {
throw new CustomException("请求失败,原因:" + waterResult.getMessage());
}
}
}

25
shuili-admin/src/main/java/com/kms/web/utils/WaterResultV2.java

@ -0,0 +1,25 @@
package com.kms.web.utils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassName: WaterResultV2
* @Description: TODO
* @Date: 2024/6/1 上午12:27
* *
* @author: hxh
* @version: 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WaterResultV2<T> {
private int code;
private String message;
private Boolean success;
private T data;
private String timestamp;
}

7
shuili-system/src/main/java/com/kms/framework/web/service/SysPermissionService.java

@ -12,6 +12,7 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.function.Function;
@ -102,10 +103,16 @@ public class SysPermissionService {
}
public void setUserPermissionFromPortal(String userId, List<String> perms) {
if (CollectionUtils.isEmpty(perms)) {
return;
}
redisCache.setCacheObject(permsKey(userId), perms);
}
public void setUserMenuFromPortal(String userId, List<MenuDto> menus) {
if (CollectionUtils.isEmpty(menus)) {
return;
}
redisCache.setCacheObject(menusKey(userId), menus);
}

35
shuili-system/src/main/java/com/kms/system/service/SysMenuService.java

@ -16,9 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 菜单 业务层处理
@ -103,39 +101,6 @@ public class SysMenuService extends BaseService<SysMenuMapper, SysMenu> {
return getChildPerms(menus, "0");
}
public List<SysMenu> selectMenuTreeByUserId(String userId, List<SysMenu> menuList) {
List<SysMenu> menus;
if ("1".equals(userId)) {
menus = menuMapper.selectMenuTreeAll();
} else {
menus = menuMapper.selectMenuTreeByUserId(userId);
}
if (menus != null) {
return getChildPerms(unionMenu(menus, menuList), "0");
} else {
return Collections.emptyList();
}
}
//菜单取并集
private List<SysMenu> unionMenu(List<SysMenu> menuList, List<SysMenu> menus) {
return Stream.concat(menuList.stream(), menus.stream())
.collect(Collectors.toMap(SysMenu::getId, Function.identity(), (o1, o2) -> {
if (o1.getIsMain()) {
return o1;
}
if (o2.getIsMain()) {
return o2;
}
return o1;
}))
.values()
.stream()
.filter(item -> item.getStatus().equals("0"))
.collect(Collectors.toList());
}
/**
* 根据角色ID查询菜单树信息
*

Loading…
Cancel
Save