Procházet zdrojové kódy

resource 页面接口开发中

reghao před 5 roky
rodič
revize
d765def9bf
61 změnil soubory, kde provedl 461 přidání a 285 odebrání
  1. 0 5
      common/pom.xml
  2. 1 17
      common/src/main/java/cn/reghao/autodop/common/dagent/app/api/data/DeployedAppStatus.java
  3. 0 3
      common/src/main/java/cn/reghao/autodop/common/dagent/app/api/data/log/LogConfig.java
  4. 1 2
      dagent/src/main/java/cn/reghao/autodop/dagent/DagentApplication.java
  5. 3 3
      dmaster/pom.xml
  6. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildDeployController.java
  7. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/StatusController.java
  8. 8 8
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/crud/AppConfigController.java
  9. 10 10
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/crud/BuildConfigController.java
  10. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/log/AppStatusCrudService.java
  11. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/AppOrchestration.java
  12. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/ProjOrchestration.java
  13. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/BuildDir.java
  14. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/CompilerConfig.java
  15. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/PackerConfig.java
  16. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/RepoAuthConfig.java
  17. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/deploy/RunningConfig.java
  18. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/BuildLog.java
  19. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/CommitLog.java
  20. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/DeployLog.java
  21. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/status/BuildDeployApp.java
  22. 4 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/status/AppStatusRepository.java
  23. 7 6
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppStatusService.java
  24. 6 6
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/log/BuildDeployLogService.java
  25. 5 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/controller/App3OpsController.java
  26. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/entity/App3.java
  27. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/entity/App3Bak.java
  28. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/entity/App3BakLog.java
  29. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/Menu.java
  30. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/MenuType.java
  31. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/Role.java
  32. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/User.java
  33. 31 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/config/MvcDataConverter.java
  34. 2 113
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/config/WebMvcConfig.java
  35. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/exception/ControllerExceptionHandler.java
  36. 10 6
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/exception/WebErrorController.java
  37. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/orm/BaseDocument.java
  38. 5 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/orm/BaseEntity.java
  39. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/controller/crud/MachineLogCrudController.java
  40. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/entity/MachineInfo.java
  41. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/entity/MachineLog.java
  42. 12 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/WebBody.java
  43. 36 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/AppPageController.java
  44. 14 10
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/LoginPageController.java
  45. 8 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/ResourceController.java
  46. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/RolePageController.java
  47. 5 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/TestController.java
  48. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/UserPageController.java
  49. 66 11
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/service/ResourceService.java
  50. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/attribute/SelectDictAttrProcessor.java
  51. 5 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/controller/GuestController.java
  52. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/controller/HostController.java
  53. 4 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/controller/StorageController.java
  54. 1 1
      dmaster/src/main/resources/application.yml
  55. 30 0
      dmaster/src/main/resources/templates/404.html
  56. 126 0
      dmaster/src/main/resources/templates/app/bd.html
  57. 11 10
      dmaster/src/main/resources/templates/main.html
  58. 4 0
      dmaster/src/main/resources/templates/system/menu/add.html
  59. 1 1
      dmaster/src/main/resources/templates/system/menu/roleList.html
  60. 3 1
      scripts/build.sh
  61. 5 5
      scripts/build_and_deploy.sh

+ 0 - 5
common/pom.xml

@@ -12,11 +12,6 @@
     <artifactId>common</artifactId>
 
     <dependencies>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-jpa</artifactId>
-        </dependency>
-
         <dependency>
             <groupId>io.netty</groupId>
             <artifactId>netty-all</artifactId>

+ 1 - 17
common/src/main/java/cn/reghao/autodop/common/dagent/app/api/data/DeployedAppStatus.java

@@ -1,11 +1,7 @@
 package cn.reghao.autodop.common.dagent.app.api.data;
 
-import cn.reghao.autodop.common.orm.BaseEntity;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
 import java.time.LocalDateTime;
 
 /**
@@ -15,30 +11,18 @@ import java.time.LocalDateTime;
  * @date 2021-02-22 16:24:08
  */
 @Data
-@EqualsAndHashCode(callSuper = false)
-@Entity
-public class DeployedAppStatus extends BaseEntity<Integer> {
-    @Column(nullable = false)
+public class DeployedAppStatus {
     private String machineId;
-    @Column(nullable = false)
     private String machineIpv4;
-    @Column(nullable = false, unique = true)
     private String appId;
-    @Column(nullable = false)
     private String appType;
-    @Column(nullable = false)
     private String env;
-    @Column(nullable = false)
     private String commitId;
     private Boolean isRunning;
     private LocalDateTime startTime;
     private Integer pid;
 
     public DeployedAppStatus vo() {
-        this.setId(null);
-        this.setIsDelete(null);
-        this.setCreateTime(null);
-        this.setUpdateTime(null);
         return this;
     }
 }

+ 0 - 3
common/src/main/java/cn/reghao/autodop/common/dagent/app/api/data/log/LogConfig.java

@@ -4,8 +4,6 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
-import javax.persistence.Embeddable;
-
 /**
  * 应用日志配置
  *
@@ -15,7 +13,6 @@ import javax.persistence.Embeddable;
 @NoArgsConstructor
 @AllArgsConstructor
 @Data
-@Embeddable
 public class LogConfig {
     private String type;
     private String level;

+ 1 - 2
dagent/src/main/java/cn/reghao/autodop/dagent/DagentApplication.java

@@ -2,10 +2,9 @@ package cn.reghao.autodop.dagent;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
 import org.springframework.context.annotation.ComponentScan;
 
-@SpringBootApplication(exclude= DataSourceAutoConfiguration.class)
+@SpringBootApplication
 @ComponentScan({"cn.reghao.autodop.dagent", "cn.reghao.autodop.common"})
 public class DagentApplication {
 	public static void main(String[] args) {

+ 3 - 3
dmaster/pom.xml

@@ -146,10 +146,10 @@
             <version>RELEASE</version>
         </dependency>
 
-        <!--<dependency>
+        <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
-        </dependency>-->
+        </dependency>
 
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -219,7 +219,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-resources-plugin</artifactId>
-                <version>3.2.0</version>
+                <!--<version>3.2.0</version>-->
                 <configuration>
                     <!-- 让 maven 不处理字体 -->
                     <nonFilteredFileExtensions>

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildDeployController.java

@@ -52,7 +52,7 @@ public class BuildDeployController {
     @PostMapping("/list/refresh/{env}")
     public ResponseEntity<String> refreshBuildList(@PathVariable("env") String env) {
         refreshService.refreshBuildList(EnvType.valueOf(env).name());
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "构建部署应用")

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/StatusController.java

@@ -33,7 +33,7 @@ public class StatusController {
     @PostMapping("/refresh}")
     public ResponseEntity<String> refreshDeployedApps(@RequestParam("env") String env) {
         statusService.refreshDeployedApps(env);
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "所有已部署应用的运行状态")

+ 8 - 8
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/crud/AppConfigController.java

@@ -41,7 +41,7 @@ public class AppConfigController {
         AppVO appVO = JsonConverter.jsonToObject(json, AppVO.class);
         AppOrchestration app = AppVO.to(appVO);
         appOrchestrationCrudService.insert(app);
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "复制应用编排")
@@ -49,7 +49,7 @@ public class AppConfigController {
     public ResponseEntity<String> copyAppOrchestration(@RequestParam("from") String from,
                                                        @RequestParam("to") String to) throws Exception {
         appOrchestrationCrudService.copy(from, to);
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "修改应用编排")
@@ -58,14 +58,14 @@ public class AppConfigController {
         AppVO appVO = JsonConverter.jsonToObject(json, AppVO.class);
         AppOrchestration app = AppVO.to(appVO);
         appOrchestrationCrudService.update(app);
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "删除应用编排")
     @DeleteMapping("/app/{uniqueKey}")
     public ResponseEntity<String> deleteAppOrchestration(@PathVariable("uniqueKey") String uniqueKey) throws Exception {
         appOrchestrationCrudService.delete(uniqueKey);
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "分页获取应用编排")
@@ -90,7 +90,7 @@ public class AppConfigController {
         ProjVO projVO = JsonConverter.jsonToObject(json, ProjVO.class);
         ProjOrchestration proj = ProjVO.to(projVO);
         projOrchestrationCrudService.insert(proj);
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "复制项目编排")
@@ -98,7 +98,7 @@ public class AppConfigController {
     public ResponseEntity<String> copyProjOrchestration(@RequestParam("from") String from,
                                                        @RequestParam("to") String to) throws Exception {
         projOrchestrationCrudService.copy(from, to);
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "修改项目编排")
@@ -106,14 +106,14 @@ public class AppConfigController {
     public ResponseEntity<String> modifyProjOrchestration(@RequestBody String json) throws Exception {
         ProjOrchestration proj = JsonConverter.jsonToObject(json, ProjOrchestration.class);
         projOrchestrationCrudService.insert(proj);
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "删除项目编排")
     @DeleteMapping("/proj/{uniqueKey}")
     public ResponseEntity<String> deleteProjOrchestration(@PathVariable("uniqueKey") String uniqueKey) throws Exception {
         projOrchestrationCrudService.delete(uniqueKey);
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "分页获取项目编排")

+ 10 - 10
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/crud/BuildConfigController.java

@@ -53,7 +53,7 @@ public class BuildConfigController {
     @PutMapping("/dir")
     public ResponseEntity<String> modifyBuildDir(@RequestBody String json) throws Exception {
         BuildDir buildDir = JsonConverter.jsonToObject(json, BuildDir.class);
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     /* 仓库认证配置 */
@@ -62,7 +62,7 @@ public class BuildConfigController {
     public ResponseEntity<String> addRepoConfig(@RequestBody String json) throws Exception {
         RepoAuthConfig repoAuthConfig = JsonConverter.jsonToObject(json, RepoAuthConfig.class);
         repoAuthConfigCrudService.insert(repoAuthConfig);
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "修改仓库认证配置")
@@ -70,14 +70,14 @@ public class BuildConfigController {
     public ResponseEntity<String> modifyRepoConfig(@RequestBody String json) throws Exception {
         RepoAuthConfig repoAuthConfig = JsonConverter.jsonToObject(json, RepoAuthConfig.class);
         repoAuthConfigCrudService.insert(repoAuthConfig);
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "删除仓库认证配置")
     @DeleteMapping("/repo/{uniqueKey}")
     public ResponseEntity<String> deleteRepoConfig(@PathVariable("uniqueKey") String uniqueKey) throws Exception {
         repoAuthConfigCrudService.delete(uniqueKey);
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "分页获取仓库认证配置")
@@ -93,7 +93,7 @@ public class BuildConfigController {
     public ResponseEntity<String> addCompileConfig(@RequestBody String json) throws Exception {
         CompilerConfig compilerConfig = JsonConverter.jsonToObject(json, CompilerConfig.class);
         compilerConfigCrudService.insert(compilerConfig);
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "修改应用编译配置")
@@ -101,14 +101,14 @@ public class BuildConfigController {
     public ResponseEntity<String> modifyCompileConfig(@RequestBody String json) throws Exception {
         CompilerConfig compilerConfig = JsonConverter.jsonToObject(json, CompilerConfig.class);
         compilerConfigCrudService.insert(compilerConfig);
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "删除应用编译配置")
     @DeleteMapping("/compiler/{uniqueKey}")
     public ResponseEntity<String> deleteCompileConfig(@PathVariable("uniqueKey") String uniqueKey) throws Exception {
         compilerConfigCrudService.delete(uniqueKey);
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "分页获取应用编译配置")
@@ -124,7 +124,7 @@ public class BuildConfigController {
     public ResponseEntity<String> addPackConfig(@RequestBody String json) throws Exception {
         PackerConfig packerConfig = JsonConverter.jsonToObject(json, PackerConfig.class);
         packerConfigCrudService.insert(packerConfig);
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "修改应用打包配置")
@@ -132,14 +132,14 @@ public class BuildConfigController {
     public ResponseEntity<String> modifyPackConfig(@RequestBody String json) throws Exception {
         PackerConfig packerConfig = JsonConverter.jsonToObject(json, PackerConfig.class);
         packerConfigCrudService.insert(packerConfig);
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "删除应用打包配置")
     @DeleteMapping("/packer/{uniqueKey}")
     public ResponseEntity<String> deletePackConfig(@PathVariable("uniqueKey") String uniqueKey) throws Exception {
         packerConfigCrudService.delete(uniqueKey);
-        return ResponseEntity.ok().body(WebBody.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success());
     }
 
     @ApiOperation(value = "分页获取应用打包配置")

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/db/log/AppStatusCrudService.java

@@ -1,7 +1,7 @@
 package cn.reghao.autodop.dmaster.app.db.log;
 
 import cn.reghao.autodop.common.dagent.app.api.data.DeployedAppStatus;
-import cn.reghao.autodop.dmaster.app.repository.status.AppStatusRepository;
+//import cn.reghao.autodop.dmaster.app.repository.status.AppStatusRepository;
 import cn.reghao.autodop.dmaster.common.db.CrudOps;
 import cn.reghao.autodop.dmaster.common.db.PageList;
 import org.springframework.data.domain.Page;
@@ -16,7 +16,7 @@ import java.util.stream.Collectors;
  * @author reghao
  * @date 2021-02-19 16:39:29
  */
-@Service
+/*@Service
 public class AppStatusCrudService implements CrudOps<DeployedAppStatus> {
     private AppStatusRepository statusRepository;
 
@@ -56,4 +56,4 @@ public class AppStatusCrudService implements CrudOps<DeployedAppStatus> {
     @Override
     public void delete(String uniqueKey) throws Exception {
     }
-}
+}*/

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/AppOrchestration.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app.entity.config;
 
-import cn.reghao.autodop.common.orm.BaseEntity;
+import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
 import cn.reghao.autodop.dmaster.app.entity.config.build.BuildConfig;
 import cn.reghao.autodop.dmaster.app.entity.config.deploy.DeployConfig;
 import cn.reghao.autodop.dmaster.app.entity.config.deploy.RunningConfig;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/ProjOrchestration.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app.entity.config;
 
-import cn.reghao.autodop.common.orm.BaseEntity;
+import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
 import cn.reghao.autodop.dmaster.app.entity.config.build.BuildConfig;
 import lombok.Data;
 import lombok.EqualsAndHashCode;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/BuildDir.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app.entity.config.build;
 
-import cn.reghao.autodop.common.orm.BaseEntity;
+import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/CompilerConfig.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app.entity.config.build;
 
-import cn.reghao.autodop.common.orm.BaseEntity;
+import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/PackerConfig.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app.entity.config.build;
 
-import cn.reghao.autodop.common.orm.BaseEntity;
+import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/build/RepoAuthConfig.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app.entity.config.build;
 
-import cn.reghao.autodop.common.orm.BaseEntity;
+import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/config/deploy/RunningConfig.java

@@ -20,7 +20,7 @@ import java.util.List;
 public class RunningConfig {
     private Integer httpPort;
     private String healthCheck;
-    @ElementCollection(targetClass = LogConfig.class)
+    /*@ElementCollection(targetClass = LogConfig.class)
     @LazyCollection(LazyCollectionOption.FALSE)
-    private List<LogConfig> logConfigs;
+    private List<LogConfig> logConfigs;*/
 }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/BuildLog.java

@@ -1,7 +1,7 @@
 package cn.reghao.autodop.dmaster.app.entity.log;
 
 import cn.reghao.autodop.dmaster.app.entity.config.AppOrchestration;
-import cn.reghao.autodop.common.orm.BaseDocument;
+import cn.reghao.autodop.dmaster.common.orm.BaseDocument;
 import cn.reghao.autodop.dmaster.app.constant.BuildStage;
 import lombok.Data;
 import lombok.EqualsAndHashCode;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/CommitLog.java

@@ -2,7 +2,7 @@ package cn.reghao.autodop.dmaster.app.entity.log;
 
 import cn.reghao.autodop.dmaster.app.entity.config.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.service.bd.tools.repo.CommitInfo;
-import cn.reghao.autodop.common.orm.BaseDocument;
+import cn.reghao.autodop.dmaster.common.orm.BaseDocument;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springframework.data.mongodb.core.mapping.Document;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/DeployLog.java

@@ -1,7 +1,7 @@
 package cn.reghao.autodop.dmaster.app.entity.log;
 
 import cn.reghao.autodop.common.dagent.app.api.data.DeployedAppStatus;
-import cn.reghao.autodop.common.orm.BaseDocument;
+import cn.reghao.autodop.dmaster.common.orm.BaseDocument;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springframework.data.mongodb.core.mapping.Document;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/status/BuildDeployApp.java

@@ -4,7 +4,7 @@ import cn.reghao.autodop.dmaster.app.constant.BuildDeployResult;
 import cn.reghao.autodop.dmaster.app.constant.BuildDeployType;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
 import cn.reghao.autodop.dmaster.app.entity.log.DeployLog;
-import cn.reghao.autodop.common.orm.BaseEntity;
+import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
 import cn.reghao.autodop.dmaster.app.entity.config.AppOrchestration;
 import lombok.Data;
 import lombok.EqualsAndHashCode;

+ 4 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/status/AppStatusRepository.java

@@ -9,15 +9,15 @@ import org.springframework.data.jpa.repository.JpaRepository;
  * @author reghao
  * @date 2020-01-21 14:53:03
  */
-public interface AppStatusRepository extends JpaRepository<DeployedAppStatus, Long> {
+/*public interface AppStatusRepository extends JpaRepository<DeployedAppStatus, Long> {
     Page<DeployedAppStatus> findAllByEnv(String env, Pageable pageable);
 
-    /**
+    *//**
      * 找到唯一的 AppStatus 对象
      *
      * @param
      * @return
      * @date 2021-02-25 上午11:50
-     */
+     *//*
     DeployedAppStatus findByAppIdAndCommitIdAndMachineId(String appId, String commitId, String machineId);
-}
+}*/

+ 7 - 6
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppStatusService.java

@@ -11,7 +11,7 @@ import cn.reghao.autodop.dmaster.app.cache.BuildDeployCache;
 import cn.reghao.autodop.dmaster.app.entity.config.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.entity.config.deploy.DeployConfig;
 import cn.reghao.autodop.common.dagent.app.api.data.log.LogFile;
-import cn.reghao.autodop.dmaster.app.db.log.AppStatusCrudService;
+//import cn.reghao.autodop.dmaster.app.db.log.AppStatusCrudService;
 import cn.reghao.autodop.dmaster.common.db.PageList;
 import org.springframework.stereotype.Service;
 
@@ -30,12 +30,12 @@ import java.util.Map;
 public class AppStatusService {
     private RemoteCallService callService;
     private BuildDeployCache cache;
-    private AppStatusCrudService statusCrudService;
+    //private AppStatusCrudService statusCrudService;
 
-    public AppStatusService(RemoteCallService callService, BuildDeployCache cache, AppStatusCrudService crudService) {
+    public AppStatusService(RemoteCallService callService, BuildDeployCache cache/*, AppStatusCrudService crudService*/) {
         this.callService = callService;
         this.cache = cache;
-        this.statusCrudService = crudService;
+        //this.statusCrudService = crudService;
     }
 
     /**
@@ -50,8 +50,9 @@ public class AppStatusService {
     }
 
     public PageList<DeployedAppStatus> deployedAppStatus(int page, int size, String env) {
-        PageList<DeployedAppStatus> pageList = statusCrudService.getByPage(page, size, env);
-        return pageList;
+        /*PageList<DeployedAppStatus> pageList = statusCrudService.getByPage(page, size, env);
+        return pageList;*/
+        return null;
     }
 
     /**

+ 6 - 6
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/log/BuildDeployLogService.java

@@ -4,7 +4,7 @@ import cn.reghao.autodop.common.dagent.app.api.data.DeployedAppStatus;
 import cn.reghao.autodop.dmaster.app.entity.log.*;
 import cn.reghao.autodop.dmaster.app.entity.status.BuildDeployApp;
 import cn.reghao.autodop.dmaster.app.service.BuildDeployAppCrudService;
-import cn.reghao.autodop.dmaster.app.db.log.AppStatusCrudService;
+//import cn.reghao.autodop.dmaster.app.db.log.AppStatusCrudService;
 import cn.reghao.autodop.dmaster.app.db.log.BuildLogCrudService;
 import cn.reghao.autodop.dmaster.app.db.log.CommitLogCrudService;
 import cn.reghao.autodop.dmaster.app.db.log.DeployLogCrudService;
@@ -25,18 +25,18 @@ public class BuildDeployLogService {
     private BuildLogCrudService buildLogCrudService;
     private DeployLogCrudService deployLogCrudService;
     private BuildDeployAppCrudService buildDeployAppCrudService;
-    private AppStatusCrudService statusCrudService;
+    //private AppStatusCrudService statusCrudService;
     
     public BuildDeployLogService(CommitLogCrudService commitLogCrudService,
                                  BuildLogCrudService buildLogCrudService,
                                  DeployLogCrudService deployLogCrudService,
-                                 BuildDeployAppCrudService buildDeployAppCrudService,
-                                 AppStatusCrudService statusCrudService) {
+                                 BuildDeployAppCrudService buildDeployAppCrudService
+                                 /*AppStatusCrudService statusCrudService*/) {
         this.commitLogCrudService = commitLogCrudService;
         this.buildLogCrudService = buildLogCrudService;
         this.deployLogCrudService = deployLogCrudService;
         this.buildDeployAppCrudService = buildDeployAppCrudService;
-        this.statusCrudService = statusCrudService;
+        //this.statusCrudService = statusCrudService;
     }
 
     @Transactional(rollbackFor = {Exception.class})
@@ -61,6 +61,6 @@ public class BuildDeployLogService {
 
     @Transactional(rollbackFor = {Exception.class})
     public void saveAppStatus(DeployedAppStatus deployedAppStatus) throws Exception {
-        statusCrudService.insert(deployedAppStatus);
+        //statusCrudService.insert(deployedAppStatus);
     }
 }

+ 5 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/controller/App3OpsController.java

@@ -24,30 +24,30 @@ public class App3OpsController {
     @PostMapping("/backup/activate/{app3Name}")
     public String activateBackup(@PathVariable("app3Name") String app3Name) throws Exception {
         app3OpsService.backup(app3Name);
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 
     @ApiOperation(value = "停用备份")
     @PostMapping("/backup/deactivate/{app3Name}")
     public String deactivateBackup(@PathVariable("app3Name") String app3Name) throws Exception {
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 
     @ApiOperation(value = "备份日志")
     @GetMapping("/log/backup/{serviceName}")
     public String bakLog(@PathVariable("serviceName") String serviceName) {
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 
     @ApiOperation(value = "还原备份")
     @PostMapping("/restore/{app3Name}")
     public String restore(@PathVariable("app3Name") String app3Name) throws Exception {
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 
     @ApiOperation(value = "还原日志")
     @GetMapping("/log/restore/{serviceName}")
     public String restoreLog(@PathVariable("serviceName") String serviceName) {
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/entity/App3.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app3.entity;
 
-import cn.reghao.autodop.common.orm.BaseEntity;
+import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
 import lombok.Data;
 
 import javax.persistence.Column;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/entity/App3Bak.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app3.entity;
 
-import cn.reghao.autodop.common.orm.BaseEntity;
+import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
 import lombok.Data;
 
 import javax.persistence.Column;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/entity/App3BakLog.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app3.entity;
 
-import cn.reghao.autodop.common.orm.BaseDocument;
+import cn.reghao.autodop.dmaster.common.orm.BaseDocument;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springframework.data.mongodb.core.mapping.Document;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/Menu.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.auth.entity;
 
-import cn.reghao.autodop.common.orm.BaseEntity;
+import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/MenuType.java

@@ -5,5 +5,5 @@ package cn.reghao.autodop.dmaster.auth.entity;
  * @date 2021-04-05 02:22:44
  */
 public enum MenuType {
-    DIR, BUTTON
+    DIR, PAGE
 }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/Role.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.auth.entity;
 
-import cn.reghao.autodop.common.orm.BaseEntity;
+import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Data;
 import lombok.EqualsAndHashCode;

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/User.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.auth.entity;
 
-import cn.reghao.autodop.common.orm.BaseEntity;
+import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Data;
 import lombok.EqualsAndHashCode;

+ 31 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/config/MvcDataConverter.java

@@ -0,0 +1,31 @@
+package cn.reghao.autodop.dmaster.common.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.convert.converter.Converter;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author reghao
+ * @date 2021-05-19 09:17:45
+ */
+@Configuration
+public class MvcDataConverter {
+    /**
+     * 将前端提交的 "2021-05-19T11:09:14.034664"(即 LocalDateTime toString 的结果) 反序列化为 LocalDateTime 对象
+     *
+     * @param
+     * @return
+     * @date 2021-05-19 上午11:35
+     */
+    @Bean
+    public Converter<String, LocalDateTime> localDateTimeDeserializer() {
+        return new Converter<String, LocalDateTime>() {
+            @Override
+            public LocalDateTime convert(String source) {
+                return LocalDateTime.parse(source);
+            }
+        };
+    }
+}

+ 2 - 113
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/config/WebMvcConfig.java

@@ -1,125 +1,14 @@
 package cn.reghao.autodop.dmaster.common.config;
 
-import cn.reghao.autodop.dmaster.app.interceptor.WebhookInterceptor;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.http.converter.HttpMessageConverter;
-import org.springframework.http.converter.StringHttpMessageConverter;
 import org.springframework.web.servlet.config.annotation.*;
 
-import java.nio.charset.StandardCharsets;
-import java.util.List;
-
 /**
  * mvc 配置
  *
  * @author reghao
  * @date 2019-05-20 11:08:53
  */
-/*
-@Configuration
-@EnableWebMvc
+/*@Configuration
+@EnableWebMvc*/
 public class WebMvcConfig implements WebMvcConfigurer {
-    private WebhookInterceptor webhookInterceptor;
-
-    public WebMvcConfig(WebhookInterceptor webhookInterceptor) {
-        this.webhookInterceptor = webhookInterceptor;
-    }
-
-    */
-/**
-     * swagger-ui 接口页面
-     *
-     * @param
-     * @return
-     * @date 2020-05-12 下午4:59
-     *//*
-
-    @Override
-    public void addResourceHandlers(ResourceHandlerRegistry registry) {
-        registry.addResourceHandler("swagger-ui.html")
-                .addResourceLocations("classpath:/META-INF/resources/");
-
-        registry.addResourceHandler("/webjars/**")
-                .addResourceLocations("classpath:/META-INF/resources/webjars/");
-
-        registry.addResourceHandler("/lib").addResourceLocations("classpath:/static/lib/");
-        registry.addResourceHandler("/css").addResourceLocations("classpath:/static/css");
-        registry.addResourceHandler("/js").addResourceLocations("classpath:/static/js");
-        registry.addResourceHandler("/images").addResourceLocations("classpath:/static/images");
-    }
-
-    */
-/**
-     * 开启默认 servlet 处理 web 项目的静态文件
-     *
-     * @param
-     * @return
-     * @date 2019-05-20 上午11:09
-     *//*
-
-    @Override
-    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
-        configurer.enable();
-    }
-
-    */
-/**
-     * 处理响应中文乱码问题
-     *
-     * @param
-     * @return
-     * @date 2019-05-21 下午3:44
-     *//*
-
-    @Bean
-    public HttpMessageConverter<String> responseBodyConverter() {
-        return new StringHttpMessageConverter(StandardCharsets.UTF_8);
-    }
-
-    @Override
-    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
-        converters.add(responseBodyConverter());
-    }
-
-    */
-/**
-     * 不忽略文件后缀名
-     *
-     * @param
-     * @return
-     * @date 2020-03-12 上午12:02
-     *//*
-
-    @Override
-    public void configurePathMatch(PathMatchConfigurer configurer) {
-        configurer.setUseSuffixPatternMatch(false);
-    }
-
-    */
-/**
-     * 处理跨域
-     *
-     * @param
-     * @return
-     * @date 2019-11-22 下午9:22
-     *//*
-
-    @Override
-    public void addCorsMappings(CorsRegistry registry) {
-        // 定义了一个 CorsConfiguration 对象
-        registry.addMapping("/**")
-                .allowedOrigins("*")
-                .allowedHeaders("*")
-                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
-                .allowCredentials(true)
-                .maxAge(3600);
-    }
-
-    @Override
-    public void addInterceptors(InterceptorRegistry registry) {
-        registry.addInterceptor(webhookInterceptor)
-                .addPathPatterns("/api/hook/**");
-    }
 }
-*/

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/exception/ControllerExceptionHandler.java

@@ -57,6 +57,6 @@ public class ControllerExceptionHandler {
 
         HttpHeaders headers = new HttpHeaders();
         headers.setContentType(MediaType.APPLICATION_JSON);
-        return new ResponseEntity<>(WebBody.error1(msg), headers, HttpStatus.OK);
+        return new ResponseEntity<>(WebBody.errorMsg(msg), headers, HttpStatus.OK);
     }
 }

+ 10 - 6
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/exception/WebErrorController.java

@@ -2,6 +2,7 @@ package cn.reghao.autodop.dmaster.common.exception;
 
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.web.servlet.error.ErrorController;
+import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -16,12 +17,12 @@ import javax.servlet.http.HttpServletRequest;
  */
 @Slf4j
 //@RestController
-public class WebErrorController implements ErrorController {
-    public WebErrorController() {
+public class WebErrorController /*implements ErrorController */{
+    /*public MyErrorController() {
     }
 
     @RequestMapping("/error")
-    public String handleError(HttpServletRequest request) {
+    public String handleError(Model model, HttpServletRequest request) {
         Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
         if (statusCode == 404) {
             return "接口不存在";
@@ -31,11 +32,14 @@ public class WebErrorController implements ErrorController {
             return "服务器内部错误";
         }
         log.error("http status code: " + statusCode);
-        return "未知错误";
+
+        model.addAttribute("statusCode", statusCode);
+        model.addAttribute("msg", "页面去火星啦~");
+        return "/404";
     }
 
     @Override
     public String getErrorPath() {
-        return null;
-    }
+        return "/error";
+    }*/
 }

+ 1 - 1
common/src/main/java/cn/reghao/autodop/common/orm/BaseDocument.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/common/orm/BaseDocument.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.orm;
+package cn.reghao.autodop.dmaster.common.orm;
 
 import lombok.Data;
 import org.springframework.data.annotation.Id;

+ 5 - 1
common/src/main/java/cn/reghao/autodop/common/orm/BaseEntity.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/common/orm/BaseEntity.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.common.orm;
+package cn.reghao.autodop.dmaster.common.orm;
 
 import lombok.Data;
 import org.hibernate.annotations.CreationTimestamp;
@@ -22,9 +22,13 @@ public class BaseEntity<T extends Serializable> implements Serializable {
     // 逻辑删除
     private Boolean isDelete;
 
+    /*@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")*/
     @CreationTimestamp
     @Column(updatable = false)
     protected LocalDateTime createTime;
+    /*@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")*/
     @CreationTimestamp
     protected LocalDateTime updateTime;
 

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/controller/crud/MachineLogCrudController.java

@@ -25,6 +25,6 @@ public class MachineLogCrudController {
     @GetMapping("/logs")
     public String machineIdByPage(@RequestParam("page") int page,
                                   @RequestParam("size") int size) {
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/entity/MachineInfo.java

@@ -5,7 +5,7 @@ import lombok.EqualsAndHashCode;
 
 import java.util.List;
 
-import cn.reghao.autodop.common.orm.BaseEntity;
+import cn.reghao.autodop.dmaster.common.orm.BaseEntity;
 import org.hibernate.annotations.LazyCollection;
 import org.hibernate.annotations.LazyCollectionOption;
 

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/entity/MachineLog.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.machine.entity;
 
-import cn.reghao.autodop.common.orm.BaseDocument;
+import cn.reghao.autodop.dmaster.common.orm.BaseDocument;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springframework.data.mongodb.core.mapping.Document;

+ 12 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/WebBody.java

@@ -44,6 +44,17 @@ public class WebBody {
         this.msg = msg;
     }
 
+    public static String success() {
+        WebBody webBody = new WebBody(SUCCESS.getCode(), "ok");
+        webBody.setTimestamp(DateTimeConverter.now());
+        try {
+            return objectMapper.writeValueAsString(webBody);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
     public static String success(Object data) {
         WebBody webBody = new WebBody(SUCCESS.getCode(), SUCCESS.getMsg());
         webBody.setTimestamp(DateTimeConverter.now());
@@ -80,7 +91,7 @@ public class WebBody {
         return null;
     }
 
-    public static String error1(String msg) {
+    public static String errorMsg(String msg) {
         WebBody webBody = new WebBody(ERROR.getCode(), msg);
         webBody.setTimestamp(DateTimeConverter.now());
         try {

+ 36 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/AppPageController.java

@@ -0,0 +1,36 @@
+package cn.reghao.autodop.dmaster.view.controller;
+
+import cn.reghao.autodop.dmaster.auth.entity.User;
+import cn.reghao.autodop.dmaster.auth.service.UserService;
+import cn.reghao.autodop.dmaster.common.db.PageList;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author reghao
+ * @date 2021-04-04 21:24:18
+ */
+@Api(tags = "应用页面")
+@RequestMapping("/app")
+@Controller
+public class AppPageController {
+    private final UserService userService;
+
+    public AppPageController(UserService userService) {
+        this.userService = userService;
+    }
+
+    @ApiOperation(value = "获取构建部署页面")
+    @GetMapping("/bd")
+    public String userPage(Model model) {
+        int page = 1;
+        int size = 10;
+        PageList<User> pageList = userService.findByPage(page, size);
+        model.addAttribute("list", pageList.getList());
+        model.addAttribute("page", pageList);
+        return "/app/bd";
+    }
+}

+ 14 - 10
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/LoginPageController.java

@@ -1,6 +1,7 @@
 package cn.reghao.autodop.dmaster.view.controller;
 
 import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.web.servlet.error.ErrorController;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
@@ -13,21 +14,16 @@ import javax.servlet.http.HttpServletRequest;
  * @author reghao
  * @date 2021-04-04 21:24:18
  */
+@Slf4j
 @Api(tags = "登录页面")
 @Controller
 public class LoginPageController implements ErrorController {
-    /**
-     * 跳转到登录页面
-     */
     @GetMapping("/login")
     public String toLogin(Model model) {
         model.addAttribute("isCaptcha", false);
         return "/login";
     }
 
-    /**
-     * 自定义错误页面
-     */
     @Override
     public String getErrorPath() {
         return "/error";
@@ -35,17 +31,25 @@ public class LoginPageController implements ErrorController {
 
     /**
      * 处理错误页面
+     *
+     * @param
+     * @return
+     * @date 2021-05-19 下午2:35
      */
     @RequestMapping("/error")
     public String handleError(Model model, HttpServletRequest request) {
         Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
-        String errorMsg = "好像出错了呢!";
         if (statusCode == 404) {
-            errorMsg = "页面找不到了!好像是去火星了~";
+            return "接口不存在";
+        } else if (statusCode == 400) {
+            return "参数错误";
+        } else if (statusCode == 500) {
+            return "服务器内部错误";
         }
+        log.error("http status code: " + statusCode);
 
         model.addAttribute("statusCode", statusCode);
-        model.addAttribute("msg", errorMsg);
-        return "/system/main/error";
+        model.addAttribute("msg", "页面去火星啦~");
+        return "/404";
     }
 }

+ 8 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/ResourceController.java

@@ -33,26 +33,27 @@ public class ResourceController {
     public String addMenu(@Validated MenuValidator menuValidator, Menu menu) {
         Integer id = menu.getId();
         if (id == null) {
+            // TODO menu 最多只能有两个 parent,即最多只能有三级菜单
             resourceService.addResource(menu);
         } else {
+            // TODO 禁止修改 menu 的URL,父级菜单和菜单类型
             resourceService.updateResource(menu);
         }
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 
     @ApiOperation(value = "修改资源状态")
     @PostMapping(value = "/status/{status}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String menuStatus(@PathVariable("status") String status,
                              @RequestParam("ids") List<Integer> ids) {
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 
     @ApiOperation(value = "删除资源")
     @DeleteMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String deleteMenu(@PathVariable("id") Menu menu) {
-        // TODO 重新调整组内排序
         resourceService.deleteResource(menu);
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 
     @ApiOperation(value = "获取所有的资源")
@@ -71,7 +72,9 @@ public class ResourceController {
                            @PathVariable(value = "id", required = false) Menu menu) {
         Map<Integer, String> map = resourceService.getMapByPid(pid);
         // 排除正在编辑的 menu
-        map.remove(menu.getPos());
+        if (menu != null) {
+            map.remove(menu.getPos());
+        }
         return WebBody.success(map);
     }
 }

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/RolePageController.java

@@ -108,13 +108,13 @@ public class RolePageController {
                        @RequestParam(value = "authId", required = false) HashSet<Menu> menus) {
         role.setMenus(menus);
         roleRepository.save(role);
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 
     @PostMapping(value = "/save", produces = MediaType.APPLICATION_JSON_VALUE)
     @ResponseBody
     public String addRole(Role role) {
         roleService.addRole(role);
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 }

+ 5 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/TestController.java

@@ -45,7 +45,7 @@ public class TestController {
         /*addRoles();
         addUsers();
         addMenus();*/
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 
     private void addRoles() {
@@ -72,7 +72,7 @@ public class TestController {
         homeMenu.setPos(1);
         homeMenu.setTitle("主页");
         homeMenu.setUrl("/home");
-        homeMenu.setType(MenuType.BUTTON.name());
+        homeMenu.setType(MenuType.PAGE.name());
         homeMenu.setIcon("layui-icon layui-icon-home");
         menus.add(homeMenu);
 
@@ -92,7 +92,7 @@ public class TestController {
         userMenu.setPos(1);
         userMenu.setTitle("用户管理");
         userMenu.setUrl("/system/user");
-        userMenu.setType(MenuType.BUTTON.name());
+        userMenu.setType(MenuType.PAGE.name());
         userMenu.setIcon("fa fa-cog");
         menus.add(userMenu);
 
@@ -101,7 +101,7 @@ public class TestController {
         roleMenu.setPos(2);
         roleMenu.setTitle("角色管理");
         roleMenu.setUrl("/system/role");
-        roleMenu.setType(MenuType.BUTTON.name());
+        roleMenu.setType(MenuType.PAGE.name());
         roleMenu.setIcon("fa fa-cog");
         menus.add(roleMenu);
 
@@ -110,7 +110,7 @@ public class TestController {
         resourceMenu.setPos(3);
         resourceMenu.setTitle("资源管理");
         resourceMenu.setUrl("/system/user/menu");
-        resourceMenu.setType(MenuType.BUTTON.name());
+        resourceMenu.setType(MenuType.PAGE.name());
         resourceMenu.setIcon("fa fa-cog");
         menus.add(resourceMenu);
         menuRepository.saveAll(menus);

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/UserPageController.java

@@ -81,7 +81,7 @@ public class UserPageController {
     @ResponseBody
     public String addOrUpdateUser(User user) {
         userService.addOrUpdate(user);
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 
     @PostMapping("/pwd")
@@ -98,6 +98,6 @@ public class UserPageController {
     public String assignRole(@RequestParam(value = "id") User user,
                              @RequestParam(value = "roleId", required = false) HashSet<Role> roles) {
         userService.modifyUserRoles(user, roles);
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 }

+ 66 - 11
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/service/ResourceService.java

@@ -5,6 +5,7 @@ import cn.reghao.autodop.dmaster.auth.entity.Menu;
 import cn.reghao.autodop.dmaster.auth.repository.MenuRepository;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -22,30 +23,30 @@ public class ResourceService {
 
     public void addResource(Menu menu) {
         menu.setStatus(DataStatus.ENABLE.name());
-        int pos = menu.getPos();
         int pid = menu.getPid();
-
-        if (adjustPosition(pos, pid)) {
-            menu.setPos(pos+1);
+        int pos = menu.getPos()+1;
+        if (adjustPosition(pid, pos)) {
+            menu.setPos(pos);
             menuRepository.save(menu);
         }
     }
 
     /**
-     * 调整组内位置
+     * 某个 menu 的位置调整后,调整同一组内其他 menu 的相对位置
      *
-     * @param
+     * @param pid 组 ID
+     * @param pos 当前 menu 的最新位置
      * @return
      * @date 2021-05-18 上午9:54
      */
     private boolean adjustPosition(int pid, int pos) {
         List<Menu> menus = menuRepository.findByPid(pid);
         int size = menus.size();
-        if (pos > size) {
+        if (pos > size+1) {
             return false;
         }
 
-        // 组内没有menu or 新增的 menu 在组内排在最后一位
+        // 组内没有menu 新增的 menu 在组内排在最后一位
         if (menus.isEmpty() || pos == size) {
             return true;
         }
@@ -69,6 +70,7 @@ public class ResourceService {
             Menu menu = map.get(i);
             int tmp = menu.getPos();
             menu.setPos(tmp+1);
+            menu.setUpdateTime(LocalDateTime.now());
             tmpList.add(menu);
         }
         menuRepository.saveAll(tmpList);
@@ -82,13 +84,66 @@ public class ResourceService {
         }
 
         Menu menuEntity = optionalMenu.get();
-        int pos = menuEntity.getPos();
-        int newPos = menu.getPos();
+        int oldPos = menuEntity.getPos();
+        int newPos = menu.getPos()+1;
+        // menu 位置发生改变
+        if (oldPos != newPos) {
+            adjustPosition1(menu.getPid(), oldPos, newPos);
+        }
+
+        menu.setPos(newPos);
+        menu.setUpdateTime(LocalDateTime.now());
+        //menuRepository.save(menu);
         return true;
     }
 
+    /**
+     * 调整组内 menu 的顺序
+     *
+     * @param
+     * @return
+     * @date 2021-05-19 下午2:15
+     */
+    private void adjustPosition1(int pid, int oldPos, int newPos) {
+        Map<Integer, Menu> map = menuRepository.findByPid(pid).stream()
+                .collect(Collectors.toMap(Menu::getPos, menu1 -> menu1));
+        int start = Math.min(oldPos, newPos);
+        int end = Math.max(oldPos, newPos);
+        System.out.println();
+        /*if (newPos == 0) {
+            // menu 移到第一位
+            List<Menu> tmpList = new ArrayList<>();
+            // menu 原位置之前的元素位置均向后移一位,之后的元素位置保持不变
+            for (int i = 1; i < oldPos; i++) {
+                Menu tmp = map.get(i);
+                tmp.setPos(tmp.getPos()+1);
+                tmpList.add(tmp);
+            }
+            menuRepository.saveAll(tmpList);
+        } else if (newPos == map.size()) {
+            // menu 移到最后一位
+            List<Menu> tmpList = new ArrayList<>();
+            // menu 原位置之前的元素位置保持不变,之后的元素位置向前移一位
+            for (int i = oldPos+1; i <= map.size(); i++) {
+                Menu tmp = map.get(i);
+                tmp.setPos(tmp.getPos()-1);
+                tmpList.add(tmp);
+            }
+            menuRepository.saveAll(tmpList);
+        } else {
+            List<Menu> tmpList = new ArrayList<>();
+            for (int i = oldPos+1; i <= newPos; i++) {
+                Menu tmp = map.get(i);
+                tmp.setPos(tmp.getPos()-1);
+                tmpList.add(tmp);
+            }
+            menuRepository.saveAll(tmpList);
+        }*/
+    }
+
     public void deleteResource(Menu menu) {
-        menuRepository.delete(menu);
+        // TODO 重新调整组内 menu 的位置
+        //menuRepository.delete(menu);
     }
 
     public List<Menu> getResourceByStatus(String status) {

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

@@ -26,7 +26,7 @@ public class SelectDictAttrProcessor extends AbstractAttributeTagProcessor {
 
         localCache.put("MENU_TYPE", new HashMap<>());
         localCache.get("MENU_TYPE").put("DIR", "DIR");
-        localCache.get("MENU_TYPE").put("BUTTON", "BUTTON");
+        localCache.get("MENU_TYPE").put("PAGE", "PAGE");
     }
     
     public static final int PRECEDENCE = 1400;

+ 5 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/controller/GuestController.java

@@ -21,7 +21,7 @@ public class GuestController {
     @PostMapping
     public String addGuest(@RequestBody String data) throws Exception {
         guest.createDomain();
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 
     @ApiOperation(value = "")
@@ -34,24 +34,24 @@ public class GuestController {
     @DeleteMapping
     public String deleteGuest(@PathVariable("guestName") String guestName) throws Exception {
         guest.deleteDomain(guestName);
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 
     @ApiOperation(value = "")
     @PostMapping("/start")
     public String start(@RequestParam("guestName") String guestName) throws Exception {
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 
     @ApiOperation(value = "")
     @PostMapping("/stop")
     public String stop(@RequestParam("guestName") String guestName) throws Exception {
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 
     @ApiOperation(value = "")
     @PostMapping("/restart")
     public String restart(@RequestParam("guestName") String guestName) throws Exception {
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 }

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/controller/HostController.java

@@ -19,20 +19,20 @@ public class HostController {
     public String addPhysicalHost(@RequestParam("name") String name) {
     //public String addPhysicalHost(@RequestParam("name") String name, @RequestBody String json) {
         log.info("post request...");
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 
     @DeleteMapping
     public String deletePhysicalHost() {
         //public String addPhysicalHost(@RequestParam("name") String name, @RequestBody String json) {
         log.info("delete request...");
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 
     @ApiOperation(value = "")
     @GetMapping("/list")
     public String nodeList(@RequestParam("name") String name) {
         log.info("name -> {}", name);
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 }

+ 4 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/controller/StorageController.java

@@ -21,7 +21,7 @@ public class StorageController {
     @PostMapping("/pool")
     public String addPool(@RequestBody String data) throws Exception {
         storage.createStoragePool();
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 
     @ApiOperation(value = "")
@@ -34,14 +34,14 @@ public class StorageController {
     @DeleteMapping("/pool/{poolName}")
     public String deletePool(@PathVariable("poolName") String poolName) throws Exception {
         storage.deleteStoragePool(poolName);
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 
     @ApiOperation(value = "")
     @PostMapping("/volume")
     public String addVolume(String poolName, int capacity) throws Exception {
         storage.createStorageVolume(poolName, capacity);
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 
     @ApiOperation(value = "")
@@ -54,6 +54,6 @@ public class StorageController {
     @DeleteMapping("/volume")
     public String deleteVolume(String volKey) throws Exception {
         storage.deleteStorageVolume(volKey);
-        return WebBody.success("ok");
+        return WebBody.success();
     }
 }

+ 1 - 1
dmaster/src/main/resources/application.yml

@@ -29,7 +29,7 @@ spring:
       connection-timeout: 30000
       connection-test-query: SELECT 1
   jpa:
-    show-sql: true
+    show-sql: false
     open-in-view: true
     hibernate:
       ddl-auto: update

+ 30 - 0
dmaster/src/main/resources/templates/404.html

@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org">
+<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
+    <style>
+        .page-error {
+            display: -webkit-box;
+            display: -ms-flexbox;
+            display: flex;
+            -webkit-box-align: center;
+            -ms-flex-align: center;
+            align-items: center;
+            -webkit-box-pack: center;
+            -ms-flex-pack: center;
+            justify-content: center;
+            -webkit-box-orient: vertical;
+            -webkit-box-direction: normal;
+            -ms-flex-direction: column;
+            flex-direction: column;
+            min-height: calc(100vh - 110px);
+            margin-bottom: 0;
+        }
+    </style>
+</head>
+<body>
+<div class="page-error" style="color: #009688">
+    <div style="font-size: 120px" th:text="${statusCode}"></div>
+    <div style="font-size: 24px" th:text="${msg}"></div>
+</div>
+</body>
+</html>

+ 126 - 0
dmaster/src/main/resources/templates/app/bd.html

@@ -0,0 +1,126 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org"
+      xmlns:mo="https://gitee.com/aun/Timo">
+<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
+    <link rel="stylesheet" th:href="@{/lib/zTree_v3/css/zTreeStyle/zTreeStyle.css}" type="text/css">
+</head>
+<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>
+        <i class="layui-icon layui-icon-refresh refresh-btn"></i>
+        <a th:href="@{/system/user/export}"><i class="fa fa-download"></i></a>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-row timo-card-screen put-row">
+            <div class="pull-left layui-form-pane timo-search-box">
+                <div class="layui-inline">
+                    <label class="layui-form-label">状态</label>
+                    <div class="layui-input-block timo-search-status">
+                        <select class="timo-search-select" name="status" mo:dict="SEARCH_STATUS"
+                                mo-selected="${param.status}"></select>
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">用户名</label>
+                    <div class="layui-input-block">
+                        <input type="text" name="username" th:value="${param.username}" placeholder="请输入用户名"
+                               autocomplete="off" class="layui-input">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <button class="layui-btn timo-search-btn">
+                        <i class="fa fa-search"></i>
+                    </button>
+                </div>
+            </div>
+            <div class="pull-right screen-btn-group">
+                <div class="btn-group-left">
+                    <button class="layui-btn open-popup-param" data-title="修改密码" th:attr="data-url=@{/system/user/pwd}"
+                            data-size="456,242">
+                        <i class="fa fa-refresh"></i> 修改密码
+                    </button>
+                    <button class="layui-btn open-popup-param" data-type="radio" data-title="角色分配"
+                            th:attr="data-url=@{/system/user/role}"
+                            data-size="480,400">
+                        <i class="fa fa-user-secret"></i> 分配角色
+                    </button>
+                </div>
+                <div class="btn-group-right">
+                    <button class="layui-btn open-popup" data-title="添加用户" th:attr="data-url=@{/system/user/add}"
+                            data-size="auto">
+                        <i class="fa fa-plus"></i> 添加
+                    </button>
+                    <div class="btn-group">
+                        <button class="layui-btn">操作<span class="caret"></span></button>
+                        <dl class="layui-nav-child layui-anim layui-anim-upbit">
+                            <dd><a class="ajax-status" th:href="@{/system/user/status/ok}">启用</a></dd>
+                            <dd><a class="ajax-status" th:href="@{/system/user/status/freezed}">冻结</a></dd>
+                            <dd><a class="ajax-status" th:href="@{/system/user/status/delete}">删除</a></dd>
+                        </dl>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="timo-table-wrap">
+            <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="username">用户名</th>
+                    <th class="sortable" data-field="nickname">用户昵称</th>
+                    <th class="sortable" data-field="sex">性别</th>
+                    <th class="sortable" data-field="phone">电话</th>
+                    <th class="sortable" data-field="email">邮箱</th>
+                    <th class="sortable" data-field="createDate">创建时间</th>
+                    <th>状态</th>
+                    <th>已授予的角色</th>
+                    <th>操作</th>
+                </tr>
+                </thead>
+                <tbody>
+                <tr th:each="item:${list}">
+                    <td><label class="timo-checkbox"><input type="checkbox" th:value="${item.id}">
+                        <i class="layui-icon layui-icon-ok"></i></label></td>
+                    <td th:text="${item.username}">用户名</td>
+                    <td th:text="${item.nickname}">用户昵称</td>
+                    <td th:text="${item.gender}">性别</td>
+                    <td th:text="${item.phone}">电话</td>
+                    <td th:text="${item.email}">邮箱</td>
+                    <td th:text="${item.createTime}">创建时间</td>
+                    <td th:text="正常">状态</td>
+                    <td th:text="查看">已授予的角色</td>
+                    <td>
+                        <a class="open-popup" data-title="编辑用户" th:attr="data-url=@{'/system/user/edit/'+${item.id}}"
+                           data-size="600,570" href="#">编辑</a>
+                        <a class="open-popup" data-title="详细信息" th:attr="data-url=@{'/system/user/detail/'+${item.id}}"
+                           data-size="800,600" href="#">详细</a>
+                        <a class="ajax-get" th:attr="data-msg='您是否删除'+${item.nickname}"
+                           th:href="@{/system/user/status/delete(ids=${item.id})}">删除</a>
+                    </td>
+                </tr>
+                </tbody>
+            </table>
+        </div>
+        <div th:replace="/common/fragment :: page"></div>
+    </div>
+</div>
+<script th:replace="/common/template :: script"></script>
+<script type="text/javascript" th:src="@{/js/plugins/jquery-2.2.4.min.js}"></script>
+<script type="text/javascript" th:src="@{/lib/zTree_v3/js/jquery.ztree.core.min.js}"></script>
+<script type="text/javascript" th:src="@{/js/timoTree.js}"></script>
+<script type="text/javascript">
+    var local = window.localStorage;
+    // 树形菜单
+    $.fn.selectTree({
+        rootTree: '全部',
+        onSelected: function (treeNode) {
+            local.setItem('deptTitle', treeNode.name);
+        }
+    });
+</script>
+</body>
+</html>

+ 11 - 10
dmaster/src/main/resources/templates/main.html

@@ -49,9 +49,8 @@
     <!-- 侧边栏 -->
     <div class="layui-side layui-bg-black">
         <div class="layui-side-scroll">
+            <!-- 用户区域 -->
             <div class="layui-side-user">
-                <!--<img class="layui-side-user-avatar open-popup" th:attr="data-url=@{/userInfo}" data-size="680,464"
-                     th:src="@{'/system/user/picture?p='+${user.avatarUrl}}" alt="头像">-->
                 <img class="layui-side-user-avatar open-popup" th:attr="data-url=@{/userInfo}" data-size="680,464"
                      th:src="@{${user.avatarUrl}}" alt="头像">
                 <div>
@@ -62,19 +61,21 @@
             <!-- 导航区域 -->
             <ul class="layui-nav layui-nav-tree" lay-filter="layui-nav-side">
                 <li class="layui-nav-item" th:each="item:${treeMenu}">
-                    <a href="javascript:;" th:attr="lay-url=${item.value.url}">
+                    <a href="javascript:" th:attr="lay-url=${item.value.url}">
                         <i th:class="${item.value.icon}"></i>
                         <span class="layui-nav-title" th:text="${item.value.title}">一级菜单</span>
                     </a>
                     <dl class="layui-nav-child" th:if="${item.value.children.size()}">
-                        <dd th:each="sItem:${item.value.children}">
-                            <a href="javascript:;" th:attr="lay-url=${sItem.value.url}">
-                                <span class="layui-nav-title" th:text="${sItem.value.title}">二级菜单</span>
+                        <dd th:each="secondItem:${item.value.children}">
+                            <a href="javascript:" th:attr="lay-url=${secondItem.value.url}">
+                                <i th:class="${secondItem.value.icon}"></i>
+                                <span class="layui-nav-title" th:text="${secondItem.value.title}">二级菜单</span>
                             </a>
-                            <dl class="layui-nav-child" th:if="${sItem.value.children.size()}">
-                                <dd th:each="tItem:${sItem.value.children}">
-                                    <a href="javascript:;" th:attr="lay-url=${tItem.value.url}">
-                                        <span class="layui-nav-title" th:text="${tItem.value.title}">三级菜单</span>
+                            <dl class="layui-nav-child" th:if="${secondItem.value.children.size()}">
+                                <dd th:each="thirdItem:${secondItem.value.children}">
+                                    <a href="javascript:" th:attr="lay-url=${thirdItem.value.url}">
+                                        <i th:class="${thirdItem.value.icon}"></i>
+                                        <span class="layui-nav-title" th:text="${thirdItem.value.title}">三级菜单</span>
                                     </a>
                                 </dd>
                             </dl>

+ 4 - 0
dmaster/src/main/resources/templates/system/menu/add.html

@@ -8,6 +8,10 @@
 <div class="layui-form timo-compile">
     <form th:action="@{/system/menu/save}">
         <input type="hidden" name="id" th:if="${menu}" th:value="${menu.id}"/>
+        <input type="hidden" name="isDelete" th:if="${menu}" th:value="${menu.isDelete}"/>
+        <input type="hidden" name="createTime" th:if="${menu}" th:value="${menu.createTime}"/>
+        <input type="hidden" name="updateTime" th:if="${menu}" th:value="${menu.updateTime}"/>
+        <input type="hidden" name="status" th:if="${menu}" th:value="${menu.status}"/>
         <div class="layui-form-item">
             <label class="layui-form-label required">标题</label>
             <div class="layui-input-inline">

+ 1 - 1
dmaster/src/main/resources/templates/system/menu/roleList.html

@@ -26,7 +26,7 @@
                 <td>[[${item.name}]]</td>
             </tr>
             <tr th:if="${list.isEmpty()}">
-                <td style="text-align: center" colspan="3">未有分配该资源的角色</td>
+                <td style="text-align: center" colspan="3">本资源没有分配给任何角色</td>
             </tr>
             </tbody>
         </table>

+ 3 - 1
scripts/build.sh

@@ -33,4 +33,6 @@ zip -r ${app_name}.zip ${app_name}
 rm -rf ${app_name}
 
 cd ${proj_home}
-mvn clean
+mvn clean
+
+#mvn clean package -am -Dmaven.test.skip=true -pl dmaster -Pdev

+ 5 - 5
scripts/build_and_deploy.sh

@@ -5,7 +5,7 @@
 
 set -e
 
-#sh build.sh test dmaster
+sh build.sh test dmaster
 #sh deploy.sh autodop-dmaster 192.168.0.211 azy &
 
 # 构建
@@ -14,10 +14,10 @@ set -e
 ##############################################################
 # 测试环境
 ##############################################################
-sh deploy.sh autodop-dagent 192.168.0.171 azy
-sh deploy.sh autodop-dagent 192.168.0.172 azy
-sh deploy.sh autodop-dagent 192.168.0.173 azy
-sh deploy.sh autodop-dagent 192.168.0.174 azy
+#sh deploy.sh autodop-dagent 192.168.0.171 azy
+#sh deploy.sh autodop-dagent 192.168.0.172 azy
+#sh deploy.sh autodop-dagent 192.168.0.173 azy
+#sh deploy.sh autodop-dagent 192.168.0.174 azy