Преглед изворни кода

处理应用部署配置的页面和接口

reghao пре 4 година
родитељ
комит
79fafaa2ce
23 измењених фајлова са 511 додато и 167 уклоњено
  1. 0 23
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/config/AppConfigController.java
  2. 51 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/config/AppDeployConfigController.java
  3. 0 34
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/config/AppConfigPageController.java
  4. 82 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/config/AppDeployConfigPageController.java
  5. 43 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/dto/AppDeployConfigDto.java
  6. 0 22
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/dto/DeployConfigDto.java
  7. 0 21
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/dto/DeployConfigs.java
  8. 7 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/po/config/AppConfig.java
  9. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/po/config/AppDeployConfig.java
  10. 32 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/vo/AppDeployConfigVo.java
  11. 0 7
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/AppConfigService.java
  12. 14 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/AppDeployConfigService.java
  13. 0 45
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/AppConfigServiceImpl.java
  14. 70 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/AppDeployConfigServiceImpl.java
  15. 8 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/page/AppConfigPage.java
  16. 20 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/page/AppDeployConfigPage.java
  17. 58 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/page/AppDeployConfigPageImpl.java
  18. 1 1
      dmaster/src/main/resources/templates/app/config/app/add.html
  19. 94 0
      dmaster/src/main/resources/templates/app/config/app/deploy/add.html
  20. 21 0
      dmaster/src/main/resources/templates/app/config/app/deploy/detail.html
  21. 4 4
      dmaster/src/main/resources/templates/app/config/app/deploy/index.html
  22. 1 1
      dmaster/src/main/resources/templates/app/config/app/index.html
  23. 2 2
      dmaster/src/test/java/cn/reghao/autodop/dmaster/app/service/impl/BuildDeployConfigServiceImplTest.java

+ 0 - 23
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/config/AppConfigController.java

@@ -1,13 +1,11 @@
 package cn.reghao.autodop.dmaster.app.controller.config;
 
-import cn.reghao.autodop.dmaster.app.model.dto.DeployConfigs;
 import cn.reghao.autodop.dmaster.app.service.config.AppConfigService;
 import cn.reghao.autodop.dmaster.machine.db.query.MachineHostQuery;
 import cn.reghao.jdkutil.result.Result;
 import cn.reghao.jdkutil.result.ResultStatus;
 import cn.reghao.autodop.dmaster.app.model.dto.NewApp;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
-import cn.reghao.autodop.dmaster.notification.model.po.NotifyGroup;
 import cn.reghao.jdkutil.result.WebBody;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -16,8 +14,6 @@ import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.List;
-
 /**
  * @author reghao
  * @date 2019-11-27 11:29:43
@@ -63,25 +59,6 @@ public class AppConfigController {
         return WebBody.result(result);
     }
 
-    @ApiOperation(value = "设置应用通知")
-    @PostMapping(value = "/notify", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String appNotify(@RequestParam("id") int id,
-                            @RequestParam(value = "groupId", required = false) List<NotifyGroup> notifyGroups) {
-        appConfigService.setNotify(id, notifyGroups);
-        return WebBody.success();
-    }
-
-    @ApiOperation(value = "设置应用部署配置")
-    @PostMapping(value = "/deploy", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String appDeploy(@RequestParam("id") int id, @Validated DeployConfigs deployConfigs) {
-        if (deployConfigs.getDeployConfigs().isEmpty()) {
-            return WebBody.success();
-        }
-
-        Result result = appConfigService.setDeployConfig(id, deployConfigs.getDeployConfigs());
-        return WebBody.result(result);
-    }
-
     @ApiOperation(value = "删除应用编排")
     @DeleteMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String deleteAppOrchestration(@PathVariable("id") AppConfig app) {

+ 51 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/config/AppDeployConfigController.java

@@ -0,0 +1,51 @@
+package cn.reghao.autodop.dmaster.app.controller.config;
+
+import cn.reghao.autodop.dmaster.app.model.dto.AppDeployConfigDto;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
+import cn.reghao.autodop.dmaster.app.service.config.AppDeployConfigService;
+import cn.reghao.jdkutil.result.Result;
+import cn.reghao.jdkutil.result.ResultStatus;
+import cn.reghao.jdkutil.result.WebBody;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author reghao
+ * @date 2019-11-27 11:29:43
+ */
+@Slf4j
+@Api(tags = "应用部署配置 CRUD 接口")
+@RestController
+@RequestMapping("/api/app/config/app/deploy")
+public class AppDeployConfigController {
+    private final AppDeployConfigService deployConfigService;
+
+    public AppDeployConfigController(AppDeployConfigService deployConfigService) {
+        this.deployConfigService = deployConfigService;
+    }
+
+    @ApiOperation(value = "添加/修改应用部署配置")
+    @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE)
+    public String add(@Validated AppDeployConfigDto appDeployConfigDto) {
+        Integer id = appDeployConfigDto.getAppDeployConfigId();
+        Result result;
+        if (id == null) {
+            result = deployConfigService.add(appDeployConfigDto);
+        } else {
+            result = deployConfigService.modify(appDeployConfigDto);
+        }
+
+        return WebBody.result(result);
+    }
+
+    @ApiOperation(value = "删除应用部署配置")
+    @DeleteMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String delete(@PathVariable("id") int appDeployConfigId) {
+
+        return WebBody.result(Result.result(ResultStatus.SUCCESS));
+    }
+}

+ 0 - 34
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/config/AppConfigPageController.java

@@ -183,38 +183,4 @@ public class AppConfigPageController {
         model.addAttribute("list", list);
         return "/app/config/app/notify";
     }
-
-    @ApiOperation(value = "部署配置页面")
-    @GetMapping("/deploy/{id}")
-    public String deployConfigIndexPage(@PathVariable("id") AppConfig app, Model model) {
-        PageRequest pageRequest = PageSort.pageRequest();
-        Page<AppDeployConfig> deployConfigPage = deployConfigQuery.findByAppId(app.getAppId(), pageRequest);
-        PageList<AppDeployConfig> pageList = PageList.pageList(deployConfigPage);
-
-        model.addAttribute("page", deployConfigPage);
-        model.addAttribute("list", pageList.getList());
-        return "/app/config/app/deployconfig";
-    }
-
-    @ApiOperation(value = "部署配置页面")
-    @GetMapping("/deploy1/{id}")
-    public String deployConfigPage1(@PathVariable("id") AppConfig app, Model model) {
-        int id = app.getId();
-        String packType = app.getPackerConfig().getType();
-        List<AppDeployConfig> list = deployConfigQuery.findByAppId(app.getAppId());
-        String env = app.getEnv();
-        List<KeyValue> machines = hostQuery.findByEnv(env).stream()
-                .map(machineHost -> {
-                    String machineId = machineHost.getMachineId();
-                    String machineIpv4 = machineHost.getMachineIpv4();
-                    return new KeyValue(machineId, machineIpv4);
-                })
-                .collect(Collectors.toList());
-
-        model.addAttribute("id", id);
-        model.addAttribute("packType", packType);
-        model.addAttribute("machines", machines);
-        model.addAttribute("list", list);
-        return "/app/config/app/deployconfig1";
-    }
 }

+ 82 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/config/AppDeployConfigPageController.java

@@ -0,0 +1,82 @@
+package cn.reghao.autodop.dmaster.app.controller.page.config;
+
+import cn.reghao.autodop.dmaster.app.model.dto.AppDeployConfigDto;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
+import cn.reghao.autodop.dmaster.app.model.vo.KeyValue;
+import cn.reghao.autodop.dmaster.app.service.page.AppDeployConfigPage;
+import cn.reghao.autodop.dmaster.util.db.PageList;
+import cn.reghao.autodop.dmaster.util.db.PageSort;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+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 java.util.List;
+
+/**
+ * @author reghao
+ * @date 2019-08-30 18:49:15
+ */
+@Slf4j
+@Api(tags = "应用部署配置页面")
+@Controller
+@RequestMapping("/app/config/app/deploy")
+public class AppDeployConfigPageController {
+    private final AppDeployConfigPage deployConfigPage;
+
+    public AppDeployConfigPageController(AppDeployConfigPage deployConfigPage) {
+        this.deployConfigPage = deployConfigPage;
+    }
+
+    @ApiOperation(value = "部署配置页面")
+    @GetMapping("/{appId}")
+    public String deployConfigIndexPage(@PathVariable("appId") String appId, Model model) {
+        PageRequest pageRequest = PageSort.pageRequest();
+        Page<AppDeployConfig> page = deployConfigPage.indexPage(appId, pageRequest);
+        PageList<AppDeployConfig> pageList = PageList.pageList(page);
+
+        model.addAttribute("appId", appId);
+        model.addAttribute("page", page);
+        model.addAttribute("list", pageList.getList());
+        return "/app/config/app/deploy/index";
+    }
+
+    @GetMapping("/add/{appId}")
+    public String addAppConfigPage(@PathVariable("appId") String appId, Model model) {
+        AppConfig appConfig = deployConfigPage.appConfig(appId);
+        List<KeyValue> machines = deployConfigPage.machines(appConfig.getEnv());
+
+        model.addAttribute("appId", appId);
+        model.addAttribute("packType", appConfig.getPackerConfig().getType());
+        model.addAttribute("machines", machines);
+        return "/app/config/app/deploy/add";
+    }
+
+    @GetMapping("/edit/{appId}/{machineId}")
+    public String editAppConfigPage(@PathVariable("appId") String appId, @PathVariable("machineId") String machineId,
+                                    Model model) {
+        AppDeployConfig appDeployConfig = deployConfigPage.findByAppIdAndMachineId(appId, machineId);
+        List<KeyValue> machines = deployConfigPage.machines(appDeployConfig.getAppConfig().getEnv());
+
+        model.addAttribute("appId", appId);
+        model.addAttribute("packType", appDeployConfig.getAppConfig().getPackerConfig().getType());
+        model.addAttribute("appDeployConfig", new AppDeployConfigDto(appDeployConfig));
+        model.addAttribute("machines", machines);
+        return "/app/config/app/deploy/add";
+    }
+
+    @GetMapping("/detail/{appId}/{machineId}")
+    public String appConfigPage(@PathVariable("appId") String appId, @PathVariable("machineId") String machineId,
+                                Model model) {
+        AppDeployConfig appDeployConfig = deployConfigPage.findByAppIdAndMachineId(appId, machineId);
+        model.addAttribute("appDeployConfig", appDeployConfig);
+        return "/app/config/app/deploy/detail";
+    }
+}

+ 43 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/dto/AppDeployConfigDto.java

@@ -0,0 +1,43 @@
+package cn.reghao.autodop.dmaster.app.model.dto;
+
+import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * 应用部署配置
+ *
+ * @author reghao
+ * @date 2020-05-13 16:59:20
+ */
+@NoArgsConstructor
+@Data
+public class AppDeployConfigDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Integer appDeployConfigId;
+    @NotBlank(message = "appId 不能为空白字符串")
+    private String appId;
+    @NotBlank(message = "machineId 不能为空白字符串")
+    private String machineId;
+    @NotBlank(message = "machineId 不能为空白字符串")
+    private String packType;
+    // packType 是 docker 时 startScript 的内容是 cn.reghao.autodop.common.dockerc.pojo.Config 序列化为 JSON 后的字符串
+    // 具体参照 https://docs.docker.com/engine/api/v1.40/#operation/ContainerCreate 的 reqeust body
+    @NotBlank(message = "startScript 不能为空白字符串")
+    private String startScript;
+    private String unpackScript;
+    private String startHome;
+
+    public AppDeployConfigDto(AppDeployConfig appDeployConfig) {
+        this.appId = appDeployConfig.getAppConfig().getAppId();
+        this.machineId = appDeployConfig.getMachineHost().getMachineId();
+        this.packType = appDeployConfig.getAppConfig().getPackerConfig().getType();
+        this.startScript = appDeployConfig.getStartScript();
+        this.unpackScript = appDeployConfig.getUnpackScript();
+        this.startHome = appDeployConfig.getStartHome();
+    }
+}

+ 0 - 22
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/dto/DeployConfigDto.java

@@ -1,22 +0,0 @@
-package cn.reghao.autodop.dmaster.app.model.dto;
-
-import lombok.Data;
-
-import javax.validation.constraints.NotBlank;
-import java.io.Serializable;
-
-/**
- * 应用部署配置
- *
- * @author reghao
- * @date 2020-05-13 16:59:20
- */
-@Data
-public class DeployConfigDto implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    @NotBlank(message = "machineId 不能为空白字符串")
-    private String machineId;
-    @NotBlank(message = "startScript 不能为空白字符串")
-    private String startScript;
-}

+ 0 - 21
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/dto/DeployConfigs.java

@@ -1,21 +0,0 @@
-package cn.reghao.autodop.dmaster.app.model.dto;
-
-import lombok.Data;
-
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2021-09-16 18:00:22
- */
-@Data
-public class DeployConfigs implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    @NotNull
-    @Valid
-    private List<DeployConfigDto> deployConfigs;
-}

+ 7 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/po/config/AppConfig.java

@@ -59,10 +59,6 @@ public class AppConfig extends BaseEntity<Integer> implements Cloneable {
     private Integer httpPort;
     private String healthCheck;
 
-    // TODO packType 是 docker 时使用 Dockerfile
-    @Lob
-    @Column(columnDefinition="text")
-    private String packScript;
     // buildConfig
     @ManyToOne(cascade = CascadeType.REFRESH)
     @JoinColumn(name = "repo_auth_config_id", foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
@@ -76,6 +72,13 @@ public class AppConfig extends BaseEntity<Integer> implements Cloneable {
     @JoinColumn(name = "packer_config_id", foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
     //@Valid
     private PackerConfig packerConfig;
+    // TODO packType 是 docker 时使用 Dockerfile
+    @Lob
+    @Column(columnDefinition="text")
+    private String packScript;
+    @Lob
+    @Column(columnDefinition="text")
+    private String unpackScript;
 
     @Override
     public Object clone() throws CloneNotSupportedException {

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/po/config/AppDeployConfig.java

@@ -1,8 +1,9 @@
 package cn.reghao.autodop.dmaster.app.model.po.config;
 
+import cn.reghao.autodop.common.msg.rpc.dto.app.PackType;
 import cn.reghao.autodop.dmaster.machine.model.po.MachineHost;
 import cn.reghao.autodop.dmaster.util.db.BaseEntity;
-import lombok.Data;
+import cn.reghao.autodop.dmaster.util.validator.ValidEnum;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
@@ -26,8 +27,7 @@ public class AppDeployConfig extends BaseEntity<Integer> {
     private AppConfig appConfig;
     @OneToOne
     private MachineHost machineHost;
-    @NotBlank(message = "machineId 不能为空白字符串")
-    @NotNull
+    @ValidEnum(value = PackType.class, message = "请选择正确的打包类型")
     private String packType;
     // packType 是 docker 时 startScript 的内容是 cn.reghao.autodop.common.dockerc.pojo.Config 序列化为 JSON 后的字符串
     // 具体参照 https://docs.docker.com/engine/api/v1.40/#operation/ContainerCreate 的 reqeust body

+ 32 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/vo/AppDeployConfigVo.java

@@ -0,0 +1,32 @@
+package cn.reghao.autodop.dmaster.app.model.vo;
+
+import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 应用部署配置
+ *
+ * @author reghao
+ * @date 2020-05-13 16:59:20
+ */
+@NoArgsConstructor
+@Data
+public class AppDeployConfigVo {
+    private Integer appDeployConfigId;
+    private String appId;
+    private String machineIpv4;
+    private String packType;
+    private String startScript;
+    private String unpackScript;
+    private String startHome;
+
+    public AppDeployConfigVo(AppDeployConfig appDeployConfig) {
+        this.appId = appDeployConfig.getAppConfig().getAppId();
+        this.machineIpv4 = appDeployConfig.getMachineHost().getMachineIpv4();
+        this.packType = appDeployConfig.getAppConfig().getPackerConfig().getType();
+        this.startScript = appDeployConfig.getStartScript();
+        this.unpackScript = appDeployConfig.getUnpackScript();
+        this.startHome = appDeployConfig.getStartHome();
+    }
+}

+ 0 - 7
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/AppConfigService.java

@@ -1,22 +1,15 @@
 package cn.reghao.autodop.dmaster.app.service.config;
 
-import cn.reghao.autodop.dmaster.app.model.dto.DeployConfigDto;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
 import cn.reghao.autodop.dmaster.app.model.dto.NewApp;
-import cn.reghao.autodop.dmaster.notification.model.po.NotifyGroup;
 import cn.reghao.jdkutil.result.Result;
 
-import java.util.List;
-
 /**
  * @author reghao
  * @date 2021-09-16 18:28:51
  */
 public interface AppConfigService {
     Result add(AppConfig appConfig);
-    Result setDeployConfig(int id, List<DeployConfigDto> deployConfigDtos);
-    @Deprecated
-    Result setNotify(int id, List<NotifyGroup> notifyGroups);
     Result copy(AppConfig from, NewApp to);
     Result modify(AppConfig appConfig);
     Result delete(AppConfig appConfig);

+ 14 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/AppDeployConfigService.java

@@ -0,0 +1,14 @@
+package cn.reghao.autodop.dmaster.app.service.config;
+
+import cn.reghao.autodop.dmaster.app.model.dto.AppDeployConfigDto;
+import cn.reghao.jdkutil.result.Result;
+
+/**
+ * @author reghao
+ * @date 2021-09-16 18:28:51
+ */
+public interface AppDeployConfigService {
+    Result add(AppDeployConfigDto appDeployConfigDto);
+    Result modify(AppDeployConfigDto appDeployConfigDto);
+    Result delete(int appDeployConfigId);
+}

+ 0 - 45
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/AppConfigServiceImpl.java

@@ -5,22 +5,16 @@ import cn.reghao.autodop.dmaster.app.db.crud.config.AppConfigCrud;
 import cn.reghao.autodop.dmaster.app.db.query.AppDeployingQuery;
 import cn.reghao.autodop.dmaster.app.db.query.config.AppConfigQuery;
 import cn.reghao.autodop.dmaster.app.db.repository.AppRunningRepository;
-import cn.reghao.autodop.dmaster.app.model.dto.DeployConfigDto;
-import cn.reghao.autodop.dmaster.app.model.po.AppRunning;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
 import cn.reghao.autodop.dmaster.app.model.dto.NewApp;
 import cn.reghao.autodop.dmaster.app.service.impl.BuildDeployConfigServiceImpl;
 import cn.reghao.autodop.dmaster.app.service.config.AppConfigService;
 import cn.reghao.autodop.dmaster.machine.db.query.MachineHostQuery;
-import cn.reghao.autodop.dmaster.notification.model.po.NotifyGroup;
 import cn.reghao.jdkutil.result.Result;
 import cn.reghao.jdkutil.result.ResultStatus;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.List;
-import java.util.stream.Collectors;
-
 /**
  * @author reghao
  * @date 2021-09-16 18:28:51
@@ -72,45 +66,6 @@ public class AppConfigServiceImpl implements AppConfigService {
         sharedEntityChecker.checkAndSetBuildConfig(app);
     }
 
-    @Override
-    public Result setDeployConfig(int id, List<DeployConfigDto> deployConfigDtos) {
-        AppConfig app = appConfigQuery.findById(id);
-        if (app == null) {
-            return Result.fail(String.format("id %s 不存在", id));
-        }
-
-        /*PackerConfig packerConfig = app.getPackerConfig();
-        String packType = packerConfig.getType();
-        List<DeployConfig> list = deployConfigDtos.stream()
-                .map(deployConfigDto -> {
-                    String machineId = deployConfigDto.getMachineId();
-                    String machineIpv4 = machineHostQuery.findByMachineId(machineId).getMachineIpv4();
-                    String startScript = deployConfigDto.getStartScript();
-                    return new DeployConfig(machineId, machineIpv4, packType, startScript);
-                })
-                .collect(Collectors.toList());
-
-        app.setDeployConfigs(list);
-        appConfigCrud.save(app);
-
-        List<AppDeploying> appDeployings = list.stream()
-                .map(deployConfig -> new AppDeploying(app, deployConfig)).collect(Collectors.toList());
-        appDeployingCrud.saveAll(appDeployings);*/
-        return Result.result(ResultStatus.SUCCESS);
-    }
-
-    @Override
-    public Result setNotify(int id, List<NotifyGroup> notifyGroups) {
-        AppConfig app = appConfigQuery.findById(id);
-        if (app == null) {
-            return Result.fail(String.format("id %s 不存在", id));
-        }
-
-        app.setNotifyGroups(notifyGroups);
-        appConfigCrud.save(app);
-        return Result.result(ResultStatus.SUCCESS);
-    }
-
     @Override
     public Result copy(AppConfig from, NewApp to) {
         if (from == null) {

+ 70 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/AppDeployConfigServiceImpl.java

@@ -0,0 +1,70 @@
+package cn.reghao.autodop.dmaster.app.service.config.impl;
+
+import cn.reghao.autodop.dmaster.app.db.crud.config.AppDeployConfigCrud;
+import cn.reghao.autodop.dmaster.app.db.query.config.AppConfigQuery;
+import cn.reghao.autodop.dmaster.app.db.query.config.AppDeployConfigQuery;
+import cn.reghao.autodop.dmaster.app.model.dto.AppDeployConfigDto;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
+import cn.reghao.autodop.dmaster.app.service.config.AppDeployConfigService;
+import cn.reghao.autodop.dmaster.machine.db.query.MachineHostQuery;
+import cn.reghao.autodop.dmaster.machine.model.po.MachineHost;
+import cn.reghao.jdkutil.result.Result;
+import cn.reghao.jdkutil.result.ResultStatus;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author reghao
+ * @date 2021-09-16 18:28:51
+ */
+@Service
+public class AppDeployConfigServiceImpl implements AppDeployConfigService {
+    private final AppDeployConfigQuery deployConfigQuery;
+    private final AppDeployConfigCrud deployConfigCrud;
+    private AppConfigQuery appConfigQuery;
+    private MachineHostQuery machineHostQuery;
+
+    public AppDeployConfigServiceImpl(AppDeployConfigQuery deployConfigQuery, AppDeployConfigCrud deployConfigCrud,
+                                      AppConfigQuery appConfigQuery, MachineHostQuery machineHostQuery) {
+        this.deployConfigQuery = deployConfigQuery;
+        this.deployConfigCrud = deployConfigCrud;
+        this.appConfigQuery = appConfigQuery;
+        this.machineHostQuery = machineHostQuery;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Result add(AppDeployConfigDto appDeployConfigDto) {
+        String appId = appDeployConfigDto.getAppId();
+        AppConfig appConfig = appConfigQuery.findByAppId(appId);
+        if (appConfig == null) {
+
+        }
+
+        String machineId = appDeployConfigDto.getMachineId();
+        MachineHost machineHost = machineHostQuery.findByMachineId(machineId);
+        if (machineHost == null) {
+
+        }
+
+        String packType = appDeployConfigDto.getPackType();
+        String startScript = appDeployConfigDto.getStartScript();
+
+        //deployConfigCrud.save(appDeployConfig);
+        return Result.result(ResultStatus.SUCCESS, "msg");
+    }
+
+    @Override
+    public Result modify(AppDeployConfigDto appDeployConfigDto) {
+        //deployConfigCrud.update(appDeployConfig);
+        return Result.result(ResultStatus.SUCCESS, "msg");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Result delete(int appDeployConfigId) {
+        AppDeployConfig appDeployConfig = deployConfigQuery.findById(appDeployConfigId);
+        return Result.result(ResultStatus.SUCCESS);
+    }
+}

+ 8 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/page/AppConfigPage.java

@@ -0,0 +1,8 @@
+package cn.reghao.autodop.dmaster.app.service.page;
+
+/**
+ * @author reghao
+ * @date 2021-10-22 09:15:56
+ */
+public interface AppConfigPage {
+}

+ 20 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/page/AppDeployConfigPage.java

@@ -0,0 +1,20 @@
+package cn.reghao.autodop.dmaster.app.service.page;
+
+import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
+import cn.reghao.autodop.dmaster.app.model.vo.KeyValue;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2021-10-22 09:15:56
+ */
+public interface AppDeployConfigPage {
+    Page<AppDeployConfig> indexPage(String appId, PageRequest pageRequest);
+    AppDeployConfig findByAppIdAndMachineId(String appId, String machineId);
+    AppConfig appConfig(String appId);
+    List<KeyValue> machines(String env);
+}

+ 58 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/page/AppDeployConfigPageImpl.java

@@ -0,0 +1,58 @@
+package cn.reghao.autodop.dmaster.app.service.page;
+
+import cn.reghao.autodop.dmaster.app.db.query.config.AppConfigQuery;
+import cn.reghao.autodop.dmaster.app.db.query.config.AppDeployConfigQuery;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
+import cn.reghao.autodop.dmaster.app.model.po.config.AppDeployConfig;
+import cn.reghao.autodop.dmaster.app.model.vo.KeyValue;
+import cn.reghao.autodop.dmaster.machine.db.query.MachineHostQuery;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2021-10-22 09:15:56
+ */
+@Service
+public class AppDeployConfigPageImpl implements AppDeployConfigPage {
+    private final AppDeployConfigQuery deployConfigQuery;
+    private AppConfigQuery appConfigQuery;
+    private MachineHostQuery hostQuery;
+
+    public AppDeployConfigPageImpl(AppDeployConfigQuery deployConfigQuery, AppConfigQuery appConfigQuery,
+                                   MachineHostQuery hostQuery) {
+        this.deployConfigQuery = deployConfigQuery;
+        this.appConfigQuery = appConfigQuery;
+        this.hostQuery = hostQuery;
+    }
+
+    @Override
+    public Page<AppDeployConfig> indexPage(String appId, PageRequest pageRequest) {
+        return deployConfigQuery.findByAppId(appId, pageRequest);
+    }
+
+    @Override
+    public AppDeployConfig findByAppIdAndMachineId(String appId, String machineId) {
+        return deployConfigQuery.findByAppIdAndMachineId(appId, machineId);
+    }
+
+    @Override
+    public AppConfig appConfig(String appId) {
+        return appConfigQuery.findByAppId(appId);
+    }
+
+    @Override
+    public List<KeyValue> machines(String env) {
+        return hostQuery.findByEnv(env).stream()
+                .map(machineHost -> {
+                    String machineId = machineHost.getMachineId();
+                    String machineIpv4 = machineHost.getMachineIpv4();
+                    return new KeyValue(machineId, machineIpv4);
+                })
+                .collect(Collectors.toList());
+    }
+}

+ 1 - 1
dmaster/src/main/resources/templates/app/config/app/add.html

@@ -80,7 +80,6 @@
                     </div>
                 </td>
             </tr>
-            </tbody>
             <tr>
                 <th>HTTP 端口</th>
                 <td>
@@ -99,6 +98,7 @@
                     </div>
                 </td>
             </tr>
+            </tbody>
         </table>
         <div class="timo-detail-title">构建配置</div>
         <table class="layui-table timo-detail-table">

+ 94 - 0
dmaster/src/main/resources/templates/app/config/app/deploy/add.html

@@ -0,0 +1,94 @@
+<!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/app/config/app/deploy}">
+        <input type="hidden" name="id" th:if="${appDeloyConfig}" th:value="${appDeloyConfig?.id}"/>
+        <table class="layui-table timo-detail-table">
+            <tbody>
+            <tr>
+                <th>选择机器</th>
+                <td>
+                    <span th:if="${appDeployConfig} == null">
+                        <div class="layui-form-item">
+                        <div class="layui-input-inline">
+                            <select name="machineId">
+                                <option th:each="item : ${machines}" th:value="${item.key}">[[${item.value}]]</option>
+                            </select>
+                        </div>
+                    </div>
+                    </span>
+                    <span th:if="${appDeployConfig} != null">
+                        <div class="layui-form-item">
+                        <div class="layui-input-inline">
+                            <select name="machineId">
+                                <option th:each="item : ${machines}" th:value="${item.key}" th:selected="${appDeloyConfig.machineHost.machineId} eq ${item.key}">[[${item.value}]]</option>
+                            </select>
+                        </div>
+                    </div>
+                    </span>
+                </td>
+                <th>应用 ID</th>
+                <td >
+                    <div class="layui-form-item">
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="appId" readonly="true" required th:value="${appId}">
+                        </div>
+                    </div>
+                </td>
+            </tr>
+            <tr>
+                <th>打包类型</th>
+                <td>
+                    <div class="layui-form-item">
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="packType" readonly="true" required th:value="${packType}">
+                        </div>
+                    </div>
+                </td>
+                <span th:if="${packType} ne 'docker' ">
+                    <th>启动目录</th>
+                    <td>
+                    <div class="layui-form-item">
+                        <div class="layui-input-inline">
+                            <input class="layui-input" type="text" name="startHome" placeholder="可执行文件位置(可选)" required th:value="${appDeloyConfig?.startHome}">
+                        </div>
+                    </div>
+                    </td>
+                </span>
+            </tr>
+            <tr>
+                <th>启动脚本</th>
+                <td>
+                    <div class="layui-form-item">
+                        <div class="layui-input-inline">
+                            <textarea class="layui-textarea" name="startScript" placeholder="启动脚本" th:text="${appDeloyConfig?.startScript}"></textarea>
+                        </div>
+                    </div>
+                </td>
+            </tr>
+            <span th:if="${packType} ne 'docker' ">
+                <tr>
+                <th>解包脚本</th>
+                <td>
+                    <div class="layui-form-item">
+                        <div class="layui-input-inline">
+                            <textarea class="layui-textarea" name="unpackScript" placeholder="解包脚本(可选)" th:text="${appDeloyConfig?.unpackScript}"></textarea>
+                        </div>
+                    </div>
+                </td>
+                </tr>
+            </span>
+            </tbody>
+        </table>
+        <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>

+ 21 - 0
dmaster/src/main/resources/templates/app/config/app/deploy/detail.html

@@ -0,0 +1,21 @@
+<!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">
+        <table class="layui-table timo-detail-table">
+            <tbody>
+            <tr>
+                <th>应用 ID</th>
+                <td th:text="${app.appId}"></td>
+                <th>应用名称</th>
+                <td th:text="${app.appName}"></td>
+                <th>应用描述</th>
+                <td th:text="${app.description}"></td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+<script th:replace="/common/template :: script"></script>
+</body>
+</html>

+ 4 - 4
dmaster/src/main/resources/templates/app/config/app/deployconfig.html → dmaster/src/main/resources/templates/app/config/app/deploy/index.html

@@ -8,7 +8,7 @@
         <div class="layui-row timo-card-screen put-row">
             <div class="pull-right screen-btn-group">
                 <div class="btn-group-right">
-                    <button class="layui-btn open-popup" data-title="添加配置" th:attr="data-url=@{/app/config/app/add}"
+                    <button class="layui-btn open-popup" data-title="添加部署配置" th:attr="data-url=@{'/app/config/app/deploy/add/'+${appId}}"
                             data-size="1200,500">
                         <i class="fa fa-plus"></i> 添加
                     </button>
@@ -29,15 +29,15 @@
                 </thead>
                 <tbody>
                 <tr th:each="item:${list}">
-                    <td th:text="${item.machineIpv4}">机器地址</td>
+                    <td th:text="${item.machineHost.machineIpv4}">机器地址</td>
                     <td th:text="${item.packType}">打包类型</td>
                     <td th:text="${item.startScript}">启动脚本</td>
                     <td th:text="${item.unpackScript}">解包脚本</td>
                     <td th:text="${item.startHome}">启动目录</td>
                     <td>
-                        <a class="open-popup" data-title="修改部署配置" th:attr="data-url=@{'/app/bd/deploy/'+${item.appId}}"
+                        <a class="open-popup" data-title="修改部署配置" th:attr="data-url=@{'/app/config/app/deploy/'+${appId}}"
                            data-size="1000,500" href="#">编辑</a>
-                        <a class="ajax-post" th:href="@{'/api/app/bd/build?appId='+${item.appId}}">删除</a>
+                        <a class="ajax-post" th:href="@{'/api/app/config/app/deploy?appId='+${appId}}">删除</a>
                     </td>
                 </tr>
                 </tbody>

+ 1 - 1
dmaster/src/main/resources/templates/app/config/app/index.html

@@ -85,7 +85,7 @@
                     <td th:text="${item.appType}">应用类型</td>
                     <td th:text="${item.httpPort?: ''}">HTTP 端口</td>
                     <td>
-                        <a class="open-popup" data-title="部署配置" th:attr="data-url=@{'/app/config/app/deploy/'+${item.id}}"
+                        <a class="open-popup" data-title="部署配置" th:attr="data-url=@{'/app/config/app/deploy/'+${item.appId}}"
                            data-size="max" href="#">设置</a>
                     </td>
                     <td>

+ 2 - 2
dmaster/src/test/java/cn/reghao/autodop/dmaster/app/service/impl/BuildDeployConfigServiceImplTest.java

@@ -26,9 +26,9 @@ public class BuildDeployConfigServiceImplTest {
     private AppBuildingCrud appBuildingCrud;
 
     @Test
-    public void test() {
+    public void generateAppBuilding() {
         List<AppBuilding> list = appConfigQuery.findAll().stream()
-                .filter(appConfig -> appConfig.getEnv().equals(EnvList.test.getName()))
+                .filter(appConfig -> appConfig.getEnv().equals(EnvList.prod.getName()))
                 .map(AppBuilding::new)
                 .collect(Collectors.toList());
         appBuildingCrud.saveAll(list);