Bladeren bron

固定数据模型

reghao 4 jaren geleden
bovenliggende
commit
bab611af63
25 gewijzigde bestanden met toevoegingen van 118 en 302 verwijderingen
  1. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/BuildDeployLogPageController.java
  2. 7 25
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/config/AppConfigPageController.java
  3. 17 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/dto/NewApp.java
  4. 2 8
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/po/config/AppConfig.java
  5. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/po/log/BuildLog.java
  6. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppBuilder.java
  7. 4 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/config/impl/AppConfigServiceImpl.java
  8. 2 6
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/util/BuilderUtil.java
  9. 1 38
      dmaster/src/main/java/cn/reghao/autodop/dmaster/notification/controller/NotificationController.java
  10. 1 58
      dmaster/src/main/java/cn/reghao/autodop/dmaster/notification/controller/NotificationPageController.java
  11. 0 12
      dmaster/src/main/java/cn/reghao/autodop/dmaster/notification/db/repository/EmailAccountRepository.java
  12. 0 12
      dmaster/src/main/java/cn/reghao/autodop/dmaster/notification/db/repository/SmsAccountRepository.java
  13. 3 6
      dmaster/src/main/java/cn/reghao/autodop/dmaster/notification/model/po/EmailAccount.java
  14. 3 6
      dmaster/src/main/java/cn/reghao/autodop/dmaster/notification/model/po/SmsAccount.java
  15. 0 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/notification/service/NotifyService.java
  16. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/notification/service/notifier/email/EmailNotify.java
  17. 3 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/util/db/BaseEntity.java
  18. 0 29
      dmaster/src/main/java/cn/reghao/autodop/dmaster/util/db/CrudOps.java
  19. 0 0
      dmaster/src/main/resources/templates/app/bd/log/dockerfile.html
  20. 31 20
      dmaster/src/main/resources/templates/app/config/app/add.html
  21. 31 3
      dmaster/src/main/resources/templates/app/config/app/copy.html
  22. 4 6
      dmaster/src/main/resources/templates/app/config/app/detail.html
  23. 0 10
      dmaster/src/main/resources/templates/app/config/app/index.html
  24. 0 39
      dmaster/src/main/resources/templates/app/config/app/notify.html
  25. 0 1
      dmaster/src/main/resources/templates/app/config/repoauth/add.html

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/page/BuildDeployLogPageController.java

@@ -91,9 +91,9 @@ public class BuildDeployLogPageController {
     @GetMapping("/build/{buildLogId}/packscript")
     public String packScriptPage(@PathVariable("buildLogId") String buildLogId, Model model) {
         BuildLog buildLog = buildDeployLogPage.findByBuildLogId(buildLogId);
-        String[] arr = buildLog.getPackScript().split(System.lineSeparator());
+        String[] arr = buildLog.getDockerfile().split(System.lineSeparator());
         model.addAttribute("list", arr);
-        return "/app/bd/log/packscript";
+        return "/app/bd/log/dockerfile";
     }
 
     @ApiOperation(value = "版本信息页面")

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

@@ -4,8 +4,6 @@ import cn.reghao.autodop.common.msg.rpc.dto.app.PackType;
 import cn.reghao.autodop.dmaster.app.db.query.config.*;
 import cn.reghao.autodop.dmaster.app.model.constant.AppType;
 import cn.reghao.autodop.dmaster.app.model.constant.EnvList;
-import cn.reghao.autodop.dmaster.machine.db.query.MachineHostQuery;
-import cn.reghao.autodop.dmaster.notification.model.po.NotifyType;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
 import cn.reghao.autodop.dmaster.app.model.vo.KeyValue;
 import cn.reghao.autodop.dmaster.util.db.PageList;
@@ -36,16 +34,13 @@ public class AppConfigPageController {
     private final RepoAuthConfigQuery repoAuthConfigQuery;
     private final CompilerConfigQuery compilerConfigQuery;
     private final PackerConfigQuery packerConfigQuery;
-    private final MachineHostQuery hostQuery;
 
     public AppConfigPageController(AppConfigQuery appConfigQuery, RepoAuthConfigQuery repoAuthConfigQuery,
-                                   CompilerConfigQuery compilerConfigQuery, PackerConfigQuery packerConfigQuery,
-                                   MachineHostQuery hostQuery) {
+                                   CompilerConfigQuery compilerConfigQuery, PackerConfigQuery packerConfigQuery) {
         this.appConfigQuery = appConfigQuery;
         this.repoAuthConfigQuery = repoAuthConfigQuery;
         this.compilerConfigQuery = compilerConfigQuery;
         this.packerConfigQuery = packerConfigQuery;
-        this.hostQuery = hostQuery;
     }
 
     @ApiOperation(value = "应用配置页面")
@@ -86,31 +81,12 @@ public class AppConfigPageController {
     }
 
     private void setAppModel(Model model) {
-        List<KeyValue> notifyTypes = new ArrayList<>();
-        notifyTypes.add(new KeyValue("请选择通知类型", ""));
-        for (NotifyType notifyType : NotifyType.values()) {
-            notifyTypes.add(new KeyValue(notifyType.name(), notifyType.name()));
-        }
-
-        List<KeyValue> machineList = hostQuery.findByEnv(EnvList.test.name()).stream()
-                .map(machineHost -> {
-                    String machineId = machineHost.getMachineId();
-                    String machineIpv4 = machineHost.getMachineIpv4();
-                    return new KeyValue(machineId, machineIpv4);
-                })
-                .collect(Collectors.toList());
-        List<KeyValue> machines = new ArrayList<>();
-        machines.add(new KeyValue("", "请选择部署的机器"));
-        machines.addAll(machineList);
-
         List<KeyValue> packTypes = new ArrayList<>();
         packTypes.add(new KeyValue("请选择打包类型", ""));
         for (PackType packType : PackType.values()) {
             packTypes.add(new KeyValue(packType.name(), packType.name()));
         }
 
-        model.addAttribute("notifyTypes", notifyTypes);
-        model.addAttribute("machines", machines);
         model.addAttribute("packTypes", packTypes);
         setCommon(model);
     }
@@ -153,6 +129,12 @@ public class AppConfigPageController {
 
     @GetMapping("/copy/{id}")
     public String copyAppConfigPage(@PathVariable("id") AppConfig app, Model model) {
+        List<KeyValue> envs = new ArrayList<>();
+        for (EnvList envList : EnvList.values()) {
+            envs.add(new KeyValue(envList.name(), envList.name()));
+        }
+
+        model.addAttribute("environments", envs);
         model.addAttribute("app", app);
         return "/app/config/app/copy";
     }

+ 17 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/dto/NewApp.java

@@ -15,16 +15,28 @@ public class NewApp implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @NotBlank(message = "应用 ID 不能为空白字符串")
-    private String newId;
+    private String newAppId;
+    @NotBlank(message = "应用名字不能为空白字符串")
+    private String newAppName;
+    @NotBlank(message = "应用环境不能为空白字符串")
+    private String newEnv;
+    @NotBlank(message = "应用仓库不能为空白字符串")
+    private String newAppRepo;
     @NotBlank(message = "仓库分支不能为空白字符串")
     private String newRepoBranch;
-    @NotBlank(message = "应用环境不能为空白字符串")
-    private String env;
+    @NotBlank(message = "应用代码目录名不能为空白字符串")
+    private String newCodeDirname;
+    private String newDockerfile;
 
     public AppConfig app(AppConfig from) {
-        from.setAppId(newId);
+        from.setAppId(newAppId);
+        from.setAppName(newAppName);
+        from.setEnv(newEnv);
+        from.setAppRepo(newAppRepo);
+        from.setRepoBranch(newRepoBranch);
         from.setRepoBranch(newRepoBranch);
-        from.setEnv(env);
+        from.setCodeDirname(newCodeDirname);
+        from.setDockerfile(newDockerfile);
 
         from.setId(null);
         from.setCreateTime(null);

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

@@ -44,9 +44,6 @@ public class AppConfig extends BaseEntity<Integer> implements Cloneable {
     /* 构建配置 */
     @NotBlank(message = "代码目录不能为空白字符串")
     private String codeDirname;
-    // 编译应用时所处的目录,以仓库目录为起点
-    @NotBlank(message = "代码编译主目录不能为空白字符串")
-    private String compileHome;
     private String execBinName;
     private Integer httpPort;
     private String healthCheck;
@@ -64,13 +61,10 @@ 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
+    // TODO packType 是 docker 时使用
     @Lob
     @Column(columnDefinition="text")
-    private String packScript;
-    @Lob
-    @Column(columnDefinition="text")
-    private String unpackScript;
+    private String dockerfile;
 
     @Override
     public Object clone() throws CloneNotSupportedException {

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/model/po/log/BuildLog.java

@@ -25,7 +25,7 @@ public class BuildLog extends BaseDocument {
     private String env;
     private String repoBranch;
     private BuildConfig buildConfig;
-    private String packScript;
+    private String dockerfile;
     private String packagePath;
 
     private CommitInfo commitInfo;
@@ -41,7 +41,7 @@ public class BuildLog extends BaseDocument {
         buildLog.setRepoBranch(app.getRepoBranch());
         buildLog.setBuildConfig(
                 new BuildConfig(app.getRepoAuthConfig(), app.getCompilerConfig(), app.getPackerConfig()));
-        buildLog.setPackScript(app.getPackScript());
+        buildLog.setDockerfile(app.getDockerfile());
 
         buildLog.setBuildTime(new BuildTime());
         buildLog.setResult(new Result());

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppBuilder.java

@@ -122,7 +122,7 @@ public class AppBuilder {
         PackerConfig packerConfig = app.getPackerConfig();
         switch (PackType.valueOf(packerConfig.getType())) {
             case docker:
-                codePacker = new DockerPack(packerConfig, app.getPackScript());
+                codePacker = new DockerPack(packerConfig, app.getDockerfile());
                 break;
             case zip:
                 codePacker = new ZipPack(packerConfig);
@@ -180,7 +180,7 @@ public class AppBuilder {
     }
 
     private String compileDir() {
-        return "/".equals(app.getCompileHome()) ? appCompileDir : appCompileDir + app.getCompileHome();
+        return appCompileDir + "/" + app.getCodeDirname();
     }
 
     @Data

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

@@ -28,8 +28,8 @@ public class AppConfigServiceImpl implements AppConfigService {
     private final AppConfigQuery appConfigQuery;
     private final AppConfigCrud appConfigCrud;
     private final BuildConfigChecker buildConfigChecker;
-    private AppBuildingService appBuildingService;
-    private AppMonitorService appMonitorService;
+    private final AppBuildingService appBuildingService;
+    private final AppMonitorService appMonitorService;
 
     public AppConfigServiceImpl(AppConfigQuery appConfigQuery, AppConfigCrud appConfigCrud,
                                 BuildConfigChecker buildConfigChecker, AppBuildingService appBuildingService,
@@ -70,9 +70,9 @@ public class AppConfigServiceImpl implements AppConfigService {
             return Result.result(ResultStatus.FAIL, "AppConfig 不存在");
         }
 
-        AppConfig toApp = appConfigQuery.findByIsDeleteFalseAndAppId(to.getNewId());
+        AppConfig toApp = appConfigQuery.findByIsDeleteFalseAndAppId(to.getNewAppId());
         if (toApp != null) {
-            String msg = String.format("%s 已存在", to.getNewId());
+            String msg = String.format("%s 已存在", to.getNewAppId());
             return Result.result(ResultStatus.FAIL, msg);
         }
 

+ 2 - 6
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/util/BuilderUtil.java

@@ -5,7 +5,6 @@ import cn.reghao.autodop.common.util.text.ReplaceCharacter;
 import cn.reghao.autodop.dmaster.app.model.constant.AppType;
 import cn.reghao.autodop.dmaster.app.model.po.config.AppConfig;
 import cn.reghao.autodop.dmaster.app.model.po.config.build.LocalBuildDir;
-import lombok.extern.slf4j.Slf4j;
 
 import java.io.File;
 import java.io.IOException;
@@ -14,7 +13,6 @@ import java.io.IOException;
  * @author reghao
  * @date 2019-11-16 21:55:31
  */
-@Slf4j
 public class BuilderUtil {
     /**
      * 复制源码到编译目录
@@ -31,13 +29,11 @@ public class BuilderUtil {
             FileOps.eraseDir(compileDir);
         }
 
-        String dirname = app.getCodeDirname();
-        FileOps.copyDirContentToDir(appLocalRepo + "/" + dirname, appCompileDir);
-
+        FileOps.copyDirContentToDir(appLocalRepo, appCompileDir);
         // TODO Dotnet 应用需要额外的处理
         if (app.getAppType().equals(AppType.dotnetCore.name())) {
             // Dotnet 应用需要替换一些字符
-            BuilderUtil.replaceCharacter(appCompileDir);
+            replaceCharacter(appCompileDir);
         }
     }
 

+ 1 - 38
dmaster/src/main/java/cn/reghao/autodop/dmaster/notification/controller/NotificationController.java

@@ -2,13 +2,9 @@ package cn.reghao.autodop.dmaster.notification.controller;
 
 import cn.reghao.jdkutil.result.WebBody;
 import cn.reghao.autodop.dmaster.notification.model.po.DingAccount;
-import cn.reghao.autodop.dmaster.notification.model.po.EmailAccount;
 import cn.reghao.autodop.dmaster.notification.model.po.NotifyGroup;
-import cn.reghao.autodop.dmaster.notification.model.po.SmsAccount;
 import cn.reghao.autodop.dmaster.notification.db.repository.DingAccountRepository;
 import cn.reghao.autodop.dmaster.notification.db.repository.NotifyGroupRepository;
-import cn.reghao.autodop.dmaster.notification.db.repository.EmailAccountRepository;
-import cn.reghao.autodop.dmaster.notification.db.repository.SmsAccountRepository;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.http.MediaType;
@@ -27,47 +23,14 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping("/api/sys/notify")
 @RestController
 public class NotificationController {
-    private EmailAccountRepository emailRepository;
-    private SmsAccountRepository smsRepository;
     private DingAccountRepository dingRepository;
     private NotifyGroupRepository receiverRepository;
 
-    public NotificationController(EmailAccountRepository emailRepository,
-                                  SmsAccountRepository smsRepository,
-                                  DingAccountRepository dingRepository,
-                                  NotifyGroupRepository receiverRepository) {
-        this.emailRepository = emailRepository;
-        this.smsRepository = smsRepository;
+    public NotificationController(DingAccountRepository dingRepository, NotifyGroupRepository receiverRepository) {
         this.dingRepository = dingRepository;
         this.receiverRepository = receiverRepository;
     }
 
-    @ApiOperation(value = "添加/修改邮件通知账户")
-    @PostMapping(value = "/email", produces = MediaType.APPLICATION_JSON_VALUE)
-    public ResponseEntity<String> addEmailAccount(@Validated EmailAccount emailAccount) {
-        emailRepository.save(emailAccount);
-        return ResponseEntity.ok().body(WebBody.success());
-    }
-
-    @ApiOperation(value = "删除邮件通知账户")
-    @DeleteMapping(value = "/email", produces = MediaType.APPLICATION_JSON_VALUE)
-    public ResponseEntity<String> deleteEmailAccount(@Validated EmailAccount emailAccount) {
-        return ResponseEntity.ok().body(WebBody.success());
-    }
-
-    @ApiOperation(value = "添加/修改短信通知账户")
-    @PostMapping(value = "/sms", produces = MediaType.APPLICATION_JSON_VALUE)
-    public ResponseEntity<String> addSmsAccount(@Validated SmsAccount smsAccount) {
-        smsRepository.save(smsAccount);
-        return ResponseEntity.ok().body(WebBody.success());
-    }
-
-    @ApiOperation(value = "删除短信通知账户")
-    @DeleteMapping(value = "/sms", produces = MediaType.APPLICATION_JSON_VALUE)
-    public ResponseEntity<String> deleteSmsAccount(@Validated SmsAccount smsAccount) {
-        return ResponseEntity.ok().body(WebBody.success());
-    }
-
     @ApiOperation(value = "添加/修改钉钉通知账户")
     @PostMapping(value = "/ding", produces = MediaType.APPLICATION_JSON_VALUE)
     public ResponseEntity<String> addDingAccount(@Validated DingAccount dingAccount) {

+ 1 - 58
dmaster/src/main/java/cn/reghao/autodop/dmaster/notification/controller/NotificationPageController.java

@@ -1,13 +1,9 @@
 package cn.reghao.autodop.dmaster.notification.controller;
 
 import cn.reghao.autodop.dmaster.notification.model.po.DingAccount;
-import cn.reghao.autodop.dmaster.notification.model.po.EmailAccount;
 import cn.reghao.autodop.dmaster.notification.model.po.NotifyGroup;
-import cn.reghao.autodop.dmaster.notification.model.po.SmsAccount;
 import cn.reghao.autodop.dmaster.notification.db.repository.DingAccountRepository;
 import cn.reghao.autodop.dmaster.notification.db.repository.NotifyGroupRepository;
-import cn.reghao.autodop.dmaster.notification.db.repository.EmailAccountRepository;
-import cn.reghao.autodop.dmaster.notification.db.repository.SmsAccountRepository;
 import cn.reghao.autodop.dmaster.util.db.PageList;
 import cn.reghao.autodop.dmaster.util.db.PageSort;
 import io.swagger.annotations.Api;
@@ -26,67 +22,14 @@ import org.springframework.web.bind.annotation.*;
 @RequestMapping("/sys")
 @Controller
 public class NotificationPageController {
-    private EmailAccountRepository emailRepository;
-    private SmsAccountRepository smsRepository;
     private DingAccountRepository dingRepository;
     private NotifyGroupRepository receiverRepository;
 
-    public NotificationPageController(EmailAccountRepository emailRepository,
-                                      SmsAccountRepository smsRepository,
-                                      DingAccountRepository dingRepository,
-                                      NotifyGroupRepository receiverRepository) {
-        this.emailRepository = emailRepository;
-        this.smsRepository = smsRepository;
+    public NotificationPageController(DingAccountRepository dingRepository, NotifyGroupRepository receiverRepository) {
         this.dingRepository = dingRepository;
         this.receiverRepository = receiverRepository;
     }
 
-    @ApiOperation(value = "邮件通知配置页面")
-    @GetMapping("/notify/email")
-    public String emailNotifyConfigPage(Model model) {
-        PageRequest pageRequest = PageSort.pageRequest();
-        Page<EmailAccount> page = emailRepository.findAll(pageRequest);
-        PageList<EmailAccount> pageList = PageList.pageList(page);
-
-        model.addAttribute("page", page);
-        model.addAttribute("list", pageList.getList());
-        return "/sys/notify/email";
-    }
-
-    @GetMapping("/notify/email/add")
-    public String emailNotifyConfigAddPage(Model model) {
-        return "/sys/notify/emailadd";
-    }
-
-    @GetMapping("/notify/email/edit/{id}")
-    public String emailNotifyConfigEditPage(@PathVariable("id") EmailAccount emailAccount, Model model) {
-        model.addAttribute("emailAccount", emailAccount);
-        return "/sys/notify/emailadd";
-    }
-
-    @ApiOperation(value = "短信通知配置页面")
-    @GetMapping("/notify/sms")
-    public String smsNotifyConfigPage(Model model) {
-        PageRequest pageRequest = PageSort.pageRequest();
-        Page<SmsAccount> page = smsRepository.findAll(pageRequest);
-        PageList<SmsAccount> pageList = PageList.pageList(page);
-
-        model.addAttribute("page", page);
-        model.addAttribute("list", pageList.getList());
-        return "/sys/notify/sms";
-    }
-
-    @GetMapping("/notify/sms/add")
-    public String smsNotifyConfigAddPage(Model model) {
-        return "/sys/notify/smsadd";
-    }
-
-    @GetMapping("/notify/sms/edit/{id}")
-    public String smsNotifyConfigEditPage(@PathVariable("id") SmsAccount smsAccount, Model model) {
-        model.addAttribute("smsAccount", smsAccount);
-        return "/sys/notify/smsadd";
-    }
-
     @ApiOperation(value = "钉钉通知配置页面")
     @GetMapping("/notify/ding")
     public String dingNotifyConfigPage(Model model) {

+ 0 - 12
dmaster/src/main/java/cn/reghao/autodop/dmaster/notification/db/repository/EmailAccountRepository.java

@@ -1,12 +0,0 @@
-package cn.reghao.autodop.dmaster.notification.db.repository;
-
-import cn.reghao.autodop.dmaster.notification.model.po.EmailAccount;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-/**
- * @author reghao
- * @date 2021-05-24 15:20:24
- */
-public interface EmailAccountRepository extends JpaRepository<EmailAccount, Integer> {
-    EmailAccount findEmailAccountByNotifyAccountId(String notifyAccountId);
-}

+ 0 - 12
dmaster/src/main/java/cn/reghao/autodop/dmaster/notification/db/repository/SmsAccountRepository.java

@@ -1,12 +0,0 @@
-package cn.reghao.autodop.dmaster.notification.db.repository;
-
-import cn.reghao.autodop.dmaster.notification.model.po.SmsAccount;
-import org.springframework.data.jpa.repository.JpaRepository;
-
-/**
- * @author reghao
- * @date 2021-05-24 15:20:24
- */
-public interface SmsAccountRepository extends JpaRepository<SmsAccount, Integer> {
-    SmsAccount findSmsAccountByNotifyAccountId(String notifyAccountId);
-}

+ 3 - 6
dmaster/src/main/java/cn/reghao/autodop/dmaster/notification/model/po/EmailAccount.java

@@ -1,18 +1,15 @@
 package cn.reghao.autodop.dmaster.notification.model.po;
 
-import lombok.*;
+import lombok.Data;
 
-import javax.persistence.Entity;
 import javax.validation.constraints.NotBlank;
 
 /**
+ * TODO 待实现
  * @author reghao
  * @date 2021-06-23 10:29:18
  */
-@NoArgsConstructor
-@Getter
-@Setter
-@Entity
+@Data
 public class EmailAccount extends NotifyAccount {
     //private String account;
     //private String password;

+ 3 - 6
dmaster/src/main/java/cn/reghao/autodop/dmaster/notification/model/po/SmsAccount.java

@@ -1,20 +1,17 @@
 package cn.reghao.autodop.dmaster.notification.model.po;
 
-import lombok.*;
+import lombok.Data;
 
-import javax.persistence.Entity;
 import javax.validation.constraints.NotBlank;
 
 /**
+ * TODO 待实现
  * 短信帐号
  *
  * @author reghao
  * @date 2021-02-25 17:54:08
  */
-@NoArgsConstructor
-@Getter
-@Setter
-@Entity
+@Data
 public class SmsAccount extends NotifyAccount {
     //private String name;
     //private String spwd;

+ 0 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/notification/service/NotifyService.java

@@ -9,9 +9,6 @@ import cn.reghao.autodop.common.util.thread.ThreadPoolWrapper;
 import cn.reghao.autodop.dmaster.notification.service.notifier.Notify;
 import cn.reghao.autodop.dmaster.notification.service.notifier.ding.DingMsg;
 import cn.reghao.autodop.dmaster.notification.service.notifier.ding.DingNotify;
-import cn.reghao.autodop.dmaster.notification.service.notifier.email.EmailMsg;
-import cn.reghao.autodop.dmaster.notification.service.notifier.email.EmailNotify;
-import cn.reghao.autodop.dmaster.notification.service.notifier.sms.SmsNotify;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/notification/service/notifier/email/EmailNotify.java

@@ -19,9 +19,9 @@ import java.util.Properties;
  * @date 2021-02-25 19:23:16
  */
 public class EmailNotify implements Notify<EmailMsg> {
-    private String account;
-    private String password;
-    private InternetAddress from;
+    private final String account;
+    private final String password;
+    private final InternetAddress from;
     private Session session;
 
     public EmailNotify(EmailAccount emailAccount) throws UnsupportedEncodingException {

+ 3 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/util/db/BaseEntity.java

@@ -30,7 +30,8 @@ public class BaseEntity<T extends Serializable> implements Serializable {
     protected LocalDateTime updateTime;
 
     public BaseEntity() {
-        // TODO 在 controller 中使用对象接收 formdata 数据时,不能正确初始化 isDelete 字段
-        this.isDelete = Boolean.FALSE;
+        this.isDelete = false;
+        this.createTime = LocalDateTime.now();
+        this.updateTime = LocalDateTime.now();
     }
 }

+ 0 - 29
dmaster/src/main/java/cn/reghao/autodop/dmaster/util/db/CrudOps.java

@@ -1,29 +0,0 @@
-package cn.reghao.autodop.dmaster.util.db;
-
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-
-import java.util.List;
-
-/**
- * 数据库 CRUD 操作接口
- *
- * @author reghao
- * @date 2020-06-25 01:34:27
- */
-public interface CrudOps<T> {
-    default void insert(T t) {}
-    default void update(T t) {}
-    void insertOrUpdate(T t);
-    void delete(T t);
-    default void deleteByUk(String uk) {}
-
-    T selectByPk(Integer pk);
-    T selectByUk(String uk);
-    default Page<T> selectByPage(Pageable pageable) {
-        return null;
-    }
-    default List<T> selectAll() {
-        return null;
-    }
-}

+ 0 - 0
dmaster/src/main/resources/templates/app/bd/log/packscript.html → dmaster/src/main/resources/templates/app/bd/log/dockerfile.html


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

@@ -10,7 +10,9 @@
         <table class="layui-table timo-detail-table">
             <tbody>
             <tr>
-                <th>应用 ID</th>
+                <th>
+                    <label class="layui-form-label required">应用 ID</label>
+                </th>
                 <td>
                     <div class="layui-form-item" th:if="${app} == null">
                         <div class="layui-input-inline">
@@ -23,7 +25,9 @@
                         </div>
                     </div>
                 </td>
-                <th>应用名</th>
+                <th>
+                    <label class="layui-form-label required">应用名</label>
+                </th>
                 <td >
                     <div class="layui-form-item">
                         <div class="layui-input-inline">
@@ -41,7 +45,9 @@
                 </td>
             </tr>
             <tr>
-                <th>所属环境</th>
+                <th>
+                    <label class="layui-form-label required">所属环境</label>
+                </th>
                 <td>
                     <div class="layui-form-item">
                         <div class="layui-input-inline">
@@ -51,7 +57,9 @@
                         </div>
                     </div>
                 </td>
-                <th>应用类型</th>
+                <th>
+                    <label class="layui-form-label required">应用类型</label>
+                </th>
                 <td>
                     <div class="layui-form-item">
                         <div class="layui-input-inline">
@@ -63,7 +71,9 @@
                 </td>
             </tr>
             <tr>
-                <th>应用仓库</th>
+                <th>
+                    <label class="layui-form-label required">应用仓库</label>
+                </th>
                 <td>
                     <div class="layui-form-item">
                         <div class="layui-input-inline">
@@ -71,7 +81,9 @@
                         </div>
                     </div>
                 </td>
-                <th>仓库分支</th>
+                <th>
+                    <label class="layui-form-label required">仓库分支</label>
+                </th>
                 <td>
                     <div class="layui-form-item">
                         <div class="layui-input-inline">
@@ -104,7 +116,9 @@
         <table class="layui-table timo-detail-table">
             <tbody>
             <tr>
-                <th>代码目录</th>
+                <th>
+                    <label class="layui-form-label required">代码目录</label>
+                </th>
                 <td>
                     <div class="layui-form-item">
                         <div class="layui-input-inline">
@@ -112,14 +126,6 @@
                         </div>
                     </div>
                 </td>
-                <th>编译目录</th>
-                <td>
-                    <div class="layui-form-item">
-                        <div class="layui-input-inline">
-                            <input class="layui-input" type="text" name="compileHome"  placeholder="请输入应用编译主目录" required th:value="${app?.compileHome}">
-                        </div>
-                    </div>
-                </td>
                 <th>可执行文件名</th>
                 <td>
                     <div class="layui-form-item">
@@ -129,9 +135,10 @@
                     </div>
                 </td>
             </tr>
-            <!-- TODO 若选择了项目,则仓库、编译和打包配置不用选择 -->
             <tr>
-                <th>仓库认证(若选择了项目则不必选择)</th>
+                <th>
+                    <label class="layui-form-label required">仓库认证</label>
+                </th>
                 <td>
                     <div class="layui-form-item">
                         <div class="layui-input-inline">
@@ -141,7 +148,9 @@
                         </div>
                     </div>
                 </td>
-                <th>编译器(若选择了项目则不必选择)</th>
+                <th>
+                    <label class="layui-form-label required">编译工具</label>
+                </th>
                 <td>
                     <div class="layui-form-item">
                         <div class="layui-input-inline">
@@ -151,7 +160,9 @@
                         </div>
                     </div>
                 </td>
-                <th>打包工具(若选择了项目则不必选择)</th>
+                <th>
+                    <label class="layui-form-label required">打包工具</label>
+                </th>
                 <td>
                     <div class="layui-form-item">
                         <div class="layui-input-inline">
@@ -167,7 +178,7 @@
                 <td>
                     <div class="layui-form-item">
                         <div class="layui-input-inline">
-                            <textarea class="layui-textarea" name="packScript" placeholder="打包类型是 docker 时才需要" th:text="${app?.packScript}"></textarea>
+                            <textarea class="layui-textarea" name="dockerfile" placeholder="打包类型是 docker 时才需要" th:text="${app?.dockerfile}"></textarea>
                         </div>
                     </div>
                 </td>

+ 31 - 3
dmaster/src/main/resources/templates/app/config/app/copy.html

@@ -9,7 +9,29 @@
         <div class="layui-form-item">
             <label class="layui-form-label required">新应用 ID</label>
             <div class="layui-input-inline">
-                <input class="layui-input" type="text" name="newId" placeholder="请输入新应用 ID">
+                <input class="layui-input" type="text" name="newAppId" placeholder="请输入新应用 ID">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label required">新应用名字</label>
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="newAppName" placeholder="请输入新应用名字">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label required">新应用环境</label>
+            <div class="layui-form-item">
+                <div class="layui-input-inline">
+                    <select name="newEnv">
+                        <option th:each="item : ${environments}" th:value="${item.key}" th:selected="${app?.env} eq ${item.key}">[[${item.value}]]</option>
+                    </select>
+                </div>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label required">新应用仓库</label>
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="newAppRepo" placeholder="请输入新应用仓库">
             </div>
         </div>
         <div class="layui-form-item">
@@ -19,9 +41,15 @@
             </div>
         </div>
         <div class="layui-form-item">
-            <label class="layui-form-label required">新应用环境</label>
+            <label class="layui-form-label required">新应用代码目录名</label>
+            <div class="layui-input-inline">
+                <input class="layui-input" type="text" name="newCodeDirname" placeholder="请输入新应用代码目录名">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label">新应用 Dockerfile</label>
             <div class="layui-input-inline">
-                <input class="layui-input" type="text" name="env" placeholder="请输入新应用环境">
+                <textarea class="layui-textarea" name="newDockerfile" placeholder="打包类型是 docker 时才需要" ></textarea>
             </div>
         </div>
         <div class="layui-form-item timo-finally">

+ 4 - 6
dmaster/src/main/resources/templates/app/config/app/detail.html

@@ -40,15 +40,11 @@
             <tr>
                 <th>代码目录</th>
                 <td th:text="${app.codeDirname}"></td>
-                <th>编译主目录</th>
-                <td th:text="${app.compileHome}"></td>
                 <th>可执行文件名</th>
                 <td th:text="${app.execBinName}"></td>
-            </tr>
-            <tr>
-                <th>打包脚本</th>
+                <th>Dockerfile</th>
                 <td>
-                    <textarea class="layui-textarea" readonly="readonly" th:text="${app.packScript}"></textarea>
+                    <textarea class="layui-textarea" readonly="readonly" th:text="${app.dockerfile}"></textarea>
                 </td>
             </tr>
             <tr>
@@ -77,6 +73,8 @@
             </tr>
             </tbody>
         </table>
+        <!-- TODO 待实现 -->
+        <div class="timo-detail-title">通知配置</div>
         <div class="timo-detail-title">部署配置</div>
         <!--<table class="layui-table timo-detail-table">
             <tbody>

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

@@ -10,7 +10,6 @@
     <div class="layui-card-header timo-card-header">
         <span><i class="fa fa-bars"></i> 应用配置</span>
         <i class="layui-icon layui-icon-refresh refresh-btn"></i>
-        <a th:href="@{/api/bak/config/app/export}"><i class="fa fa-download"></i></a>
     </div>
     <div class="layui-card-body">
         <div class="layui-row timo-card-screen put-row">
@@ -39,10 +38,6 @@
             </div>
             <div class="pull-right screen-btn-group">
                 <div class="btn-group-right">
-                    <button type="button" class="layui-btn upload-image" name="file[]"
-                            th:attr="up-url=@{/api/bak/config/app/import}" up-field="path">
-                        <i class="fa fa-upload"></i> 导入
-                    </button>
                     <button class="layui-btn open-popup" data-title="添加应用" th:attr="data-url=@{/app/config/app/add}"
                             data-size="1200,500">
                         <i class="fa fa-plus"></i> 添加
@@ -71,7 +66,6 @@
                     <th class="sortable" data-field="appType">应用类型</th>
                     <th class="sortable" data-field="httpPort">HTTP 端口</th>
                     <th>部署配置</th>
-                    <th>通知组</th>
                     <th>操作</th>
                 </tr>
                 </thead>
@@ -88,10 +82,6 @@
                         <a class="open-popup" data-title="部署配置" th:attr="data-url=@{'/app/config/app/deploy/'+${item.appId}}"
                            data-size="max" href="#">设置</a>
                     </td>
-                    <td>
-                        <a class="open-popup" data-title="设置通知组" th:attr="data-url=@{'/app/config/app/notify/'+${item.id}}"
-                           href="#">设置</a>
-                    </td>
                     <td>
                         <a class="open-popup" data-title="拷贝" th:attr="data-url=@{'/app/config/app/copy/'+${item.id}}"
                            href="#">拷贝</a>

+ 0 - 39
dmaster/src/main/resources/templates/app/config/app/notify.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/app/config/app/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>

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

@@ -7,7 +7,6 @@
 <div class="layui-form timo-compile">
     <form th:action="@{/api/app/config/build/repoauth}">
         <input type="hidden" name="id" th:value="${repoAuth?.id}"/>
-        <input type="hidden" name="isDelete" th:value="${repoAuth?.isDelete}"/>
         <div class="layui-form-item">
             <label class="layui-form-label required">仓库类型</label>
             <div class="layui-input-inline">