diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobLogController.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobLogController.java index 43ed6cf8..50ab7e10 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobLogController.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/controller/biz/JobLogController.java @@ -8,6 +8,7 @@ import com.xxl.job.admin.model.XxlJobInfo; import com.xxl.job.admin.model.XxlJobLog; import com.xxl.job.admin.scheduler.config.XxlJobAdminBootstrap; import com.xxl.job.admin.scheduler.exception.XxlJobException; +import com.xxl.job.admin.service.XxlJobService; import com.xxl.job.admin.util.I18nUtil; import com.xxl.job.admin.util.JobGroupPermissionUtil; import com.xxl.job.core.openapi.ExecutorBiz; @@ -24,6 +25,7 @@ import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @@ -43,7 +45,7 @@ import java.util.Map; @Controller @RequestMapping("/joblog") public class JobLogController { - private static Logger logger = LoggerFactory.getLogger(JobLogController.class); + private static final Logger logger = LoggerFactory.getLogger(JobLogController.class); @Resource private XxlJobGroupMapper xxlJobGroupMapper; @@ -51,58 +53,71 @@ public class JobLogController { public XxlJobInfoMapper xxlJobInfoMapper; @Resource public XxlJobLogMapper xxlJobLogMapper; + @Autowired + private XxlJobService xxlJobService; @RequestMapping - public String index(HttpServletRequest request, Model model, + public String index(HttpServletRequest request, + Model model, @RequestParam(value = "jobGroup", required = false, defaultValue = "0") Integer jobGroup, @RequestParam(value = "jobId", required = false, defaultValue = "0") Integer jobId) { - // find jobGroup + // find all jobGroup List jobGroupListTotal = xxlJobGroupMapper.findAll(); - // filter jobGroup + + // filter JobGroupList List jobGroupList = JobGroupPermissionUtil.filterJobGroupByPermission(request, jobGroupListTotal); if (CollectionTool.isEmpty(jobGroupList)) { throw new XxlJobException(I18nUtil.getString("jobgroup_empty")); } - // write jobGroup - model.addAttribute("JobGroupList", jobGroupList); - // parse jobId、jobGroup + // parse jobGroup if (jobId > 0) { + // assign jobId (+ jobGroup) XxlJobInfo jobInfo = xxlJobInfoMapper.loadById(jobId); if (jobInfo == null) { + // jobId not exist, inteceptor throw new RuntimeException(I18nUtil.getString("jobinfo_field_id") + I18nUtil.getString("system_unvalid")); } jobGroup = jobInfo.getJobGroup(); - } else if (jobGroup > 0){ + } else if (jobGroup > 0) { + // assign jobGroup + Integer finalJobGroup = jobGroup; + if (CollectionTool.isEmpty(jobGroupListTotal.stream().filter(item -> item.getId() == finalJobGroup).toList())) { + // jobGroup not exist, use first + jobGroup = jobGroupList.get(0).getId(); + } + jobId = 0; + } else { + // default first valid jobGroup + jobGroup = jobGroupList.get(0).getId(); jobId = 0; } - jobGroup = jobGroup > 0 ? jobGroup : jobGroupList.get(0).getId(); - // valid permission - JobGroupPermissionUtil.validJobGroupPermission(request, jobGroup); + + /*// valid permission + JobGroupPermissionUtil.validJobGroupPermission(request, jobGroup);*/ // find jobList List jobInfoList = xxlJobInfoMapper.getJobsByGroup(jobGroup); + // parse jobId + if (CollectionTool.isEmpty(jobInfoList)) { + jobId = 0; + } else { + if (!jobInfoList.stream().map(XxlJobInfo::getId).toList().contains(jobId)) { + // jobId not exist, use first + jobId = jobInfoList.get(0).getId(); + } + } + // write + model.addAttribute("JobGroupList", jobGroupList); model.addAttribute("jobInfoList", jobInfoList); model.addAttribute("jobGroup", jobGroup); model.addAttribute("jobId", jobId); - return "joblog/joblog.index"; + return "biz/log.list"; } - - /*@RequestMapping("/getJobsByGroup") - @ResponseBody - public Response> getJobsByGroup(HttpServletRequest request, @RequestParam("jobGroup") int jobGroup){ - - // valid permission - JobInfoController.validJobGroupPermission(request, jobGroup); - - // query - List list = xxlJobInfoMapper.getJobsByGroup(jobGroup); - return Response.ofSuccess(list); - }*/ @RequestMapping("/pageList") @ResponseBody @@ -117,6 +132,11 @@ public class JobLogController { // valid jobGroup permission JobGroupPermissionUtil.validJobGroupPermission(request, jobGroup); + // valid jobId + if (jobId < 1) { + return Response.ofFail(I18nUtil.getString("system_please_choose") + I18nUtil.getString("jobinfo_job")); + } + // parse param Date triggerTimeStart = null; Date triggerTimeEnd = null; @@ -140,64 +160,8 @@ public class JobLogController { return Response.ofSuccess(pageModel); } - @RequestMapping("/logDetailPage") - public String logDetailPage(HttpServletRequest request, @RequestParam("id") int id, Model model){ - - // base check - XxlJobLog jobLog = xxlJobLogMapper.load(id); - if (jobLog == null) { - throw new RuntimeException(I18nUtil.getString("joblog_logid_unvalid")); - } - - // valid permission - JobGroupPermissionUtil.validJobGroupPermission(request, jobLog.getJobGroup()); - - // data - model.addAttribute("triggerCode", jobLog.getTriggerCode()); - model.addAttribute("handleCode", jobLog.getHandleCode()); - model.addAttribute("logId", jobLog.getId()); - return "joblog/joblog.detail"; - } - - @RequestMapping("/logDetailCat") - @ResponseBody - public Response logDetailCat(@RequestParam("logId") long logId, @RequestParam("fromLineNum") int fromLineNum){ - try { - // valid - XxlJobLog jobLog = xxlJobLogMapper.load(logId); // todo, need to improve performance - if (jobLog == null) { - return Response.ofFail(I18nUtil.getString("joblog_logid_unvalid")); - } - - // log cat - ExecutorBiz executorBiz = XxlJobAdminBootstrap.getExecutorBiz(jobLog.getExecutorAddress()); - Response logResult = executorBiz.log(new LogRequest(jobLog.getTriggerTime().getTime(), logId, fromLineNum)); - - // is end - if (logResult.getData()!=null && logResult.getData().getFromLineNum() > logResult.getData().getToLineNum()) { - if (jobLog.getHandleCode() > 0) { - logResult.getData().setEnd(true); - } - } - - // fix xss - if (logResult.getData()!=null && StringTool.isNotBlank(logResult.getData().getLogContent())) { - String newLogContent = filter(logResult.getData().getLogContent()); - logResult.getData().setLogContent(newLogContent); - } - - return logResult; - } catch (Exception e) { - logger.error(e.getMessage(), e); - return Response.ofFail(e.getMessage()); - } - } - /** * filter xss tag - * - * @param originData - * @return */ private String filter(String originData){ @@ -271,6 +235,11 @@ public class JobLogController { // valid JobGroup permission JobGroupPermissionUtil.validJobGroupPermission(request, jobGroup); + // valid jobId + if (jobId < 1) { + return Response.ofFail(I18nUtil.getString("system_please_choose") + I18nUtil.getString("jobinfo_job")); + } + // opt Date clearBeforeTime = null; int clearBeforeNum = 0; @@ -299,12 +268,69 @@ public class JobLogController { List logIds = null; do { logIds = xxlJobLogMapper.findClearLogIds(jobGroup, jobId, clearBeforeTime, clearBeforeNum, 1000); - if (logIds!=null && logIds.size()>0) { + if (logIds!=null && !logIds.isEmpty()) { xxlJobLogMapper.clearLog(logIds); } - } while (logIds!=null && logIds.size()>0); + } while (logIds!=null && !logIds.isEmpty()); return Response.ofSuccess(); } + @RequestMapping("/logDetailPage") + public String logDetailPage(HttpServletRequest request, @RequestParam("id") int id, Model model){ + + // base check + XxlJobLog jobLog = xxlJobLogMapper.load(id); + if (jobLog == null) { + throw new RuntimeException(I18nUtil.getString("joblog_logid_unvalid")); + } + + // valid permission + JobGroupPermissionUtil.validJobGroupPermission(request, jobLog.getJobGroup()); + + // load jobInfo + XxlJobInfo jobInfo = xxlJobInfoMapper.loadById(jobLog.getJobId()); + + // data + model.addAttribute("triggerCode", jobLog.getTriggerCode()); + model.addAttribute("handleCode", jobLog.getHandleCode()); + model.addAttribute("logId", jobLog.getId()); + model.addAttribute("jobInfo", jobInfo); + return "biz/log.detail"; + } + + @RequestMapping("/logDetailCat") + @ResponseBody + public Response logDetailCat(@RequestParam("logId") long logId, @RequestParam("fromLineNum") int fromLineNum){ + try { + // valid + XxlJobLog jobLog = xxlJobLogMapper.load(logId); // todo, need to improve performance + if (jobLog == null) { + return Response.ofFail(I18nUtil.getString("joblog_logid_unvalid")); + } + + // log cat + ExecutorBiz executorBiz = XxlJobAdminBootstrap.getExecutorBiz(jobLog.getExecutorAddress()); + Response logResult = executorBiz.log(new LogRequest(jobLog.getTriggerTime().getTime(), logId, fromLineNum)); + + // is end + if (logResult.getData()!=null && logResult.getData().getFromLineNum() > logResult.getData().getToLineNum()) { + if (jobLog.getHandleCode() > 0) { + logResult.getData().setEnd(true); + } + } + + // fix xss + if (logResult.getData()!=null && StringTool.isNotBlank(logResult.getData().getLogContent())) { + String newLogContent = filter(logResult.getData().getLogContent()); + logResult.getData().setLogContent(newLogContent); + } + + return logResult; + } catch (Exception e) { + logger.error(e.getMessage(), e); + return Response.ofFail(e.getMessage()); + } + } + } diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/util/JobGroupPermissionUtil.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/util/JobGroupPermissionUtil.java index 434a79fa..39b1ff8d 100644 --- a/xxl-job-admin/src/main/java/com/xxl/job/admin/util/JobGroupPermissionUtil.java +++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/util/JobGroupPermissionUtil.java @@ -52,7 +52,8 @@ public class JobGroupPermissionUtil { return jobGroupListTotal; } else { List jobGroups = (loginInfoResponse.getData().getExtraInfo()!=null && loginInfoResponse.getData().getExtraInfo().containsKey("jobGroups")) - ? StringTool.split(loginInfoResponse.getData().getExtraInfo().get("jobGroups"), ",") :new ArrayList<>(); + ? StringTool.split(loginInfoResponse.getData().getExtraInfo().get("jobGroups"), ",") + :new ArrayList<>(); return jobGroupListTotal .stream() diff --git a/xxl-job-admin/src/main/resources/templates/biz/log.detail.ftl b/xxl-job-admin/src/main/resources/templates/biz/log.detail.ftl new file mode 100644 index 00000000..b1b60d1e --- /dev/null +++ b/xxl-job-admin/src/main/resources/templates/biz/log.detail.ftl @@ -0,0 +1,184 @@ + + + + <#-- import macro --> + <#import "../common/common.macro.ftl" as netCommon> + + + <@netCommon.commonStyle /> + + + + +
+ + +
+ +
+ + + +
+
+ +
+				
+
  • +
    +
    +
    + + + +
    + Powered by XXL-JOB ${I18n.admin_version} + +
    + + +
    + + +<@netCommon.commonScript /> + + + + + + \ No newline at end of file diff --git a/xxl-job-admin/src/main/resources/templates/biz/log.list.ftl b/xxl-job-admin/src/main/resources/templates/biz/log.list.ftl new file mode 100644 index 00000000..f2ac4e1d --- /dev/null +++ b/xxl-job-admin/src/main/resources/templates/biz/log.list.ftl @@ -0,0 +1,564 @@ + + + + <#-- import macro --> + <#import "../common/common.macro.ftl" as netCommon> + + + <@netCommon.commonStyle /> + + + + + + + +
    +
    + + + + <#-- 查询区域 --> +
    +
    +
    + +
    +
    + ${I18n.jobinfo_field_jobgroup} + +
    +
    +
    +
    + ${I18n.jobinfo_job} + +
    +
    +
    +
    + ${I18n.joblog_status} + +
    +
    +
    +
    + + ${I18n.joblog_field_triggerTime} + + +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    + + <#-- 数据表格区域 --> +
    +
    +
    +
    + + + | + + <#--warning + danger + info + default--> +
    +
    + + + + +
    +
    +
    +
    +
    + + + + + + +
    +
    + + +<@netCommon.commonScript /> + + +<#--daterangepicker--> + + +<#-- admin table --> + + + + + + \ No newline at end of file diff --git a/xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl b/xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl deleted file mode 100644 index 37ed5345..00000000 --- a/xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl +++ /dev/null @@ -1,92 +0,0 @@ - - - - <#-- import macro --> - <#import "../common/common.macro.ftl" as netCommon> - - <#-- commonStyle --> - <@netCommon.commonStyle /> - - <#-- biz start(1/5 style) --> - <#-- biz end(1/5 end) --> - - - -
    - - - <#-- biz start(2/5 style) --> -
    - -
    - <#-- biz end(2/5 end) --> - - -
    - - <#-- biz start(3/5 name) --> - <#-- biz end(3/5 name) --> - - -
    - - <#-- biz start(4/5 content) --> -
    -                
    -
  • -
    - <#-- biz end(4/5 content) --> - -
    -
    - - - - <@netCommon.commonFooter /> - -
    - -<@netCommon.commonScript /> - -<#-- biz start(5/5 script) --> - - -<#-- biz end(5/5 script) --> - - - \ No newline at end of file diff --git a/xxl-job-admin/src/main/resources/templates/joblog/joblog.index.ftl b/xxl-job-admin/src/main/resources/templates/joblog/joblog.index.ftl deleted file mode 100644 index 5fd13697..00000000 --- a/xxl-job-admin/src/main/resources/templates/joblog/joblog.index.ftl +++ /dev/null @@ -1,206 +0,0 @@ - - - - <#-- import macro --> - <#import "../common/common.macro.ftl" as netCommon> - - <#-- commonStyle --> - <@netCommon.commonStyle /> - - <#-- biz start(1/5 style) --> - - - - - <#-- biz end(1/5 end) --> - - - -
    - - - <@netCommon.commonHeader /> - - - <#-- biz start(2/5 left) --> - <@netCommon.commonLeft "joblog" /> - <#-- biz end(2/5 left) --> - - -
    - - -
    - <#-- biz start(3/5 name) --> -

    ${I18n.joblog_name}

    - <#-- biz end(3/5 name) --> -
    - - -
    - - <#-- biz start(4/5 content) --> - - -
    -
    -
    - ${I18n.jobinfo_field_jobgroup} - -
    -
    -
    -
    - ${I18n.jobinfo_job} - -
    -
    - -
    -
    - ${I18n.joblog_status} - -
    -
    - -
    -
    - - ${I18n.joblog_field_triggerTime} - - -
    -
    - -
    - -
    - -
    - -
    -
    - - -
    -
    -
    - <#--

    调度日志

    --> -
    - - - - - - <#-- - - --> - - - - - - - - - - -
    ${I18n.jobinfo_field_id}jobGroup执行器地址运行模式任务参数${I18n.joblog_field_triggerTime}${I18n.joblog_field_triggerCode}${I18n.joblog_field_triggerMsg}${I18n.joblog_field_handleTime}${I18n.joblog_field_handleCode}${I18n.joblog_field_handleMsg}${I18n.system_opt}
    -
    -
    -
    -
    -
    - - - - - <#-- biz end(4/5 content) --> - -
    - - - - <@netCommon.commonFooter /> -
    - -<@netCommon.commonScript /> - -<#-- biz start(5/5 script) --> - - - - - - - -<#-- biz end(5/5 script) --> - - -