diff --git a/epmet-admin/epmet-admin-client/src/main/java/com/epmet/dto/form/CorsConfigFormDTO.java b/epmet-admin/epmet-admin-client/src/main/java/com/epmet/dto/form/CorsConfigFormDTO.java new file mode 100644 index 0000000000..18668f87fe --- /dev/null +++ b/epmet-admin/epmet-admin-client/src/main/java/com/epmet/dto/form/CorsConfigFormDTO.java @@ -0,0 +1,37 @@ +package com.epmet.dto.form; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CorsConfigFormDTO { + + public interface Add {} + public interface Update {} + + @NotBlank(message = "ID不能为空", groups = { Update.class }) + private String id; + + /** + * 首部type + */ + @NotBlank(message = "首部类型不能为空", groups = { Add.class, Update.class }) + private String headerType; + + /** + * 首部value + */ + @NotBlank(message = "首部值不能为空", groups = { Add.class, Update.class }) + private String headerValue; + + /** + * 备注 + */ + private String comment; + +} diff --git a/epmet-admin/epmet-admin-client/src/main/java/com/epmet/dto/result/CorsConfigResultDTO.java b/epmet-admin/epmet-admin-client/src/main/java/com/epmet/dto/result/CorsConfigResultDTO.java new file mode 100644 index 0000000000..828e2998ae --- /dev/null +++ b/epmet-admin/epmet-admin-client/src/main/java/com/epmet/dto/result/CorsConfigResultDTO.java @@ -0,0 +1,27 @@ +package com.epmet.dto.result; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CorsConfigResultDTO { + + private String id; + /** + * 首部类型 + */ + private String headerType; + + /** + * 首部值 + */ + private String headerValue; + + /** + * 首部备注 + */ + private String comment; +} diff --git a/epmet-admin/epmet-admin-client/src/main/java/com/epmet/feign/EpmetAdminOpenFeignClient.java b/epmet-admin/epmet-admin-client/src/main/java/com/epmet/feign/EpmetAdminOpenFeignClient.java new file mode 100644 index 0000000000..e1b48a9186 --- /dev/null +++ b/epmet-admin/epmet-admin-client/src/main/java/com/epmet/feign/EpmetAdminOpenFeignClient.java @@ -0,0 +1,24 @@ +package com.epmet.feign; + +import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.result.CorsConfigResultDTO; +import com.epmet.feign.fallback.EpmetAdminOpenFeignClientFallback; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; + +import java.util.List; + +@FeignClient(name = ServiceConstant.EPMET_ADMIN_SERVER, fallback = EpmetAdminOpenFeignClientFallback.class) +//@FeignClient(name = ServiceConstant.EPMET_ADMIN_SERVER, fallback = EpmetAdminOpenFeignClientFallback.class, url = "localhost:8082") +public interface EpmetAdminOpenFeignClient { + + /** + * @Description 查询跨域配置列表 + * @return + * @author wxz + * @date 2021.06.25 10:00 + */ + @PostMapping("/sys/cors-config/list") + Result> list(); +} diff --git a/epmet-admin/epmet-admin-client/src/main/java/com/epmet/feign/fallback/EpmetAdminOpenFeignClientFallback.java b/epmet-admin/epmet-admin-client/src/main/java/com/epmet/feign/fallback/EpmetAdminOpenFeignClientFallback.java new file mode 100644 index 0000000000..72edce3446 --- /dev/null +++ b/epmet-admin/epmet-admin-client/src/main/java/com/epmet/feign/fallback/EpmetAdminOpenFeignClientFallback.java @@ -0,0 +1,18 @@ +package com.epmet.feign.fallback; + +import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.utils.ModuleUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.result.CorsConfigResultDTO; +import com.epmet.feign.EpmetAdminOpenFeignClient; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class EpmetAdminOpenFeignClientFallback implements EpmetAdminOpenFeignClient { + @Override + public Result> list() { + return ModuleUtils.feignConError(ServiceConstant.EPMET_USER_SERVER, "list", null); + } +} diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/controller/CorsConfigController.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/controller/CorsConfigController.java new file mode 100644 index 0000000000..6ccf102354 --- /dev/null +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/controller/CorsConfigController.java @@ -0,0 +1,70 @@ +package com.epmet.controller; + +import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.dto.form.CorsConfigFormDTO; +import com.epmet.dto.result.CorsConfigResultDTO; +import com.epmet.service.CorsConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("cors-config") +public class CorsConfigController { + + @Autowired + private CorsConfigService corsConfigService; + + /** + * @Description 查询跨域配置列表 + * @return + * @author wxz + * @date 2021.06.25 10:00 + */ + @PostMapping("/list") + public Result> list() { + List list = corsConfigService.list(); + return new Result>().ok(list); + } + + /** + * @Description 添加跨域配置 + * @return + * @author wxz + * @date 2021.06.25 13:51 + */ + @PostMapping("/add") + public Result addConfig(@RequestBody CorsConfigFormDTO input) { + ValidatorUtils.validateEntity(input, CorsConfigFormDTO.Add.class); + CorsConfigResultDTO data = corsConfigService.addConfig(input.getHeaderType(), input.getHeaderValue(), input.getComment()); + return new Result().ok(data); + } + + /** + * @Description 通过id删除配置 + * @return + * @author wxz + * @date 2021.06.25 14:18 + */ + @PostMapping("/delete/{id}") + public Result deleteConfigById(@PathVariable("id") String configId) { + corsConfigService.deleteById(configId); + return new Result<>(); + } + + /** + * @Description 根据id更新 + * @return + * @author wxz + * @date 2021.06.25 14:23 + */ + @PostMapping("/update") + public Result updateById(@RequestBody CorsConfigFormDTO input) { + ValidatorUtils.validateEntity(input, CorsConfigFormDTO.Update.class); + corsConfigService.updateById(input.getId(), input.getHeaderType(), input.getHeaderValue(), input.getComment()); + return new Result<>(); + } + +} diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/dao/CorsConfigDao.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/dao/CorsConfigDao.java new file mode 100644 index 0000000000..0b6c499833 --- /dev/null +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/dao/CorsConfigDao.java @@ -0,0 +1,33 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

+ * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + *

+ * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + *

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.dao; + +import com.epmet.commons.mybatis.dao.BaseDao; +import com.epmet.entity.CorsConfigEntity; +import org.apache.ibatis.annotations.Mapper; + +/** + * 跨域配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-06-25 + */ +@Mapper +public interface CorsConfigDao extends BaseDao { + +} \ No newline at end of file diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/entity/CorsConfigEntity.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/entity/CorsConfigEntity.java new file mode 100644 index 0000000000..0a717f1c50 --- /dev/null +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/entity/CorsConfigEntity.java @@ -0,0 +1,56 @@ +/** + * Copyright 2018 人人开源 https://www.renren.io + *

+ * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + *

+ * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + *

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.epmet.entity; + +import com.baomidou.mybatisplus.annotation.TableName; + +import com.epmet.commons.mybatis.entity.BaseEpmetEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 跨域配置表 + * + * @author generator generator@elink-cn.com + * @since v1.0.0 2021-06-25 + */ +@Data +@EqualsAndHashCode(callSuper=false) +@TableName("cors_config") +public class CorsConfigEntity extends BaseEpmetEntity { + + private static final long serialVersionUID = 1L; + + /** + * 首部类型 + */ + private String headerType; + + /** + * 首部值 + */ + private String headerValue; + + /** + * 说明 + */ + private String comment; + +} diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/CorsConfigService.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/CorsConfigService.java new file mode 100644 index 0000000000..93a6b358a3 --- /dev/null +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/CorsConfigService.java @@ -0,0 +1,20 @@ +package com.epmet.service; + +import com.epmet.dto.result.CorsConfigResultDTO; + +import java.util.List; + +/** + * @Description 跨域配置service接口 + * @author wxz + * @date 2021-06-44 09:52:44 +*/ +public interface CorsConfigService { + List list(); + + CorsConfigResultDTO addConfig(String headerType, String headerValue, String comment); + + void deleteById(String configId); + + void updateById(String configId, String headerType, String headerValue, String comment); +} diff --git a/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/impl/CorsConfigServiceImpl.java b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/impl/CorsConfigServiceImpl.java new file mode 100644 index 0000000000..2441882ea3 --- /dev/null +++ b/epmet-admin/epmet-admin-server/src/main/java/com/epmet/service/impl/CorsConfigServiceImpl.java @@ -0,0 +1,110 @@ +package com.epmet.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.ExceptionUtils; +import com.epmet.commons.tools.exception.RenException; +import com.epmet.commons.tools.redis.RedisKeys; +import com.epmet.commons.tools.utils.ConvertUtils; +import com.epmet.dao.CorsConfigDao; +import com.epmet.dto.result.CorsConfigResultDTO; +import com.epmet.entity.CorsConfigEntity; +import com.epmet.service.CorsConfigService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Description 跨域配置 + * @author wxz + * @date 2021.06.25 09:53:57 +*/ +@Service +public class CorsConfigServiceImpl implements CorsConfigService { + + @Autowired + private CorsConfigDao corsConfigDao; + + @Autowired + private RedisTemplate redisTemplate; + + private Logger logger = LoggerFactory.getLogger(getClass()); + + /** + * @Description 查询配置列表 + * @return + * @author wxz + * @date 2021.06.25 09:58 + */ + @Override + public List list() { + LambdaQueryWrapper conditions = new LambdaQueryWrapper<>(); + return ConvertUtils.sourceToTarget(corsConfigDao.selectList(conditions), CorsConfigResultDTO.class); + } + + @Override + public CorsConfigResultDTO addConfig(String headerType, String headerValue, String comment) { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(CorsConfigEntity::getHeaderType, headerType.trim()); + w.eq(CorsConfigEntity::getHeaderValue, headerValue.trim()); + if (corsConfigDao.selectCount(w) > 0) { + throw new RenException(EpmetErrorCode.OPER_CORS_CONFIG_ERROR.getCode(), "已存在该跨域配置,请勿重复添加"); + } + + CorsConfigEntity insert = new CorsConfigEntity(); + insert.setHeaderType(headerType); + insert.setHeaderValue(headerValue); + insert.setComment(comment); + if (corsConfigDao.insert(insert) == 0) { + throw new RenException(EpmetErrorCode.OPER_CORS_CONFIG_ERROR.getCode(), "插入跨域配置出错"); + } + + deleteFromRedis(); + return new CorsConfigResultDTO(insert.getId(), headerType, headerValue, comment); + } + + @Override + public void deleteById(String configId) { + if (corsConfigDao.deleteById(configId) == 0) { + String msg = "删除出错,不存在该项数据"; + throw new RenException(EpmetErrorCode.OPER_CORS_CONFIG_ERROR.getCode(), msg, msg, RenException.MessageMode.CODE_INTERNAL_EXTERNAL); + } + deleteFromRedis(); + } + + @Override + public void updateById(String configId, String headerType, String headerValue, String comment) { + CorsConfigEntity exists = corsConfigDao.selectById(configId); + if (exists == null) { + String msg = "该项数据不存在"; + throw new RenException(EpmetErrorCode.OPER_CORS_CONFIG_ERROR.getCode(), msg, msg, RenException.MessageMode.CODE_INTERNAL_EXTERNAL); + } + exists.setHeaderType(headerType); + exists.setHeaderValue(headerValue); + exists.setComment(comment); + if (corsConfigDao.updateById(exists) == 0) { + throw new RenException(EpmetErrorCode.OPER_CORS_CONFIG_ERROR.getCode(), "更新出错,影响条数为0"); + } + deleteFromRedis(); + } + + /** + * @Description 从缓存中删除 + * @return + * @author wxz + * @date 2021.06.25 14:26 + */ + private void deleteFromRedis() { + try { + redisTemplate.delete(RedisKeys.getCorsConfigKey()); + } catch (Exception e) { + String errorMsg = ExceptionUtils.getErrorStackTrace(e); + logger.error(String.format("从Redis中删除Cors跨域信息失败,程序继续执行。错误信息:%s", errorMsg)); + } + } +} diff --git a/epmet-admin/epmet-admin-server/src/main/resources/db/migration/V0.0.5__cors_config_tbl.sql b/epmet-admin/epmet-admin-server/src/main/resources/db/migration/V0.0.5__cors_config_tbl.sql new file mode 100644 index 0000000000..f240aff0bc --- /dev/null +++ b/epmet-admin/epmet-admin-server/src/main/resources/db/migration/V0.0.5__cors_config_tbl.sql @@ -0,0 +1,13 @@ +CREATE TABLE `cors_config` ( + `ID` varchar(64) NOT NULL, + `HEADER_TYPE` varchar(32) NOT NULL COMMENT '首部类型', + `HEADER_VALUE` varchar(128) NOT NULL COMMENT '首部值', + `COMMENT` varchar(512) DEFAULT NULL COMMENT '说明', + `DEL_FLAG` int(11) NOT NULL DEFAULT '0' COMMENT '删除标识 0.未删除 1.已删除', + `REVISION` int(11) NOT NULL COMMENT '乐观锁', + `CREATED_BY` varchar(32) NOT NULL COMMENT '创建人', + `CREATED_TIME` datetime NOT NULL COMMENT '创建时间', + `UPDATED_BY` varchar(32) NOT NULL COMMENT '更新人', + `UPDATED_TIME` datetime NOT NULL COMMENT '更新时间', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='跨域配置表' \ No newline at end of file diff --git a/epmet-admin/epmet-admin-server/src/main/resources/mapper/CorsConfigDao.xml b/epmet-admin/epmet-admin-server/src/main/resources/mapper/CorsConfigDao.xml new file mode 100644 index 0000000000..36201beb73 --- /dev/null +++ b/epmet-admin/epmet-admin-server/src/main/resources/mapper/CorsConfigDao.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java index 86edad6f0b..2538492bb8 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/exception/EpmetErrorCode.java @@ -128,6 +128,7 @@ public enum EpmetErrorCode { USER_LIST_ROLES_BY_KEY_FAIL(8715, "根据角色key查询角色列表失败"), OPER_UPLOAD_IMG_TYPE_ERROR(8716, "请上传PNG格式的图片"), OPER_UPLOAD_IMG_SIZE_ERROR(8717, "请上传200*200的图片"), + OPER_CORS_CONFIG_ERROR(8718, "跨域配置错误"), // 党建声音 前端提示 88段 DRAFT_CONTENT_IS_NULL(8801, "至少需要添加一个段落"), diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java index 0dfa22915c..68c417c580 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java @@ -459,4 +459,14 @@ public class RedisKeys { String currentMonth= DateUtils.getBeforeNMonth(NumConstant.ZERO); return "groupread:user:".concat(currentMonth).concat(":").concat(source).concat(":").concat(groupId).concat(":").concat(sourceId); } + + /** + * @Description 跨域配置key + * @return + * @author wxz + * @date 2021.06.25 10:31 + */ + public static String getCorsConfigKey() { + return rootPrefix.concat("sys:cors"); + } } diff --git a/epmet-gateway/pom.xml b/epmet-gateway/pom.xml index b89bc59c0e..6d62b56d53 100644 --- a/epmet-gateway/pom.xml +++ b/epmet-gateway/pom.xml @@ -81,6 +81,11 @@ epmet-commons-openapi 2.0.0 + + com.epmet + epmet-admin-client + 2.0.0 + diff --git a/epmet-gateway/src/main/java/com/epmet/bean/CorsConfigCache.java b/epmet-gateway/src/main/java/com/epmet/bean/CorsConfigCache.java new file mode 100644 index 0000000000..3a44510959 --- /dev/null +++ b/epmet-gateway/src/main/java/com/epmet/bean/CorsConfigCache.java @@ -0,0 +1,21 @@ +package com.epmet.bean; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @Description 跨域配置缓存 + * @author wxz + * @date 2021.06.25 10:59:44 +*/ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CorsConfigCache { + + private List accessControlAllowOrigins; + +} diff --git a/epmet-gateway/src/main/java/com/epmet/config/CorsConfig.java b/epmet-gateway/src/main/java/com/epmet/config/CorsConfig.java index ffec185a98..bb95213c1f 100644 --- a/epmet-gateway/src/main/java/com/epmet/config/CorsConfig.java +++ b/epmet-gateway/src/main/java/com/epmet/config/CorsConfig.java @@ -1,15 +1,29 @@ /** * Copyright (c) 2018 人人开源 All rights reserved. - * + *

* https://www.renren.io - * + *

* 版权所有,侵权必究! */ package com.epmet.config; +import com.epmet.bean.CorsConfigCache; +import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.exception.EpmetErrorCode; +import com.epmet.commons.tools.exception.ExceptionUtils; +import com.epmet.commons.tools.feign.ResultDataResolver; +import com.epmet.commons.tools.redis.RedisKeys; +import com.epmet.dto.result.CorsConfigResultDTO; +import com.epmet.feign.EpmetAdminOpenFeignClient; +import org.apache.commons.collections4.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; @@ -21,6 +35,11 @@ import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebFilterChain; import reactor.core.publisher.Mono; +import javax.annotation.Resource; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + /** * Cors跨域 * @@ -29,33 +48,105 @@ import reactor.core.publisher.Mono; */ @Configuration public class CorsConfig { - private static final String MAX_AGE = "18000L"; @Bean public WebFilter corsFilter() { - return (ServerWebExchange ctx, WebFilterChain chain) -> { - ServerHttpRequest request = ctx.getRequest(); - if (!CorsUtils.isCorsRequest(request)) { - return chain.filter(ctx); - } - HttpHeaders requestHeaders = request.getHeaders(); - ServerHttpResponse response = ctx.getResponse(); - HttpMethod requestMethod = requestHeaders.getAccessControlRequestMethod(); - HttpHeaders headers = response.getHeaders(); + return new EpmetWebFilter(); + } +} + +/** + * @Description 用于CORS等操作的判断 + * @return + * @author wxz + * @date 2021.06.25 10:42 + */ +class EpmetWebFilter implements WebFilter, ResultDataResolver { + + private static final String MAX_AGE = "18000L"; + + @Autowired + private EpmetAdminOpenFeignClient adminOpenFeignClient; + + @Resource + private RedisTemplate redisTemplate; + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @Override + public Mono filter(ServerWebExchange ctx, WebFilterChain chain) { + ServerHttpRequest request = ctx.getRequest(); + if (!CorsUtils.isCorsRequest(request)) { + return chain.filter(ctx); + } + HttpHeaders requestHeaders = request.getHeaders(); + ServerHttpResponse response = ctx.getResponse(); + HttpMethod requestMethod = requestHeaders.getAccessControlRequestMethod(); + HttpHeaders headers = response.getHeaders(); + if (isAllowed(requestHeaders.getOrigin())) { headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, requestHeaders.getOrigin()); - headers.addAll(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, requestHeaders.getAccessControlRequestHeaders()); - if (requestMethod != null) { - headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, requestMethod.name()); + } + headers.addAll(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, requestHeaders.getAccessControlRequestHeaders()); + if (requestMethod != null) { + headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, requestMethod.name()); + } + headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"); + headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*"); + headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, MAX_AGE); + if (request.getMethod() == HttpMethod.OPTIONS) { + response.setStatusCode(HttpStatus.OK); + return Mono.empty(); + } + return chain.filter(ctx); + } + + /** + * @Description 是否允许跨域 + * @return + * @author wxz + * @date 2021.06.25 10:43 + */ + private Boolean isAllowed(String origin) { + HashOperations> ope = redisTemplate.opsForHash(); + Map> configMap = ope.entries(RedisKeys.getCorsConfigKey()); + + if (configMap == null || configMap.size() == 0) { + List data = null; + try { + data = getResultDataOrThrowsException( + adminOpenFeignClient.list(), + ServiceConstant.EPMET_ADMIN_SERVER, + EpmetErrorCode.SERVER_ERROR.getCode(), + "调用Admin服务查询Cors配置失败"); + } catch (Exception e) { + logger.error("调用Admin服务查询Cors配置失败"); } - headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"); - headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*"); - headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, MAX_AGE); - if (request.getMethod() == HttpMethod.OPTIONS) { - response.setStatusCode(HttpStatus.OK); - return Mono.empty(); + + // 将origin集合 + List origins = data.stream() + .filter((c) -> HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN.equals(c.getHeaderType())) + .map((c) -> c.getHeaderValue()) + .collect(Collectors.toList()); + + try { + configMap.put(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, origins); + ope.putAll(RedisKeys.getCorsConfigKey(), configMap); + } catch (Exception e) { + logger.error(String.format("gateway缓存跨域配置出错:%s", ExceptionUtils.getErrorStackTrace(e))); } - return chain.filter(ctx); - }; - } + } -} + List accessControlAllowOrigins = configMap.get(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN); + + logger.info("accessControlAllowOrigins:" + accessControlAllowOrigins); + logger.info("origin:" + origin); + + if (CollectionUtils.isEmpty(accessControlAllowOrigins)) { + return false; + } + if (accessControlAllowOrigins.contains("*")) { + return true; + } + return accessControlAllowOrigins.contains(origin); + } +} \ No newline at end of file diff --git a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/EpmetUserServiceImpl.java b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/EpmetUserServiceImpl.java index 2ebc6b4613..175525d16d 100644 --- a/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/EpmetUserServiceImpl.java +++ b/epmet-module/data-aggregator/data-aggregator-server/src/main/java/com/epmet/dataaggre/service/epmetuser/impl/EpmetUserServiceImpl.java @@ -7,7 +7,6 @@ import com.epmet.dataaggre.constant.DataSourceConstant; import com.epmet.dataaggre.dao.epmetuser.StaffPatrolRecordDao; import com.epmet.dataaggre.dao.epmetuser.StaffRoleDao; import com.epmet.dataaggre.dao.epmetuser.UserBaseInfoDao; -import com.epmet.dataaggre.dto.datastats.result.SubAgencyUserResultDTO; import com.epmet.dataaggre.dto.epmetuser.StaffPatrolDetailDTO; import com.epmet.dataaggre.dto.epmetuser.StaffPatrolRecordDTO; import com.epmet.dataaggre.dto.epmetuser.form.PatrolDateListFormDTO; @@ -21,9 +20,7 @@ import com.epmet.dataaggre.service.epmetuser.StaffPatrolDetailService; import com.epmet.dataaggre.service.epmetuser.StaffPatrolRecordService; import com.epmet.dataaggre.service.govorg.GovOrgService; import lombok.extern.slf4j.Slf4j; -import oracle.sql.NUMBER; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -78,6 +75,7 @@ public class EpmetUserServiceImpl implements EpmetUserService { /** * @Param formDTO * @Description 001、各人员巡查记录列表查询 + * @remark 因为是yi以人为单位的数据 所以要内存分页 * @author sun */ @Override diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenIndexDataMonthlyDao.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenIndexDataMonthlyDao.java index abb857fb14..976c3c85b4 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenIndexDataMonthlyDao.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenIndexDataMonthlyDao.java @@ -47,7 +47,9 @@ public interface ScreenIndexDataMonthlyDao{ * @author zxc * @date 2020/8/20 9:02 上午 */ - List selectMonthBarchart(@Param("agencyId")String agencyId,@Param("monthId") String monthId); + List selectMonthBarchart(@Param("agencyId")String agencyId, + @Param("monthId") String monthId, + @Param("customerId")String customerId); /** * @param subAgencyIndexRankFormDTO diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenIndexDataYearlyDao.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenIndexDataYearlyDao.java index 4300b76ea3..6735487317 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenIndexDataYearlyDao.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/dao/evaluationindex/screen/ScreenIndexDataYearlyDao.java @@ -40,7 +40,7 @@ public interface ScreenIndexDataYearlyDao{ * @author zxc * @date 2020/8/19 3:43 下午 */ - YearAverageIndexResultDTO selectYearAverageIndex(@Param("agencyId")String agencyId); + YearAverageIndexResultDTO selectYearAverageIndex(@Param("agencyId")String agencyId,@Param("customerId")String customerId); /** * 5、下级部门指数排行(安宁数据段用) - 年 diff --git a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/IndexServiceImpl.java b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/IndexServiceImpl.java index 12c470cd25..993c590f05 100644 --- a/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/IndexServiceImpl.java +++ b/epmet-module/data-report/data-report-server/src/main/java/com/epmet/datareport/service/evaluationindex/screen/impl/IndexServiceImpl.java @@ -53,7 +53,7 @@ public class IndexServiceImpl implements IndexService { @DataSource(value = DataSourceConstant.EVALUATION_INDEX,datasourceNameFromArg = true) @Override public YearAverageIndexResultDTO yearAverageIndex(YearAverageIndexFormDTO yearAverageIndexFormDTO) { - YearAverageIndexResultDTO yearAverageIndexResultDTO = screenIndexDataYearlyDao.selectYearAverageIndex(yearAverageIndexFormDTO.getAgencyId()); + YearAverageIndexResultDTO yearAverageIndexResultDTO = screenIndexDataYearlyDao.selectYearAverageIndex(yearAverageIndexFormDTO.getAgencyId(),yearAverageIndexFormDTO.getCustomerId()); if (null == yearAverageIndexResultDTO){ return new YearAverageIndexResultDTO(); } @@ -119,7 +119,9 @@ public class IndexServiceImpl implements IndexService { result.setXAxis(partyMemberLeadServiceImpl.getXPro()); } // 2. 查询近一年的指数值【包括本月】 - List monthBarchartResults = screenIndexDataMonthlyDao.selectMonthBarchart(monthBarchartFormDTO.getAgencyId(),monthBarchartFormDTO.getMonthId()); + List monthBarchartResults = screenIndexDataMonthlyDao.selectMonthBarchart(monthBarchartFormDTO.getAgencyId(), + monthBarchartFormDTO.getMonthId(), + monthBarchartFormDTO.getCustomerId()); if (monthBarchartResults.size() == NumConstant.ZERO){ for (int i = NumConstant.ZERO; i <= NumConstant.TWELVE; i++) { serviceAbilityData.add(NumConstant.ZERO_DOT_ZERO); @@ -233,8 +235,10 @@ public class IndexServiceImpl implements IndexService { subAgencyIndexRankFormDTO.setYearId(String.valueOf(yearId)); List subAgencyIndexRankResultDTOS = new ArrayList<>(); if (StringUtils.isNotEmpty(subAgencyIndexRankFormDTO.getAreaCode())){ + //area_code不为空,多客户 subAgencyIndexRankResultDTOS = screenIndexDataMonthlyDao.selectSubAgencyIndexRankNew(subAgencyIndexRankFormDTO); }else { + //单客户 subAgencyIndexRankResultDTOS = screenIndexDataMonthlyDao.selectSubAgencyIndexRank(subAgencyIndexRankFormDTO); } if (CollectionUtils.isEmpty(subAgencyIndexRankResultDTOS)){ diff --git a/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenIndexDataMonthlyDao.xml b/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenIndexDataMonthlyDao.xml index 26c21cd8b1..f00cc4c23e 100644 --- a/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenIndexDataMonthlyDao.xml +++ b/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenIndexDataMonthlyDao.xml @@ -43,6 +43,9 @@ WHERE del_flag = '0' AND org_id = #{agencyId} + + and customer_id = #{customerId} + AND MONTH_ID <= #{monthId} @@ -64,6 +67,9 @@ AND parent_id = #{agencyId} AND year_id = #{yearId} AND ORG_TYPE != 'department' + + and customer_id = #{customerId} + ORDER BY index_total DESC LIMIT #{topNum} @@ -327,6 +333,9 @@ AND ca.AREA_CODE LIKE CONCAT(#{areaCode},'%') AND y.year_id = #{yearId} AND y.ORG_TYPE != 'department' + + and y.customer_id = #{customerId} + ORDER BY y.index_total DESC LIMIT #{topNum} diff --git a/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenIndexDataYearlyDao.xml b/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenIndexDataYearlyDao.xml index 4184ecd513..ad0132dd85 100644 --- a/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenIndexDataYearlyDao.xml +++ b/epmet-module/data-report/data-report-server/src/main/resources/mapper/screen/ScreenIndexDataYearlyDao.xml @@ -15,6 +15,9 @@ WHERE del_flag = '0' AND org_id = #{agencyId} + + and customer_id=#{customerId} + order by year_id desc limit 1 diff --git a/epmet-module/epmet-point/epmet-point-client/src/main/java/com/epmet/dto/InitPointRuleResultDTO.java b/epmet-module/epmet-point/epmet-point-client/src/main/java/com/epmet/dto/InitPointRuleResultDTO.java index 4f486cba66..205b69db19 100644 --- a/epmet-module/epmet-point/epmet-point-client/src/main/java/com/epmet/dto/InitPointRuleResultDTO.java +++ b/epmet-module/epmet-point/epmet-point-client/src/main/java/com/epmet/dto/InitPointRuleResultDTO.java @@ -42,4 +42,6 @@ public class InitPointRuleResultDTO implements Serializable { * 已经初始化总数 */ private Integer initedTotal; -} \ No newline at end of file + + private String InitedDetail; +} diff --git a/epmet-module/epmet-point/epmet-point-client/src/main/java/com/epmet/feign/EpmetPointOpenFeignClient.java b/epmet-module/epmet-point/epmet-point-client/src/main/java/com/epmet/feign/EpmetPointOpenFeignClient.java index 55d2970a5e..8093ad3fee 100644 --- a/epmet-module/epmet-point/epmet-point-client/src/main/java/com/epmet/feign/EpmetPointOpenFeignClient.java +++ b/epmet-module/epmet-point/epmet-point-client/src/main/java/com/epmet/feign/EpmetPointOpenFeignClient.java @@ -36,7 +36,7 @@ public interface EpmetPointOpenFeignClient { * @author sun **/ @PostMapping("/point/opback/initpointrule") - Result initPointRule(); + Result initPointRule(String customerId); /** * 获取小组积分 diff --git a/epmet-module/epmet-point/epmet-point-client/src/main/java/com/epmet/feign/fallback/EpmetPointOpenFeignClientFallback.java b/epmet-module/epmet-point/epmet-point-client/src/main/java/com/epmet/feign/fallback/EpmetPointOpenFeignClientFallback.java index a54f0b5eab..04e953edc9 100644 --- a/epmet-module/epmet-point/epmet-point-client/src/main/java/com/epmet/feign/fallback/EpmetPointOpenFeignClientFallback.java +++ b/epmet-module/epmet-point/epmet-point-client/src/main/java/com/epmet/feign/fallback/EpmetPointOpenFeignClientFallback.java @@ -10,6 +10,7 @@ import com.epmet.dto.form.GroupPointFormDTO; import com.epmet.dto.result.ResiPointDetailResultDTO; import com.epmet.feign.EpmetPointOpenFeignClient; import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RequestParam; /** * @Description @@ -25,8 +26,8 @@ public class EpmetPointOpenFeignClientFallback implements EpmetPointOpenFeignCli } @Override - public Result initPointRule() { - return ModuleUtils.feignConError(ServiceConstant.EPMET_POINT_SERVER, "initPointRule"); + public Result initPointRule(@RequestParam String customerId) { + return ModuleUtils.feignConError(ServiceConstant.EPMET_POINT_SERVER, "initPointRule",customerId); } /** diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/controller/BackDoorController.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/controller/BackDoorController.java index cbbbbeebf5..047ae55ce6 100644 --- a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/controller/BackDoorController.java +++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/controller/BackDoorController.java @@ -9,10 +9,7 @@ import com.epmet.dto.InitPointRuleResultDTO; import com.epmet.dto.form.PointRuleFormDTO; import com.epmet.service.PointRuleService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -44,12 +41,12 @@ public class BackDoorController { /** * desc:批量添加规则 * - * @param list + * @param customerId * @return */ - @PostMapping(value = "initpointrule") - public Result initPointRule() { - InitPointRuleResultDTO resultDTO = pointRuleService.initPointRule(); + @GetMapping(value = "initpointrule") + public Result initPointRule(@RequestParam(required = false) String customerId) { + InitPointRuleResultDTO resultDTO = pointRuleService.initPointRule(customerId); return new Result().ok(resultDTO); } diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/PointRuleService.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/PointRuleService.java index cd39750f34..101261fe55 100644 --- a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/PointRuleService.java +++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/PointRuleService.java @@ -69,7 +69,7 @@ public interface PointRuleService extends BaseService { **/ PointRuleEntity getByEventCodeAndCustomerId(String customerId,String eventCode); - InitPointRuleResultDTO initPointRule(); + InitPointRuleResultDTO initPointRule(String customerId); /** * 获取小组积分规则 @@ -79,4 +79,4 @@ public interface PointRuleService extends BaseService { * @return com.epmet.dto.result.GroupPointRuleResultDTO */ GroupPointRuleResultDTO getGroupRule(String customerId); -} \ No newline at end of file +} diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/PointRuleServiceImpl.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/PointRuleServiceImpl.java index 2e31394868..de0f13ac4d 100644 --- a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/PointRuleServiceImpl.java +++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/PointRuleServiceImpl.java @@ -16,7 +16,6 @@ */ package com.epmet.service.impl; - import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.epmet.common.enu.PointUnitEnum; @@ -196,14 +195,23 @@ public class PointRuleServiceImpl extends BaseServiceImpl> customerListResult = operCrmOpenFeignClient.getAllCustomerList(); - log.info("initPointRule operCrmOpenFeignClient.getAllCustomerList result:{}",JSON.toJSONString(customerListResult)); - if (!customerListResult.success() || CollectionUtils.isEmpty(customerListResult.getData())) { - throw new RenException("获取所有客户列表失败"); + List customerDTOList = null; + if (StringUtils.isBlank(customerId)){ + Result> customerListResult = operCrmOpenFeignClient.getAllCustomerList(); + log.info("initPointRule operCrmOpenFeignClient.getAllCustomerList result:{}",JSON.toJSONString(customerListResult)); + if (!customerListResult.success() || CollectionUtils.isEmpty(customerListResult.getData())) { + throw new RenException("获取所有客户列表失败"); + } + customerDTOList = customerListResult.getData(); + }else{ + customerDTOList = new ArrayList<>(); + CustomerDTO customerDTO = new CustomerDTO(); + customerDTO.setId(customerId); + customerDTOList.add(customerDTO); } - List customerDTOList = customerListResult.getData(); + //获取默认规则列表 List ruleDefaultEntities = pointRuleDefaultDao.selectList(null); if (CollectionUtils.isEmpty(ruleDefaultEntities)) { @@ -221,7 +229,7 @@ public class PointRuleServiceImpl extends BaseServiceImpl> customerRuleMap = customerRule.stream().collect(Collectors.groupingBy(PointRuleEntity :: getCustomerId)); - customerRuleMap.forEach((customerId,ruleList) -> { + customerRuleMap.forEach((cId,ruleList) -> { if(null != ruleList){ List event = new LinkedList<>(defaultEventCodeList); //取差集,event只剩下当前客户没有的积分规则 @@ -234,7 +242,7 @@ public class PointRuleServiceImpl extends BaseServiceImpl resultPoint = epmetPointOpenFeignClient.initPointRule(); + Result resultPoint = epmetPointOpenFeignClient.initPointRule(formDTO.getCustomerId()); if (!resultPoint.success()) { throw new RenException(resultPoint.getCode(), resultPoint.getInternalMsg()); }