From f6e2f9235292a1bedb007a4bb4438901311539d1 Mon Sep 17 00:00:00 2001 From: XinWei <2718030729@qq.com> Date: Wed, 10 Jul 2024 15:17:48 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E5=BA=A6=E4=B8=AD=E5=BF=83API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ludu-job-admin/ludu-job-admin-api/pom.xml | 4 + .../xxl/job/admin/api/info/JobInfoApi.java | 38 +- .../api/info/dto/JobInfoDetailRespDTO.java | 26 + .../admin/api/info/dto/JobInfoPageReqDTO.java | 24 + .../admin/api/info/dto/JobInfoRespDTO.java | 11 +- .../admin/api/info/dto/JobInfoSaveReqDTO.java | 26 + .../com/xxl/job/admin/api/log/JobLogApi.java | 28 + .../admin/api/log/dto/JobLogPageReqDTO.java | 29 ++ .../job/admin/api/log/dto/JobLogRespDTO.java | 42 ++ .../job/admin/api/info/JobInfoApiImpl.java | 40 +- .../xxl/job/admin/api/log/JobLogApiImpl.java | 56 ++ .../com/xxl/job/admin/dao/XxlJobInfoDao.java | 5 + .../com/xxl/job/admin/dao/XxlJobLogDao.java | 8 + .../config/SecurityConfiguration.java | 4 +- .../xxl/job/admin/service/LoginService.java | 45 +- .../xxl/job/admin/service/XxlJobService.java | 52 ++ .../admin/service/impl/XxlJobServiceImpl.java | 128 +++++ .../src/main/resources/application.yaml | 5 +- .../mybatis-mapper/XxlJobInfoMapper.xml | 485 ++++++++++-------- .../mybatis-mapper/XxlJobLogMapper.xml | 45 ++ .../src/main/resources/application.yaml | 2 +- .../config/SecurityConfiguration.java | 3 +- .../YudaoWebSecurityConfigurerAdapter.java | 49 +- .../yudao-module-infra-biz/pom.xml | 4 +- .../controller/admin/job/JobController.java | 111 ++-- .../admin/joblog/JobLogController.java | 33 ++ .../rpc/config/RpcConfiguration.java | 3 +- 27 files changed, 988 insertions(+), 318 deletions(-) create mode 100644 ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/dto/JobInfoDetailRespDTO.java create mode 100644 ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/dto/JobInfoPageReqDTO.java create mode 100644 ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/dto/JobInfoSaveReqDTO.java create mode 100644 ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/log/JobLogApi.java create mode 100644 ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/log/dto/JobLogPageReqDTO.java create mode 100644 ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/log/dto/JobLogRespDTO.java create mode 100644 ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/api/log/JobLogApiImpl.java create mode 100644 yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/joblog/JobLogController.java diff --git a/ludu-job-admin/ludu-job-admin-api/pom.xml b/ludu-job-admin/ludu-job-admin-api/pom.xml index b9fa9a009..651b0a4c0 100644 --- a/ludu-job-admin/ludu-job-admin-api/pom.xml +++ b/ludu-job-admin/ludu-job-admin-api/pom.xml @@ -43,6 +43,10 @@ spring-cloud-starter-openfeign true + + cn.iocoder.cloud + yudao-spring-boot-starter-excel + \ No newline at end of file diff --git a/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/JobInfoApi.java b/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/JobInfoApi.java index 1b32799c1..ed3c65a35 100644 --- a/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/JobInfoApi.java +++ b/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/JobInfoApi.java @@ -2,25 +2,24 @@ package com.xxl.job.admin.api.info; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import com.xxl.job.admin.api.info.dto.JobInfoDetailRespDTO; import com.xxl.job.admin.api.info.dto.JobInfoRespDTO; +import com.xxl.job.admin.api.info.dto.JobInfoSaveReqDTO; import com.xxl.job.admin.enums.ApiConstants; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; /** - * @Description TODO + * @Description 调度任务信息Api接口 */ -@FeignClient(name = ApiConstants.NAME) +@FeignClient(name = ApiConstants.NAME, path = "/xxl-job-admin") @Tag(name = "RPC 服务 - 任务信息管理") -@RequestMapping("") public interface JobInfoApi { String PREFIX = ApiConstants.PREFIX + "/info"; @GetMapping(PREFIX + "/page") @@ -32,4 +31,31 @@ public interface JobInfoApi { @Parameter(name = "handlerName", description = "处理器名字", required = false) public CommonResult> getPage(@RequestParam(value = "pageNo") Integer pageNo, @RequestParam(value = "pageSize") Integer pageSize, @RequestParam(required = false, value = "name") String name, @RequestParam(required = false, value = "status") Integer status, @RequestParam(required = false, value = "handlerName") String handlerName); + @GetMapping(PREFIX + "/get") + @Operation(summary = "获得任务详情") + @Parameter(name = "id", description = "任务主键", required = true) + CommonResult get(@RequestParam("id") Integer id); + + @PostMapping(PREFIX + "/create") + @Operation(summary = "创建任务") + CommonResult create(@RequestBody JobInfoSaveReqDTO jobInfoSaveReqDTO); + + @PutMapping(PREFIX + "/update") + @Operation(summary = "修改任务") + CommonResult update(@RequestBody JobInfoSaveReqDTO jobInfoSaveReqDTO); + + @DeleteMapping(PREFIX + "/delete") + @Operation(summary = "删除任务") + CommonResult delete(@RequestParam("id") Integer id); + @PutMapping(PREFIX + "/update-status") + @Operation(summary = "任务状态修改") + CommonResult updateStatus(@RequestParam("id") Integer id, @RequestParam("status") Integer status); + + @PutMapping(PREFIX + "/trigger") + @Operation(summary = "任务立即执行一次") + CommonResult trigger(@RequestParam("id") Integer id); + + @GetMapping(PREFIX + "/get_next_times") + @Operation(summary = "下n次执行时间") + CommonResult> getNextTimes(@RequestParam("id") Integer id); } diff --git a/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/dto/JobInfoDetailRespDTO.java b/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/dto/JobInfoDetailRespDTO.java new file mode 100644 index 000000000..12c50d635 --- /dev/null +++ b/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/dto/JobInfoDetailRespDTO.java @@ -0,0 +1,26 @@ +package com.xxl.job.admin.api.info.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @Description 任务详情 + */ +@Schema(description = "RPC 服务 - 任务信息 Response DTO") +@Data +public class JobInfoDetailRespDTO { + @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer id; + @Schema(description = "任务名称") + private String name; + @Schema(description = "处理器的名字") + private String handlerName; + @Schema(description = "处理器的参数") + private String handlerParam; + @Schema(description = "CRON 表达式") + private String cronExpression; + @Schema(description = "重试次数") + private Integer retryCount; + @Schema(description = "监控超时时间") + private Integer monitorTimeout; +} diff --git a/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/dto/JobInfoPageReqDTO.java b/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/dto/JobInfoPageReqDTO.java new file mode 100644 index 000000000..4eb34331a --- /dev/null +++ b/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/dto/JobInfoPageReqDTO.java @@ -0,0 +1,24 @@ +package com.xxl.job.admin.api.info.dto; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "RPC 服务 - 任务列表 Request DTO") +@Data +public class JobInfoPageReqDTO extends PageParam { + @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer id; + @Schema(description = "任务名称") + private String name; + @Schema(description = "任务状态") + private Integer status; + @Schema(description = "处理器的名字") + private String handlerName; + @Schema(description = "处理器的参数") + private String handlerParam; + @Schema(description = "CRON 表达式") + private String cronExpression; +} diff --git a/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/dto/JobInfoRespDTO.java b/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/dto/JobInfoRespDTO.java index de6c7ab40..290686550 100644 --- a/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/dto/JobInfoRespDTO.java +++ b/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/dto/JobInfoRespDTO.java @@ -1,25 +1,34 @@ package com.xxl.job.admin.api.info.dto; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; /** - * @Description 任务信息 + * @Description 任务列表单个信息 */ @Schema(description = "RPC 服务 - 任务信息 Response DTO") @Data +@ExcelIgnoreUnannotated public class JobInfoRespDTO { @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("任务编号") private Integer id; @Schema(description = "任务名称") + @ExcelProperty("任务名称") private String name; @Schema(description = "任务状态") + @ExcelProperty("任务状态") private Integer status; @Schema(description = "处理器的名字") + @ExcelProperty("处理器的名字") private String handlerName; @Schema(description = "处理器的参数") + @ExcelProperty("处理器的参数") private String handlerParam; @Schema(description = "CRON 表达式") + @ExcelProperty("CRON 表达式") private String cronExpression; } diff --git a/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/dto/JobInfoSaveReqDTO.java b/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/dto/JobInfoSaveReqDTO.java new file mode 100644 index 000000000..e7baf6b4a --- /dev/null +++ b/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/info/dto/JobInfoSaveReqDTO.java @@ -0,0 +1,26 @@ +package com.xxl.job.admin.api.info.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @Description TODO + */ +@Schema(description = "RPC 服务 - 新增任务 Request DTO") +@Data +public class JobInfoSaveReqDTO { + @Schema(description = "任务编号") + private Integer id; + @Schema(description = "任务名称") + private String name; + @Schema(description = "处理器的名字") + private String handlerName; + @Schema(description = "处理器的参数") + private String handlerParam; + @Schema(description = "CRON 表达式") + private String cronExpression; + @Schema(description = "重试次数") + private Integer retryCount; + @Schema(description = "监控超时时间") + private Integer monitorTimeout; +} diff --git a/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/log/JobLogApi.java b/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/log/JobLogApi.java new file mode 100644 index 000000000..c538c694d --- /dev/null +++ b/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/log/JobLogApi.java @@ -0,0 +1,28 @@ +package com.xxl.job.admin.api.log; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import com.xxl.job.admin.api.info.dto.JobInfoRespDTO; +import com.xxl.job.admin.api.log.dto.JobLogPageReqDTO; +import com.xxl.job.admin.api.log.dto.JobLogRespDTO; +import com.xxl.job.admin.enums.ApiConstants; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import javax.validation.Valid; + +/** + * @Description 调度任务日志Api接口 + */ +@FeignClient(name = ApiConstants.NAME, path = "/xxl-job-admin") +@Tag(name = "RPC 服务 - 任务日志管理") +public interface JobLogApi { + String PREFIX = ApiConstants.PREFIX + "/log"; + @GetMapping(PREFIX + "/page") + @Operation(summary = "获得所有任务列表") + public CommonResult> getPage(@Valid JobLogPageReqDTO jobLogPageReqDTO); +} diff --git a/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/log/dto/JobLogPageReqDTO.java b/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/log/dto/JobLogPageReqDTO.java new file mode 100644 index 000000000..09eaf54b3 --- /dev/null +++ b/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/log/dto/JobLogPageReqDTO.java @@ -0,0 +1,29 @@ +package com.xxl.job.admin.api.log.dto; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +@Schema(description = "RPC 服务 - 任务日志 Request DTO") +@Data +public class JobLogPageReqDTO extends PageParam { + @NotNull(message = "任务编号不能为空") + @Schema(description = "任务编号") + private Integer jobId; + @Schema(description = "处理器的名字") + private String handlerName; + @Schema(description = "开始执行时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date beginTime; + @Schema(description = "结束执行时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + @Schema(description = "任务状态") + private Integer status; +} diff --git a/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/log/dto/JobLogRespDTO.java b/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/log/dto/JobLogRespDTO.java new file mode 100644 index 000000000..fa0b6f931 --- /dev/null +++ b/ludu-job-admin/ludu-job-admin-api/src/main/java/com/xxl/job/admin/api/log/dto/JobLogRespDTO.java @@ -0,0 +1,42 @@ +package com.xxl.job.admin.api.log.dto; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Schema(description = "RPC 服务 - 任务日志 Response DTO") +@Data +@ExcelIgnoreUnannotated +public class JobLogRespDTO { + @Schema(description = "日志编号") + @ExcelProperty("日志编号") + private Integer id; + @Schema(description = "任务编号") + @ExcelProperty("任务编号") + private Integer jobId; + @Schema(description = "处理器的名字") + @ExcelProperty("处理器的名字") + private String handlerName; + @Schema(description = "处理器的参数") + @ExcelProperty("处理器的参数") + private String handlerParam; + @Schema(description = "第几次执行") + @ExcelProperty("第几次执行") + private Integer executeIndex; + @Schema(description = "开始执行时间") + @ExcelProperty("开始执行时间") + private Date beginTime; + @Schema(description = "结束执行时间") + @ExcelProperty("结束执行时间") + private Date endTime; + @Schema(description = "执行时长") + @ExcelProperty("执行时长") + private Integer duration; + @Schema(description = "任务状态") + @ExcelProperty("任务状态") + private Integer status; + +} diff --git a/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/api/info/JobInfoApiImpl.java b/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/api/info/JobInfoApiImpl.java index 23ea146e4..e679c68a1 100644 --- a/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/api/info/JobInfoApiImpl.java +++ b/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/api/info/JobInfoApiImpl.java @@ -2,7 +2,9 @@ package com.xxl.job.admin.api.info; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import com.xxl.job.admin.api.info.dto.JobInfoDetailRespDTO; import com.xxl.job.admin.api.info.dto.JobInfoRespDTO; +import com.xxl.job.admin.api.info.dto.JobInfoSaveReqDTO; import com.xxl.job.admin.service.XxlJobService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RestController; @@ -14,7 +16,7 @@ import java.util.Map; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; /** - * @Description TODO + * @Description 调度任务信息Api实现类 */ @RestController // 提供 RESTful API 接口,给 Feign 调用 @Validated @@ -26,4 +28,40 @@ public class JobInfoApiImpl implements JobInfoApi{ public CommonResult> getPage(Integer pageNo, Integer pageSize, String name, Integer status, String handlerName) { return success(xxlJobService.apiPage(pageNo, pageSize, name, status, handlerName)); } + + @Override + public CommonResult get(Integer id) { + return success(xxlJobService.apiGet(id)); + } + + @Override + public CommonResult create(JobInfoSaveReqDTO jobInfoSaveReqDTO) { + return xxlJobService.apiCreate(jobInfoSaveReqDTO); + } + + @Override + public CommonResult update(JobInfoSaveReqDTO jobInfoSaveReqDTO) { + return xxlJobService.apiUpdate(jobInfoSaveReqDTO); + } + + @Override + public CommonResult delete(Integer id) { + return success(xxlJobService.apiDelete(id)); + } + + @Override + public CommonResult updateStatus(Integer id, Integer status) { + return success(xxlJobService.apiUpdateStatus(id, status)); + } + + @Override + public CommonResult trigger(Integer id) { + + return xxlJobService.apiTrigger(id); + } + + @Override + public CommonResult> getNextTimes(Integer id) { + return xxlJobService.apiGetNextTimes(id); + } } diff --git a/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/api/log/JobLogApiImpl.java b/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/api/log/JobLogApiImpl.java new file mode 100644 index 000000000..75627a42a --- /dev/null +++ b/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/api/log/JobLogApiImpl.java @@ -0,0 +1,56 @@ +package com.xxl.job.admin.api.log; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import com.xxl.job.admin.api.info.dto.JobInfoRespDTO; +import com.xxl.job.admin.api.log.dto.JobLogPageReqDTO; +import com.xxl.job.admin.api.log.dto.JobLogRespDTO; +import com.xxl.job.admin.controller.JobInfoController; +import com.xxl.job.admin.controller.JobLogController; +import com.xxl.job.admin.core.model.XxlJobLog; +import com.xxl.job.admin.dao.XxlJobGroupDao; +import com.xxl.job.admin.dao.XxlJobInfoDao; +import com.xxl.job.admin.dao.XxlJobLogDao; +import com.xxl.job.core.util.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @Description 调度任务日志Api实现类 + */ +@RestController // 提供 RESTful API 接口,给 Feign 调用 +@Validated +public class JobLogApiImpl implements JobLogApi { + private static Logger logger = LoggerFactory.getLogger(JobLogController.class); + + @Resource + private XxlJobGroupDao xxlJobGroupDao; + @Resource + public XxlJobInfoDao xxlJobInfoDao; + @Resource + public XxlJobLogDao xxlJobLogDao; + + @Override + public CommonResult> getPage(JobLogPageReqDTO jobLogPageReqDTO) { + // 设置默认组为3 + int jobGroup = 3; + int status = jobLogPageReqDTO.getStatus() == null ? -1 : jobLogPageReqDTO.getStatus(); + // page query + List list = xxlJobLogDao.apiPageList(jobLogPageReqDTO.getPageNo(), jobLogPageReqDTO.getPageSize(), jobGroup, jobLogPageReqDTO.getJobId(), jobLogPageReqDTO.getBeginTime(), jobLogPageReqDTO.getEndTime(), status); + int list_count = xxlJobLogDao.pageListCount(jobLogPageReqDTO.getPageNo(), jobLogPageReqDTO.getPageSize(), jobGroup, jobLogPageReqDTO.getJobId(), jobLogPageReqDTO.getBeginTime(), jobLogPageReqDTO.getEndTime(), status); + // package result + PageResult pageResult = new PageResult<>(); + pageResult.setTotal((long) list_count); + pageResult.setList(list); + return CommonResult.success(pageResult); + } +} diff --git a/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java b/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java index c3742bd75..60895ab50 100644 --- a/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java +++ b/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/dao/XxlJobInfoDao.java @@ -1,7 +1,9 @@ package com.xxl.job.admin.dao; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import com.xxl.job.admin.api.info.dto.JobInfoDetailRespDTO; import com.xxl.job.admin.api.info.dto.JobInfoRespDTO; +import com.xxl.job.admin.api.info.dto.JobInfoSaveReqDTO; import com.xxl.job.admin.core.model.XxlJobInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -51,4 +53,7 @@ public interface XxlJobInfoDao extends BaseMapperX { List apiPage(@Param("pageNo") Integer pageNo, @Param("pageSize") Integer pageSize, @Param("name") String name, @Param("status") Integer status, @Param("handlerName") String handlerName); Long apiPageCount(@Param("name") String name, @Param("status") Integer status, @Param("handlerName") String handlerName); + + JobInfoDetailRespDTO apiGet(@Param("id") Integer id); + } diff --git a/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java b/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java index 62fa3b4f9..fe73542f8 100644 --- a/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java +++ b/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/dao/XxlJobLogDao.java @@ -1,5 +1,6 @@ package com.xxl.job.admin.dao; +import com.xxl.job.admin.api.log.dto.JobLogRespDTO; import com.xxl.job.admin.core.model.XxlJobLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,6 +24,13 @@ public interface XxlJobLogDao { @Param("triggerTimeStart") Date triggerTimeStart, @Param("triggerTimeEnd") Date triggerTimeEnd, @Param("logStatus") int logStatus); + public List apiPageList(@Param("offset") int offset, + @Param("pagesize") int pagesize, + @Param("jobGroup") int jobGroup, + @Param("jobId") int jobId, + @Param("triggerTimeStart") Date triggerTimeStart, + @Param("triggerTimeEnd") Date triggerTimeEnd, + @Param("logStatus") Integer logStatus); public int pageListCount(@Param("offset") int offset, @Param("pagesize") int pagesize, @Param("jobGroup") int jobGroup, diff --git a/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/framework/security/config/SecurityConfiguration.java b/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/framework/security/config/SecurityConfiguration.java index 2b64da75e..a66983351 100644 --- a/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/framework/security/config/SecurityConfiguration.java +++ b/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/framework/security/config/SecurityConfiguration.java @@ -1,7 +1,7 @@ package com.xxl.job.admin.framework.security.config; import cn.iocoder.yudao.framework.security.config.AuthorizeRequestsCustomizer; -import cn.iocoder.yudao.module.system.enums.ApiConstants; +import com.xxl.job.admin.enums.ApiConstants; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; @@ -29,6 +29,8 @@ public class SecurityConfiguration { .antMatchers("/actuator/**").anonymous(); // RPC 服务的安全配置 registry.antMatchers(ApiConstants.PREFIX + "/**").permitAll(); + // 放行所有后台原本请求和rpc接口 + registry.antMatchers("/**").permitAll(); } }; diff --git a/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/service/LoginService.java b/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/service/LoginService.java index afcff4447..319f85e8b 100644 --- a/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/service/LoginService.java +++ b/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/service/LoginService.java @@ -83,24 +83,33 @@ public class LoginService { * @return */ public XxlJobUser ifLogin(HttpServletRequest request, HttpServletResponse response){ - String cookieToken = CookieUtil.getValue(request, LOGIN_IDENTITY_KEY); - if (cookieToken != null) { - XxlJobUser cookieUser = null; - try { - cookieUser = parseToken(cookieToken); - } catch (Exception e) { - logout(request, response); - } - if (cookieUser != null) { - XxlJobUser dbUser = xxlJobUserDao.loadByUserName(cookieUser.getUsername()); - if (dbUser != null) { - if (cookieUser.getPassword().equals(dbUser.getPassword())) { - return dbUser; - } - } - } - } - return null; + +// String cookieToken = CookieUtil.getValue(request, LOGIN_IDENTITY_KEY); +// if (cookieToken != null) { +// XxlJobUser cookieUser = null; +// try { +// cookieUser = parseToken(cookieToken); +// } catch (Exception e) { +// logout(request, response); +// } +// if (cookieUser != null) { +// XxlJobUser dbUser = xxlJobUserDao.loadByUserName(cookieUser.getUsername()); +// if (dbUser != null) { +// if (cookieUser.getPassword().equals(dbUser.getPassword())) { +// return dbUser; +// } +// } +// } +// } +// return null; + // TODO 暂时放行cookie + XxlJobUser test = new XxlJobUser(); + test.setId(1); + test.setUsername("admin"); + test.setPassword("e10adc3949ba59abbe56e057f20f883e"); + test.setRole(1); + test.setPermission(null); + return test; } } diff --git a/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/service/XxlJobService.java b/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/service/XxlJobService.java index d7c744075..acfd04ef4 100644 --- a/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/service/XxlJobService.java +++ b/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/service/XxlJobService.java @@ -3,7 +3,9 @@ package com.xxl.job.admin.service; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import com.xxl.job.admin.api.info.dto.JobInfoDetailRespDTO; import com.xxl.job.admin.api.info.dto.JobInfoRespDTO; +import com.xxl.job.admin.api.info.dto.JobInfoSaveReqDTO; import com.xxl.job.admin.core.model.XxlJobInfo; import com.xxl.job.admin.core.model.XxlJobUser; import com.xxl.job.core.biz.model.ReturnT; @@ -109,4 +111,54 @@ public interface XxlJobService { * @return */ PageResult apiPage(Integer pageNo, Integer pageSize, String name, Integer status, String handlerName); + + /** + * api接口用于查看任务详情 + * @param id + * @return com.xxl.job.admin.api.info.dto.JobInfoDetailRespDTO + */ + JobInfoDetailRespDTO apiGet(Integer id); + + /** + * api接口用于创建任务 + * @param jobInfoSaveReqDTO + * @return + */ + CommonResult apiCreate(JobInfoSaveReqDTO jobInfoSaveReqDTO); + + /** + * api接口用于修改任务 + * @param jobInfoSaveReqDTO + * @return + */ + CommonResult apiUpdate(JobInfoSaveReqDTO jobInfoSaveReqDTO); + + /** + * api接口用于删除任务 + * @param id + * @return + */ + Boolean apiDelete(Integer id); + + /** + * api接口用于任务状态修改 + * @param id + * @param status + * @return + */ + Boolean apiUpdateStatus(Integer id, Integer status); + + /** + * api接口用于任务立即执行一次 + * @param id + * @return + */ + CommonResult apiTrigger(Integer id); + + /** + * api接口用于获取下N次执行时间 + * @param id + * @return cn.iocoder.yudao.framework.common.pojo.CommonResult> + */ + CommonResult> apiGetNextTimes(Integer id); } diff --git a/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java b/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java index 632285907..778c035bc 100644 --- a/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java +++ b/ludu-job-admin/ludu-job-admin-biz/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java @@ -1,7 +1,10 @@ package com.xxl.job.admin.service.impl; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import com.xxl.job.admin.api.info.dto.JobInfoDetailRespDTO; import com.xxl.job.admin.api.info.dto.JobInfoRespDTO; +import com.xxl.job.admin.api.info.dto.JobInfoSaveReqDTO; import com.xxl.job.admin.core.cron.CronExpression; import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobInfo; @@ -28,6 +31,9 @@ import javax.annotation.Resource; import java.text.MessageFormat; import java.util.*; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + /** * core job action for xxl-job * @author xuxueli 2016-5-28 15:30:33 @@ -481,4 +487,126 @@ public class XxlJobServiceImpl implements XxlJobService { return pageResult; } + @Override + public JobInfoDetailRespDTO apiGet(Integer id) { + return xxlJobInfoDao.apiGet(id); + } + + @Override + public CommonResult apiCreate(JobInfoSaveReqDTO jobInfoSaveReqDTO) { + XxlJobInfo xxlJobInfo = new XxlJobInfo(); + xxlJobInfo.setJobDesc(jobInfoSaveReqDTO.getName()); + xxlJobInfo.setExecutorHandler(jobInfoSaveReqDTO.getHandlerName()); + xxlJobInfo.setExecutorParam(jobInfoSaveReqDTO.getHandlerParam()); + xxlJobInfo.setScheduleConf(jobInfoSaveReqDTO.getCronExpression()); + if (jobInfoSaveReqDTO.getRetryCount() != null){ + xxlJobInfo.setExecutorFailRetryCount(jobInfoSaveReqDTO.getRetryCount()); + } + if (jobInfoSaveReqDTO.getMonitorTimeout() != null){ + xxlJobInfo.setExecutorTimeout(jobInfoSaveReqDTO.getMonitorTimeout()); + } + // 设置默认参数 默认为第3组 + xxlJobInfo.setJobGroup(3); + xxlJobInfo.setAuthor("ludu"); + xxlJobInfo.setScheduleType("CRON"); + xxlJobInfo.setGlueType("BEAN"); + xxlJobInfo.setExecutorRouteStrategy("FIRST"); + xxlJobInfo.setMisfireStrategy("DO_NOTHING"); + xxlJobInfo.setExecutorBlockStrategy("SERIAL_EXECUTION"); + xxlJobInfo.setGlueRemark("GLUE代码初始化"); + ReturnT add = add(xxlJobInfo); + if (add.getCode() == ReturnT.FAIL_CODE){ + return error(add.getCode(), add.getMsg()); + } + return success(true); + } + + @Override + public CommonResult apiUpdate(JobInfoSaveReqDTO jobInfoSaveReqDTO) { + XxlJobInfo xxlJobInfo = new XxlJobInfo(); + xxlJobInfo.setId(jobInfoSaveReqDTO.getId()); + xxlJobInfo.setJobDesc(jobInfoSaveReqDTO.getName()); + xxlJobInfo.setExecutorHandler(jobInfoSaveReqDTO.getHandlerName()); + xxlJobInfo.setExecutorParam(jobInfoSaveReqDTO.getHandlerParam()); + xxlJobInfo.setScheduleConf(jobInfoSaveReqDTO.getCronExpression()); + if (jobInfoSaveReqDTO.getRetryCount() != null){ + xxlJobInfo.setExecutorFailRetryCount(jobInfoSaveReqDTO.getRetryCount()); + } + if (jobInfoSaveReqDTO.getMonitorTimeout() != null){ + xxlJobInfo.setExecutorTimeout(jobInfoSaveReqDTO.getMonitorTimeout()); + } + // 设置默认参数 默认为第3组 + xxlJobInfo.setJobGroup(3); + xxlJobInfo.setAuthor("ludu"); + xxlJobInfo.setScheduleType("CRON"); + xxlJobInfo.setGlueType("BEAN"); + xxlJobInfo.setExecutorRouteStrategy("FIRST"); + xxlJobInfo.setMisfireStrategy("DO_NOTHING"); + xxlJobInfo.setExecutorBlockStrategy("SERIAL_EXECUTION"); + xxlJobInfo.setGlueRemark("GLUE代码初始化"); + ReturnT update = update(xxlJobInfo); + if (update.getCode() == ReturnT.FAIL_CODE){ + return error(update.getCode(), update.getMsg()); + } + return success(true); + } + + @Override + public Boolean apiDelete(Integer id) { + remove(id); + return true; + } + + @Override + public Boolean apiUpdateStatus(Integer id, Integer status) { + if (status == null || id == null){ + return false; + } + if (status == 1){ + start(id); + }else if (status == 2){ + stop(id); + }else{ + return false; + } + return true; + } + + @Override + public CommonResult apiTrigger(Integer id) { + + XxlJobInfo xxlJobInfo = xxlJobInfoDao.loadById(id); + if (xxlJobInfo == null) { + return error(ReturnT.FAIL.getCode(), I18nUtil.getString("jobinfo_glue_jobid_unvalid")); + } + + JobTriggerPoolHelper.trigger(id, TriggerTypeEnum.MANUAL, -1, null, "", ""); + return success(true); + } + + @Override + public CommonResult> apiGetNextTimes(Integer id) { + + XxlJobInfo paramXxlJobInfo = new XxlJobInfo(); + paramXxlJobInfo.setScheduleType("CRON"); + paramXxlJobInfo.setScheduleConf(apiGet(id).getCronExpression()); + + List result = new ArrayList<>(); + try { + Date lastTime = new Date(); + for (int i = 0; i < 5; i++) { + lastTime = JobScheduleHelper.generateNextValidTime(paramXxlJobInfo, lastTime); + if (lastTime != null) { + result.add(DateUtil.formatDateTime(lastTime)); + } else { + break; + } + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + return error(ReturnT.FAIL_CODE, (I18nUtil.getString("schedule_type")+I18nUtil.getString("system_unvalid")) + e.getMessage()); + } + return success(result); + } + } diff --git a/ludu-job-admin/ludu-job-admin-biz/src/main/resources/application.yaml b/ludu-job-admin/ludu-job-admin-biz/src/main/resources/application.yaml index acf998377..4eaa7a119 100644 --- a/ludu-job-admin/ludu-job-admin-biz/src/main/resources/application.yaml +++ b/ludu-job-admin/ludu-job-admin-biz/src/main/resources/application.yaml @@ -31,12 +31,11 @@ spring: ### actuator management: - server: - servlet: - context-path: /actuator health: mail: enabled: false + server: + base-path: /actuator diff --git a/ludu-job-admin/ludu-job-admin-biz/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml b/ludu-job-admin/ludu-job-admin-biz/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml index 059016897..e872a9d68 100644 --- a/ludu-job-admin/ludu-job-admin-biz/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml +++ b/ludu-job-admin/ludu-job-admin-biz/src/main/resources/mybatis-mapper/XxlJobInfoMapper.xml @@ -1,45 +1,48 @@ + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - + + - - + + - - + + - - + + - - - + + + - - - - - - + + + + + + - - - - + + + + - + - - - - + + + + - - t.id, + + t + . + id + , t.job_group, t.job_desc, t.add_time, @@ -63,220 +66,254 @@ t.trigger_status, t.trigger_last_time, t.trigger_next_time - + - + SELECT + + FROM xxl_job_info AS t + + + AND t.job_group = #{jobGroup} + AND t.trigger_status = #{triggerStatus} - - AND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%') - - - AND t.executor_handler like CONCAT(CONCAT('%', #{executorHandler}), '%') - - - AND t.author like CONCAT(CONCAT('%', #{author}), '%') - - - ORDER BY id DESC - LIMIT #{offset}, #{pagesize} - + + AND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%') + + + AND t.executor_handler like CONCAT(CONCAT('%', #{executorHandler}), '%') + + + AND t.author like CONCAT(CONCAT('%', #{author}), '%') + + + ORDER BY id DESC + LIMIT #{offset}, #{pagesize} + - + SELECT count(1) + FROM xxl_job_info AS t + + + AND t.job_group = #{jobGroup} + AND t.trigger_status = #{triggerStatus} - - AND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%') - - - AND t.executor_handler like CONCAT(CONCAT('%', #{executorHandler}), '%') - - - AND t.author like CONCAT(CONCAT('%', #{author}), '%') - - - + + AND t.job_desc like CONCAT(CONCAT('%', #{jobDesc}), '%') + + + AND t.executor_handler like CONCAT(CONCAT('%', #{executorHandler}), '%') + + + AND t.author like CONCAT(CONCAT('%', #{author}), '%') + + + - - INSERT INTO xxl_job_info ( - job_group, - job_desc, - add_time, - update_time, - author, - alarm_email, - schedule_type, - schedule_conf, - misfire_strategy, - executor_route_strategy, - executor_handler, - executor_param, - executor_block_strategy, - executor_timeout, - executor_fail_retry_count, - glue_type, - glue_source, - glue_remark, - glue_updatetime, - child_jobid, - trigger_status, - trigger_last_time, - trigger_next_time - ) VALUES ( - #{jobGroup}, - #{jobDesc}, - #{addTime}, - #{updateTime}, - #{author}, - #{alarmEmail}, - #{scheduleType}, - #{scheduleConf}, - #{misfireStrategy}, - #{executorRouteStrategy}, - #{executorHandler}, - #{executorParam}, - #{executorBlockStrategy}, - #{executorTimeout}, - #{executorFailRetryCount}, - #{glueType}, - #{glueSource}, - #{glueRemark}, - #{glueUpdatetime}, - #{childJobId}, - #{triggerStatus}, - #{triggerLastTime}, - #{triggerNextTime} - ); - - + + INSERT INTO xxl_job_info ( + job_group, + job_desc, + add_time, + update_time, + author, + alarm_email, + schedule_type, + schedule_conf, + misfire_strategy, + executor_route_strategy, + executor_handler, + executor_param, + executor_block_strategy, + executor_timeout, + executor_fail_retry_count, + glue_type, + glue_source, + glue_remark, + glue_updatetime, + child_jobid, + trigger_status, + trigger_last_time, + trigger_next_time + ) VALUES ( + #{jobGroup}, + #{jobDesc}, + #{addTime}, + #{updateTime}, + #{author}, + #{alarmEmail}, + #{scheduleType}, + #{scheduleConf}, + #{misfireStrategy}, + #{executorRouteStrategy}, + #{executorHandler}, + #{executorParam}, + #{executorBlockStrategy}, + #{executorTimeout}, + #{executorFailRetryCount}, + #{glueType}, + #{glueSource}, + #{glueRemark}, + #{glueUpdatetime}, + #{childJobId}, + #{triggerStatus}, + #{triggerLastTime}, + #{triggerNextTime} + ); + + - + - - UPDATE xxl_job_info - SET - job_group = #{jobGroup}, - job_desc = #{jobDesc}, - update_time = #{updateTime}, - author = #{author}, - alarm_email = #{alarmEmail}, - schedule_type = #{scheduleType}, - schedule_conf = #{scheduleConf}, - misfire_strategy = #{misfireStrategy}, - executor_route_strategy = #{executorRouteStrategy}, - executor_handler = #{executorHandler}, - executor_param = #{executorParam}, - executor_block_strategy = #{executorBlockStrategy}, - executor_timeout = ${executorTimeout}, - executor_fail_retry_count = ${executorFailRetryCount}, - glue_type = #{glueType}, - glue_source = #{glueSource}, - glue_remark = #{glueRemark}, - glue_updatetime = #{glueUpdatetime}, - child_jobid = #{childJobId}, - trigger_status = #{triggerStatus}, - trigger_last_time = #{triggerLastTime}, - trigger_next_time = #{triggerNextTime} - WHERE id = #{id} - + + UPDATE xxl_job_info + SET job_group = #{jobGroup}, + job_desc = #{jobDesc}, + update_time = #{updateTime}, + author = #{author}, + alarm_email = #{alarmEmail}, + schedule_type = #{scheduleType}, + schedule_conf = #{scheduleConf}, + misfire_strategy = #{misfireStrategy}, + executor_route_strategy = #{executorRouteStrategy}, + executor_handler = #{executorHandler}, + executor_param = #{executorParam}, + executor_block_strategy = #{executorBlockStrategy}, + executor_timeout = ${executorTimeout}, + executor_fail_retry_count = ${executorFailRetryCount}, + glue_type = #{glueType}, + glue_source = #{glueSource}, + glue_remark = #{glueRemark}, + glue_updatetime = #{glueUpdatetime}, + child_jobid = #{childJobId}, + trigger_status = #{triggerStatus}, + trigger_last_time = #{triggerLastTime}, + trigger_next_time = #{triggerNextTime} + WHERE id = #{id} + - - DELETE - FROM xxl_job_info - WHERE id = #{id} - + + DELETE + FROM xxl_job_info + WHERE id = #{id} + - + - + - + - - UPDATE xxl_job_info - SET - trigger_last_time = #{triggerLastTime}, - trigger_next_time = #{triggerNextTime}, - trigger_status = #{triggerStatus} - WHERE id = #{id} - - - - - - - - - + + UPDATE xxl_job_info + SET trigger_last_time = #{triggerLastTime}, + trigger_next_time = #{triggerNextTime}, + trigger_status = #{triggerStatus} + WHERE id = #{id} + - - + + + + 3 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ludu-job-admin/ludu-job-admin-biz/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml b/ludu-job-admin/ludu-job-admin-biz/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml index 4155f1798..8fdbbbe6a 100644 --- a/ludu-job-admin/ludu-job-admin-biz/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml +++ b/ludu-job-admin/ludu-job-admin-biz/src/main/resources/mybatis-mapper/XxlJobLogMapper.xml @@ -77,6 +77,51 @@ ORDER BY t.trigger_time DESC LIMIT #{offset}, #{pagesize} + + + + + + + + + + + + +