Procházet zdrojové kódy

完成监控模块的页面接口和前端页面

reghao před 4 roky
rodič
revize
5dea1f1a71
19 změnil soubory, kde provedl 435 přidání a 379 odebrání
  1. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/constant/EnvType.java
  2. 106 115
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/controller/MonitorController.java
  3. 168 89
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/controller/MonitorPageController.java
  4. 0 38
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/controller/SchedulerController.java
  5. 1 13
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/entity/AppMonitor.java
  6. 38 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/entity/BaseMonitor.java
  7. 2 13
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/entity/MachineMonitor.java
  8. 11 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/entity/MonitorType.java
  9. 22 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MonitorScheduler.java
  10. 51 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/job/machine/MachineDiskUsageCheckJob.java
  11. 2 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/attribute/SelectDictAttrProcessor.java
  12. 0 11
      dmaster/src/main/resources/templates/monitor/app3.html
  13. 0 23
      dmaster/src/main/resources/templates/monitor/appjob.html
  14. 16 17
      dmaster/src/main/resources/templates/monitor/appmonitor.html
  15. 7 8
      dmaster/src/main/resources/templates/monitor/machinemonitor.html
  16. 0 39
      dmaster/src/main/resources/templates/monitor/machinenotify.html
  17. 1 2
      dmaster/src/main/resources/templates/monitor/monitorjob.html
  18. 8 4
      dmaster/src/main/resources/templates/monitor/monitorjobs.html
  19. 1 2
      dmaster/src/main/resources/templates/monitor/monitornotify.html

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/constant/EnvType.java

@@ -7,7 +7,7 @@ package cn.reghao.autodop.dmaster.app.constant;
  * @date 2019-10-18 14:31:29
  */
 public enum EnvType {
-    dev, test, prod;
+    dev,test,preprod,prod;
 
     public String getName() {
         return this.name();

+ 106 - 115
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/controller/MonitorController.java

@@ -1,8 +1,11 @@
 package cn.reghao.autodop.dmaster.monitor.controller;
 
+import cn.reghao.autodop.common.result.Result;
+import cn.reghao.autodop.common.result.ResultStatus;
 import cn.reghao.autodop.dmaster.monitor.entity.AppMonitor;
 import cn.reghao.autodop.dmaster.monitor.entity.MachineMonitor;
 import cn.reghao.autodop.dmaster.monitor.entity.MonitorJob;
+import cn.reghao.autodop.dmaster.monitor.entity.MonitorType;
 import cn.reghao.autodop.dmaster.monitor.repository.AppMonitorRepository;
 import cn.reghao.autodop.dmaster.monitor.repository.MachineMonitorRepository;
 import cn.reghao.autodop.dmaster.monitor.service.MonitorScheduler;
@@ -18,10 +21,11 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author reghao
- * @date 2019-11-15 08:44:50
+ * @date 2019-08-30 18:49:15
  */
 @Slf4j
 @Api(tags = "监控接口")
@@ -40,133 +44,120 @@ public class MonitorController {
         this.appMonitorRepository = appMonitorRepository;
     }
 
-    @ApiOperation(value = "设置机器状态监控任务")
-    @PostMapping(value = "/machine/job/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
-    public ResponseEntity<String> machineMonitorJob(@PathVariable("id") MachineMonitor machineMonitor,
-                                                    @Valid MonitorJob monitorJob) throws SchedulerException {
-        String jobId = machineMonitor.getMachineId() + "-heartbeat";
-        monitorJob.setJobId(jobId);
-        monitorJob.setEnable(true);
+    // TODO 任务启用或禁用时设置都立即生效
+    @ApiOperation(value = "设置机器监控通知")
+    @PostMapping(value = "/{monitorType}/notify/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ResponseBody
+    public ResponseEntity<String> machineMonitorNotify(@PathVariable("monitorType") String monitorType,
+                                                       @PathVariable("id") Integer id,
+                                                       @RequestParam("groupId") List<NotifyGroup> notifyGroups) {
 
-        List<MonitorJob> monitorJobs = machineMonitor.getMonitorJobs();
-        monitorJobs.add(monitorJob);
-        // 这两个操作应该在一个事务中
-        //monitorScheduler.addMachineHeartbeatCheckJob(machineMonitor);
-        machineMonitorRepository.save(machineMonitor);
+        switch (MonitorType.valueOf(monitorType)) {
+            case machine:
+                MachineMonitor machineMonitor = machineMonitorRepository.findById(id).orElse(null);
+                machineMonitor.setNotifyGroups(notifyGroups);
+                machineMonitorRepository.save(machineMonitor);
+                break;
+            case app:
+                AppMonitor appMonitor = appMonitorRepository.findById(id).orElse(null);
+                appMonitor.setNotifyGroups(notifyGroups);
+                appMonitorRepository.save(appMonitor);
+                break;
+            default:
+        }
         return ResponseEntity.ok().body(WebBody.success());
     }
 
-    @ApiOperation(value = "是否开始监控机器状态")
-    @PostMapping(value = "/machine/{status}/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
-    public ResponseEntity<String> machineMonitorStatus(@PathVariable("status") String status,
-                                                        @PathVariable("id") MachineMonitor machineMonitor)
-            throws SchedulerException {
-        /*Boolean enable = machineMonitor.getEnable();
-        if ("enable".equals(status)) {
-            if (enable) {
-                return ResponseEntity.ok().body(WebBody.successMsg("当前正在监控中"));
-            }
-
-            String jobId = machineMonitor.getJobId();
-            if (jobId == null) {
-                return ResponseEntity.ok().body(WebBody.failWithMsg("请先设置监控任务"));
-            }
-
-            // TODO 应该在一个事务中
-            machineMonitor.setEnable(true);
-            monitorScheduler.resume(machineMonitor.getJobId());
-            machineMonitorRepository.save(machineMonitor);
-
-            return ResponseEntity.ok().body(WebBody.successMsg("监控已开启"));
-        } else {
-            if (!enable) {
-                return ResponseEntity.ok().body(WebBody.successMsg("当前没有监控"));
-            }
-
-            // TODO 应该在一个事务中
-            machineMonitor.setEnable(false);
-            monitorScheduler.pause(machineMonitor.getJobId());
-            machineMonitorRepository.save(machineMonitor);
-
-            return ResponseEntity.ok().body(WebBody.successMsg("监控已停止"));
-        }*/
-
-        return ResponseEntity.ok().body(WebBody.successMsg("监控已停止"));
-    }
+    @ApiOperation(value = "设置机器监控任务")
+    @PostMapping(value = "/{monitorType}/job/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
+    public ResponseEntity<String> machineMonitorJob(@PathVariable("monitorType") String monitorType,
+                                                    @PathVariable("id") Integer id,
+                                                    @Valid MonitorJob monitorJob) throws SchedulerException {
+        switch (MonitorType.valueOf(monitorType)) {
+            case machine:
+                MachineMonitor machineMonitor = machineMonitorRepository.findById(id).orElse(null);
+                String jobId = String.format("%s-%s", machineMonitor.getMachineId(), monitorJob.getJobClassName());
+                monitorJob.setJobId(jobId);
+                monitorJob.setEnable(true);
+
+                Map<String, MonitorJob> monitorJobs = machineMonitor.getJobMap();
+                monitorJobs.put(monitorJob.getJobId(), monitorJob);
+                // TODO 这两个操作应该在一个事务中
+                monitorScheduler.addMachineHeartbeatCheckJob(machineMonitor);
+                machineMonitorRepository.save(machineMonitor);
+                break;
+            case app:
+                AppMonitor appMonitor = appMonitorRepository.findById(id).orElse(null);
+                String jobId1 = String.format("%s-%s-%s",
+                        appMonitor.getAppId(), appMonitor.getMachineId(), monitorJob.getJobClassName());
+                monitorJob.setJobId(jobId1);
+                monitorJob.setEnable(true);
+
+                Map<String, MonitorJob> monitorJobs1 = appMonitor.getJobMap();
+                monitorJobs1.put(monitorJob.getJobId(), monitorJob);
+                // TODO 这两个操作应该在一个事务中
+                monitorScheduler.addAppHealthCheckJob(appMonitor);
+                appMonitorRepository.save(appMonitor);
+                break;
+            default:
+        }
 
-    @ApiOperation(value = "设置机器状态监控通知")
-    @PostMapping(value = "/machine/notify", produces = MediaType.APPLICATION_JSON_VALUE)
-    public ResponseEntity<String> machineMonitorNotify(@RequestParam("id") MachineMonitor machineMonitor,
-                                                       @RequestParam("groupId") List<NotifyGroup> notifyGroups) {
-        machineMonitor.setNotifyGroups(notifyGroups);
-        machineMonitorRepository.save(machineMonitor);
         return ResponseEntity.ok().body(WebBody.success());
     }
 
-    @ApiOperation(value = "设置应用健康检查监控任务")
-    @PostMapping(value = "/app/job/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
-    public ResponseEntity<String> appMonitorJob(@PathVariable("id") AppMonitor appMonitor,
-                                                @RequestParam("cronExp") String cronExp) throws SchedulerException {
-        /*String jobId = appMonitor.getJobId();
-        if (jobId == null) {
-            jobId = String.format("%s-%s-healthcheck", appMonitor.getAppId(), appMonitor.getMachineId());
-            appMonitor.setJobId(jobId);
+    @ApiOperation(value = "开始/停止任务")
+    @PostMapping(value = "/{monitorType}/job/{id}/{jobId}/{status}", produces = MediaType.APPLICATION_JSON_VALUE)
+    public ResponseEntity<String> machineJobStatus(@PathVariable("monitorType") String monitorType,
+                                                   @PathVariable("id") Integer id,
+                                                   @PathVariable("jobId") String jobId,
+                                                   @PathVariable("status") String status) throws SchedulerException {
+        Result result;
+        switch (MonitorType.valueOf(monitorType)) {
+            case machine:
+                MachineMonitor machineMonitor = machineMonitorRepository.findById(id).orElse(null);
+                MonitorJob monitorJob = machineMonitor.getJobMap().get(jobId);
+                result = changeJobStatus(monitorJob, status);
+                if (result.getCode() != ResultStatus.SUCCESS.getCode()) {
+                    return ResponseEntity.ok().body(WebBody.failWithMsg("操作失败"));
+                }
+                machineMonitorRepository.save(machineMonitor);
+                break;
+            case app:
+                AppMonitor appMonitor = appMonitorRepository.findById(id).orElse(null);
+                MonitorJob monitorJob1 = appMonitor.getJobMap().get(jobId);
+                result = changeJobStatus(monitorJob1, status);
+                if (result.getCode() != ResultStatus.SUCCESS.getCode()) {
+                    return ResponseEntity.ok().body(WebBody.failWithMsg("操作失败"));
+                }
+                appMonitorRepository.save(appMonitor);
+                break;
+            default:
+                result = Result.result(ResultStatus.FAIL);
         }
-        // TODO 验证 cronExp 是否有效
-        appMonitor.setCronExp(cronExp);
-        appMonitor.setEnable(true);
 
-        // TODO 这两个操作应该在一个事务中
-        monitorScheduler.addAppHealthCheckJob(appMonitor);
-        appMonitorRepository.save(appMonitor);*/
-
-        return ResponseEntity.ok().body(WebBody.success());
+        return ResponseEntity.ok().body(WebBody.result(result));
     }
 
-    @ApiOperation(value = "是否开始应用健康检查监控")
-    @PostMapping(value = "/app/{status}/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
-    public ResponseEntity<String> appMonitorStatus(@PathVariable("status") String status,
-                                                   @PathVariable("id") AppMonitor appMonitor)
-            throws SchedulerException {
-        /*Boolean enable = appMonitor.getEnable();
-        if ("enable".equals(status)) {
-            if (enable) {
-                return ResponseEntity.ok().body(WebBody.successMsg("当前正在监控中"));
-            }
-
-            String jobId = appMonitor.getJobId();
-            if (jobId == null) {
-                return ResponseEntity.ok().body(WebBody.failWithMsg("请先设置监控任务"));
-            }
-
-            // TODO 应该在一个事务中
-            appMonitor.setEnable(true);
-            monitorScheduler.resume(appMonitor.getJobId());
-            appMonitorRepository.save(appMonitor);
-
-            return ResponseEntity.ok().body(WebBody.successMsg("监控已开启"));
-        } else {
-            if (!enable) {
-                return ResponseEntity.ok().body(WebBody.successMsg("当前没有监控"));
-            }
-
-            // TODO 应该在一个事务中
-            appMonitor.setEnable(false);
-            monitorScheduler.pause(appMonitor.getJobId());
-            appMonitorRepository.save(appMonitor);
-
-            return ResponseEntity.ok().body(WebBody.successMsg("监控已停止"));
-        }*/
+    private Result changeJobStatus(MonitorJob monitorJob, String status) throws SchedulerException {
+        boolean enable = "enable".equals(status);
+        boolean isEnable = monitorJob.getEnable();
+        Result result = null;
+        if (enable && !isEnable) {
+            // 开启任务
+            monitorScheduler.resume(monitorJob.getJobId());
+            result = Result.result(ResultStatus.SUCCESS, "监控已开始");
+        }
 
-        return ResponseEntity.ok().body(WebBody.successMsg("监控已停止"));
-    }
+        if (!enable && isEnable) {
+            // 停止任务
+            monitorScheduler.pause(monitorJob.getJobId());
+            result = Result.result(ResultStatus.SUCCESS, "监控已停止");
+        }
 
-    @ApiOperation(value = "设置机器状态监控通知")
-    @PostMapping(value = "/app/notify", produces = MediaType.APPLICATION_JSON_VALUE)
-    public ResponseEntity<String> appMonitorNotify(@RequestParam("id") AppMonitor appMonitor,
-                                                       @RequestParam("groupId") List<NotifyGroup> notifyGroups) {
-        appMonitor.setNotifyGroups(notifyGroups);
-        appMonitorRepository.save(appMonitor);
-        return ResponseEntity.ok().body(WebBody.success());
+        if (result != null) {
+            monitorJob.setEnable(enable);
+            return result;
+        }
+        return Result.result(ResultStatus.SUCCESS);
     }
 }

+ 168 - 89
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/controller/MonitorPageController.java

@@ -5,6 +5,7 @@ import cn.reghao.autodop.dmaster.app.vo.KeyValue;
 import cn.reghao.autodop.dmaster.monitor.entity.AppMonitor;
 import cn.reghao.autodop.dmaster.monitor.entity.MachineMonitor;
 import cn.reghao.autodop.dmaster.monitor.entity.MonitorJob;
+import cn.reghao.autodop.dmaster.monitor.entity.MonitorType;
 import cn.reghao.autodop.dmaster.monitor.repository.AppMonitorRepository;
 import cn.reghao.autodop.dmaster.monitor.repository.MachineMonitorRepository;
 import cn.reghao.autodop.dmaster.notification.entity.NotifyGroup;
@@ -19,22 +20,18 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author reghao
  * @date 2019-08-30 18:49:15
  */
 @Slf4j
-@Api(tags = "监控页面接口")
+@Api(tags = "机器监控页面")
 @Controller
 @RequestMapping("/monitor")
 public class MonitorPageController {
@@ -50,106 +47,188 @@ public class MonitorPageController {
         this.receiverRepository = receiverRepository;
     }
 
-    @ApiOperation(value = "机器监控页面")
-    @GetMapping("/machine")
-    public String machineMonitorPage(Model model) {
+    @ApiOperation(value = "监控页面")
+    @GetMapping("/{monitorType}")
+    public String machineMonitorPage(@PathVariable("monitorType") String monitorType, Model model) {
         PageRequest pageRequest = PageSort.pageRequest();
-        Page<MachineMonitor> page = machineMonitorRepository.findAll(pageRequest);
-        PageList<MachineMonitor> pageList = PageList.pageList(page);
+        switch (MonitorType.valueOf(monitorType)) {
+            case machine:
+                Page<MachineMonitor> page = machineMonitorRepository.findAll(pageRequest);
+                PageList<MachineMonitor> pageList = PageList.pageList(page);
+
+                model.addAttribute("page", page);
+                model.addAttribute("list", pageList.getList());
+                return "/monitor/machinemonitor";
+            case app:
+                Page<MachineMonitor> page1 = machineMonitorRepository.findAll(pageRequest);
+                PageList<MachineMonitor> pageList1 = PageList.pageList(page1);
+
+                model.addAttribute("page", page1);
+                model.addAttribute("list", pageList1.getList());
+                return "/monitor/appmonitor";
+            default:
+        }
+        return "";
+    }
+
+    @ApiOperation(value = "监控通知设置页面")
+    @GetMapping("/{monitorType}/notify/{id}")
+    public String monitorNotifyPage(@PathVariable("monitorType") String monitorType,
+                                    @PathVariable("id") Integer id,
+                                    Model model) {
+        String notifyApi;
+        Set<NotifyGroup> currentSet;
+        List<NotifyGroup> list;
+        switch (MonitorType.valueOf(monitorType)) {
+            case machine:
+                notifyApi = "/api/monitor/machine/notify/" + id;
+                MachineMonitor machineMonitor = machineMonitorRepository.findById(id).orElse(null);
+                currentSet = new HashSet<>(machineMonitor.getNotifyGroups());
+                list = receiverRepository.findAll();
+                break;
+            case app:
+                notifyApi = "/api/monitor/app/notify/" + id;
+                AppMonitor appMonitor = appMonitorRepository.findById(id).orElse(null);
+                currentSet = new HashSet<>(appMonitor.getNotifyGroups());
+                list = receiverRepository.findAll();
+                break;
+            default:
+                notifyApi = null;
+                currentSet = Collections.emptySet();
+                list = Collections.emptyList();
+        }
 
-        model.addAttribute("page", page);
-        model.addAttribute("list", pageList.getList());
-        return "/monitor/machine";
+        model.addAttribute("notifyApi", notifyApi);
+        model.addAttribute("currentSet", currentSet);
+        model.addAttribute("list", list);
+        return "/monitor/monitornotify";
     }
 
-    @ApiOperation(value = "机器监控任务列表页面")
-    @GetMapping("/machine/jobs/{id}")
-    public String monitorAddPage(@PathVariable("id") MachineMonitor machineMonitor, Model model) {
-        List<MonitorJob> list = machineMonitor.getMonitorJobs();
-        model.addAttribute("machineMonitorId", machineMonitor.getId());
+    @ApiOperation(value = "监控任务列表页面")
+    @GetMapping("/{monitorType}/jobs/{id}")
+    public String monitorAddPage(@PathVariable("monitorType") String monitorType,
+                                 @PathVariable("id") Integer id,
+                                 Model model) {
+
+        String addJobUrl;
+        String editJobUrl;
+        String jobStatusApi;
+        List<MonitorJob> list;
+        switch (MonitorType.valueOf(monitorType)) {
+            case machine:
+                addJobUrl = String.format("/monitor/machine/jobs/add/%s", id);
+                editJobUrl = String.format("/monitor/machine/jobs/edit/%s", id);
+                jobStatusApi = String.format("/api/monitor/machine/job/%s", id);
+                MachineMonitor machineMonitor = machineMonitorRepository.findById(id).orElse(null);
+                list = new ArrayList<>(machineMonitor.getJobMap().values());
+                break;
+            case app:
+                addJobUrl = String.format("/monitor/app/jobs/add/%s", id);
+                editJobUrl = String.format("/monitor/app/jobs/edit/%s", id);
+                jobStatusApi = String.format("/api/monitor/app/job/%s", id);
+                AppMonitor appMonitor = appMonitorRepository.findById(id).orElse(null);
+                list = new ArrayList<>(appMonitor.getJobMap().values());
+                break;
+            default:
+                addJobUrl = null;
+                editJobUrl = null;
+                jobStatusApi = null;
+                list = Collections.emptyList();
+        }
+
+        model.addAttribute("addJobUrl", addJobUrl);
+        model.addAttribute("editJobUrl", editJobUrl);
+        model.addAttribute("jobStatusApi", jobStatusApi);
         model.addAttribute("list", list);
-        return "/monitor/machinejobs";
+        return "/monitor/monitorjobs";
     }
 
-    @ApiOperation(value = "机器监控任务添加页面")
-    @GetMapping("/machine/jobs/add/{id}")
-    public String monitorJobAddPage(@PathVariable("id") MachineMonitor machineMonitor, Model model)
-            throws IOException {
+    @ApiOperation(value = "监控任务添加页面")
+    @GetMapping("/{monitorType}/jobs/add/{id}")
+    public String monitorJobAddPage(@PathVariable("monitorType") String monitorType,
+                                    @PathVariable("id") Integer id,
+                                    Model model) throws IOException {
+
+        String addJobApi;
+        String jobPkg;
+        Set<String> exclude;
+        switch (MonitorType.valueOf(monitorType)) {
+            case machine:
+                MachineMonitor machineMonitor = machineMonitorRepository.findById(id).orElse(null);
+                exclude = machineMonitor.getJobMap().values().stream()
+                        .map(MonitorJob::getJobClassName)
+                        .collect(Collectors.toSet());
+                addJobApi = String.format("/api/monitor/machine/job/%s", id);
+                jobPkg = "cn.reghao.autodop.dmaster.monitor.service.job.machine";
+                break;
+            case app:
+                AppMonitor appMonitor = appMonitorRepository.findById(id).orElse(null);
+                exclude = appMonitor.getJobMap().values().stream()
+                        .map(MonitorJob::getJobClassName)
+                        .collect(Collectors.toSet());
+                addJobApi = String.format("/api/monitor/app/job/%s", id);
+                jobPkg = "cn.reghao.autodop.dmaster.monitor.service.job.app";
+                break;
+            default:
+                addJobApi = null;
+                jobPkg = null;
+                exclude = Collections.emptySet();
+        }
 
-        setJobNames(model);
-        model.addAttribute("machineMonitorId", machineMonitor.getId());
-        return "/monitor/machinejob";
+        model.addAttribute("addJobApi", addJobApi);
+        setJobNames(model, jobPkg, exclude);
+        return "/monitor/monitorjob";
     }
 
-    @ApiOperation(value = "机器监控任务编辑页面")
-    @GetMapping("/machine/jobs/edit/{id}")
-    public String monitorJobEditPage(@PathVariable("id") MonitorJob monitorJob, Model model) throws IOException {
-        setJobNames(model);
+    @ApiOperation(value = "监控任务编辑页面")
+    @GetMapping("/{monitorType}/jobs/edit/{id}/{jobId}")
+    public String monitorJobEditPage(@PathVariable("monitorType") String monitorType,
+                                     @PathVariable("id") Integer id,
+                                     @PathVariable("jobId") String jobId,
+                                     Model model) {
+
+        String addJobApi;
+        List<KeyValue> jobNames;
+        MonitorJob monitorJob;
+        switch (MonitorType.valueOf(monitorType)) {
+            case machine:
+                addJobApi = String.format("/api/monitor/machine/job/%s", id);
+                MachineMonitor machineMonitor = machineMonitorRepository.findById(id).orElse(null);
+                monitorJob = machineMonitor.getJobMap().get(jobId);
+                jobNames = new ArrayList<>();
+                jobNames.add(new KeyValue(monitorJob.getJobClassName(), monitorJob.getJobClassName()));
+                break;
+            case app:
+                addJobApi = String.format("/api/monitor/app/job/%s", id);
+                AppMonitor appMonitor = appMonitorRepository.findById(id).orElse(null);
+                monitorJob = appMonitor.getJobMap().get(jobId);
+                jobNames = new ArrayList<>();
+                jobNames.add(new KeyValue(monitorJob.getJobClassName(), monitorJob.getJobClassName()));
+                break;
+            default:
+                addJobApi = null;
+                jobNames = Collections.emptyList();
+                monitorJob = null;
+        }
+
+        model.addAttribute("addJobApi", addJobApi);
+        model.addAttribute("jobNames", jobNames);
         model.addAttribute("monitorJob", monitorJob);
-        return "/monitor/machinejob";
+        return "/monitor/monitorjob";
     }
 
-    private void setJobNames(Model model) throws IOException {
+    private void setJobNames(Model model, String jobPkg, Set<String> exclude) throws IOException {
         PackageScanner packageScanner = new PackageScanner();
-        String pkg = "cn.reghao.autodop.dmaster.monitor.service.job.machine";
-        List<Class<?>> classList = packageScanner.doScan(DmasterApplication.class, pkg);
+        List<Class<?>> classList = packageScanner.doScan(DmasterApplication.class, jobPkg);
 
         List<KeyValue> jobNames = new ArrayList<>();
         jobNames.add(new KeyValue("请选择任务", ""));
         for (Class<?> clazz : classList) {
-            jobNames.add(new KeyValue(clazz.getSimpleName(), clazz.getSimpleName()));
+            String simpleName = clazz.getSimpleName();
+            if (!exclude.contains(simpleName)) {
+                jobNames.add(new KeyValue(simpleName, simpleName));
+            }
         }
         model.addAttribute("jobNames", jobNames);
     }
-
-    @ApiOperation(value = "机器监控通知页面")
-    @GetMapping("/machine/notify/{id}")
-    public String monitorNotifyPage(@PathVariable("id") MachineMonitor machineMonitor, Model model) {
-        Set<NotifyGroup> currentSet = new HashSet<>(machineMonitor.getNotifyGroups());
-        List<NotifyGroup> list = receiverRepository.findAll();
-
-        model.addAttribute("id", machineMonitor.getId());
-        model.addAttribute("currentSet", currentSet);
-        model.addAttribute("list", list);
-        return "/monitor/machinenotify";
-    }
-
-    @ApiOperation(value = "应用监控页面")
-    @GetMapping("/app")
-    public String appMonitorPage(Model model) {
-        PageRequest pageRequest = PageSort.pageRequest();
-        Page<AppMonitor> page = appMonitorRepository.findAll(pageRequest);
-        PageList<AppMonitor> pageList = PageList.pageList(page);
-
-        model.addAttribute("page", page);
-        model.addAttribute("list", pageList.getList());
-        return "/monitor/app";
-    }
-
-    @ApiOperation(value = "应用监控任务页面")
-    @GetMapping("/app/job/{id}")
-    public String appJobPage(@PathVariable("id") AppMonitor appMonitor, Model model) {
-        model.addAttribute("id", appMonitor.getId());
-        model.addAttribute("jobId", "appMonitor.getJobId()");
-        model.addAttribute("cronExp", "appMonitor.getCronExp()");
-        return "/monitor/appjob";
-    }
-
-    @ApiOperation(value = "应用监控通知页面")
-    @GetMapping("/app/notify/{id}")
-    public String appNotifyPage(@PathVariable("id") AppMonitor appMonitor, Model model) {
-        Set<NotifyGroup> currentSet = new HashSet<>(appMonitor.getNotifyGroups());
-        List<NotifyGroup> list = receiverRepository.findAll();
-
-        model.addAttribute("id", appMonitor.getId());
-        model.addAttribute("currentSet", currentSet);
-        model.addAttribute("list", list);
-        return "/monitor/appnotify";
-    }
-
-    @ApiOperation(value = "第三方应用监控页面")
-    @GetMapping("/app3")
-    public String app3MonitorPage(Model model) {
-        return "/monitor/app3";
-    }
 }

+ 0 - 38
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/controller/SchedulerController.java

@@ -1,38 +0,0 @@
-package cn.reghao.autodop.dmaster.monitor.controller;
-
-import cn.reghao.autodop.dmaster.monitor.service.MonitorScheduler;
-import cn.reghao.autodop.dmaster.utils.WebBody;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * @author reghao
- * @date 2019-11-15 08:44:50
- */
-@Api(tags = "定时任务接口")
-@RestController
-@RequestMapping("/api/scheduler")
-public class SchedulerController {
-    private MonitorScheduler monitorScheduler;
-
-    public SchedulerController(MonitorScheduler monitorScheduler) {
-        this.monitorScheduler = monitorScheduler;
-    }
-
-    @ApiOperation(value = "添加一个应用健康检查任务")
-    @PostMapping(value = "/job/app", produces = MediaType.APPLICATION_JSON_VALUE)
-    public ResponseEntity<String> addAppHealthCheckJob() {
-        return ResponseEntity.ok().body(WebBody.success());
-    }
-
-    @ApiOperation(value = "添加一个机器状态监控任务")
-    @PostMapping(value = "/job/machine", produces = MediaType.APPLICATION_JSON_VALUE)
-    public ResponseEntity<String> addMachineStatusMonitorJob() {
-        return ResponseEntity.ok().body(WebBody.success());
-    }
-}

+ 1 - 13
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/entity/AppMonitor.java

@@ -1,16 +1,11 @@
 package cn.reghao.autodop.dmaster.monitor.entity;
 
 import cn.reghao.autodop.dmaster.app.entity.AppRunning;
-import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
-import cn.reghao.autodop.dmaster.notification.entity.NotifyGroup;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
-import org.hibernate.annotations.LazyCollection;
-import org.hibernate.annotations.LazyCollectionOption;
 
 import javax.persistence.*;
-import java.util.List;
 
 /**
  * @author reghao
@@ -20,18 +15,11 @@ import java.util.List;
 @EqualsAndHashCode(callSuper = false)
 @Data
 @Entity
-public class AppMonitor extends BaseEntity<Integer> {
+public class AppMonitor extends BaseMonitor {
     private String appId;
     private String appName;
     private String machineId;
     private String machineIpv4;
-    @ElementCollection(targetClass = MonitorJob.class)
-    @LazyCollection(LazyCollectionOption.FALSE)
-    private List<MonitorJob> monitorJobs;
-    @ManyToMany(cascade = CascadeType.REFRESH)
-    @JoinColumn(name = "notify_group_id", foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
-    @LazyCollection(LazyCollectionOption.FALSE)
-    private List<NotifyGroup> notifyGroups;
 
     public AppMonitor(AppRunning appRunning) {
         this.appId = appRunning.getAppId();

+ 38 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/entity/BaseMonitor.java

@@ -0,0 +1,38 @@
+package cn.reghao.autodop.dmaster.monitor.entity;
+
+import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
+import cn.reghao.autodop.dmaster.notification.entity.NotifyGroup;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.hibernate.annotations.LazyCollection;
+import org.hibernate.annotations.LazyCollectionOption;
+
+import javax.persistence.*;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author reghao
+ * @date 2021-06-25 19:08:58
+ */
+@MappedSuperclass
+@EqualsAndHashCode(callSuper = false)
+@Data
+public class BaseMonitor extends BaseEntity<Integer> {
+    private Integer totalJobs;
+    private Integer runningJobs;
+
+    @ElementCollection(targetClass = MonitorJob.class)
+    @MapKeyClass(String.class)
+    private Map<String, MonitorJob> jobMap;
+
+    @ManyToMany(cascade = CascadeType.REFRESH)
+    @JoinColumn(name = "notify_group_id", foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
+    @LazyCollection(LazyCollectionOption.FALSE)
+    private List<NotifyGroup> notifyGroups;
+
+    public BaseMonitor() {
+        this.totalJobs = 0;
+        this.runningJobs = 0;
+    }
+}

+ 2 - 13
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/entity/MachineMonitor.java

@@ -1,16 +1,12 @@
 package cn.reghao.autodop.dmaster.monitor.entity;
 
-import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
 import cn.reghao.autodop.dmaster.machine.entity.MachineInfo;
-import cn.reghao.autodop.dmaster.notification.entity.NotifyGroup;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
-import org.hibernate.annotations.LazyCollection;
-import org.hibernate.annotations.LazyCollectionOption;
 
 import javax.persistence.*;
-import java.util.List;
+import java.util.Map;
 
 /**
  * @author reghao
@@ -20,16 +16,9 @@ import java.util.List;
 @EqualsAndHashCode(callSuper = false)
 @Data
 @Entity
-public class MachineMonitor extends BaseEntity<Integer> {
+public class MachineMonitor extends BaseMonitor {
     private String machineId;
     private String machineIpv4;
-    @ElementCollection(targetClass = MonitorJob.class)
-    @LazyCollection(LazyCollectionOption.FALSE)
-    private List<MonitorJob> monitorJobs;
-    @ManyToMany(cascade = CascadeType.REFRESH)
-    @JoinColumn(name = "notify_group_id", foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
-    @LazyCollection(LazyCollectionOption.FALSE)
-    private List<NotifyGroup> notifyGroups;
 
     public MachineMonitor(MachineInfo machineInfo) {
         this.machineId = machineInfo.getMachineId();

+ 11 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/entity/MonitorType.java

@@ -0,0 +1,11 @@
+package cn.reghao.autodop.dmaster.monitor.entity;
+
+/**
+ * 监控类型
+ *
+ * @author reghao
+ * @date 2021-06-25 18:11:55
+ */
+public enum MonitorType {
+    machine,app;
+}

+ 22 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/MonitorScheduler.java

@@ -6,8 +6,11 @@ import cn.reghao.autodop.dmaster.machine.db.crud.MachineStatusCrudService;
 import cn.reghao.autodop.dmaster.app.repository.AppRunningRepository;
 import cn.reghao.autodop.dmaster.monitor.entity.AppMonitor;
 import cn.reghao.autodop.dmaster.monitor.entity.MachineMonitor;
+import cn.reghao.autodop.dmaster.monitor.entity.MonitorJob;
 import cn.reghao.autodop.dmaster.monitor.repository.AppMonitorRepository;
 import cn.reghao.autodop.dmaster.monitor.repository.MachineMonitorRepository;
+import cn.reghao.autodop.dmaster.monitor.service.job.machine.MachineHeartbeatCheckJob;
+import cn.reghao.autodop.dmaster.notification.entity.NotifyGroup;
 import cn.reghao.autodop.dmaster.notification.service.NotifyService;
 import lombok.extern.slf4j.Slf4j;
 import org.quartz.*;
@@ -15,6 +18,7 @@ import org.quartz.impl.StdSchedulerFactory;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
+import java.util.List;
 
 /**
  * 监控使用的定时任务调度器
@@ -54,14 +58,16 @@ public class MonitorScheduler {
      */
     @PostConstruct
     public void startScheduler() throws SchedulerException {
-        for (MachineMonitor machineMonitor : machineMonitorRepository.findAll()) {
+        List<MachineMonitor> machineMonitors = machineMonitorRepository.findAll();
+        for (MachineMonitor machineMonitor : machineMonitors) {
+
             //addMachineHeartbeatCheckJob(machineMonitor);
         }
 
-        for (AppMonitor appMonitor : appMonitorRepository.findAll()) {
-            addAppHealthCheckJob(appMonitor);
+        List<AppMonitor> appMonitors = appMonitorRepository.findAll();
+        for (AppMonitor appMonitor : appMonitors) {
+            //addAppHealthCheckJob(appMonitor);
         }
-
         // TODO 系统启动时启用所有存在的任务
         scheduler.start();
     }
@@ -72,6 +78,18 @@ public class MonitorScheduler {
         }
     }
 
+    public void addMonitorJob(MonitorJob monitorJob, List<NotifyGroup> notifyGroups) {
+        /*String jobId = monitorJob.getJobId();
+        String cronExp = monitorJob.getCronExp();
+
+        JobDataMap jobDataMap = new JobDataMap();
+        jobDataMap.put("notifyService", notifyService);
+        jobDataMap.put("notifyGroups", notifyGroups);
+        jobDataMap.put("machineId", machineMonitor.getMachineId());
+        jobDataMap.put("statusCrudService", statusCrudService);
+        addAndStart(MachineHeartbeatCheckJob.class, jobId, cronExp, jobDataMap);*/
+    }
+
     public void addMachineHeartbeatCheckJob(MachineMonitor machineMonitor) throws SchedulerException {
         /*String jobId = machineMonitor.getJobId();
         String cronExp = machineMonitor.getCronExp();

+ 51 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/monitor/service/job/machine/MachineDiskUsageCheckJob.java

@@ -0,0 +1,51 @@
+package cn.reghao.autodop.dmaster.monitor.service.job.machine;
+
+import cn.reghao.autodop.common.utils.DateTimeConverter;
+import cn.reghao.autodop.dmaster.machine.db.crud.MachineStatusCrudService;
+import cn.reghao.autodop.dmaster.machine.entity.MachineStatus;
+import cn.reghao.autodop.dmaster.notification.entity.NotifyGroup;
+import cn.reghao.autodop.dmaster.notification.service.NotifyService;
+import cn.reghao.autodop.dmaster.notification.service.notifier.ding.DingMsg;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.Job;
+import org.quartz.JobDataMap;
+import org.quartz.JobDetail;
+import org.quartz.JobExecutionContext;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 机器磁盘使用情况监控任务
+ *
+ * @author reghao
+ * @date 2021-06-22 19:04:10
+ */
+@Slf4j
+public class MachineDiskUsageCheckJob implements Job {
+    @Override
+    public void execute(JobExecutionContext context) {
+        JobDetail jobDetail = context.getJobDetail();
+        JobDataMap jobDataMap = jobDetail.getJobDataMap();
+
+        NotifyService notifyService = (NotifyService) jobDataMap.get("notifyService");
+        List<NotifyGroup> notifyGroups = (List<NotifyGroup>) jobDataMap.get("notifyGroups");
+        MachineStatusCrudService statusCrudService = (MachineStatusCrudService) jobDataMap.get("statusCrudService");
+        String machineId = jobDataMap.getString("machineId");
+
+        MachineStatus machineStatus = statusCrudService.selectByUniqueKey(machineId);
+        long lastCheck = DateTimeConverter.msTimestamp(machineStatus.getLastCheck());
+        long now = System.currentTimeMillis();
+        machineStatus.setLastCheck(LocalDateTime.now());
+        statusCrudService.insertOrUpdate(machineStatus);
+
+        long result = now - lastCheck;
+        if (result > 10_000) {
+            // TODO 检测 IP 是否能 ping 通
+            // TODO 检测 MQTT 服务器是否正常连接
+            String msg = String.format("距离上次接收到 %s 的心跳消息已过去 %ss", machineStatus.getMachineIpv4(), result/1000);
+            DingMsg dingMsg = new DingMsg("监控报警",msg);
+            notifyGroups.forEach(notifyGroup -> notifyService.notify(notifyGroup, dingMsg));
+        }
+    }
+}

+ 2 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/attribute/SelectDictAttrProcessor.java

@@ -28,9 +28,11 @@ public class SelectDictAttrProcessor extends AbstractAttributeTagProcessor {
         localCache.get("MENU_TYPE").put("DIR", "DIR");
         localCache.get("MENU_TYPE").put("PAGE", "PAGE");
 
+        // TODO 指定默认环境
         localCache.put("ENVIRONMENT", new HashMap<>());
         localCache.get("ENVIRONMENT").put("dev", "dev");
         localCache.get("ENVIRONMENT").put("test", "test");
+        localCache.get("ENVIRONMENT").put("preprod", "preprod");
         localCache.get("ENVIRONMENT").put("prod", "prod");
     }
     

+ 0 - 11
dmaster/src/main/resources/templates/monitor/app3.html

@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org">
-<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})"></head>
-
-<body>
-    <div class="timo-detail-page">
-        <div class="timo-detail-title">第三方应用监控</div>
-    </div>
-<script th:replace="/common/template :: script"></script>
-</body>
-</html>

+ 0 - 23
dmaster/src/main/resources/templates/monitor/appjob.html

@@ -1,23 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org">
-<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})"></head>
-
-<body>
-<div class="layui-form timo-compile">
-        <form th:action="@{'/api/monitor/app/job/'+${id}}">
-            <input type="hidden" name="id" th:value="${id}"/>
-            <div class="layui-form-item">
-                <label class="layui-form-label required">CRON 表达式</label>
-                <div class="layui-input-inline">
-                    <input class="layui-input" type="text" name="cronExp" placeholder="请输入 CRON 表达式" required th:value="${cronExp}">
-                </div>
-            </div>
-            <div class="layui-form-item timo-finally">
-                <button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
-                <button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
-            </div>
-        </form>
-    </div>
-<script th:replace="/common/template :: script"></script>
-</body>
-</html>

+ 16 - 17
dmaster/src/main/resources/templates/monitor/app.html → dmaster/src/main/resources/templates/monitor/appmonitor.html

@@ -6,7 +6,7 @@
 <body class="timo-layout-page">
 <div class="layui-card">
     <div class="layui-card-header timo-card-header">
-        <span><i class="fa fa-bars"></i> 应用健康检查任务</span>
+        <span><i class="fa fa-bars"></i> 应用监控列表</span>
         <i class="layui-icon layui-icon-refresh refresh-btn"></i>
     </div>
     <div class="layui-card-body">
@@ -21,9 +21,9 @@
                         </div>
                     </div>
                     <div class="layui-inline timo-search-box">
-                        <label class="layui-form-label">应用名</label>
+                        <label class="layui-form-label">应用名</label>
                         <div class="layui-input-block">
-                            <input type="text" name="appName" th:value="${param.appName}" placeholder="请输入应用名"
+                            <input type="text" name="appName" th:value="${param.appName}" placeholder="请输入应用名"
                                    autocomplete="off" class="layui-input">
                         </div>
                     </div>
@@ -39,28 +39,27 @@
             <table class="layui-table timo-table">
                 <thead>
                 <tr>
-                    <th class="timo-table-checkbox">
-                        <label class="timo-checkbox"><input type="checkbox">
-                            <i class="layui-icon layui-icon-ok"></i></label>
-                    </th>
-                    <th class="sortable" data-field="appName">应用名</th>
+                    <th class="sortable" data-field="appName">应用名字</th>
                     <th class="sortable" data-field="machineIpv4">机器地址</th>
-                    <th>操作</th>
+                    <th class="sortable" data-field="totalJobs">任务总数</th>
+                    <th class="sortable" data-field="runningJobs">正在运行的任务</th>
+                    <th class="sortable" data-field="notifyGroups">通知组</th>
+                    <th class="sortable" data-field="jobs">任务列表</th>
                 </tr>
                 </thead>
                 <tbody>
                 <tr th:each="item:${list}">
-                    <td><label class="timo-checkbox"><input type="checkbox" th:value="${item.appId}">
-                        <i class="layui-icon layui-icon-ok"></i></label></td>
-                    <td th:text="${item.appName}">应用名</td>
+                    <td th:text="${item.appName}">应用名字</td>
                     <td th:text="${item.machineIpv4}">机器地址</td>
+                    <td th:text="${item.totalJobs}">任务总数</td>
+                    <td th:text="${item.runningJobs}">正在运行的任务</td>
                     <td>
-                        <a class="open-popup" data-title="添加/修改监控任务" th:attr="data-url=@{'/monitor/app/job/'+${item.id}}"
-                           data-size="600,400" href="#">设置监控任务</a>
-                        <a class="ajax-post" th:href="@{'/api/monitor/app/enable/'+${item.id}}">开启监控</a>
-                        <a class="ajax-post" th:href="@{'/api/monitor/app/disable/'+${item.id}}">停止监控</a>
                         <a class="open-popup" data-title="设置通知组" th:attr="data-url=@{'/monitor/app/notify/'+${item.id}}"
-                           data-size="640,480" href="#">设置通知</a>
+                           data-size="640,480" href="#">设置</a>
+                    </td>
+                    <td>
+                        <a class="open-popup" data-title="任务列表" th:attr="data-url=@{'/monitor/app/jobs/'+${item.id}}"
+                           data-size="1200,600" href="#">查看</a>
                     </td>
                 </tr>
                 </tbody>

+ 7 - 8
dmaster/src/main/resources/templates/monitor/machine.html → dmaster/src/main/resources/templates/monitor/machinemonitor.html

@@ -44,9 +44,10 @@
                             <i class="layui-icon layui-icon-ok"></i></label>
                     </th>
                     <th class="sortable" data-field="machineIpv4">机器地址</th>
-                    <th class="sortable" data-field="jobs">任务列表</th>
+                    <th class="sortable" data-field="totalJobs">任务总数</th>
+                    <th class="sortable" data-field="runningJobs">正在运行的任务</th>
                     <th class="sortable" data-field="notifyGroups">通知组</th>
-                    <th>操作</th>
+                    <th class="sortable" data-field="jobs">任务列表</th>
                 </tr>
                 </thead>
                 <tbody>
@@ -54,17 +55,15 @@
                     <td><label class="timo-checkbox"><input type="checkbox" th:value="${item.machineId}">
                         <i class="layui-icon layui-icon-ok"></i></label></td>
                     <td th:text="${item.machineIpv4}">机器地址</td>
-                    <td>
-                        <a class="open-popup" data-title="任务列表" th:attr="data-url=@{'/monitor/machine/jobs/'+${item.id}}"
-                           data-size="1200,600" href="#">查看</a>
-                    </td>
+                    <td th:text="${item.totalJobs}">任务总数</td>
+                    <td th:text="${item.runningJobs}">正在运行的任务</td>
                     <td>
                         <a class="open-popup" data-title="设置通知组" th:attr="data-url=@{'/monitor/machine/notify/'+${item.id}}"
                            data-size="640,480" href="#">设置</a>
                     </td>
                     <td>
-                        <a class="ajax-post" th:href="@{'/api/monitor/machine/enable/'+${item.id}}">开启所有任务</a>
-                        <a class="ajax-post" th:href="@{'/api/monitor/machine/disable/'+${item.id}}">停止所有任务</a>
+                        <a class="open-popup" data-title="任务列表" th:attr="data-url=@{'/monitor/machine/jobs/'+${item.id}}"
+                           data-size="1200,600" href="#">查看</a>
                     </td>
                 </tr>
                 </tbody>

+ 0 - 39
dmaster/src/main/resources/templates/monitor/machinenotify.html

@@ -1,39 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org">
-<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
-    <style>
-        .layui-input-block{
-            margin-left: 20px;
-            margin-right: 20px;
-            margin-bottom: 70px;
-        }
-        .timo-compile .timo-finally{
-            position: fixed;
-            bottom: 0;
-            left: 0;
-            right: 0;
-            padding-bottom: 14px;
-            margin-bottom: 0;
-            background-color: #ffffff;
-        }
-    </style>
-</head>
-<body>
-<div class="layui-form timo-compile">
-    <form th:action="@{/api/monitor/machine/notify/}">
-        <input type="hidden" name="id" th:value="${id}"/>
-        <div class="layui-form-item">
-            <div class="layui-input-block">
-                <input th:each="item:${list}" type="checkbox" name="groupId" th:title="${item.groupId}"
-                       th:value="${item.id}" th:checked="${#sets.contains(currentSet, item)}" lay-skin="primary">
-            </div>
-        </div>
-        <div class="layui-form-item timo-finally">
-            <button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
-            <button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
-        </div>
-    </form>
-</div>
-<script th:replace="/common/template :: script"></script>
-</body>
-</html>

+ 1 - 2
dmaster/src/main/resources/templates/monitor/machinejob.html → dmaster/src/main/resources/templates/monitor/monitorjob.html

@@ -4,8 +4,7 @@
 
 <body>
 <div class="layui-form timo-compile">
-        <form th:action="@{'/api/monitor/machine/job/'+${machineMonitorId}}">
-            <input type="hidden" name="id" th:value="${monitorJob?.id}"/>
+        <form th:action="@{${addJobApi}}">
             <div class="layui-form-item">
                 <label class="layui-form-label required">任务名</label>
                 <div class="layui-input-inline">

+ 8 - 4
dmaster/src/main/resources/templates/monitor/machinejobs.html → dmaster/src/main/resources/templates/monitor/monitorjobs.html

@@ -9,7 +9,7 @@
             <div class="pull-right screen-btn-group">
                 <div class="btn-group-right">
                     <button class="layui-btn open-popup" data-title="添加任务" data-size="640,480"
-                            th:attr="data-url=@{'/monitor/machine/jobs/add/'+${machineMonitorId}}">
+                            th:attr="data-url=@{${addJobUrl}}">
                         <i class="fa fa-plus"></i> 添加
                     </button>
                 </div>
@@ -33,14 +33,18 @@
                     <td th:text="${item.cronExp}">CRON 表达式</td>
                     <td th:text="${item.enable}">是否启用</td>
                     <td>
-                        <a class="ajax-post" th:href="@{'/api/monitor/machine/enable/'+${item.jobId}}">启用</a>
-                        <a class="ajax-post" th:href="@{'/api/monitor/machine/disable/'+${item.jobId}}">禁用</a>
+                        <a class="open-popup" data-title="编辑任务"
+                           th:attr="data-url=@{${editJobUrl}+'/'+${item.jobId}}"
+                           data-size="640,480" href="#">编辑</a>
+                        <a class="ajax-post"
+                           th:href="@{${jobStatusApi}+'/'+${item.jobId}+'/enable'}">启用</a>
+                        <a class="ajax-post"
+                           th:href="@{${jobStatusApi}+'/'+${item.jobId}+'/disable'}">禁用</a>
                     </td>
                 </tr>
                 </tbody>
             </table>
         </div>
-        <!--<div th:replace="/common/fragment :: page"></div>-->
     </div>
 </div>
 

+ 1 - 2
dmaster/src/main/resources/templates/monitor/appnotify.html → dmaster/src/main/resources/templates/monitor/monitornotify.html

@@ -20,8 +20,7 @@
 </head>
 <body>
 <div class="layui-form timo-compile">
-    <form th:action="@{/api/monitor/app/notify/}">
-        <input type="hidden" name="id" th:value="${id}"/>
+    <form th:action="@{${notifyApi}}">
         <div class="layui-form-item">
             <div class="layui-input-block">
                 <input th:each="item:${list}" type="checkbox" name="groupId" th:title="${item.groupId}"