diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/endpoint/PigxTokenEndpoint.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/endpoint/PigxTokenEndpoint.java index 3473eb08c..9f762ca8e 100644 --- a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/endpoint/PigxTokenEndpoint.java +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/endpoint/PigxTokenEndpoint.java @@ -26,7 +26,6 @@ import com.pig4cloud.pigx.admin.api.entity.SysTenant; import com.pig4cloud.pigx.admin.api.feign.RemoteClientDetailsService; import com.pig4cloud.pigx.admin.api.feign.RemoteTenantService; import com.pig4cloud.pigx.admin.api.vo.TokenVO; -import com.pig4cloud.pigx.auth.support.handler.PigxAuthenticationFailureEventHandler; import com.pig4cloud.pigx.common.core.constant.CacheConstants; import com.pig4cloud.pigx.common.core.constant.CommonConstants; import com.pig4cloud.pigx.common.core.constant.SecurityConstants; @@ -55,7 +54,6 @@ import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; -import org.springframework.security.oauth2.server.resource.InvalidBearerTokenException; import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; @@ -78,8 +76,6 @@ import java.util.stream.Collectors; @RequestMapping("/token") public class PigxTokenEndpoint { - private final PigxAuthenticationFailureEventHandler authenticationFailureHandler; - private final OAuth2AuthorizationService authorizationService; private final RemoteClientDetailsService clientDetailsService; @@ -153,16 +149,14 @@ public class PigxTokenEndpoint { if (StrUtil.isBlank(token)) { httpResponse.setStatusCode(HttpStatus.UNAUTHORIZED); - this.authenticationFailureHandler.onAuthenticationFailure(request, response, - new InvalidBearerTokenException(OAuth2ErrorCodesExpand.TOKEN_MISSING)); - return R.failed(); + return R.failed(OAuth2ErrorCodesExpand.TOKEN_MISSING); } OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); // 如果令牌不存在 返回401 if (authorization == null || authorization.getAccessToken() == null) { - this.authenticationFailureHandler.onAuthenticationFailure(request, response, - new InvalidBearerTokenException(OAuth2ErrorCodesExpand.INVALID_BEARER_TOKEN)); + httpResponse.setStatusCode(HttpStatus.UNAUTHORIZED); + return R.failed(OAuth2ErrorCodesExpand.INVALID_BEARER_TOKEN); } // 获取令牌 diff --git a/pigx-common/pigx-common-bom/pom.xml b/pigx-common/pigx-common-bom/pom.xml index a11522a9a..57baabc15 100644 --- a/pigx-common/pigx-common-bom/pom.xml +++ b/pigx-common/pigx-common-bom/pom.xml @@ -18,11 +18,11 @@ 5.6.0 - 3.5.7 - 1.4.13 + 3.5.9 + 1.5.2 4.3.1 - 1.2.20 - 5.8.31 + 1.2.23 + 5.8.33 8.3.0 21.3.0.0 8.4.1.jre8 @@ -31,7 +31,7 @@ 3.0.5 2.1.0 2.2.14 - 4.6.0 + 4.6.7.B 2.9.10-17 3.0.3 4.0.1 @@ -46,7 +46,7 @@ 7.3.3 1.7.0 7.1 - 0.17.0 + 0.21.0 2.17.1 0.33.0 1.0.0 @@ -54,6 +54,7 @@ 8.7.2-jdk17-20240808 3.2.1 2.0.1 + 2.16.5 2.3 2.16.1 3.1 @@ -206,18 +207,6 @@ sensitive-word ${sensitive.word.version} - - - com.baomidou - mybatis-plus-extension - ${mybatis-plus.version} - - - - com.baomidou - mybatis-plus-spring-boot3-starter - ${mybatis-plus.version} - com.baomidou dynamic-datasource-spring-boot3-starter @@ -272,7 +261,7 @@ com.dameng - DmDialect-for-hibernate6.1 + DmDialect-for-hibernate5.3 ${dm.version} @@ -432,6 +421,18 @@ jakarta.mail ${jakarta.mail.version} + + + com.alibaba + dashscope-sdk-java + ${dashscope.version} + + + slf4j-simple + org.slf4j + + + org.dromara.sms4j @@ -505,6 +506,13 @@ pom import + + com.baomidou + mybatis-plus-bom + ${mybatis-plus.version} + pom + import + diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/RepeatBodyRequestWrapper.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/RepeatBodyRequestWrapper.java index 574b0a628..826ea7545 100644 --- a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/RepeatBodyRequestWrapper.java +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/RepeatBodyRequestWrapper.java @@ -28,6 +28,7 @@ import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; +import java.util.HashMap; import java.util.Map; /** @@ -39,13 +40,13 @@ import java.util.Map; public class RepeatBodyRequestWrapper extends HttpServletRequestWrapper { private final byte[] bodyByteArray; - private final Map parameterMap; public RepeatBodyRequestWrapper(HttpServletRequest request) { super(request); this.bodyByteArray = getByteBody(request); - this.parameterMap = super.getParameterMap(); + // 使用 HashMap 以便后续可以修改 + this.parameterMap = new HashMap<>(request.getParameterMap()); } @Override @@ -60,17 +61,17 @@ public class RepeatBodyRequestWrapper extends HttpServletRequestWrapper { return new ServletInputStream() { @Override public boolean isFinished() { - return false; + return byteArrayInputStream.available() == 0; } @Override public boolean isReady() { - return false; + return true; // 可以读取 } @Override public void setReadListener(ReadListener readListener) { - // doNoting + // doNothing } @Override @@ -84,20 +85,34 @@ public class RepeatBodyRequestWrapper extends HttpServletRequestWrapper { byte[] body = new byte[0]; try { body = StreamUtils.copyToByteArray(request.getInputStream()); - } - catch (IOException e) { + } catch (IOException e) { log.error("解析流中数据异常", e); } return body; } - /** - * 重写 getParameterMap() 方法 解决 undertow 中流被读取后,会进行标记,从而导致无法正确获取 body 中的表单数据的问题 - * @return Map parameterMap - */ @Override public Map getParameterMap() { - return this.parameterMap; + return this.parameterMap; // 返回可变的 parameterMap } + /** + * 设置新的参数映射 + * @param parameterMap 新的参数映射 + */ + public void setParameterMap(Map parameterMap) { + this.parameterMap.clear(); + this.parameterMap.putAll(parameterMap); + } + + @Override + public String getParameter(String name) { + String[] values = parameterMap.get(name); + return (values != null && values.length > 0) ? values[0] : null; + } + + @Override + public String[] getParameterValues(String name) { + return parameterMap.get(name); + } } diff --git a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java index 5d21ff151..c42d1bc24 100755 --- a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java +++ b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java @@ -40,6 +40,7 @@ import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import java.lang.reflect.Method; +import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -66,7 +67,9 @@ public class SysLogUtils { // get 参数脱敏 PigxLogProperties logProperties = SpringUtil.getBean(PigxLogProperties.class); - Map paramsMap = MapUtil.removeAny(request.getParameterMap(), + + // 修复request.getParameterMap()其他容器不允许改,tomcat会报错,当然undertow默认可以的 + Map paramsMap = MapUtil.removeAny(new HashMap<>(request.getParameterMap()), ArrayUtil.toArray(logProperties.getExcludeFields(), String.class)); sysLog.setParams(HttpUtil.toParams(paramsMap)); return sysLog; diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxTocDefaultUserDetailsServiceImpl.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxTocDefaultUserDetailsServiceImpl.java index 7e84c8064..9fbb28173 100755 --- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxTocDefaultUserDetailsServiceImpl.java +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxTocDefaultUserDetailsServiceImpl.java @@ -84,7 +84,7 @@ public class PigxTocDefaultUserDetailsServiceImpl implements PigxUserDetailsServ UserDetails getUserDetailsAppUser(R result) { // @formatter:off return RetOps.of(result) - .assertSuccess(r -> new OAuth2AuthenticationException(new OAuth2Error(OAuth2ErrorCodes.SERVER_ERROR, "用户信息获取失败",null))) + .assertSuccess(r -> new OAuth2AuthenticationException(new OAuth2Error(OAuth2ErrorCodes.SERVER_ERROR, "用户名或密码错误",null))) .getData() .map(this::convertUserDetailsAppUser) .orElseThrow(() -> new UsernameNotFoundException("用户不存在")); diff --git a/pigx-common/pigx-common-sequence/pom.xml b/pigx-common/pigx-common-sequence/pom.xml index 5f1aac3af..964e730e3 100755 --- a/pigx-common/pigx-common-sequence/pom.xml +++ b/pigx-common/pigx-common-sequence/pom.xml @@ -15,6 +15,7 @@ pigx 分布式发号器 + com.pig4cloud pigx-common-core @@ -29,21 +30,10 @@ org.anyline anyline-environment-spring-data-jdbc + org.anyline anyline-data-jdbc-mysql - - org.anyline - anyline-data-jdbc-postgresql - - - org.anyline - anyline-data-jdbc-oracle - - - org.anyline - anyline-data-jdbc-dm - diff --git a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineFlowController.java b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineFlowController.java index ac353f0c6..7a86dc0a5 100644 --- a/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineFlowController.java +++ b/pigx-flow/pigx-flow-engine/pigx-flow-engine-biz/src/main/java/com/pig4cloud/pigx/flow/engine/controller/EngineFlowController.java @@ -11,6 +11,7 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.security.annotation.Inner; import com.pig4cloud.pigx.flow.engine.utils.ModelUtil; import com.pig4cloud.pigx.flow.task.dto.*; import com.pig4cloud.pigx.flow.task.entity.Process; @@ -95,6 +96,7 @@ public class EngineFlowController { * @param processInstanceParamDto 启动参数 * @return 流程实例ID */ + @Inner @PostMapping("/start") public R start(@RequestBody ProcessInstanceParamDto processInstanceParamDto) { Authentication.setAuthenticatedUserId(processInstanceParamDto.getStartUserId()); diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteAiFlowService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowApiFlowService.java similarity index 82% rename from pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteAiFlowService.java rename to pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowApiFlowService.java index 7d5780616..e1d6e62c2 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteAiFlowService.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowApiFlowService.java @@ -18,7 +18,7 @@ import java.util.List; * @date 2023/7/14 */ @FeignClient(contextId = "remoteAiFlowService", value = ServiceNameConstants.FLOW_TASK_SERVER) -public interface RemoteAiFlowService { +public interface RemoteFlowApiFlowService { /** * 查询所有我可以发起的表单 @@ -38,7 +38,13 @@ public interface RemoteAiFlowService { R getDetail(@RequestParam("flowId") String flowId); + /** + * 启动流程实例 + * + * @param paramDto param dto + * @return {@link R } 流程实例ID {@link String} + */ @PostMapping("/process-instance/startProcessInstance") - R startProcessInstance(@RequestBody ProcessInstanceParamDto paramDto); + R startProcessInstance(@RequestBody ProcessInstanceParamDto paramDto); } diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowEngineService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowEngineService.java index 5d35945d9..670bcf3ef 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowEngineService.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowEngineService.java @@ -3,6 +3,7 @@ package com.pig4cloud.pigx.flow.task.api.feign; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.feign.annotation.NoToken; import com.pig4cloud.pigx.flow.task.dto.*; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @@ -48,6 +49,7 @@ public interface RemoteFlowEngineService { * @param processInstanceParamDto 流程实例参数 * @return 启动流程结果 */ + @NoToken @PostMapping("/flow/start") R startProcess(@RequestBody ProcessInstanceParamDto processInstanceParamDto); diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowTaskService.java b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowTaskService.java index caf7aadfc..856916d51 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowTaskService.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/java/com/pig4cloud/pigx/flow/task/api/feign/RemoteFlowTaskService.java @@ -2,6 +2,7 @@ package com.pig4cloud.pigx.flow.task.api.feign; import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.feign.annotation.NoToken; import com.pig4cloud.pigx.flow.task.dto.*; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @@ -22,6 +23,7 @@ public interface RemoteFlowTaskService { * 节点开始事件 * @param nodeRecordParamDto */ + @NoToken @PostMapping("/remote/startNodeEvent") void startNodeEvent(@RequestBody ProcessNodeRecordParamDto nodeRecordParamDto); @@ -29,6 +31,7 @@ public interface RemoteFlowTaskService { * 节点结束事件 * @param nodeRecordParamDto */ + @NoToken @PostMapping("/remote/endNodeEvent") void endNodeEvent(@RequestBody ProcessNodeRecordParamDto nodeRecordParamDto); @@ -43,6 +46,7 @@ public interface RemoteFlowTaskService { * 创建流程事件 * @param processInstanceRecordParamDto */ + @NoToken @PostMapping("/remote/createProcessEvent") void createProcessEvent(@RequestBody ProcessInstanceRecordParamDto processInstanceRecordParamDto); @@ -73,6 +77,7 @@ public interface RemoteFlowTaskService { * @param nodeId 节点id * @return */ + @NoToken @GetMapping("/processNodeData/getNodeData") R queryNodeOriData(@RequestParam("flowId") String flowId, @RequestParam("nodeId") String nodeId); @@ -80,6 +85,7 @@ public interface RemoteFlowTaskService { * 节点开始指派用户了 * @param processNodeRecordAssignUserParamDto */ + @NoToken @PostMapping("/remote/startAssignUser") R startAssignUser(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); @@ -87,6 +93,7 @@ public interface RemoteFlowTaskService { * 任务结束事件 * @param processNodeRecordAssignUserParamDto */ + @NoToken @PostMapping("/remote/taskEndEvent") R taskEndEvent(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto); diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports index d28afc491..c7b4ff957 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports @@ -1,3 +1,3 @@ com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowTaskService com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowEngineService -com.pig4cloud.pigx.flow.task.api.feign.RemoteAiFlowService +com.pig4cloud.pigx.flow.task.api.feign.RemoteFlowApiFlowService diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/pom.xml b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/pom.xml index 2a0f1c164..bf66050a9 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/pom.xml +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/pom.xml @@ -98,21 +98,6 @@ org.springframework.boot spring-boot-starter-test - - - com.dameng - DmJdbcDriver18 - - - - org.postgresql - postgresql - - - - com.oracle.database.jdbc - ojdbc8 - diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessInstanceController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessInstanceController.java index feeba5c28..d86a9058c 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessInstanceController.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessInstanceController.java @@ -1,6 +1,7 @@ package com.pig4cloud.pigx.flow.task.controller; import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.security.annotation.Inner; import com.pig4cloud.pigx.flow.task.dto.ProcessInstanceParamDto; import com.pig4cloud.pigx.flow.task.dto.TaskQueryParamDto; import com.pig4cloud.pigx.flow.task.service.IProcessInstanceService; @@ -30,6 +31,19 @@ public class ProcessInstanceController { return processInstanceService.startProcessInstance(processInstanceParamDto); } + /** + * 启动内部流程实例 + * + * @param processInstanceParamDto 进程实例参数 DTO + * @return {@link R } + */ + @Inner + @SneakyThrows + @PostMapping("startInnerProcessInstance") + public R startInnerProcessInstance(@RequestBody ProcessInstanceParamDto processInstanceParamDto) { + return processInstanceService.startProcessInstance(processInstanceParamDto); + } + /** * 查询当前登录用户的待办任务 * @param pageDto diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessNodeDataController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessNodeDataController.java index 2a5d6dce9..929ce5c0c 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessNodeDataController.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/ProcessNodeDataController.java @@ -1,6 +1,7 @@ package com.pig4cloud.pigx.flow.task.controller; import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.security.annotation.Inner; import com.pig4cloud.pigx.flow.task.dto.Node; import com.pig4cloud.pigx.flow.task.dto.ProcessNodeDataDto; import com.pig4cloud.pigx.flow.task.service.IProcessNodeDataService; @@ -38,6 +39,7 @@ public class ProcessNodeDataController { * @param nodeId * @return */ + @Inner @GetMapping("getNodeData") public R getNodeData(String flowId, String nodeId) { return processNodeDataService.getNodeData(flowId, nodeId); diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/RemoteController.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/RemoteController.java index 551a84ea8..07ce38058 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/RemoteController.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/controller/RemoteController.java @@ -1,6 +1,7 @@ package com.pig4cloud.pigx.flow.task.controller; import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.security.annotation.Inner; import com.pig4cloud.pigx.flow.task.dto.*; import com.pig4cloud.pigx.flow.task.service.IRemoteService; import lombok.RequiredArgsConstructor; @@ -17,136 +18,154 @@ import java.util.Map; @RequestMapping("/remote") public class RemoteController { - private final IRemoteService remoteService; + private final IRemoteService remoteService; - /** - * 根据角色id集合查询用户id集合 - * @param roleIdList - * @return - */ - @PostMapping("queryUserIdListByRoleIdList") - public R> queryUserIdListByRoleIdList(@RequestBody List roleIdList) { - return remoteService.queryUserIdListByRoleIdList(roleIdList); - } + /** + * 根据角色id集合查询用户id集合 + * + * @param roleIdList + * @return + */ + @PostMapping("queryUserIdListByRoleIdList") + public R> queryUserIdListByRoleIdList(@RequestBody List roleIdList) { + return remoteService.queryUserIdListByRoleIdList(roleIdList); + } - /** - * 保存抄送 - * @param copyDto - * @return - */ - @PostMapping("savecc") - public R saveCC(@RequestBody ProcessCopyDto copyDto) { - return remoteService.saveCC(copyDto); - } + /** + * 保存抄送 + * + * @param copyDto + * @return + */ + @PostMapping("savecc") + public R saveCC(@RequestBody ProcessCopyDto copyDto) { + return remoteService.saveCC(copyDto); + } - /** - * 检查是否是所有的父级 - * @param checkParentDto - * @return - */ - @PostMapping("checkIsAllParent") - public R checkIsAllParent(@RequestBody CheckParentDto checkParentDto) { - return remoteService.checkIsAllParent(checkParentDto); - } + /** + * 检查是否是所有的父级 + * + * @param checkParentDto + * @return + */ + @PostMapping("checkIsAllParent") + public R checkIsAllParent(@RequestBody CheckParentDto checkParentDto) { + return remoteService.checkIsAllParent(checkParentDto); + } - /** - * 根据部门id集合查询用户id集合 - * @param depIdList - * @return - */ - @PostMapping("queryUserIdListByDepIdList") - public R> queryUserIdListByDepIdList(@RequestBody List depIdList) { - return remoteService.queryUserIdListByDepIdList(depIdList); - } + /** + * 根据部门id集合查询用户id集合 + * + * @param depIdList + * @return + */ + @PostMapping("queryUserIdListByDepIdList") + public R> queryUserIdListByDepIdList(@RequestBody List depIdList) { + return remoteService.queryUserIdListByDepIdList(depIdList); + } - /** - * 检查是否是所有的子级 - * @param checkChildDto - * @return - */ - @PostMapping("checkIsAllChild") - public R checkIsAllChild(@RequestBody CheckChildDto checkChildDto) { - return remoteService.checkIsAllChild(checkChildDto); - } + /** + * 检查是否是所有的子级 + * + * @param checkChildDto + * @return + */ + @PostMapping("checkIsAllChild") + public R checkIsAllChild(@RequestBody CheckChildDto checkChildDto) { + return remoteService.checkIsAllChild(checkChildDto); + } - /** - * 获取用户的信息-包括扩展字段 - * @param userId - * @return - */ - @GetMapping("queryUserAllInfo") - public R> queryUserAllInfo(long userId) { - return remoteService.queryUserAllInfo(userId); - } + /** + * 获取用户的信息-包括扩展字段 + * + * @param userId + * @return + */ + @GetMapping("queryUserAllInfo") + public R> queryUserAllInfo(long userId) { + return remoteService.queryUserAllInfo(userId); + } - /** - * 开始节点事件 - * @param recordParamDto - * @return - */ - @PostMapping("startNodeEvent") - public R startNodeEvent(@RequestBody ProcessNodeRecordParamDto recordParamDto) { - return remoteService.startNodeEvent(recordParamDto); - } + /** + * 开始节点事件 + * + * @param recordParamDto + * @return + */ + @Inner + @PostMapping("/startNodeEvent") + public R startNodeEvent(@RequestBody ProcessNodeRecordParamDto recordParamDto) { + return remoteService.startNodeEvent(recordParamDto); + } - /** - * 流程创建了 - * @param processInstanceRecordParamDto - * @return - */ - @PostMapping("createProcessEvent") - public R createProcessEvent(@RequestBody ProcessInstanceRecordParamDto processInstanceRecordParamDto) { - return remoteService.createProcessEvent(processInstanceRecordParamDto); - } + /** + * 流程创建了 + * + * @param processInstanceRecordParamDto + * @return + */ + @Inner + @PostMapping("createProcessEvent") + public R createProcessEvent(@RequestBody ProcessInstanceRecordParamDto processInstanceRecordParamDto) { + return remoteService.createProcessEvent(processInstanceRecordParamDto); + } - /** - * 结束节点事件 - * @param recordParamDto - * @return - */ - @PostMapping("endNodeEvent") - public R endNodeEvent(@RequestBody ProcessNodeRecordParamDto recordParamDto) { - return remoteService.endNodeEvent(recordParamDto); - } + /** + * 结束节点事件 + * + * @param recordParamDto + * @return + */ + @Inner + @PostMapping("endNodeEvent") + public R endNodeEvent(@RequestBody ProcessNodeRecordParamDto recordParamDto) { + return remoteService.endNodeEvent(recordParamDto); + } - /** - * 开始设置执行人 - * @param processNodeRecordAssignUserParamDto - * @return - */ - @PostMapping("startAssignUser") - public R startAssignUser(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { - return remoteService.startAssignUser(processNodeRecordAssignUserParamDto); - } + /** + * 开始设置执行人 + * + * @param processNodeRecordAssignUserParamDto + * @return + */ + @Inner + @PostMapping("startAssignUser") + public R startAssignUser(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { + return remoteService.startAssignUser(processNodeRecordAssignUserParamDto); + } - /** - * 任务结束事件 - * @param processNodeRecordAssignUserParamDto - * @return - */ - @PostMapping("taskEndEvent") - public R taskEndEvent(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { - return remoteService.taskEndEvent(processNodeRecordAssignUserParamDto); - } + /** + * 任务结束事件 + * + * @param processNodeRecordAssignUserParamDto + * @return + */ + @Inner + @PostMapping("taskEndEvent") + public R taskEndEvent(@RequestBody ProcessNodeRecordAssignUserParamDto processNodeRecordAssignUserParamDto) { + return remoteService.taskEndEvent(processNodeRecordAssignUserParamDto); + } - /** - * 实例结束 - * @param processInstanceParamDto - * @return - */ - @PostMapping("endProcess") - public R endProcess(@RequestBody ProcessInstanceParamDto processInstanceParamDto) { - return remoteService.endProcess(processInstanceParamDto.getProcessInstanceId()); - } + /** + * 实例结束 + * + * @param processInstanceParamDto + * @return + */ + @PostMapping("endProcess") + public R endProcess(@RequestBody ProcessInstanceParamDto processInstanceParamDto) { + return remoteService.endProcess(processInstanceParamDto.getProcessInstanceId()); + } - /** - * 查询流程管理员 - * @param flowId - * @return - */ - @GetMapping("queryProcessAdmin") - public R queryProcessAdmin(String flowId) { - return remoteService.queryProcessAdmin(flowId); - } + /** + * 查询流程管理员 + * + * @param flowId + * @return + */ + @GetMapping("queryProcessAdmin") + public R queryProcessAdmin(String flowId) { + return remoteService.queryProcessAdmin(flowId); + } } diff --git a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceServiceImpl.java b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceServiceImpl.java index 282b655c0..2dbcdff86 100644 --- a/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceServiceImpl.java +++ b/pigx-flow/pigx-flow-task/pigx-flow-task-biz/src/main/java/com/pig4cloud/pigx/flow/task/service/impl/ProcessInstanceServiceImpl.java @@ -69,16 +69,18 @@ public class ProcessInstanceServiceImpl implements IProcessInstanceService { */ @Override public R startProcessInstance(ProcessInstanceParamDto processInstanceParamDto) { + // 如果没有传递根节点(发起人),则根据当前用户初始化一个 + if (StrUtil.isBlank(processInstanceParamDto.getStartUserId())) { + PigxUser user = SecurityUtils.getUser(); + processInstanceParamDto.setStartUserId(String.valueOf(user.getId())); + Map paramMap = processInstanceParamDto.getParamMap(); + Dict rootUser = Dict.create() + .set("id", user.getId()) + .set("name", user.getUsername()) + .set("type", NodeUserTypeEnum.USER.getKey()); + paramMap.put("root", CollUtil.newArrayList(rootUser)); + } - PigxUser user = SecurityUtils.getUser(); - - processInstanceParamDto.setStartUserId(String.valueOf(user.getId())); - Map paramMap = processInstanceParamDto.getParamMap(); - Dict rootUser = Dict.create() - .set("id", user.getId()) - .set("name", user.getUsername()) - .set("type", NodeUserTypeEnum.USER.getKey()); - paramMap.put("root", CollUtil.newArrayList(rootUser)); return flowEngineService.startProcess(processInstanceParamDto); } @@ -91,56 +93,56 @@ public class ProcessInstanceServiceImpl implements IProcessInstanceService { @Override public R queryMineTask(TaskQueryParamDto taskQueryParamDto) { taskQueryParamDto.setAssign(SecurityUtils.getUser().getId().toString()); - R> r = flowEngineService.queryAssignTask(taskQueryParamDto); + R> r = flowEngineService.queryAssignTask(taskQueryParamDto); - if (CollUtil.isEmpty(r.getData().getRecords())) { - return r; - } + if (CollUtil.isEmpty(r.getData().getRecords())) { + return r; + } - Set processInstanceIdSet = r.getData() - .getRecords() - .stream() - .map(TaskDto::getProcessInstanceId) - .collect(Collectors.toSet()); + Set processInstanceIdSet = r.getData() + .getRecords() + .stream() + .map(TaskDto::getProcessInstanceId) + .collect(Collectors.toSet()); - // 流程实例记录 - List processInstanceRecordList = processInstanceRecordService.lambdaQuery() - .in(ProcessInstanceRecord::getProcessInstanceId, processInstanceIdSet) - .list(); + // 流程实例记录 + List processInstanceRecordList = processInstanceRecordService.lambdaQuery() + .in(ProcessInstanceRecord::getProcessInstanceId, processInstanceIdSet) + .list(); - // 发起人 + // 发起人 // 发起人 List collect = processInstanceRecordList.stream().map(ProcessInstanceRecord::getUserId).collect(Collectors.toList()); List startUserList = userService.getUserById(collect).getData(); - Page pageResultDto = r.getData(); - List taskDtoList = new ArrayList<>(); - for (TaskDto record : r.getData().getRecords()) { - ProcessInstanceRecord processInstanceRecord = processInstanceRecordList.stream() - .filter(w -> StrUtil.equals(w.getProcessInstanceId(), record.getProcessInstanceId())) - .findAny() - .orElse(null); + Page pageResultDto = r.getData(); + List taskDtoList = new ArrayList<>(); + for (TaskDto record : r.getData().getRecords()) { + ProcessInstanceRecord processInstanceRecord = processInstanceRecordList.stream() + .filter(w -> StrUtil.equals(w.getProcessInstanceId(), record.getProcessInstanceId())) + .findAny() + .orElse(null); - if (processInstanceRecord != null) { - record.setProcessName(processInstanceRecord.getName()); - SysUser startUser = startUserList.stream() - .filter(w -> w.getUserId().longValue() == processInstanceRecord.getUserId()) - .findAny() - .orElse(null); + if (processInstanceRecord != null) { + record.setProcessName(processInstanceRecord.getName()); + SysUser startUser = startUserList.stream() + .filter(w -> w.getUserId().longValue() == processInstanceRecord.getUserId()) + .findAny() + .orElse(null); - record.setRootUserId(processInstanceRecord.getUserId()); - record.setGroupName(processInstanceRecord.getGroupName()); - record.setRootUserName(startUser.getUsername()); - record.setRootUserAvatarUrl(startUser.getAvatar()); - record.setStartTime(processInstanceRecord.getCreateTime()); + record.setRootUserId(processInstanceRecord.getUserId()); + record.setGroupName(processInstanceRecord.getGroupName()); + record.setRootUserName(startUser.getUsername()); + record.setRootUserAvatarUrl(startUser.getAvatar()); + record.setStartTime(processInstanceRecord.getCreateTime()); - taskDtoList.add(record); - } - } + taskDtoList.add(record); + } + } - pageResultDto.setRecords(taskDtoList); + pageResultDto.setRecords(taskDtoList); - return R.ok(pageResultDto); + return R.ok(pageResultDto); } /** diff --git a/pigx-visual/pigx-pay-platform/pom.xml b/pigx-visual/pigx-pay-platform/pom.xml index f8ed91606..ab06d6dcd 100755 --- a/pigx-visual/pigx-pay-platform/pom.xml +++ b/pigx-visual/pigx-pay-platform/pom.xml @@ -37,24 +37,6 @@ com.mysql mysql-connector-j - - - com.oracle.database.jdbc - ojdbc8 - - - - - org.postgresql - postgresql - - - - - com.dameng - DmJdbcDriver18 - - com.alibaba diff --git a/pigx-visual/pigx-xxl-job-admin/pom.xml b/pigx-visual/pigx-xxl-job-admin/pom.xml index c28929f1f..598f47231 100644 --- a/pigx-visual/pigx-xxl-job-admin/pom.xml +++ b/pigx-visual/pigx-xxl-job-admin/pom.xml @@ -12,8 +12,6 @@ jar 3.0.3 - 6.0.0 - 2.1.1 @@ -97,14 +95,12 @@ jakarta.annotation jakarta.annotation-api - ${jakarta.annotation-api.version} compile jakarta.servlet jakarta.servlet-api - ${jakarta.servlet-api.version} compile diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java index 9054e7552..c6fbe1ff1 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java +++ b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/IndexController.java @@ -1,8 +1,8 @@ package com.xxl.job.admin.controller; import com.xxl.job.admin.controller.annotation.PermissionLimit; -import com.xxl.job.admin.service.LoginService; import com.xxl.job.admin.service.XxlJobService; +import com.xxl.job.admin.service.impl.LoginService; import com.xxl.job.core.biz.model.ReturnT; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; @@ -37,7 +37,7 @@ public class IndexController { private LoginService loginService; @RequestMapping("/") - public String index(Model model, HttpServletRequest request) { + public String index(Model model) { Map dashboardMap = xxlJobService.dashboardInfo(); model.addAllAttributes(dashboardMap); diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java index e87983472..92bb17023 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java +++ b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobCodeController.java @@ -1,5 +1,6 @@ package com.xxl.job.admin.controller; +import com.xxl.job.admin.controller.interceptor.PermissionInterceptor; import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.model.XxlJobLogGlue; import com.xxl.job.admin.core.util.I18nUtil; @@ -45,7 +46,7 @@ public class JobCodeController { } // valid permission - JobInfoController.validPermission(request, jobInfo.getJobGroup()); + PermissionInterceptor.validJobGroupPermission(request, jobInfo.getJobGroup()); // Glue类型-字典 model.addAttribute("GlueTypeEnum", GlueTypeEnum.values()); @@ -57,7 +58,7 @@ public class JobCodeController { @RequestMapping("/save") @ResponseBody - public ReturnT save(Model model, int id, String glueSource, String glueRemark) { + public ReturnT save(HttpServletRequest request, int id, String glueSource, String glueRemark) { // valid if (glueRemark == null) { return new ReturnT(500, @@ -66,23 +67,26 @@ public class JobCodeController { if (glueRemark.length() < 4 || glueRemark.length() > 100) { return new ReturnT(500, I18nUtil.getString("jobinfo_glue_remark_limit")); } - XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(id); - if (exists_jobInfo == null) { + XxlJobInfo existsJobInfo = xxlJobInfoDao.loadById(id); + if (existsJobInfo == null) { return new ReturnT(500, I18nUtil.getString("jobinfo_glue_jobid_unvalid")); } - // update new code - exists_jobInfo.setGlueSource(glueSource); - exists_jobInfo.setGlueRemark(glueRemark); - exists_jobInfo.setGlueUpdatetime(new Date()); + // valid permission + PermissionInterceptor.validJobGroupPermission(request, existsJobInfo.getJobGroup()); - exists_jobInfo.setUpdateTime(new Date()); - xxlJobInfoDao.update(exists_jobInfo); + // update new code + existsJobInfo.setGlueSource(glueSource); + existsJobInfo.setGlueRemark(glueRemark); + existsJobInfo.setGlueUpdatetime(new Date()); + + existsJobInfo.setUpdateTime(new Date()); + xxlJobInfoDao.update(existsJobInfo); // log old code XxlJobLogGlue xxlJobLogGlue = new XxlJobLogGlue(); - xxlJobLogGlue.setJobId(exists_jobInfo.getId()); - xxlJobLogGlue.setGlueType(exists_jobInfo.getGlueType()); + xxlJobLogGlue.setJobId(existsJobInfo.getId()); + xxlJobLogGlue.setGlueType(existsJobInfo.getGlueType()); xxlJobLogGlue.setGlueSource(glueSource); xxlJobLogGlue.setGlueRemark(glueRemark); @@ -91,7 +95,7 @@ public class JobCodeController { xxlJobLogGlueDao.save(xxlJobLogGlue); // remove code backup more than 30 - xxlJobLogGlueDao.removeOld(exists_jobInfo.getId(), 30); + xxlJobLogGlueDao.removeOld(existsJobInfo.getId(), 30); return ReturnT.SUCCESS; } diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java index b73801e08..ec14129fc 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java +++ b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java @@ -68,7 +68,7 @@ public class JobGroupController { public ReturnT save(XxlJobGroup xxlJobGroup) { // valid - if (xxlJobGroup.getAppname() == null || xxlJobGroup.getAppname().trim().isEmpty()) { + if (xxlJobGroup.getAppname() == null || xxlJobGroup.getAppname().trim().length() == 0) { return new ReturnT(500, (I18nUtil.getString("system_please_input") + "AppName")); } if (xxlJobGroup.getAppname().length() < 4 || xxlJobGroup.getAppname().length() > 64) { @@ -77,7 +77,7 @@ public class JobGroupController { if (xxlJobGroup.getAppname().contains(">") || xxlJobGroup.getAppname().contains("<")) { return new ReturnT(500, "AppName" + I18nUtil.getString("system_unvalid")); } - if (xxlJobGroup.getTitle() == null || xxlJobGroup.getTitle().trim().isEmpty()) { + if (xxlJobGroup.getTitle() == null || xxlJobGroup.getTitle().trim().length() == 0) { return new ReturnT(500, (I18nUtil.getString("system_please_input") + I18nUtil.getString("jobgroup_field_title"))); } @@ -86,7 +86,7 @@ public class JobGroupController { I18nUtil.getString("jobgroup_field_title") + I18nUtil.getString("system_unvalid")); } if (xxlJobGroup.getAddressType() != 0) { - if (xxlJobGroup.getAddressList() == null || xxlJobGroup.getAddressList().trim().isEmpty()) { + if (xxlJobGroup.getAddressList() == null || xxlJobGroup.getAddressList().trim().length() == 0) { return new ReturnT(500, I18nUtil.getString("jobgroup_field_addressType_limit")); } if (xxlJobGroup.getAddressList().contains(">") || xxlJobGroup.getAddressList().contains("<")) { @@ -96,7 +96,7 @@ public class JobGroupController { String[] addresss = xxlJobGroup.getAddressList().split(","); for (String item : addresss) { - if (item == null || item.trim().isEmpty()) { + if (item == null || item.trim().length() == 0) { return new ReturnT(500, I18nUtil.getString("jobgroup_field_registryList_unvalid")); } } diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java index d307a4fee..9117d802d 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java +++ b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobInfoController.java @@ -1,5 +1,6 @@ package com.xxl.job.admin.controller; +import com.xxl.job.admin.controller.interceptor.PermissionInterceptor; import com.xxl.job.admin.core.exception.XxlJobException; import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobInfo; @@ -8,11 +9,8 @@ import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum; import com.xxl.job.admin.core.scheduler.MisfireStrategyEnum; import com.xxl.job.admin.core.scheduler.ScheduleTypeEnum; import com.xxl.job.admin.core.thread.JobScheduleHelper; -import com.xxl.job.admin.core.thread.JobTriggerPoolHelper; -import com.xxl.job.admin.core.trigger.TriggerTypeEnum; import com.xxl.job.admin.core.util.I18nUtil; import com.xxl.job.admin.dao.XxlJobGroupDao; -import com.xxl.job.admin.service.LoginService; import com.xxl.job.admin.service.XxlJobService; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; @@ -28,7 +26,10 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; -import java.util.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; /** * index controller @@ -62,7 +63,7 @@ public class JobInfoController { List jobGroupList_all = xxlJobGroupDao.findAll(); // filter group - List jobGroupList = filterJobGroupByRole(request, jobGroupList_all); + List jobGroupList = PermissionInterceptor.filterJobGroupByRole(request, jobGroupList_all); if (jobGroupList == null || jobGroupList.size() == 0) { throw new XxlJobException(I18nUtil.getString("jobgroup_empty")); } @@ -73,37 +74,6 @@ public class JobInfoController { return "jobinfo/jobinfo.index"; } - public static List filterJobGroupByRole(HttpServletRequest request, - List jobGroupList_all) { - List jobGroupList = new ArrayList<>(); - if (jobGroupList_all != null && jobGroupList_all.size() > 0) { - XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); - if (loginUser.getRole() == 1) { - jobGroupList = jobGroupList_all; - } - else { - List groupIdStrs = new ArrayList<>(); - if (loginUser.getPermission() != null && loginUser.getPermission().trim().length() > 0) { - groupIdStrs = Arrays.asList(loginUser.getPermission().trim().split(",")); - } - for (XxlJobGroup groupItem : jobGroupList_all) { - if (groupIdStrs.contains(String.valueOf(groupItem.getId()))) { - jobGroupList.add(groupItem); - } - } - } - } - return jobGroupList; - } - - public static void validPermission(HttpServletRequest request, int jobGroup) { - XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); - if (!loginUser.validPermission(jobGroup)) { - throw new RuntimeException( - I18nUtil.getString("system_permission_limit") + "[username=" + loginUser.getUsername() + "]"); - } - } - @RequestMapping("/pageList") @ResponseBody public Map pageList(@RequestParam(required = false, defaultValue = "0") int start, @@ -115,14 +85,24 @@ public class JobInfoController { @RequestMapping("/add") @ResponseBody - public ReturnT add(XxlJobInfo jobInfo) { - return xxlJobService.add(jobInfo); + public ReturnT add(HttpServletRequest request, XxlJobInfo jobInfo) { + // valid permission + PermissionInterceptor.validJobGroupPermission(request, jobInfo.getJobGroup()); + + // opt + XxlJobUser loginUser = PermissionInterceptor.getLoginUser(request); + return xxlJobService.add(jobInfo, loginUser); } @RequestMapping("/update") @ResponseBody - public ReturnT update(XxlJobInfo jobInfo) { - return xxlJobService.update(jobInfo); + public ReturnT update(HttpServletRequest request, XxlJobInfo jobInfo) { + // valid permission + PermissionInterceptor.validJobGroupPermission(request, jobInfo.getJobGroup()); + + // opt + XxlJobUser loginUser = PermissionInterceptor.getLoginUser(request); + return xxlJobService.update(jobInfo, loginUser); } @RequestMapping("/remove") @@ -145,15 +125,11 @@ public class JobInfoController { @RequestMapping("/trigger") @ResponseBody - // @PermissionLimit(limit = false) - public ReturnT triggerJob(int id, String executorParam, String addressList) { - // force cover job param - if (executorParam == null) { - executorParam = ""; - } - - JobTriggerPoolHelper.trigger(id, TriggerTypeEnum.MANUAL, -1, null, executorParam, addressList); - return ReturnT.SUCCESS; + public ReturnT triggerJob(HttpServletRequest request, int id, String executorParam, String addressList) { + // login user + XxlJobUser loginUser = PermissionInterceptor.getLoginUser(request); + // trigger + return xxlJobService.trigger(loginUser, id, executorParam, addressList); } @RequestMapping("/nextTriggerTime") diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java index 7d90d3a5e..494c4ac2e 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java +++ b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java @@ -1,5 +1,6 @@ package com.xxl.job.admin.controller; +import com.xxl.job.admin.controller.interceptor.PermissionInterceptor; import com.xxl.job.admin.core.complete.XxlJobCompleter; import com.xxl.job.admin.core.exception.XxlJobException; import com.xxl.job.admin.core.model.XxlJobGroup; @@ -22,9 +23,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.util.HtmlUtils; import java.util.Date; import java.util.HashMap; @@ -59,7 +62,7 @@ public class JobLogController { List jobGroupList_all = xxlJobGroupDao.findAll(); // filter group - List jobGroupList = JobInfoController.filterJobGroupByRole(request, jobGroupList_all); + List jobGroupList = PermissionInterceptor.filterJobGroupByRole(request, jobGroupList_all); if (jobGroupList == null || jobGroupList.size() == 0) { throw new XxlJobException(I18nUtil.getString("jobgroup_empty")); } @@ -77,7 +80,7 @@ public class JobLogController { model.addAttribute("jobInfo", jobInfo); // valid permission - JobInfoController.validPermission(request, jobInfo.getJobGroup()); + PermissionInterceptor.validJobGroupPermission(request, jobInfo.getJobGroup()); } return "joblog/joblog.index"; @@ -98,8 +101,8 @@ public class JobLogController { String filterTime) { // valid permission - JobInfoController.validPermission(request, jobGroup); // 仅管理员支持查询全部;普通用户仅支持查询有权限的 - // jobGroup + PermissionInterceptor.validJobGroupPermission(request, jobGroup); // 仅管理员支持查询全部;普通用户仅支持查询有权限的 + // jobGroup // parse param Date triggerTimeStart = null; @@ -166,6 +169,13 @@ public class JobLogController { } } + // fix xss + if (logResult.getContent() != null && StringUtils.hasText(logResult.getContent().getLogContent())) { + String newLogContent = logResult.getContent().getLogContent(); + newLogContent = HtmlUtils.htmlEscape(newLogContent, "UTF-8"); + logResult.getContent().setLogContent(newLogContent); + } + return logResult; } catch (Exception e) { @@ -213,8 +223,11 @@ public class JobLogController { @RequestMapping("/clearLog") @ResponseBody - public ReturnT clearLog(int jobGroup, int jobId, int type) { + public ReturnT clearLog(HttpServletRequest request, int jobGroup, int jobId, int type) { + // valid permission + PermissionInterceptor.validJobGroupPermission(request, jobGroup); + // opt Date clearBeforeTime = null; int clearBeforeNum = 0; if (type == 1) { diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobUserController.java similarity index 84% rename from pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java rename to pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobUserController.java index f7acc289d..d5a26be4f 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/UserController.java +++ b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobUserController.java @@ -1,12 +1,12 @@ package com.xxl.job.admin.controller; import com.xxl.job.admin.controller.annotation.PermissionLimit; +import com.xxl.job.admin.controller.interceptor.PermissionInterceptor; import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobUser; import com.xxl.job.admin.core.util.I18nUtil; import com.xxl.job.admin.dao.XxlJobGroupDao; import com.xxl.job.admin.dao.XxlJobUserDao; -import com.xxl.job.admin.service.LoginService; import com.xxl.job.core.biz.model.ReturnT; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; @@ -27,7 +27,7 @@ import java.util.Map; */ @Controller @RequestMapping("/user") -public class UserController { +public class JobUserController { @Resource private XxlJobUserDao xxlJobUserDao; @@ -114,7 +114,7 @@ public class UserController { public ReturnT update(HttpServletRequest request, XxlJobUser xxlJobUser) { // avoid opt login seft - XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); + XxlJobUser loginUser = PermissionInterceptor.getLoginUser(request); if (loginUser.getUsername().equals(xxlJobUser.getUsername())) { return new ReturnT(ReturnT.FAIL.getCode(), I18nUtil.getString("user_update_loginuser_limit")); } @@ -143,7 +143,7 @@ public class UserController { public ReturnT remove(HttpServletRequest request, int id) { // avoid opt login seft - XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); + XxlJobUser loginUser = PermissionInterceptor.getLoginUser(request); if (loginUser.getId() == id) { return new ReturnT(ReturnT.FAIL.getCode(), I18nUtil.getString("user_update_loginuser_limit")); } @@ -154,11 +154,16 @@ public class UserController { @RequestMapping("/updatePwd") @ResponseBody - public ReturnT updatePwd(HttpServletRequest request, String password) { + public ReturnT updatePwd(HttpServletRequest request, String password, String oldPassword) { - // valid password + // valid + if (oldPassword == null || oldPassword.trim().length() == 0) { + return new ReturnT(ReturnT.FAIL.getCode(), + I18nUtil.getString("system_please_input") + I18nUtil.getString("change_pwd_field_oldpwd")); + } if (password == null || password.trim().length() == 0) { - return new ReturnT(ReturnT.FAIL.getCode(), "密码不可为空"); + return new ReturnT(ReturnT.FAIL.getCode(), + I18nUtil.getString("system_please_input") + I18nUtil.getString("change_pwd_field_oldpwd")); } password = password.trim(); if (!(password.length() >= 4 && password.length() <= 20)) { @@ -166,13 +171,18 @@ public class UserController { } // md5 password + String md5OldPassword = DigestUtils.md5DigestAsHex(oldPassword.getBytes()); String md5Password = DigestUtils.md5DigestAsHex(password.getBytes()); - // update pwd - XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); - - // do write + // valid old pwd + XxlJobUser loginUser = PermissionInterceptor.getLoginUser(request); XxlJobUser existUser = xxlJobUserDao.loadByUserName(loginUser.getUsername()); + if (!md5OldPassword.equals(existUser.getPassword())) { + return new ReturnT(ReturnT.FAIL.getCode(), + I18nUtil.getString("change_pwd_field_oldpwd") + I18nUtil.getString("system_unvalid")); + } + + // write new existUser.setPassword(md5Password); xxlJobUserDao.update(existUser); diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java index ad1aca1af..0fdcde944 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java +++ b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/interceptor/PermissionInterceptor.java @@ -1,9 +1,10 @@ package com.xxl.job.admin.controller.interceptor; import com.xxl.job.admin.controller.annotation.PermissionLimit; +import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobUser; import com.xxl.job.admin.core.util.I18nUtil; -import com.xxl.job.admin.service.LoginService; +import com.xxl.job.admin.service.impl.LoginService; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -11,6 +12,10 @@ import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.AsyncHandlerInterceptor; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + /** * 权限拦截 * @@ -50,10 +55,70 @@ public class PermissionInterceptor implements AsyncHandlerInterceptor { if (needAdminuser && loginUser.getRole() != 1) { throw new RuntimeException(I18nUtil.getString("system_permission_limit")); } - request.setAttribute(LoginService.LOGIN_IDENTITY_KEY, loginUser); + request.setAttribute(LoginService.LOGIN_IDENTITY_KEY, loginUser); // set + // loginUser, + // with + // request } return true; // proceed with the next interceptor } + // -------------------- permission tool -------------------- + + /** + * get loginUser + * @param request + * @return + */ + public static XxlJobUser getLoginUser(HttpServletRequest request) { + XxlJobUser loginUser = (XxlJobUser) request.getAttribute(LoginService.LOGIN_IDENTITY_KEY); // get + // loginUser, + // with + // request + return loginUser; + } + + /** + * valid permission by JobGroup + * @param request + * @param jobGroup + */ + public static void validJobGroupPermission(HttpServletRequest request, int jobGroup) { + XxlJobUser loginUser = getLoginUser(request); + if (!loginUser.validPermission(jobGroup)) { + throw new RuntimeException( + I18nUtil.getString("system_permission_limit") + "[username=" + loginUser.getUsername() + "]"); + } + } + + /** + * filter XxlJobGroup by role + * @param request + * @param jobGroupList_all + * @return + */ + public static List filterJobGroupByRole(HttpServletRequest request, + List jobGroupList_all) { + List jobGroupList = new ArrayList<>(); + if (jobGroupList_all != null && jobGroupList_all.size() > 0) { + XxlJobUser loginUser = PermissionInterceptor.getLoginUser(request); + if (loginUser.getRole() == 1) { + jobGroupList = jobGroupList_all; + } + else { + List groupIdStrs = new ArrayList<>(); + if (loginUser.getPermission() != null && loginUser.getPermission().trim().length() > 0) { + groupIdStrs = Arrays.asList(loginUser.getPermission().trim().split(",")); + } + for (XxlJobGroup groupItem : jobGroupList_all) { + if (groupIdStrs.contains(String.valueOf(groupItem.getId()))) { + jobGroupList.add(groupItem); + } + } + } + } + return jobGroupList; + } + } diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java index 8a6453d2e..4be69f970 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java +++ b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/cron/CronExpression.java @@ -19,7 +19,16 @@ package com.xxl.job.admin.core.cron; import java.io.Serializable; import java.text.ParseException; -import java.util.*; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Locale; +import java.util.Map; +import java.util.SortedSet; +import java.util.StringTokenizer; +import java.util.TimeZone; +import java.util.TreeSet; /** * Provides a parser and evaluator for unix-like cron expressions. Cron expressions @@ -360,9 +369,9 @@ public final class CronExpression implements Serializable, Cloneable { // the second immediately following it. while (difference == 1000) { newDate = getTimeAfter(lastDate); - if (newDate == null) + if (newDate == null) { break; - + } difference = newDate.getTime() - lastDate.getTime(); if (difference == 1000) { @@ -657,8 +666,9 @@ public final class CronExpression implements Serializable, Cloneable { if (c == '-') { ValueSet vs = getValue(0, s, i + 1); lastdayOffset = vs.value; - if (lastdayOffset > 30) + if (lastdayOffset > 30) { throw new ParseException("Offset from last day must be <= 30", i + 1); + } i = vs.pos; } if (s.length() > i) { @@ -727,8 +737,9 @@ public final class CronExpression implements Serializable, Cloneable { if (c == 'L') { if (type == DAY_OF_WEEK) { - if (val < 1 || val > 7) + if (val < 1 || val > 7) { throw new ParseException("Day-of-Week values must be between 1 and 7", -1); + } lastdayOfWeek = true; } else { @@ -747,10 +758,11 @@ public final class CronExpression implements Serializable, Cloneable { else { throw new ParseException("'W' option is not valid here. (pos=" + i + ")", i); } - if (val > 31) + if (val > 31) { throw new ParseException( "The 'W' option does not make sense with values larger than 31 (max number of days in a month)", i); + } TreeSet set = getSet(type); set.add(val); i++; diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobDynamicScheduler.java b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobDynamicScheduler.java index b321f6c73..03e863e51 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobDynamicScheduler.java +++ b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/old/XxlJobDynamicScheduler.java @@ -25,9 +25,9 @@ // import org.slf4j.LoggerFactory; // import org.springframework.util.Assert; // -// import javax.servlet.ServletException; -// import javax.servlet.http.HttpServletRequest; -// import javax.servlet.http.HttpServletResponse; +// import jakarta.servlet.ServletException; +// import jakarta.servlet.http.HttpServletRequest; +// import jakarta.servlet.http.HttpServletResponse; // import java.io.IOException; // import java.util.Date; // import java.util.concurrent.ConcurrentHashMap; @@ -427,4 +427,4 @@ // return jobList; // }*/ // -// } \ No newline at end of file +// } diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java index 3a5dd759e..5ef102e56 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java +++ b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java @@ -1,7 +1,7 @@ package com.xxl.job.admin.core.route.strategy; -import com.xxl.job.admin.core.route.ExecutorRouter; import com.xxl.job.admin.core.scheduler.XxlJobScheduler; +import com.xxl.job.admin.core.route.ExecutorRouter; import com.xxl.job.admin.core.util.I18nUtil; import com.xxl.job.core.biz.ExecutorBiz; import com.xxl.job.core.biz.model.IdleBeatParam; diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java index f6d815188..a60d8f69a 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java +++ b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java @@ -1,7 +1,7 @@ package com.xxl.job.admin.core.route.strategy; -import com.xxl.job.admin.core.route.ExecutorRouter; import com.xxl.job.admin.core.scheduler.XxlJobScheduler; +import com.xxl.job.admin.core.route.ExecutorRouter; import com.xxl.job.admin.core.util.I18nUtil; import com.xxl.job.core.biz.ExecutorBiz; import com.xxl.job.core.biz.model.ReturnT; diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java index d4f97d833..a65db1248 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java +++ b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java @@ -303,18 +303,31 @@ public class JobScheduleHelper { } private void refreshNextValidTime(XxlJobInfo jobInfo, Date fromTime) throws Exception { - Date nextValidTime = generateNextValidTime(jobInfo, fromTime); - if (nextValidTime != null) { - jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime()); - jobInfo.setTriggerNextTime(nextValidTime.getTime()); + try { + Date nextValidTime = generateNextValidTime(jobInfo, fromTime); + if (nextValidTime != null) { + jobInfo.setTriggerLastTime(jobInfo.getTriggerNextTime()); + jobInfo.setTriggerNextTime(nextValidTime.getTime()); + } + else { + // generateNextValidTime fail, stop job + jobInfo.setTriggerStatus(0); + jobInfo.setTriggerLastTime(0); + jobInfo.setTriggerNextTime(0); + logger.error( + ">>>>>>>>>>> xxl-job, refreshNextValidTime fail for job: jobId={}, scheduleType={}, scheduleConf={}", + jobInfo.getId(), jobInfo.getScheduleType(), jobInfo.getScheduleConf()); + } } - else { + catch (Exception e) { + // generateNextValidTime error, stop job jobInfo.setTriggerStatus(0); jobInfo.setTriggerLastTime(0); jobInfo.setTriggerNextTime(0); - logger.warn( - ">>>>>>>>>>> xxl-job, refreshNextValidTime fail for job: jobId={}, scheduleType={}, scheduleConf={}", - jobInfo.getId(), jobInfo.getScheduleType(), jobInfo.getScheduleConf()); + + logger.error( + ">>>>>>>>>>> xxl-job, refreshNextValidTime error for job: jobId={}, scheduleType={}, scheduleConf={}", + jobInfo.getId(), jobInfo.getScheduleType(), jobInfo.getScheduleConf(), e); } } diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java index 8effbc926..c21c3c1fe 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java +++ b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/dao/XxlJobUserDao.java @@ -3,7 +3,6 @@ package com.xxl.job.admin.dao; import com.xxl.job.admin.core.model.XxlJobUser; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; - import java.util.List; /** diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java index 1ec9a2c06..ec512f7ae 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java +++ b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/service/XxlJobService.java @@ -1,6 +1,7 @@ package com.xxl.job.admin.service; import com.xxl.job.admin.core.model.XxlJobInfo; +import com.xxl.job.admin.core.model.XxlJobUser; import com.xxl.job.core.biz.model.ReturnT; import java.util.Date; @@ -31,14 +32,14 @@ public interface XxlJobService { * @param jobInfo * @return */ - public ReturnT add(XxlJobInfo jobInfo); + public ReturnT add(XxlJobInfo jobInfo, XxlJobUser loginUser); /** * update job * @param jobInfo * @return */ - public ReturnT update(XxlJobInfo jobInfo); + public ReturnT update(XxlJobInfo jobInfo, XxlJobUser loginUser); /** * remove job * @@ -61,6 +62,16 @@ public interface XxlJobService { */ public ReturnT stop(int id); + /** + * trigger + * @param loginUser + * @param jobId + * @param executorParam + * @param addressList + * @return + */ + public ReturnT trigger(XxlJobUser loginUser, int jobId, String executorParam, String addressList); + /** * dashboard info * @return diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/service/LoginService.java b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/LoginService.java similarity index 92% rename from pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/service/LoginService.java rename to pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/LoginService.java index eddf2c395..888fc626b 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/service/LoginService.java +++ b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/LoginService.java @@ -1,4 +1,4 @@ -package com.xxl.job.admin.service; +package com.xxl.job.admin.service.impl; import com.xxl.job.admin.core.model.XxlJobUser; import com.xxl.job.admin.core.util.CookieUtil; @@ -6,18 +6,18 @@ import com.xxl.job.admin.core.util.I18nUtil; import com.xxl.job.admin.core.util.JacksonUtil; import com.xxl.job.admin.dao.XxlJobUserDao; import com.xxl.job.core.biz.model.ReturnT; +import org.springframework.stereotype.Service; +import org.springframework.util.DigestUtils; + import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import org.springframework.context.annotation.Configuration; -import org.springframework.util.DigestUtils; - import java.math.BigInteger; /** * @author xuxueli 2019-05-04 22:13:264 */ -@Configuration +@Service public class LoginService { public static final String LOGIN_IDENTITY_KEY = "XXL_JOB_LOGIN_IDENTITY"; @@ -25,6 +25,8 @@ public class LoginService { @Resource private XxlJobUserDao xxlJobUserDao; + // ---------------------- token tool ---------------------- + private String makeToken(XxlJobUser xxlJobUser) { String tokenJson = JacksonUtil.writeValueAsString(xxlJobUser); String tokenHex = new BigInteger(tokenJson.getBytes()).toString(16); @@ -40,6 +42,8 @@ public class LoginService { return xxlJobUser; } + // ---------------------- login tool, with cookie and db ---------------------- + public ReturnT login(HttpServletRequest request, HttpServletResponse response, String username, String password, boolean ifRemember) { diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java index dab1e6cb7..95f14c60e 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java +++ b/pigx-visual/pigx-xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java @@ -4,10 +4,13 @@ import com.xxl.job.admin.core.cron.CronExpression; import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.model.XxlJobLogReport; +import com.xxl.job.admin.core.model.XxlJobUser; import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum; import com.xxl.job.admin.core.scheduler.MisfireStrategyEnum; import com.xxl.job.admin.core.scheduler.ScheduleTypeEnum; import com.xxl.job.admin.core.thread.JobScheduleHelper; +import com.xxl.job.admin.core.thread.JobTriggerPoolHelper; +import com.xxl.job.admin.core.trigger.TriggerTypeEnum; import com.xxl.job.admin.core.util.I18nUtil; import com.xxl.job.admin.dao.*; import com.xxl.job.admin.service.XxlJobService; @@ -15,11 +18,11 @@ import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.enums.ExecutorBlockStrategyEnum; import com.xxl.job.core.glue.GlueTypeEnum; import com.xxl.job.core.util.DateUtil; -import jakarta.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; +import jakarta.annotation.Resource; import java.text.MessageFormat; import java.util.*; @@ -67,7 +70,7 @@ public class XxlJobServiceImpl implements XxlJobService { } @Override - public ReturnT add(XxlJobInfo jobInfo) { + public ReturnT add(XxlJobInfo jobInfo, XxlJobUser loginUser) { // valid base XxlJobGroup group = xxlJobGroupDao.load(jobInfo.getJobGroup()); @@ -155,6 +158,11 @@ public class XxlJobServiceImpl implements XxlJobService { MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId") + "({0})" + I18nUtil.getString("system_not_found")), childJobIdItem)); } + if (!loginUser.validPermission(childJobInfo.getJobGroup())) { + return new ReturnT(ReturnT.FAIL_CODE, + MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId") + "({0})" + + I18nUtil.getString("system_permission_limit")), childJobIdItem)); + } } else { return new ReturnT(ReturnT.FAIL_CODE, @@ -197,7 +205,7 @@ public class XxlJobServiceImpl implements XxlJobService { } @Override - public ReturnT update(XxlJobInfo jobInfo) { + public ReturnT update(XxlJobInfo jobInfo, XxlJobUser loginUser) { // valid base if (jobInfo.getJobDesc() == null || jobInfo.getJobDesc().trim().length() == 0) { @@ -267,6 +275,11 @@ public class XxlJobServiceImpl implements XxlJobService { MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId") + "({0})" + I18nUtil.getString("system_not_found")), childJobIdItem)); } + if (!loginUser.validPermission(childJobInfo.getJobGroup())) { + return new ReturnT(ReturnT.FAIL_CODE, + MessageFormat.format((I18nUtil.getString("jobinfo_field_childJobId") + "({0})" + + I18nUtil.getString("system_permission_limit")), childJobIdItem)); + } } else { return new ReturnT(ReturnT.FAIL_CODE, @@ -404,6 +417,40 @@ public class XxlJobServiceImpl implements XxlJobService { return ReturnT.SUCCESS; } + @Override + public ReturnT trigger(XxlJobUser loginUser, int jobId, String executorParam, String addressList) { + // permission + if (loginUser == null) { + return new ReturnT(ReturnT.FAIL.getCode(), I18nUtil.getString("system_permission_limit")); + } + XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(jobId); + if (xxlJobInfo == null) { + return new ReturnT(ReturnT.FAIL.getCode(), I18nUtil.getString("jobinfo_glue_jobid_unvalid")); + } + if (!hasPermission(loginUser, xxlJobInfo.getJobGroup())) { + return new ReturnT(ReturnT.FAIL.getCode(), I18nUtil.getString("system_permission_limit")); + } + + // force cover job param + if (executorParam == null) { + executorParam = ""; + } + + JobTriggerPoolHelper.trigger(jobId, TriggerTypeEnum.MANUAL, -1, null, executorParam, addressList); + return ReturnT.SUCCESS; + } + + private boolean hasPermission(XxlJobUser loginUser, int jobGroup) { + if (loginUser.getRole() == 1) { + return true; + } + List groupIdStrs = new ArrayList<>(); + if (loginUser.getPermission() != null && loginUser.getPermission().trim().length() > 0) { + groupIdStrs = Arrays.asList(loginUser.getPermission().trim().split(",")); + } + return groupIdStrs.contains(String.valueOf(jobGroup)); + } + @Override public Map dashboardInfo() { diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/resources/i18n/message_en.properties b/pigx-visual/pigx-xxl-job-admin/src/main/resources/i18n/message_en.properties index 2ca59155c..e2336bc6f 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/resources/i18n/message_en.properties +++ b/pigx-visual/pigx-xxl-job-admin/src/main/resources/i18n/message_en.properties @@ -1,6 +1,6 @@ admin_name=Scheduling Center admin_name_full=Distributed Task Scheduling Platform XXL-JOB -admin_version=2.4.1-SNAPSHOT +admin_version=2.5.0-SNAPSHOT admin_i18n=en ## system @@ -91,6 +91,7 @@ logout_fail=Logout fail ## change pwd change_pwd=Change password change_pwd_suc_to_logout=Change password successful, about to log out login +change_pwd_field_oldpwd=old password change_pwd_field_newpwd=new password ## dashboard diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties b/pigx-visual/pigx-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties index dc00c6971..37f4d5402 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties +++ b/pigx-visual/pigx-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties @@ -1,6 +1,6 @@ admin_name=任务调度中心 admin_name_full=分布式任务调度平台XXL-JOB -admin_version=2.4.1-SNAPSHOT +admin_version=2.5.0-SNAPSHOT admin_i18n= ## system @@ -91,6 +91,7 @@ logout_fail=注销失败 ## change pwd change_pwd=修改密码 change_pwd_suc_to_logout=修改密码成功,即将注销登陆 +change_pwd_field_oldpwd=旧密码 change_pwd_field_newpwd=新密码 ## dashboard diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties b/pigx-visual/pigx-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties index 2152c2983..6c6dae307 100755 --- a/pigx-visual/pigx-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties +++ b/pigx-visual/pigx-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties @@ -1,6 +1,6 @@ admin_name=任務調度中心 admin_name_full=分布式任務調度平臺XXL-JOB -admin_version=2.4.1-SNAPSHOT +admin_version=2.5.0-SNAPSHOT admin_i18n= ## system @@ -91,6 +91,7 @@ logout_fail=登出失敗 ## change pwd change_pwd=修改密碼 change_pwd_suc_to_logout=修改密碼成功,即將登出 +change_pwd_field_oldpwd=舊密碼 change_pwd_field_newpwd=新密碼 ## dashboard diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/resources/static/js/common.1.js b/pigx-visual/pigx-xxl-job-admin/src/main/resources/static/js/common.1.js index 1a3fd24ce..7b736fbc2 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/resources/static/js/common.1.js +++ b/pigx-visual/pigx-xxl-job-admin/src/main/resources/static/js/common.1.js @@ -99,15 +99,23 @@ $(function(){ errorClass : 'help-block', focusInvalid : true, rules : { + oldPassword : { + required : true , + rangelength:[4,20] + }, password : { required : true , - rangelength:[4,50] + rangelength:[4,20] } }, messages : { + oldPassword : { + required : I18n.system_please_input +I18n.change_pwd_field_oldpwd, + rangelength : "密码长度限制为4~20" + }, password : { - required : '请输入密码' , - rangelength : "密码长度限制为4~50" + required : I18n.system_please_input +I18n.change_pwd_field_newpwd, + rangelength : "密码长度限制为4~20" } }, highlight : function(element) { diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/resources/static/js/jobgroup.index.1.js b/pigx-visual/pigx-xxl-job-admin/src/main/resources/static/js/jobgroup.index.1.js index 5eb655989..0e5b23565 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/resources/static/js/jobgroup.index.1.js +++ b/pigx-visual/pigx-xxl-job-admin/src/main/resources/static/js/jobgroup.index.1.js @@ -123,7 +123,7 @@ $(function() { var id = $(this).attr("_id"); var row = tableData['key'+id]; - var html = '
'; + /*var html = '
'; if (row.registryList) { for (var index in row.registryList) { html += (parseInt(index)+1) + '. ' + row.registryList[index] + '
'; @@ -135,8 +135,19 @@ $(function() { title: I18n.jobinfo_opt_registryinfo , btn: [ I18n.system_ok ], content: html - }); + });*/ + var html = ''; + if (row.registryList) { + for (var index in row.registryList) { + html += ''; + html += ''; + } + } + html += '
' + (parseInt(index)+1) + '' + row.registryList[index] + '
'; + + $('#showRegistryListModal .data').html(html); + $('#showRegistryListModal').modal({backdrop: false, keyboard: false}).modal('show'); }); diff --git a/pigx-visual/pigx-xxl-job-admin/src/main/resources/templates/common/common.macro.ftl b/pigx-visual/pigx-xxl-job-admin/src/main/resources/templates/common/common.macro.ftl index fb0435fbf..4484151bb 100644 --- a/pigx-visual/pigx-xxl-job-admin/src/main/resources/templates/common/common.macro.ftl +++ b/pigx-visual/pigx-xxl-job-admin/src/main/resources/templates/common/common.macro.ftl @@ -107,9 +107,13 @@