diff --git a/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/support/DynamicRouteEndpoint.java b/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/support/DynamicRouteEndpoint.java index 8196e5deb..d6a995dac 100644 --- a/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/support/DynamicRouteEndpoint.java +++ b/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/support/DynamicRouteEndpoint.java @@ -17,6 +17,7 @@ package com.pig4cloud.pigx.gateway.support; +import cn.hutool.json.JSONObject; import com.pig4cloud.pigx.common.core.util.R; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -49,37 +50,24 @@ public class DynamicRouteEndpoint { return dynamicRouteHandler.routes(); } - /** - * 新增路由 - * - * @param route 路由定义 - * @return - */ - @PostMapping - public Mono save(@RequestBody Mono route) { - return Mono.just(new R(dynamicRouteHandler.addRoute(route))); - } - - /** - * 删除路由 - * - * @param id 路由定义ID - * @return - */ - @DeleteMapping("/{id}") - public Mono delete(@PathVariable String id) { - return Mono.just(new R(dynamicRouteHandler.deleteRoute(id))); - - } - /** * 修改路由 * - * @param routeDefinition 路由定义 + * @param routes 路由定义 * @return */ @PutMapping - public R edit(@RequestBody RouteDefinition routeDefinition) { - return new R(); + public R edit(@RequestBody JSONObject routes) { + return new R(dynamicRouteHandler.editRoutes(routes)); + } + + /** + * 回滚初始化配置 + * + * @return + */ + @GetMapping("/fallback") + public Mono fallback() { + return Mono.just(new R(dynamicRouteHandler.fallback())); } } diff --git a/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/support/DynamicRouteHandler.java b/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/support/DynamicRouteHandler.java index eb48aef46..a87e5c1cb 100644 --- a/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/support/DynamicRouteHandler.java +++ b/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/support/DynamicRouteHandler.java @@ -17,16 +17,25 @@ package com.pig4cloud.pigx.gateway.support; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import com.pig4cloud.pigx.common.core.constant.CommonConstant; +import com.pig4cloud.pigx.gateway.support.vo.RouteDefinitionVo; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.event.RefreshRoutesEvent; +import org.springframework.cloud.gateway.filter.FilterDefinition; +import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition; import org.springframework.cloud.gateway.route.RouteDefinition; import org.springframework.cloud.gateway.route.RouteDefinitionLocator; -import org.springframework.cloud.gateway.route.RouteDefinitionWriter; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.stereotype.Service; import reactor.core.publisher.Mono; +import java.net.URI; +import java.util.List; import java.util.Map; /** @@ -39,13 +48,13 @@ import java.util.Map; @Slf4j @Service public class DynamicRouteHandler implements ApplicationEventPublisherAware { - private final RouteDefinitionWriter routeDefinitionWriter; private final RouteDefinitionLocator routeDefinitionLocator; + private final RedisTemplate redisTemplate; private ApplicationEventPublisher applicationEventPublisher; - public DynamicRouteHandler(RouteDefinitionWriter routeDefinitionWriter + public DynamicRouteHandler(RedisTemplate redisTemplate , RouteDefinitionLocator routeDefinitionLocator) { - this.routeDefinitionWriter = routeDefinitionWriter; + this.redisTemplate = redisTemplate; this.routeDefinitionLocator = routeDefinitionLocator; } @@ -63,19 +72,67 @@ public class DynamicRouteHandler implements ApplicationEventPublisherAware { } /** - * 添加路由 + * 更新路由信息 * - * @param route 路由定义 + * @param routes 路由信息 * @return */ - public Mono addRoute(Mono route) { + public Mono editRoutes(JSONObject routes) { + Boolean result = redisTemplate.delete(CommonConstant.ROUTE_KEY); + log.info("清空网关路由 {} ", result); + + routes.forEach((key, value) -> { + log.info("更新路由 -> {} ->{}", key, value); + RouteDefinitionVo vo = new RouteDefinitionVo(); + Map map = (Map) value; + + Object id = map.get("id"); + if (id != null) { + vo.setId(String.valueOf(id)); + } + + Object predicates = map.get("predicates"); + if (predicates != null) { + JSONArray predicatesArray = (JSONArray) predicates; + List predicateDefinitionList = + predicatesArray.toList(PredicateDefinition.class); + vo.setPredicates(predicateDefinitionList); + } + + Object filters = map.get("filters"); + if (filters != null) { + JSONArray filtersArray = (JSONArray) filters; + List filterDefinitionList + = filtersArray.toList(FilterDefinition.class); + vo.setFilters(filterDefinitionList); + } + + Object uri = map.get("uri"); + if (uri != null) { + vo.setUri(URI.create(String.valueOf(uri))); + } + + Object order = map.get("order"); + if (order != null) { + vo.setOrder(Integer.parseInt(String.valueOf(order))); + } + + redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(RouteDefinitionVo.class)); + redisTemplate.opsForHash().put(CommonConstant.ROUTE_KEY, key, vo); + }); + log.debug("更新网关路由结束 "); this.applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this)); - return routeDefinitionWriter.save(route); + return Mono.empty(); } - public Mono deleteRoute(String id) { - this.applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this)); - return routeDefinitionWriter.delete(Mono.just(id)); + /** + * 回滚路由 + * + * @return + */ + public Mono fallback() { + this.applicationEventPublisher.publishEvent(new DynamicRouteInitEvent(this)); + return Mono.empty(); } @Override diff --git a/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/support/DynamicRouteInitEvent.java b/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/support/DynamicRouteInitEvent.java new file mode 100644 index 000000000..875cd7513 --- /dev/null +++ b/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/support/DynamicRouteInitEvent.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.gateway.support; + +import org.springframework.context.ApplicationEvent; + +/** + * @author lengleng + * @date 2018/11/5 + *

+ * 路由初始化事件 + */ +public class DynamicRouteInitEvent extends ApplicationEvent { + public DynamicRouteInitEvent(Object source) { + super(source); + } +} diff --git a/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/support/DynamicRouteInitRunner.java b/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/support/DynamicRouteInitRunner.java index ea7b6727d..6230be4d6 100644 --- a/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/support/DynamicRouteInitRunner.java +++ b/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/support/DynamicRouteInitRunner.java @@ -48,7 +48,7 @@ public class DynamicRouteInitRunner { @Async @Order - @EventListener(WebServerInitializedEvent.class) + @EventListener({WebServerInitializedEvent.class, DynamicRouteInitEvent.class}) public void initRoute() { Boolean result = redisTemplate.delete(CommonConstant.ROUTE_KEY); log.info("初始化网关路由 {} ", result); diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/MenuController.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/MenuController.java index faff502f2..78bd6f271 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/MenuController.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/MenuController.java @@ -19,7 +19,6 @@ package com.pig4cloud.pigx.admin.controller; -import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.pig4cloud.pigx.admin.api.dto.MenuTree; import com.pig4cloud.pigx.admin.api.entity.SysMenu; @@ -34,7 +33,11 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; -import java.util.*; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; /** * @author lengleng @@ -55,14 +58,13 @@ public class MenuController { public List userMenu() { // 获取符合条件得菜单 Set all = new HashSet<>(); - SecurityUtils.getRoles().forEach(roleId -> all.addAll(sysMenuService.findMenuByRoleId(roleId))); - List menuTreeList = new ArrayList<>(); - all.forEach(menuVo -> { - if (CommonConstant.MENU.equals(menuVo.getType())) { - menuTreeList.add(new MenuTree(menuVo)); - } - }); - CollUtil.sort(menuTreeList, Comparator.comparingInt(MenuTree::getSort)); + SecurityUtils.getRoles() + .forEach(roleId -> all.addAll(sysMenuService.findMenuByRoleId(roleId))); + List menuTreeList = all.stream() + .filter(menuVo -> CommonConstant.MENU.equals(menuVo.getType())) + .map(MenuTree::new) + .sorted(Comparator.comparingInt(MenuTree::getSort)) + .collect(Collectors.toList()); return TreeUtil.bulid(menuTreeList, -1); } @@ -86,12 +88,10 @@ public class MenuController { */ @GetMapping("/roleTree/{roleId}") public List roleTree(@PathVariable Integer roleId) { - List menus = sysMenuService.findMenuByRoleId(roleId); - List menuList = new ArrayList<>(); - for (MenuVO menuVo : menus) { - menuList.add(menuVo.getMenuId()); - } - return menuList; + return sysMenuService.findMenuByRoleId(roleId) + .stream() + .map(MenuVO::getMenuId) + .collect(Collectors.toList()); } /** diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/UserController.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/UserController.java index a19157876..5c1faaf0a 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/UserController.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/UserController.java @@ -110,6 +110,7 @@ public class UserController { /** * 添加用户 + * TODO 什么鬼逻辑,先删除再增加??? * * @param userDto 用户信息 * @return success/false diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysLogServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysLogServiceImpl.java index 6a66d2449..b57cb96d2 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysLogServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysLogServiceImpl.java @@ -28,8 +28,8 @@ import com.pig4cloud.pigx.common.core.constant.CommonConstant; import org.springframework.stereotype.Service; import java.time.LocalDateTime; -import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; /** *

@@ -60,18 +60,19 @@ public class SysLogServiceImpl extends ServiceImpl impleme */ @Override public Boolean insertLogs(List preLogVoList) { - List sysLogs = new ArrayList<>(); - preLogVoList.forEach(pre -> { - SysLog log = new SysLog(); - log.setType(CommonConstant.STATUS_LOCK); - log.setTitle(pre.getInfo()); - log.setException(pre.getStack()); - log.setParams(pre.getMessage()); - log.setCreateTime(LocalDateTime.now()); - log.setRequestUri(pre.getUrl()); - log.setCreateBy(pre.getUser()); - sysLogs.add(log); - }); + List sysLogs = preLogVoList.stream() + .map(pre -> { + SysLog log = new SysLog(); + log.setType(CommonConstant.STATUS_LOCK); + log.setTitle(pre.getInfo()); + log.setException(pre.getStack()); + log.setParams(pre.getMessage()); + log.setCreateTime(LocalDateTime.now()); + log.setRequestUri(pre.getUrl()); + log.setCreateBy(pre.getUser()); + return log; + }) + .collect(Collectors.toList()); return this.insertBatch(sysLogs); } } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRoleMenuServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRoleMenuServiceImpl.java index 4857eae85..021ec222e 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRoleMenuServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRoleMenuServiceImpl.java @@ -30,9 +30,9 @@ import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Service; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; /** *

@@ -64,15 +64,14 @@ public class SysRoleMenuServiceImpl extends ServiceImpl roleMenuList = new ArrayList<>(); - List menuIdList = Arrays.asList(menuIds.split(",")); - - for (String menuId : menuIdList) { - SysRoleMenu roleMenu = new SysRoleMenu(); - roleMenu.setRoleId(roleId); - roleMenu.setMenuId(Integer.valueOf(menuId)); - roleMenuList.add(roleMenu); - } + List roleMenuList = Arrays + .stream(menuIds.split(",")) + .map(menuId -> { + SysRoleMenu roleMenu = new SysRoleMenu(); + roleMenu.setRoleId(roleId); + roleMenu.setMenuId(Integer.valueOf(menuId)); + return roleMenu; + }).collect(Collectors.toList()); //清空userinfo cacheManager.getCache("user_details").clear(); diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java index 7dd1b490c..453782f8f 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java @@ -19,7 +19,6 @@ package com.pig4cloud.pigx.admin.service.impl; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.mapper.EntityWrapper; @@ -48,10 +47,10 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import java.time.LocalDateTime; -import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; /** * @author lengleng @@ -94,26 +93,22 @@ public class SysUserServiceImpl extends ServiceImpl impl UserInfo userInfo = new UserInfo(); userInfo.setSysUser(sysUser); //设置角色列表 (ID) - List roleList = sysRoleService.findRolesByUserId(sysUser.getUserId()); - List roleIds = new ArrayList<>(); - if (CollUtil.isNotEmpty(roleList)) { - roleList.forEach(sysRole -> roleIds.add(sysRole.getRoleId())); - } + List roleIds = sysRoleService.findRolesByUserId(sysUser.getUserId()) + .stream() + .map(SysRole::getRoleId) + .collect(Collectors.toList()); userInfo.setRoles(ArrayUtil.toArray(roleIds, Integer.class)); //设置权限列表(menu.permission) - Set menuVoSet = new HashSet<>(); - for (Integer roleId : roleIds) { - List menuVos = sysMenuService.findMenuByRoleId(roleId); - menuVoSet.addAll(menuVos); - } Set permissions = new HashSet<>(); - for (MenuVO menuVo : menuVoSet) { - if (StringUtils.isNotEmpty(menuVo.getPermission())) { - String permission = menuVo.getPermission(); - permissions.add(permission); - } - } + roleIds.forEach(roleId -> { + List permissionList = sysMenuService.findMenuByRoleId(roleId) + .stream() + .filter(menuVo -> StringUtils.isNotEmpty(menuVo.getPermission())) + .map(MenuVO::getPermission) + .collect(Collectors.toList()); + permissions.addAll(permissionList); + }); userInfo.setPermissions(ArrayUtil.toArray(permissions, String.class)); return userInfo; } @@ -160,7 +155,6 @@ public class SysUserServiceImpl extends ServiceImpl impl */ @Override public Boolean deleteSysUserByUsernameAndUserId(String username, Integer userId) { - sysUserMapper.deleteSysUserByUsernameAndUserId(username, userId); SysUserRole condition = new SysUserRole(); condition.setUserId(userId); @@ -257,14 +251,14 @@ public class SysUserServiceImpl extends ServiceImpl impl */ private List getChildDepts() { Integer deptId = SecurityUtils.getUser().getDeptId(); - //获取当前部门的子部门 - SysDeptRelation deptRelation = new SysDeptRelation(); - deptRelation.setAncestor(deptId); - List deptRelationList = sysDeptRelationService.selectList(new EntityWrapper<>(deptRelation)); - List deptIds = new ArrayList<>(); - deptRelationList.forEach(sysDeptRelation -> deptIds.add(sysDeptRelation.getDescendant())); - return deptIds; + SysDeptRelation condition = new SysDeptRelation(); + condition.setAncestor(deptId); + return sysDeptRelationService + .selectList(new EntityWrapper<>(condition)) + .stream() + .map(SysDeptRelation::getDescendant) + .collect(Collectors.toList()); } }