Procházet zdrojové kódy

rbac 页面接口开发中

reghao před 4 roky
rodič
revize
d6c5775269
47 změnil soubory, kde provedl 529 přidání a 317 odebrání
  1. 8 8
      common/src/main/java/cn/reghao/autodop/common/result/ResultCode.java
  2. 0 49
      common/src/main/java/cn/reghao/autodop/common/result/WebResult.java
  3. 1 2
      common/src/main/java/cn/reghao/autodop/common/utils/serializer/JsonConverter.java
  4. 8 8
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildDeployController.java
  5. 7 7
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildDeployLogController.java
  6. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/ConfigController.java
  7. 4 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/FileController.java
  8. 9 9
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/StatusController.java
  9. 2 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/WebhookController.java
  10. 11 11
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/crud/AppConfigController.java
  11. 15 15
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/crud/BuildConfigController.java
  12. 15 15
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/controller/App3CrudController.java
  13. 6 6
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/controller/App3OpsController.java
  14. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/config/WebAuthSuccessHandlerImpl.java
  15. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/MenuType.java
  16. 2 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/Role.java
  17. 4 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/repository/MenuRepository.java
  18. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/exception/ControllerExceptionHandler.java
  19. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/controller/crud/MachineCrudController.java
  20. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/controller/crud/MachineLogCrudController.java
  21. 5 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/MonitorController.java
  22. 0 24
      dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/UserContext.java
  23. 66 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/WebBody.java
  24. 10 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/HomeController.java
  25. 0 52
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/MenuPageController.java
  26. 26 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/ResourceController.java
  27. 85 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/ResourcePageController.java
  28. 4 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/RoleController.java
  29. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/TestController.java
  30. 4 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/UserController.java
  31. 2 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/TimoDialect.java
  32. 15 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/TimoExpressionObjectFactory.java
  33. 24 8
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/attribute/SelectDictAttrProcessor.java
  34. 2 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/attribute/SelectListAttrProcessor.java
  35. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/config/ThymeleafAutoConfig.java
  36. 84 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/utility/DictUtil.java
  37. 35 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/utility/LogUtil.java
  38. 11 9
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/utility/PageUtil.java
  39. 3 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/xml/Timo-Dialect.xml
  40. 7 7
      dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/controller/GuestController.java
  41. 4 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/controller/HostController.java
  42. 7 7
      dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/controller/StorageController.java
  43. 2 0
      dmaster/src/main/resources/META-INF/spring.factories
  44. 3 0
      dmaster/src/main/resources/application.yml
  45. 4 14
      dmaster/src/main/resources/static/js/timoTree.js
  46. 5 4
      dmaster/src/main/resources/templates/system/menu/add.html
  47. 13 12
      dmaster/src/main/resources/templates/system/menu/index.html

+ 8 - 8
common/src/main/java/cn/reghao/autodop/common/result/ResultCode.java

@@ -9,21 +9,21 @@ package cn.reghao.autodop.common.result;
 public enum ResultCode {
     SUCCESS(0, "操作成功"),
     FAIL(1, "操作失败"),
-    ERROR(-1, "请求错误");
+    ERROR(-1, "操作错误");
 
-    private Integer code;
-    private String status;
+    private int code;
+    private String msg;
 
-    ResultCode(Integer code, String status) {
+    ResultCode(int code, String msg) {
         this.code = code;
-        this.status = status;
+        this.msg = msg;
     }
 
-    public Integer getCode() {
+    public int getCode() {
         return code;
     }
 
-    public String getStatus() {
-        return status;
+    public String getMsg() {
+        return msg;
     }
 }

+ 0 - 49
common/src/main/java/cn/reghao/autodop/common/result/WebResult.java

@@ -1,49 +0,0 @@
-package cn.reghao.autodop.common.result;
-
-import cn.reghao.autodop.common.utils.DateTimeConverter;
-import cn.reghao.autodop.common.utils.serializer.JsonConverter;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import static cn.reghao.autodop.common.result.ResultCode.*;
-
-/**
- * HTTP 响应 body 数据
- *
- * @author reghao
- * @date 2019-09-28 10:05:35
- */
-@Data
-@NoArgsConstructor
-public class WebResult {
-    private Integer code;
-    private String status;
-    private String timestamp;
-    private Object data;
-
-    private WebResult(Integer code, String status) {
-        this.code = code;
-        this.status = status;
-    }
-
-    public static String success(Object data) {
-        WebResult webResult = new WebResult(SUCCESS.getCode(), SUCCESS.getStatus());
-        webResult.setTimestamp(DateTimeConverter.now());
-        webResult.setData(data);
-        return JsonConverter.objectToJson(webResult);
-    }
-
-    public static String fail(Object data) {
-        WebResult webResult = new WebResult(FAIL.getCode(), FAIL.getStatus());
-        webResult.setTimestamp(DateTimeConverter.now());
-        webResult.setData(data);
-        return JsonConverter.objectToJson(webResult);
-    }
-
-    public static String error(Object data) {
-        WebResult webResult = new WebResult(ERROR.getCode(), ERROR.getStatus());
-        webResult.setTimestamp(DateTimeConverter.now());
-        webResult.setData(data);
-        return JsonConverter.objectToJson(webResult);
-    }
-}

+ 1 - 2
common/src/main/java/cn/reghao/autodop/common/utils/serializer/JsonConverter.java

@@ -9,13 +9,12 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- * JSON 转换器
+ * JSON 序列化/反序列化
  *
  * @author reghao
  * @date 2020-11-11 16:57:04
  */
 public class JsonConverter {
-    // TODO 采用 Jackson
     private static Gson gson = new GsonBuilder()
             .registerTypeAdapter(LocalDateTime.class, new LocalDateTimeAdapter())
             .create();

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

@@ -8,7 +8,7 @@ import cn.reghao.autodop.dmaster.app.vo.SuccessfullyBuildVO;
 import cn.reghao.autodop.dmaster.app.service.BuildService;
 import cn.reghao.autodop.dmaster.common.db.PageList;
 import cn.reghao.autodop.dmaster.app.service.BuildDeployDispatcher;
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -45,14 +45,14 @@ public class BuildDeployController {
     public ResponseEntity<String> buildList(@RequestParam("page") int page, @RequestParam("size") int size,
                                             @RequestParam("env") String env) {
         PageList<BuildDeployApp> pageList = buildService.buildList(page, size, EnvType.valueOf(env).name());
-        return ResponseEntity.ok().body(WebResult.success(pageList));
+        return ResponseEntity.ok().body(WebBody.success(pageList));
     }
 
     @ApiOperation(value = "刷新某个环境需要构建部署的应用列表")
     @PostMapping("/list/refresh/{env}")
     public ResponseEntity<String> refreshBuildList(@PathVariable("env") String env) {
         refreshService.refreshBuildList(EnvType.valueOf(env).name());
-        return ResponseEntity.ok().body(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     @ApiOperation(value = "构建部署应用")
@@ -60,7 +60,7 @@ public class BuildDeployController {
     @PostMapping("/update")
     public String buildAndDeploy(@RequestParam("appId") String appId) throws Exception {
         BuildDeployApp buildDeployApp = buildDeployDispatcher.buildAndDeploy(appId, true);
-        return WebResult.success(buildDeployApp.vo());
+        return WebBody.success(buildDeployApp.vo());
     }
 
     @ApiOperation(value = "构建应用")
@@ -68,7 +68,7 @@ public class BuildDeployController {
     @PostMapping("/build")
     public String build(@RequestParam("appId") String appId) throws Exception {
         BuildDeployApp buildDeployApp = buildDeployDispatcher.buildAndDeploy(appId, false);
-        return WebResult.success(buildDeployApp.vo());
+        return WebBody.success(buildDeployApp.vo());
     }
 
     @ApiOperation(value = "部署应用")
@@ -79,7 +79,7 @@ public class BuildDeployController {
     @PostMapping("/deploy")
     public String deploy(@RequestParam("appId") String appId, @RequestParam("commitId") String commitId) {
         BuildDeployApp buildDeployApp = buildDeployDispatcher.deploy(appId, commitId);
-        return WebResult.success(buildDeployApp.vo());
+        return WebBody.success(buildDeployApp.vo());
     }
 
     @GetMapping("/deployed_app")
@@ -87,7 +87,7 @@ public class BuildDeployController {
                                               @RequestParam("page") int page, @RequestParam("size") int size) {
 
         PageList<CurrentRunningCommit> latestDeployedApps = buildService.deployedApp(appId, page, size);
-        return ResponseEntity.ok().body(WebResult.success(latestDeployedApps));
+        return ResponseEntity.ok().body(WebBody.success(latestDeployedApps));
     }
 
     @ApiOperation(value = "某个应用成功的构建列表")
@@ -98,6 +98,6 @@ public class BuildDeployController {
         PageRequest pageRequest =
                 PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "createTime"));
         PageList<SuccessfullyBuildVO> pageList = buildService.successfullyBuilds(appId, pageRequest);
-        return ResponseEntity.ok().body(WebResult.success(pageList));
+        return ResponseEntity.ok().body(WebBody.success(pageList));
     }
 }

+ 7 - 7
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/BuildDeployLogController.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app.controller;
 
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import cn.reghao.autodop.dmaster.app.constant.EnvType;
 import cn.reghao.autodop.dmaster.app.entity.log.BuildLog;
 import cn.reghao.autodop.dmaster.app.entity.log.CommitLog;
@@ -33,7 +33,7 @@ public class BuildDeployLogController {
     public ResponseEntity<String> commitLogs(@RequestParam("page") int page, @RequestParam("size") int size,
                                              @RequestParam("env") String env) {
         PageList<CommitLog> pageList = buildService.commitLogs(page, size, EnvType.valueOf(env).name());
-        return ResponseEntity.ok().body(WebResult.success(pageList));
+        return ResponseEntity.ok().body(WebBody.success(pageList));
     }
 
     @ApiOperation(value = "某个应用的代码日志")
@@ -42,7 +42,7 @@ public class BuildDeployLogController {
                                                   @PathVariable("appId") String appId) {
 
         PageList<CommitLog> pageList = buildService.commitLogsByApp(page, size, appId);
-        return ResponseEntity.ok().body(WebResult.success(pageList));
+        return ResponseEntity.ok().body(WebBody.success(pageList));
     }
 
     @ApiOperation(value = "构建日志")
@@ -50,7 +50,7 @@ public class BuildDeployLogController {
     public ResponseEntity<String> buildLogs(@RequestParam("page") int page, @RequestParam("size") int size,
                                             @RequestParam("env") String env) {
         PageList<BuildLog> pageList = buildService.buildLogs(page, size, EnvType.valueOf(env).name());
-        return ResponseEntity.ok().body(WebResult.success(pageList));
+        return ResponseEntity.ok().body(WebBody.success(pageList));
     }
 
     @ApiOperation(value = "某个应用的构建日志")
@@ -59,7 +59,7 @@ public class BuildDeployLogController {
                                                  @RequestParam("page") int page,
                                                  @RequestParam("size") int size) {
         PageList<BuildLog> pageList = buildService.buildLogsByApp(page, size, appId);
-        return ResponseEntity.ok().body(WebResult.success(pageList));
+        return ResponseEntity.ok().body(WebBody.success(pageList));
     }
 
     @ApiOperation(value = "部署日志")
@@ -67,7 +67,7 @@ public class BuildDeployLogController {
     public ResponseEntity<String> deployLogs(@RequestParam("page") int page, @RequestParam("size") int size,
                                              @RequestParam("env") String env) {
         PageList<DeployLog> pageList = buildService.deployLogs(page, size, EnvType.valueOf(env).name());
-        return ResponseEntity.ok().body(WebResult.success(pageList));
+        return ResponseEntity.ok().body(WebBody.success(pageList));
     }
 
     @ApiOperation(value = "某个应用的部署日志")
@@ -75,6 +75,6 @@ public class BuildDeployLogController {
     public ResponseEntity<String> deployLogsByApp(@RequestParam("page") int page, @RequestParam("size") int size,
                                                   @PathVariable("appId") String appId) {
         PageList<DeployLog> pageList = buildService.deployLogsByApp(page, size, appId);
-        return ResponseEntity.ok().body(WebResult.success(pageList));
+        return ResponseEntity.ok().body(WebBody.success(pageList));
     }
 }

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

@@ -1,7 +1,7 @@
 package cn.reghao.autodop.dmaster.app.controller;
 
 import cn.reghao.autodop.common.dagent.app.api.data.deploy.PackerType;
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import cn.reghao.autodop.dmaster.app.constant.*;
 import cn.reghao.autodop.dmaster.app.constant.build.CompileType;
 import cn.reghao.autodop.dmaster.app.constant.build.RepoAuthType;
@@ -83,6 +83,6 @@ public class ConfigController {
                     map.put(name, name);
                 });
         }
-        return ResponseEntity.ok().body(WebResult.success(map));
+        return ResponseEntity.ok().body(WebBody.success(map));
     }
 }

+ 4 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/FileController.java

@@ -2,7 +2,7 @@ package cn.reghao.autodop.dmaster.app.controller;
 
 import cn.reghao.autodop.dmaster.common.config.SysConfig;
 import cn.reghao.autodop.dmaster.utils.SpringBootUtil;
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -43,10 +43,10 @@ public class FileController {
                 os.write(buffer, 0, i);
                 i = bis.read(buffer);
             }
-            return WebResult.success("文件已下载");
+            return WebBody.success("文件已下载");
         }
 
-        return WebResult.success("文件不存在");
+        return WebBody.success("文件不存在");
     }
 
     @ApiOperation(value = "上传文件")
@@ -54,6 +54,6 @@ public class FileController {
     public String upload(@RequestParam("file") MultipartFile file) {
         String filename = file.getOriginalFilename();
         String filePath = SpringBootUtil.saveFile(file, "/tmp");
-        return WebResult.success(filePath);
+        return WebBody.success(filePath);
     }
 }

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

@@ -2,7 +2,7 @@ package cn.reghao.autodop.dmaster.app.controller;
 
 import cn.reghao.autodop.common.dagent.app.api.data.DeployedAppStatus;
 import cn.reghao.autodop.dmaster.app.service.AppStatusService;
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import cn.reghao.autodop.common.dagent.app.api.data.log.LogFile;
 import cn.reghao.autodop.dmaster.common.db.PageList;
 import io.swagger.annotations.Api;
@@ -33,7 +33,7 @@ public class StatusController {
     @PostMapping("/refresh}")
     public ResponseEntity<String> refreshDeployedApps(@RequestParam("env") String env) {
         statusService.refreshDeployedApps(env);
-        return ResponseEntity.ok().body(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     @ApiOperation(value = "所有已部署应用的运行状态")
@@ -41,7 +41,7 @@ public class StatusController {
     public ResponseEntity<String> status(@RequestParam("page") int page, @RequestParam("size") int size,
                                          @RequestParam("env") String env) {
         PageList<DeployedAppStatus> pageList = statusService.deployedAppStatus(page, size, env);
-        return ResponseEntity.ok().body(WebResult.success(pageList));
+        return ResponseEntity.ok().body(WebBody.success(pageList));
     }
 
     @ApiOperation(value = "获取指定主机上应用的所有日志文件")
@@ -49,7 +49,7 @@ public class StatusController {
     public ResponseEntity<String> appLogFiles(@RequestParam("machineId") String machineId,
                                               @RequestParam("appId") String appId) {
         List<LogFile> list = statusService.logFiles(appId, machineId);
-        return ResponseEntity.ok().body(WebResult.success(list));
+        return ResponseEntity.ok().body(WebBody.success(list));
     }
 
     @ApiOperation(value = "获取应用日志内容")
@@ -60,34 +60,34 @@ public class StatusController {
                                                 @RequestParam("logLevel") String logLevel,
                                                 @RequestParam("logFile") String logFile) {
         List<String> logs = statusService.logContent(appId, logType, logLevel, machineId, logFile);
-        return ResponseEntity.ok().body(WebResult.success(logs));
+        return ResponseEntity.ok().body(WebBody.success(logs));
     }
 
     @ApiOperation(value = "某个已部署应用的运行状态")
     @GetMapping("/{appId}")
     public ResponseEntity<String> appStatus(@PathVariable("appId") String appId) {
         Map<String, DeployedAppStatus> map = statusService.appStatus(appId);
-        return ResponseEntity.ok().body(WebResult.success(map));
+        return ResponseEntity.ok().body(WebBody.success(map));
     }
 
     @ApiOperation(value = "重启应用")
     @PostMapping("/restart/{appId}")
     public ResponseEntity<String> restart(@PathVariable("appId") String appId) {
         Map<String, DeployedAppStatus> map = statusService.restart(appId);
-        return ResponseEntity.ok().body(WebResult.success(map));
+        return ResponseEntity.ok().body(WebBody.success(map));
     }
 
     @ApiOperation(value = "停止应用")
     @PostMapping("/stop/{appId}")
     public ResponseEntity<String> stop(@PathVariable("appId") String appId) {
         Map<String, DeployedAppStatus> map = statusService.stop(appId);
-        return ResponseEntity.ok().body(WebResult.success(map));
+        return ResponseEntity.ok().body(WebBody.success(map));
     }
 
     @ApiOperation(value = "启动应用")
     @PostMapping("/start/{appId}")
     public ResponseEntity<String> start(@PathVariable("appId") String appId) {
         Map<String, DeployedAppStatus> map = statusService.start(appId);
-        return ResponseEntity.ok().body(WebResult.success(map));
+        return ResponseEntity.ok().body(WebBody.success(map));
     }
 }

+ 2 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/WebhookController.java

@@ -1,10 +1,9 @@
 package cn.reghao.autodop.dmaster.app.controller;
 
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import cn.reghao.autodop.common.utils.serializer.JsonConverter;
 import cn.reghao.autodop.dmaster.app.service.BuildDeployDispatcher;
 import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
@@ -31,6 +30,6 @@ public class WebhookController {
         String ref = jsonObject.get("ref").getAsString();
         String branch = ref.substring(ref.lastIndexOf("/")+1);
 
-        return WebResult.success("buildDeployResult");
+        return WebBody.success("buildDeployResult");
     }
 }

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

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app.controller.crud;
 
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import cn.reghao.autodop.dmaster.common.db.PageList;
 import cn.reghao.autodop.common.utils.serializer.JsonConverter;
 import cn.reghao.autodop.dmaster.app.entity.config.AppOrchestration;
@@ -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(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     @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(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     @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(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     @ApiOperation(value = "删除应用编排")
     @DeleteMapping("/app/{uniqueKey}")
     public ResponseEntity<String> deleteAppOrchestration(@PathVariable("uniqueKey") String uniqueKey) throws Exception {
         appOrchestrationCrudService.delete(uniqueKey);
-        return ResponseEntity.ok().body(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     @ApiOperation(value = "分页获取应用编排")
@@ -80,7 +80,7 @@ public class AppConfigController {
         vos.setHasNext(pageList.isHasNext());
         vos.setPageSize(pageList.getPageSize());
         vos.setList(pageList.getList().stream().map(AppVO::from).collect(Collectors.toList()));
-        return ResponseEntity.ok().body(WebResult.success(vos));
+        return ResponseEntity.ok().body(WebBody.success(vos));
     }
 
     /* 项目编排 */
@@ -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(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     @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(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     @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(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     @ApiOperation(value = "删除项目编排")
     @DeleteMapping("/proj/{uniqueKey}")
     public ResponseEntity<String> deleteProjOrchestration(@PathVariable("uniqueKey") String uniqueKey) throws Exception {
         projOrchestrationCrudService.delete(uniqueKey);
-        return ResponseEntity.ok().body(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     @ApiOperation(value = "分页获取项目编排")
@@ -128,6 +128,6 @@ public class AppConfigController {
         vos.setHasNext(pageList.isHasNext());
         vos.setPageSize(pageList.getPageSize());
         vos.setList(pageList.getList().stream().map(ProjVO::from).collect(Collectors.toList()));
-        return ResponseEntity.ok().body(WebResult.success(vos));
+        return ResponseEntity.ok().body(WebBody.success(vos));
     }
 }

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

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app.controller.crud;
 
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import cn.reghao.autodop.dmaster.app.entity.config.build.BuildDir;
 import cn.reghao.autodop.dmaster.app.db.config.BuildDirCrudService;
 import cn.reghao.autodop.dmaster.common.db.PageList;
@@ -46,14 +46,14 @@ public class BuildConfigController {
     @GetMapping("/dir")
     public ResponseEntity<String> getBuildDirByPage(@RequestParam("page") int page, @RequestParam("size") int size) {
         PageList<BuildDir> pageList = buildDirCrudService.getByPage(page, size, "");
-        return ResponseEntity.ok().body(WebResult.success(pageList));
+        return ResponseEntity.ok().body(WebBody.success(pageList));
     }
 
     @ApiOperation(value = "修改构建目录配置")
     @PutMapping("/dir")
     public ResponseEntity<String> modifyBuildDir(@RequestBody String json) throws Exception {
         BuildDir buildDir = JsonConverter.jsonToObject(json, BuildDir.class);
-        return ResponseEntity.ok().body(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     /* 仓库认证配置 */
@@ -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(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     @ApiOperation(value = "修改仓库认证配置")
@@ -70,21 +70,21 @@ 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(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     @ApiOperation(value = "删除仓库认证配置")
     @DeleteMapping("/repo/{uniqueKey}")
     public ResponseEntity<String> deleteRepoConfig(@PathVariable("uniqueKey") String uniqueKey) throws Exception {
         repoAuthConfigCrudService.delete(uniqueKey);
-        return ResponseEntity.ok().body(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     @ApiOperation(value = "分页获取仓库认证配置")
     @GetMapping("/repo")
     public ResponseEntity<String> getRepoConfigByPage(@RequestParam("page") int page, @RequestParam("size") int size) {
         PageList<RepoAuthConfig> pageList = repoAuthConfigCrudService.getByPage(page, size, "");
-        return ResponseEntity.ok().body(WebResult.success(pageList));
+        return ResponseEntity.ok().body(WebBody.success(pageList));
     }
 
     /* 应用编译配置 */
@@ -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(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     @ApiOperation(value = "修改应用编译配置")
@@ -101,21 +101,21 @@ 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(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     @ApiOperation(value = "删除应用编译配置")
     @DeleteMapping("/compiler/{uniqueKey}")
     public ResponseEntity<String> deleteCompileConfig(@PathVariable("uniqueKey") String uniqueKey) throws Exception {
         compilerConfigCrudService.delete(uniqueKey);
-        return ResponseEntity.ok().body(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     @ApiOperation(value = "分页获取应用编译配置")
     @GetMapping("/compiler")
     public ResponseEntity<String> getCompileConfigByPage(@RequestParam("page") int page, @RequestParam("size") int size) {
         PageList<CompilerConfig> pageList = compilerConfigCrudService.getByPage(page, size, "");
-        return ResponseEntity.ok().body(WebResult.success(pageList));
+        return ResponseEntity.ok().body(WebBody.success(pageList));
     }
 
     /* 应用打包配置 */
@@ -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(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     @ApiOperation(value = "修改应用打包配置")
@@ -132,20 +132,20 @@ 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(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     @ApiOperation(value = "删除应用打包配置")
     @DeleteMapping("/packer/{uniqueKey}")
     public ResponseEntity<String> deletePackConfig(@PathVariable("uniqueKey") String uniqueKey) throws Exception {
         packerConfigCrudService.delete(uniqueKey);
-        return ResponseEntity.ok().body(WebResult.success("ok"));
+        return ResponseEntity.ok().body(WebBody.success("ok"));
     }
 
     @ApiOperation(value = "分页获取应用打包配置")
     @GetMapping("/packer")
     public ResponseEntity<String> getPackConfigByPage(@RequestParam("page") int page, @RequestParam("size") int size) {
         PageList<PackerConfig> pageList = packerConfigCrudService.getByPage(page, size, "");
-        return ResponseEntity.ok().body(WebResult.success(pageList));
+        return ResponseEntity.ok().body(WebBody.success(pageList));
     }
 }

+ 15 - 15
dmaster/src/main/java/cn/reghao/autodop/dmaster/app3/controller/App3CrudController.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app3.controller;
 
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import cn.reghao.autodop.dmaster.app3.entity.App3;
 import cn.reghao.autodop.dmaster.app3.entity.App3Bak;
 import cn.reghao.autodop.dmaster.app3.service.crud.App3BakCrudService;
@@ -31,20 +31,20 @@ public class App3CrudController {
         App3 app3 = JsonConverter.jsonToObject(jsonData, App3.class);
         if (isApp3Valid(app3)) {
             app3CrudService.insert(app3);
-            return WebResult.success("add done...");
+            return WebBody.success("add done...");
         }
 
-        return WebResult.fail("add failed...");
+        return WebBody.fail("add failed...");
     }
 
     @GetMapping
     public String getApp3ByPage(@RequestParam("page") int page, @RequestParam("size") int size) {
         if (page < 0 || size <0) {
-            return WebResult.fail("get failed...");
+            return WebBody.fail("get failed...");
         }
 
         PageList<App3> list = app3CrudService.getByPage(page, size, "");
-        return WebResult.success(list);
+        return WebBody.success(list);
     }
 
     @PutMapping
@@ -52,16 +52,16 @@ public class App3CrudController {
         App3 app3 = JsonConverter.jsonToObject(jsonData, App3.class);
         if (isApp3Valid(app3)) {
             app3CrudService.insert(app3);
-            return WebResult.success("put done...");
+            return WebBody.success("put done...");
         }
 
-        return WebResult.fail("modify failed...");
+        return WebBody.fail("modify failed...");
     }
 
     @DeleteMapping("/{app3Name}")
     public String deleteApp3(@PathVariable("app3Name") String app3Name) throws Exception {
         app3CrudService.delete(app3Name);
-        return WebResult.success("delete done...");
+        return WebBody.success("delete done...");
     }
 
     private boolean isApp3Valid(App3 app3) {
@@ -73,20 +73,20 @@ public class App3CrudController {
         App3Bak app3Bak = JsonConverter.jsonToObject(jsonData, App3Bak.class);
         if (isApp3BakValid(app3Bak)) {
             app3BakCrudService.insert(app3Bak);
-            return WebResult.success("add done...");
+            return WebBody.success("add done...");
         }
 
-        return WebResult.fail("add failed...");
+        return WebBody.fail("add failed...");
     }
 
     @GetMapping("/bak")
     public String getApp3BakByPage(@RequestParam("page") int page, @RequestParam("size") int size) {
         if (page < 0 || size <0) {
-            return WebResult.fail("get failed...");
+            return WebBody.fail("get failed...");
         }
 
         PageList<App3Bak> list = app3BakCrudService.getByPage(page, size, "");
-        return WebResult.success(list);
+        return WebBody.success(list);
     }
 
     @PutMapping("/bak")
@@ -94,16 +94,16 @@ public class App3CrudController {
         App3Bak app3Bak = JsonConverter.jsonToObject(jsonData, App3Bak.class);
         if (isApp3BakValid(app3Bak)) {
             app3BakCrudService.insert(app3Bak);
-            return WebResult.success("put done...");
+            return WebBody.success("put done...");
         }
 
-        return WebResult.fail("modify failed...");
+        return WebBody.fail("modify failed...");
     }
 
     @DeleteMapping("/bak/{app3BakName}")
     public String deleteApp3Bak(@PathVariable("app3BakName") String app3BakName) throws Exception {
         app3BakCrudService.delete(app3BakName);
-        return WebResult.success("delete done...");
+        return WebBody.success("delete done...");
     }
 
     private boolean isApp3BakValid(App3Bak app3Bak) {

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

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app3.controller;
 
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import cn.reghao.autodop.dmaster.app3.service.App3OpsService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -24,30 +24,30 @@ public class App3OpsController {
     @PostMapping("/backup/activate/{app3Name}")
     public String activateBackup(@PathVariable("app3Name") String app3Name) throws Exception {
         app3OpsService.backup(app3Name);
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 
     @ApiOperation(value = "停用备份")
     @PostMapping("/backup/deactivate/{app3Name}")
     public String deactivateBackup(@PathVariable("app3Name") String app3Name) throws Exception {
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 
     @ApiOperation(value = "备份日志")
     @GetMapping("/log/backup/{serviceName}")
     public String bakLog(@PathVariable("serviceName") String serviceName) {
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 
     @ApiOperation(value = "还原备份")
     @PostMapping("/restore/{app3Name}")
     public String restore(@PathVariable("app3Name") String app3Name) throws Exception {
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 
     @ApiOperation(value = "还原日志")
     @GetMapping("/log/restore/{serviceName}")
     public String restoreLog(@PathVariable("serviceName") String serviceName) {
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 }

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/config/WebAuthSuccessHandlerImpl.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.auth.config;
 
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
 import org.springframework.security.web.savedrequest.SavedRequest;
@@ -38,7 +38,7 @@ public class WebAuthSuccessHandlerImpl implements AuthenticationSuccessHandler {
 
     private void sendResponse(HttpServletResponse response) throws IOException {
         response.setContentType("text/html;charset=utf-8");
-        String result = WebResult.success("");
+        String result = WebBody.success("");
         PrintWriter pt = response.getWriter();
         pt.println(result);
     }

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

@@ -6,9 +6,9 @@ package cn.reghao.autodop.dmaster.auth.entity;
  */
 public enum MenuType {
     /**
-     * 菜单
+     * 目录
      */
-    MENU(1),
+    DIR(1),
     /**
      * 按钮
      */

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

@@ -1,6 +1,7 @@
 package cn.reghao.autodop.dmaster.auth.entity;
 
 import cn.reghao.autodop.common.orm.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
@@ -27,5 +28,6 @@ public class Role extends BaseEntity<Integer> {
     @JoinTable(name = "role_menu",
             joinColumns = @JoinColumn(name = "role_id"),
             inverseJoinColumns = @JoinColumn(name = "menu_id"))
+    @JsonIgnore
     private Set<Menu> menus;
 }

+ 4 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/repository/MenuRepository.java

@@ -3,9 +3,13 @@ package cn.reghao.autodop.dmaster.auth.repository;
 import cn.reghao.autodop.dmaster.auth.entity.Menu;
 import org.springframework.data.jpa.repository.JpaRepository;
 
+import java.util.List;
+
 /**
  * @author reghao
  * @date 2019-08-29 10:52:14
  */
 public interface MenuRepository extends JpaRepository<Menu, Integer> {
+    Menu findById(int id);
+    List<Menu> findByPid(int pid);
 }

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

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.common.exception;
 
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import cn.reghao.autodop.common.utils.ExceptionUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.ControllerAdvice;
@@ -33,6 +33,6 @@ public class ControllerExceptionHandler {
         if (msg == null) {
             msg = e.toString();
         }
-        return WebResult.error(msg);
+        return WebBody.error(msg);
     }
 }

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/machine/controller/crud/MachineCrudController.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.machine.controller.crud;
 
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import cn.reghao.autodop.dmaster.machine.entity.MachineInfo;
 import cn.reghao.autodop.dmaster.machine.vo.MachineInfoVO;
 import cn.reghao.autodop.dmaster.common.db.PageList;
@@ -44,6 +44,6 @@ public class MachineCrudController {
         vos.setList(pageList.getList().stream()
                 .map(info -> MachineInfoVO.of(info, map.get(info.getMachineId())))
                 .collect(Collectors.toList()));
-        return WebResult.success(vos);
+        return WebBody.success(vos);
     }
 }

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

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.machine.controller.crud;
 
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import cn.reghao.autodop.dmaster.machine.service.crud.MachineLogCrudService;
 import io.swagger.annotations.Api;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -25,6 +25,6 @@ public class MachineLogCrudController {
     @GetMapping("/logs")
     public String machineIdByPage(@RequestParam("page") int page,
                                   @RequestParam("size") int size) {
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 }

+ 5 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/MonitorController.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.sys;
 
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import io.swagger.annotations.Api;
 import org.springframework.web.bind.annotation.*;
 
@@ -20,21 +20,21 @@ public class MonitorController {
 
     @GetMapping("/jvm/info")
     public String jvmInfo() {
-        return WebResult.success(monitorService.jvmInfo());
+        return WebBody.success(monitorService.jvmInfo());
     }
 
     @GetMapping("/jvm/stat")
     public String jvmStat() {
-        return WebResult.success(monitorService.jvmStat());
+        return WebBody.success(monitorService.jvmStat());
     }
 
     @GetMapping("/linux/info")
     public String osInfo() {
-        return WebResult.success(monitorService.jvmInfo());
+        return WebBody.success(monitorService.jvmInfo());
     }
 
     @GetMapping("/linux/stat")
     public String osStat() {
-        return WebResult.success(monitorService.linuxSysStat());
+        return WebBody.success(monitorService.linuxSysStat());
     }
 }

+ 0 - 24
dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/UserContext.java

@@ -1,24 +0,0 @@
-package cn.reghao.autodop.dmaster.utils;
-
-import cn.reghao.autodop.dmaster.auth.entity.User;
-
-/**
- * @author reghao
- * @date 2020-06-23 19:20:56
- */
-public class UserContext implements AutoCloseable {
-    static final ThreadLocal<User> CURRENT = new ThreadLocal<>();
-
-    public UserContext(User auth) {
-        CURRENT.set(auth);
-    }
-
-    public static User currentUser() {
-        return CURRENT.get();
-    }
-
-    @Override
-    public void close() {
-        CURRENT.remove();
-    }
-}

+ 66 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/utils/WebBody.java

@@ -0,0 +1,66 @@
+package cn.reghao.autodop.dmaster.utils;
+
+import cn.reghao.autodop.common.utils.DateTimeConverter;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import static cn.reghao.autodop.common.result.ResultCode.*;
+
+/**
+ * HTTP 响应 body 数据
+ *
+ * @author reghao
+ * @date 2019-09-28 10:05:35
+ */
+@Data
+@NoArgsConstructor
+public class WebBody {
+    private static ObjectMapper objectMapper = new ObjectMapper();
+    private Integer code;
+    private String status;
+    private String timestamp;
+    private Object data;
+
+    private WebBody(Integer code, String status) {
+        this.code = code;
+        this.status = status;
+    }
+
+    public static String success(Object data) {
+        WebBody webBody = new WebBody(SUCCESS.getCode(), SUCCESS.getMsg());
+        webBody.setTimestamp(DateTimeConverter.now());
+        webBody.setData(data);
+        try {
+            return objectMapper.writeValueAsString(webBody);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static String fail(Object data) {
+        WebBody webBody = new WebBody(FAIL.getCode(), FAIL.getMsg());
+        webBody.setTimestamp(DateTimeConverter.now());
+        webBody.setData(data);
+        try {
+            return objectMapper.writeValueAsString(webBody);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static String error(Object data) {
+        WebBody webBody = new WebBody(ERROR.getCode(), ERROR.getMsg());
+        webBody.setTimestamp(DateTimeConverter.now());
+        webBody.setData(data);
+        try {
+            return objectMapper.writeValueAsString(webBody);
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}

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

@@ -9,9 +9,8 @@ import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.GetMapping;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author reghao
@@ -29,13 +28,19 @@ public class HomeController {
 
     @GetMapping("/")
     public String index(Model model) {
-        // 获取当前登录的用户
         User user = UserContext.currentUser();
+        // TODO 根据用户角色获取相应的 menu
         List<Menu> menus = menuRepository.findAll();
 
+        Map<Integer, List<Menu>> map =  menus.stream()
+                .collect(Collectors.groupingBy(Menu::getPid));
+        map.forEach((pid, menuList) -> {
+
+        });
+
+
         // id -> menu
         Map<Integer, Menu> keyMenu = new HashMap<>(16);
-        // TODO 根据用户角色获取相应的 menu
         menus.forEach(menu -> keyMenu.put(menu.getId(), menu));
 
         // 封装菜单树形数据

+ 0 - 52
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/MenuPageController.java

@@ -1,52 +0,0 @@
-package cn.reghao.autodop.dmaster.view.controller;
-
-import cn.reghao.autodop.common.result.WebResult;
-import cn.reghao.autodop.dmaster.auth.repository.UserRepository;
-import cn.reghao.autodop.dmaster.auth.entity.Menu;
-import cn.reghao.autodop.dmaster.auth.repository.MenuRepository;
-import cn.reghao.autodop.dmaster.common.db.PageList;
-import org.springframework.data.domain.*;
-import org.springframework.http.MediaType;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author reghao
- * @date 2021-04-04 21:24:18
- */
-@RequestMapping("/system/menu")
-@Controller
-public class MenuPageController {
-    private final UserRepository userRepository;
-    private final MenuRepository menuRepository;
-
-    public MenuPageController(UserRepository userRepository, MenuRepository menuRepository) {
-        this.userRepository = userRepository;
-        this.menuRepository = menuRepository;
-    }
-
-    @GetMapping
-    public String systemMenu(Model model) {
-        return "/system/menu/index";
-    }
-
-    @GetMapping(value = "/list", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ResponseBody
-    public String list() {
-        PageRequest pageRequest =
-                PageRequest.of(0, 100, Sort.by(Sort.Direction.DESC, "updateTime"));
-        Page<Menu> menuPage = menuRepository.findAll(pageRequest);
-        PageList<Menu> pageList = PageList.pageList(menuPage);
-        pageList.getList().forEach(menu -> {
-            menu.setChildren(null);
-            menu.setRoles(null);
-        });
-        return WebResult.success(pageList);
-    }
-}

+ 26 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/ResourceController.java

@@ -0,0 +1,26 @@
+package cn.reghao.autodop.dmaster.view.controller;
+
+import cn.reghao.autodop.dmaster.auth.entity.Menu;
+import cn.reghao.autodop.dmaster.auth.repository.MenuRepository;
+import cn.reghao.autodop.dmaster.utils.WebBody;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author reghao
+ * @date 2021-04-04 21:24:18
+ */
+@RequestMapping("/system/menu")
+@RestController
+public class ResourceController {
+    private final MenuRepository menuRepository;
+
+    public ResourceController(MenuRepository menuRepository) {
+        this.menuRepository = menuRepository;
+    }
+
+    @PostMapping("/save")
+    public String addMenu(Menu menu) {
+        menuRepository.save(menu);
+        return WebBody.success("ok");
+    }
+}

+ 85 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/ResourcePageController.java

@@ -0,0 +1,85 @@
+package cn.reghao.autodop.dmaster.view.controller;
+
+import cn.reghao.autodop.dmaster.utils.WebBody;
+import cn.reghao.autodop.dmaster.auth.repository.UserRepository;
+import cn.reghao.autodop.dmaster.auth.entity.Menu;
+import cn.reghao.autodop.dmaster.auth.repository.MenuRepository;
+import cn.reghao.autodop.dmaster.common.db.PageList;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.data.domain.*;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2021-04-04 21:24:18
+ */
+@RequestMapping("/system/menu")
+@Controller
+public class ResourcePageController {
+    private final UserRepository userRepository;
+    private final MenuRepository menuRepository;
+
+    public ResourcePageController(UserRepository userRepository, MenuRepository menuRepository) {
+        this.userRepository = userRepository;
+        this.menuRepository = menuRepository;
+    }
+
+    @GetMapping
+    public String systemMenu(Model model) {
+        return "/system/menu/index";
+    }
+
+    @ApiOperation(value = "获取所有的资源")
+    @GetMapping(value = "/list", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ResponseBody
+    public String list() {
+        List<Menu> menuList = menuRepository.findAll();
+        Map<Integer, List<Menu>> map =  menuList.stream()
+                .collect(Collectors.groupingBy(Menu::getPid));
+
+        List<Menu> list = new ArrayList<>();
+        map.forEach((pid, menus) -> {
+            list.addAll(menus.stream()
+                    .sorted(Comparator.comparing(Menu::getSort))
+                    .peek(menu -> menu.setChildren(null))
+                    .collect(Collectors.toList()));
+        });
+        return WebBody.success(list);
+    }
+
+    @ApiOperation(value = "资源添加页面")
+    @GetMapping({"/add", "/add/{pid}"})
+    public String toAdd(@PathVariable(value = "pid", required = false) Integer pid, Model model) {
+        // 父级菜单
+        Menu pMenu = null;
+        if (pid != null) {
+            pMenu = menuRepository.findById(pid.intValue());
+        }
+        model.addAttribute("pMenu", pMenu);
+        return "/system/menu/add";
+    }
+
+    @ApiOperation(value = "获取所有的资源")
+    @GetMapping(value = "/sortList/{pid}/{notId}", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ResponseBody
+    public String sortList(@PathVariable(value = "pid") int pid,
+                           @PathVariable(value = "notId", required = false) int notId) {
+
+        List<Menu> menus = menuRepository.findByPid(pid);
+        Map<Integer, String> map = new HashMap<>();
+        menus.forEach(menu -> {
+            map.put(menu.getSort(), menu.getTitle());
+        });
+        //map.put("1", "用户管理");
+        return WebBody.success(map);
+    }
+}

+ 4 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/RoleController.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.view.controller;
 
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import cn.reghao.autodop.dmaster.auth.entity.Role;
 import cn.reghao.autodop.dmaster.auth.service.RoleService;
 import cn.reghao.autodop.dmaster.auth.entity.Menu;
@@ -26,17 +26,17 @@ public class RoleController {
     @GetMapping("/authList")
     public String authList(@RequestParam(value = "ids") Role role) {
         List<Menu> list = new ArrayList<>();
-        return WebResult.success(list);
+        return WebBody.success(list);
     }
 
     @PostMapping("/auth")
     public String auth() {
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 
     @PostMapping("/save")
     public String addRole(Role role) {
         roleService.addRole(role);
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 }

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

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.view.controller;
 
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import cn.reghao.autodop.common.utils.security.Cryptor;
 import cn.reghao.autodop.common.utils.security.Md5Cryptor;
 import cn.reghao.autodop.common.utils.security.Salt;
@@ -45,7 +45,7 @@ public class TestController {
         /*addRoles();
         addUsers();
         addMenus();*/
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 
     private void addRoles() {
@@ -81,7 +81,7 @@ public class TestController {
         sysMenu.setSort(2);
         sysMenu.setTitle("系统管理");
         sysMenu.setUrl("#");
-        sysMenu.setType(MenuType.MENU.name());
+        sysMenu.setType(MenuType.DIR.name());
         sysMenu.setIcon("fa fa-cog");
         menus.add(sysMenu);
         menuRepository.saveAll(menus);

+ 4 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/UserController.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.view.controller;
 
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import cn.reghao.autodop.dmaster.auth.entity.User;
 import cn.reghao.autodop.dmaster.auth.service.UserService;
 import org.springframework.web.bind.annotation.*;
@@ -26,7 +26,7 @@ public class UserController {
     @PostMapping("/save")
     @ResponseBody
     public String addOrUpdateUser(User user) {
-        return WebResult.success("");
+        return WebBody.success("");
     }
 
     @PostMapping("/pwd")
@@ -35,7 +35,7 @@ public class UserController {
                                  String confirm,
                                  @RequestParam(value = "ids", required = false) List<Long> ids,
                                  @RequestParam(value = "ids", required = false) List<User> users) {
-        return WebResult.success("");
+        return WebBody.success("");
     }
 
     @PostMapping("/role")
@@ -46,6 +46,6 @@ public class UserController {
         Set<Integer> set = Arrays.stream(roleIds.split(","))
                 .map(Integer::parseInt)
                 .collect(Collectors.toSet());
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 }

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

@@ -1,5 +1,6 @@
 package cn.reghao.autodop.dmaster.view.thymeleaf;
 
+import cn.reghao.autodop.dmaster.view.thymeleaf.attribute.SelectDictAttrProcessor;
 import cn.reghao.autodop.dmaster.view.thymeleaf.attribute.SelectListAttrProcessor;
 import org.thymeleaf.dialect.AbstractProcessorDialect;
 import org.thymeleaf.dialect.IExpressionObjectDialect;
@@ -28,6 +29,7 @@ public class TimoDialect extends AbstractProcessorDialect implements IExpression
     @Override
     public Set<IProcessor> getProcessors(String dialectPrefix) {
         Set<IProcessor> processors = new LinkedHashSet<IProcessor>();
+        processors.add(new SelectDictAttrProcessor(TemplateMode.HTML, dialectPrefix));
         processors.add(new SelectListAttrProcessor(TemplateMode.HTML, dialectPrefix));
         return processors;
     }

+ 15 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/TimoExpressionObjectFactory.java

@@ -1,5 +1,7 @@
 package cn.reghao.autodop.dmaster.view.thymeleaf;
 
+import cn.reghao.autodop.dmaster.view.thymeleaf.utility.DictUtil;
+import cn.reghao.autodop.dmaster.view.thymeleaf.utility.LogUtil;
 import cn.reghao.autodop.dmaster.view.thymeleaf.utility.PageUtil;
 import org.thymeleaf.context.IExpressionContext;
 import org.thymeleaf.expression.IExpressionObjectFactory;
@@ -17,11 +19,17 @@ public class TimoExpressionObjectFactory implements IExpressionObjectFactory {
 
     public static final String PAGE_UTIL_NAME = "pageUtil";
     public static final PageUtil PAGE_UTIL_OBJECT = new PageUtil();
+    public static final String DICT_UTIL_NAME = "dicts";
+    public static final DictUtil DICT_UTIL_OBJECT = new DictUtil();
+    public static final String LOG_UTIL_NAME = "logs";
+    public static final LogUtil LOG_UTIL_OBJECT = new LogUtil();
 
     @Override
     public Set<String> getAllExpressionObjectNames() {
         Set<String> names = Collections.unmodifiableSet(new LinkedHashSet<String>(Arrays.asList(
-                PAGE_UTIL_NAME
+                PAGE_UTIL_NAME,
+                DICT_UTIL_NAME,
+                LOG_UTIL_NAME
         )));
         return names;
     }
@@ -31,6 +39,12 @@ public class TimoExpressionObjectFactory implements IExpressionObjectFactory {
         if(PAGE_UTIL_NAME.equals(expressionObjectName)){
             return PAGE_UTIL_OBJECT;
         }
+        if(DICT_UTIL_NAME.equals(expressionObjectName)){
+            return DICT_UTIL_OBJECT;
+        }
+        if(LOG_UTIL_NAME.equals(expressionObjectName)){
+            return LOG_UTIL_OBJECT;
+        }
         return null;
     }
 

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

@@ -10,10 +10,7 @@ import org.thymeleaf.processor.element.IElementTagStructureHandler;
 import org.thymeleaf.standard.expression.*;
 import org.thymeleaf.templatemode.TemplateMode;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 /**
  * 根据字典标识生成下拉列表
@@ -21,10 +18,26 @@ import java.util.Set;
  * @date 2018/8/14
  */
 public class SelectDictAttrProcessor extends AbstractAttributeTagProcessor {
+    private final static Map<String, Map<String, String>> localCache = new HashMap<>();
+    static {
+        localCache.put("SEARCH_STATUS", new HashMap<>());
+        localCache.get("SEARCH_STATUS").put("1", "正常");
+        localCache.get("SEARCH_STATUS").put("2", "冻结");
+
+        localCache.put("MENU_TYPE", new HashMap<>());
+        localCache.get("MENU_TYPE").put("1", "目录");
+        localCache.get("MENU_TYPE").put("2", "按钮");
+    }
+    
     public static final int PRECEDENCE = 1400;
+    public static final String ATTR_NAME = "dict";
     public static final String SELECTED_ATTR_NAME= "mo-selected";
     public static final String EMPTY_ATTR_NAME= "mo-empty";
 
+    public SelectDictAttrProcessor(final TemplateMode templateMode, final String dialectPrefix) {
+        super(templateMode, dialectPrefix, null, false, ATTR_NAME, true, PRECEDENCE, true);
+    }
+
     public SelectDictAttrProcessor(final TemplateMode templateMode, final String dialectPrefix, String attrName, int precedence) {
         super(templateMode, dialectPrefix, null, false, attrName, true, precedence, true);
     }
@@ -43,14 +56,17 @@ public class SelectDictAttrProcessor extends AbstractAttributeTagProcessor {
         if(attributeValue.isEmpty() || !"select".equals(elementName)) {
             return;
         }
+
+        // 获取列表对象,空则不处理
+        Map<String, String> valueList = localCache.get(attributeValue);
+        if(valueList != null && valueList.size() > 0) {
+            doProcess(context, tag, structureHandler, valueList);
+        }
     }
 
-    @SuppressWarnings("unchecked")
     protected void doProcess(
             final ITemplateContext context,
             final IProcessableElementTag tag,
-            final AttributeName attributeName,
-            final String attributeValue,
             final IElementTagStructureHandler structureHandler,
             Map<String, String> valueList) {
 
@@ -62,7 +78,7 @@ public class SelectDictAttrProcessor extends AbstractAttributeTagProcessor {
             final IStandardExpressionParser expressionParser = StandardExpressions.getExpressionParser(configuration);
             final IStandardExpression expression = expressionParser.parseExpression(context, attributeSelectedValue);
             final Object expressionResult;
-            if (expression != null && expression instanceof FragmentExpression) {
+            if (expression instanceof FragmentExpression) {
                 final FragmentExpression.ExecutedFragmentExpression executedFragmentExpression =
                         FragmentExpression.createExecutedFragmentExpression(context, (FragmentExpression) expression);
                 expressionResult =

+ 2 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/attribute/SelectListAttrProcessor.java

@@ -1,6 +1,5 @@
 package cn.reghao.autodop.dmaster.view.thymeleaf.attribute;
 
-import lombok.EqualsAndHashCode;
 import org.thymeleaf.IEngineConfiguration;
 import org.thymeleaf.context.ITemplateContext;
 import org.thymeleaf.engine.AttributeName;
@@ -29,7 +28,6 @@ public class SelectListAttrProcessor extends SelectDictAttrProcessor {
     }
 
     @Override
-    @SuppressWarnings("unchecked")
     protected void doProcess(
             final ITemplateContext context,
             final IProcessableElementTag tag,
@@ -48,7 +46,7 @@ public class SelectListAttrProcessor extends SelectDictAttrProcessor {
         final IStandardExpressionParser expressionParser = StandardExpressions.getExpressionParser(configuration);
         final IStandardExpression expression = expressionParser.parseExpression(context, attributeValue);
         Object expressionResult;
-        if (expression != null && expression instanceof FragmentExpression) {
+        if (expression instanceof FragmentExpression) {
             final FragmentExpression.ExecutedFragmentExpression executedFragmentExpression =
                     FragmentExpression.createExecutedFragmentExpression(context, (FragmentExpression) expression);
             expressionResult =
@@ -84,7 +82,7 @@ public class SelectListAttrProcessor extends SelectDictAttrProcessor {
         }
 
         if (valueList.size() > 0) {
-            doProcess(context, tag, attributeName, attributeValue, structureHandler, valueList);
+            doProcess(context, tag, structureHandler, valueList);
         };
     }
 

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/config/ThymeleafAutoConfig.java

@@ -6,6 +6,6 @@ import org.springframework.context.annotation.ComponentScan;
  * @author 小懒虫 <auntvt@163.com>
  * @date 2021/3/19
  */
-@ComponentScan(basePackages = "cn.reghao.autodop.dmaster.view.thymeleaf")
+@ComponentScan(basePackages = "cn.reghao.autodop.dmaster")
 public class ThymeleafAutoConfig {
 }

+ 84 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/utility/DictUtil.java

@@ -0,0 +1,84 @@
+package cn.reghao.autodop.dmaster.view.thymeleaf.utility;
+
+/*import com.linln.common.utils.EhCacheUtil;
+import com.linln.modules.system.domain.Dict;
+import com.linln.modules.system.service.DictService;
+import com.linln.common.utils.SpringContextUtil;
+import net.sf.ehcache.Cache;
+import net.sf.ehcache.Element;*/
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * 字典提取工具对象
+ * @author 小懒虫
+ * @date 2018/8/14
+ */
+public class DictUtil {
+
+    //private static Cache dictCache = EhCacheUtil.getDictCache();
+
+    /**
+     * 获取字典值集合
+     * @param label 字典标识
+     */
+    @SuppressWarnings("unchecked")
+    public static Map<String, String> value(String label){
+        Map<String, String> value = null;
+        /*Element dictEle = dictCache.get(label);
+        if(dictEle != null){
+            value = (Map<String, String>) dictEle.getObjectValue();
+        }else {
+            DictService dictService = SpringContextUtil.getBean(DictService.class);
+            Dict dict = dictService.getByNameOk(label);
+            if(dict != null){
+                String dictValue = dict.getValue();
+                String[] outerSplit = dictValue.split(",");
+                value = new LinkedHashMap<>();
+                for (String osp : outerSplit) {
+                    String[] split = osp.split(":");
+                    if(split.length > 1){
+                        value.put(split[0], split[1]);
+                    }
+                }
+                dictCache.put(new Element(dict.getName(), value));
+            }
+        }*/
+        return value;
+    }
+
+    /**
+     * 根据选项编码获取选项值
+     * @param label 字典标识
+     * @param code 选项编码
+     */
+    public static String keyValue(String label, String code){
+        Map<String, String> list = DictUtil.value(label);
+        if(list != null){
+            return list.get(code);
+        }else{
+            return "";
+        }
+    }
+
+    /**
+     * 封装数据状态字典
+     * @param status 状态
+     */
+    public static String dataStatus(Byte status){
+        String label = "DATA_STATUS";
+        return DictUtil.keyValue(label, String.valueOf(status));
+    }
+
+    /**
+     * 清除缓存中指定的数据
+     * @param label 字典标识
+     */
+    public static void clearCache(String label){
+        /*Element dictEle = dictCache.get(label);
+        if (dictEle != null){
+            dictCache.remove(label);
+        }*/
+    }
+}

+ 35 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/utility/LogUtil.java

@@ -0,0 +1,35 @@
+package cn.reghao.autodop.dmaster.view.thymeleaf.utility;
+
+/*import com.linln.common.utils.EntityBeanUtil;
+import com.linln.common.utils.SpringContextUtil;
+import com.linln.modules.system.domain.ActionLog;
+import com.linln.modules.system.service.ActionLogService;*/
+
+import javax.persistence.Table;
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+
+/**
+ * @author 小懒虫
+ * @date 2018/10/16
+ */
+public class LogUtil {
+
+    /**
+     * 获取实体对象的日志
+     * @param entity 实体对象
+     */
+    /*public List<ActionLog> entityList(Object entity){
+        ActionLogService actionLogService = SpringContextUtil.getBean(ActionLogService.class);
+        Table table = entity.getClass().getAnnotation(Table.class);
+        String tableName = table.name();
+        try {
+            Object object = EntityBeanUtil.getField(entity, "id");
+            Long entityId = Long.valueOf(String.valueOf(object));
+            return actionLogService.getDataLogList(tableName, entityId);
+        } catch (InvocationTargetException | IllegalAccessException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }*/
+}

+ 11 - 9
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/utility/PageUtil.java

@@ -1,6 +1,7 @@
 package cn.reghao.autodop.dmaster.view.thymeleaf.utility;
 
 import cn.reghao.autodop.dmaster.common.db.PageList;
+import org.springframework.data.domain.Page;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
@@ -17,6 +18,7 @@ public class PageUtil {
 
     public boolean pageInit(PageList pageList, HttpServletRequest request){
         if (pageList.getTotalSize() > pageList.getPageSize() && pageList.getList().size() != 0){
+
             // 获取分页参数地址
             String servletPath = request.getServletPath();
             StringBuffer param = new StringBuffer(servletPath + "?");
@@ -34,9 +36,9 @@ public class PageUtil {
         return false;
     }
 
-    public List<String> pageCode(PageList pageList){
-        int number = pageList.getList().size()+1;
-        int totalPages = pageList.getTotalPages();
+    public List<String> pageCode(Page page){
+        int number = page.getNumber()+1;
+        int totalPages = page.getTotalPages();
         int start = 0;
         int length = 7;
         int half = length % 2 == 0 ? length / 2 : length / 2 + 1;
@@ -62,8 +64,8 @@ public class PageUtil {
         return codeList;
     }
 
-    public String pageActive(PageList pageList, String pageCode, String className){
-        int number = pageList.getList().size();
+    public String pageActive(Page page, String pageCode, String className){
+        int number = page.getNumber();
         if(!"…".equals(pageCode)){
             if(number == Integer.valueOf(pageCode) - 1){
                 return " "+className;
@@ -72,12 +74,12 @@ public class PageUtil {
         return "";
     }
 
-    public boolean isPrevious(PageList pageList){
-        return pageList.getList().size() != 0;
+    public boolean isPrevious(Page page){
+        return page.getNumber() != 0;
     }
 
-    public boolean isNext(PageList pageList){
-        return pageList.getList().size() != pageList.getTotalPages() - 1;
+    public boolean isNext(Page page){
+        return page.getNumber() != page.getTotalPages() - 1;
     }
 
     public boolean isCode(String pageCode){

+ 3 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/xml/Timo-Dialect.xml

@@ -45,4 +45,7 @@
 
     <!-- 自定义对象工具 -->
     <expression-object name="pageUtil" class="cn.reghao.autodop.dmaster.view.thymeleaf.utility.PageUtil"/>
+    <expression-object name="dicts" class="cn.reghao.autodop.dmaster.view.thymeleaf.utility.DictUtil"/>
+
+
 </dialect>

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

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.vm.controller;
 
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import cn.reghao.autodop.dmaster.vm.kvm.Guest;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -21,37 +21,37 @@ public class GuestController {
     @PostMapping
     public String addGuest(@RequestBody String data) throws Exception {
         guest.createDomain();
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 
     @ApiOperation(value = "")
     @GetMapping
     public String getGuest() throws Exception {
-        return WebResult.success(guest.listDomain());
+        return WebBody.success(guest.listDomain());
     }
 
     @ApiOperation(value = "")
     @DeleteMapping
     public String deleteGuest(@PathVariable("guestName") String guestName) throws Exception {
         guest.deleteDomain(guestName);
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 
     @ApiOperation(value = "")
     @PostMapping("/start")
     public String start(@RequestParam("guestName") String guestName) throws Exception {
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 
     @ApiOperation(value = "")
     @PostMapping("/stop")
     public String stop(@RequestParam("guestName") String guestName) throws Exception {
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 
     @ApiOperation(value = "")
     @PostMapping("/restart")
     public String restart(@RequestParam("guestName") String guestName) throws Exception {
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 }

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

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.vm.controller;
 
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -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 WebResult.success("ok");
+        return WebBody.success("ok");
     }
 
     @DeleteMapping
     public String deletePhysicalHost() {
         //public String addPhysicalHost(@RequestParam("name") String name, @RequestBody String json) {
         log.info("delete request...");
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 
     @ApiOperation(value = "")
     @GetMapping("/list")
     public String nodeList(@RequestParam("name") String name) {
         log.info("name -> {}", name);
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 }

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

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.vm.controller;
 
-import cn.reghao.autodop.common.result.WebResult;
+import cn.reghao.autodop.dmaster.utils.WebBody;
 import cn.reghao.autodop.dmaster.vm.kvm.Storage;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -21,39 +21,39 @@ public class StorageController {
     @PostMapping("/pool")
     public String addPool(@RequestBody String data) throws Exception {
         storage.createStoragePool();
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 
     @ApiOperation(value = "")
     @GetMapping("/pool")
     public String getPool() throws Exception {
-        return WebResult.success(storage.listStoragePool());
+        return WebBody.success(storage.listStoragePool());
     }
 
     @ApiOperation(value = "")
     @DeleteMapping("/pool/{poolName}")
     public String deletePool(@PathVariable("poolName") String poolName) throws Exception {
         storage.deleteStoragePool(poolName);
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 
     @ApiOperation(value = "")
     @PostMapping("/volume")
     public String addVolume(String poolName, int capacity) throws Exception {
         storage.createStorageVolume(poolName, capacity);
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 
     @ApiOperation(value = "")
     @GetMapping("/volume/{poolName}")
     public String getVolume(@PathVariable("poolName") String poolName) throws Exception {
-        return WebResult.success(storage.listStorageVolume(poolName));
+        return WebBody.success(storage.listStorageVolume(poolName));
     }
 
     @ApiOperation(value = "")
     @DeleteMapping("/volume")
     public String deleteVolume(String volKey) throws Exception {
         storage.deleteStorageVolume(volKey);
-        return WebResult.success("ok");
+        return WebBody.success("ok");
     }
 }

+ 2 - 0
dmaster/src/main/resources/META-INF/spring.factories

@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+cn.reghao.autodop.dmaster.view.thymeleaf.config.ThymeleafAutoConfig

+ 3 - 0
dmaster/src/main/resources/application.yml

@@ -1,5 +1,8 @@
 server:
   port: 4020
+  servlet:
+    session:
+      timeout: 86400
 spring:
   application:
     name: autodop-master

+ 4 - 14
dmaster/src/main/resources/static/js/timoTree.js

@@ -22,11 +22,11 @@
             // 获取树形列表数据
             var tree = self.options.tree;
             $.get(tree.data('url'),function(result){
-                if(result.data.list.length > 0){
+                if(result.data.length > 0){
                     // zTree传递列表数据
-                    self.zTreeReady(result.data.list);
+                    self.zTreeReady(result.data);
                     // 树形表格传递列表数据
-                    self.tableTree(result.data.list);
+                    self.tableTree(result.data);
                     // 开启树形表格子级开关
                     self.toggleChild();
                 }
@@ -145,17 +145,9 @@
 
             listData.forEach(function (item) {
                 if(newList[item.pid] != undefined){
-                    if(newList[item.pid].children instanceof Object){
-                        console.log('children 是个对象')
-                        newList[item.pid].children = [];
-                    } else if (newList[item.pid].children == undefined) {
-                        console.log('children 未定义')
+                    if(newList[item.pid].children == undefined){
                         newList[item.pid].children = [];
                     }
-
-                    console.log('children')
-                    console.log(newList[item.pid].children)
-                    //newList[item.pid].children = [];
                     newList[item.pid].children.push(item);
                 }else{
                     treeList.push(item);
@@ -197,8 +189,6 @@
 
         // 展开树形数据
         expandTree: function (list, rank, callback) {
-            console.log('展开树形数据')
-            console.log(list)
             list.forEach(function(item){
                 callback(item, rank);
                 if(item.children != undefined){

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

@@ -20,7 +20,7 @@
                 <input class="layui-input url-input" type="text" name="url"  placeholder="请输入URL地址" th:value="${menu?.url}">
             </div>
         </div>
-        <div class="layui-form-item">
+        <!--<div class="layui-form-item">
             <label class="layui-form-label required">权限标识</label>
             <div class="layui-input-inline">
                 <input class="layui-input perms-input" type="text" name="perms"  placeholder="请输入权限标识" th:value="${menu?.perms}">
@@ -28,7 +28,7 @@
             <button class="layui-btn layui-btn-primary layui-btn-xs perms-refresh" style="margin-top: 8px">
                 <i class="layui-icon layui-icon-refresh" style="margin-right: 0"></i>
             </button>
-        </div>
+        </div>-->
         <div class="layui-form-item">
             <label class="layui-form-label">菜单图标</label>
             <div class="layui-input-inline">
@@ -39,7 +39,7 @@
         <div class="layui-form-item">
             <label class="layui-form-label required">父级菜单</label>
             <div class="layui-input-inline">
-                <input class="layui-input select-tree" th:attr="data-url=@{/system/menu/list}, data-value=${pMenu?.id}" type="text" name="pid"  placeholder="请输入父级菜单" th:value="${pMenu?.title}">
+                <input class="layui-input select-tree" th:attr="data-url=@{/system/menu/list}, data-value=${pMenu?.id}" type="text" name="pid"  placeholder="请输入父级菜单(必须是目录类型)" th:value="${pMenu?.title}">
             </div>
         </div>
         <div class="layui-form-item">
@@ -86,7 +86,7 @@
 
     // 初始化下拉树
     $.fn.selectTree({
-        rootTree: '顶级菜单',
+        rootTree: '',
         // 选中后事件
         onSelected: sortRender
     });
@@ -98,6 +98,7 @@
         var id = sort.data('id') ? sort.data('id') : 0;
         var url = sort.data('url') + "/" + pid + "/" + id;
         $.get(url, function (result) {
+            result = result.data
             var options = '';
             var sortNum = Object.keys(result).length;
             if(pid === $(".select-tree").data('value') && sort.data('sort')){

+ 13 - 12
dmaster/src/main/resources/templates/system/menu/index.html

@@ -1,5 +1,6 @@
 <!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org">
+<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>
@@ -8,14 +9,14 @@
             <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>
             </div>
             <div class="layui-card-body layui-row">
                 <div class="layui-col-lg2 layui-col-sm3">
                     <div class="layui-card timo-nav-tree">
-                        <div class="layui-card-header">菜单结构</div>
+                        <div class="layui-card-header">资源结构</div>
                         <div class="layui-card-body">
                             <ul class="ztree"></ul>
                         </div>
@@ -34,14 +35,14 @@
                             <div class="layui-inline">
                                 <label class="layui-form-label">名称</label>
                                 <div class="layui-input-block">
-                                    <input type="text" name="title" th:value="${param.title}" placeholder="请输入菜单名称"
+                                    <input type="text" name="title" th:value="${param.title}" placeholder="请输入资源名称"
                                            autocomplete="off" class="layui-input">
                                 </div>
                             </div>
                             <div class="layui-inline">
                                 <label class="layui-form-label">URL地址</label>
                                 <div class="layui-input-block">
-                                    <input type="text" name="url" th:value="${param.url}" placeholder="请输入菜单URL地址"
+                                    <input type="text" name="url" th:value="${param.url}" placeholder="请输入资源URL地址"
                                            autocomplete="off" class="layui-input">
                                 </div>
                             </div>
@@ -52,7 +53,7 @@
                             </div>
                         </div>
                         <div class="pull-right screen-btn-group">
-                            <button class="layui-btn open-popup popup-add" data-title="添加菜单"
+                            <button class="layui-btn open-popup popup-add" data-title="添加资源"
                                     th:attr="data-url=@{/system/menu/add}">
                                 <i class="fa fa-plus"></i>
                                 添加
@@ -86,10 +87,10 @@
                                         </label>
                                     </th>
                                     <th>名称</th>
-                                    <th>URL地址</th>
-                                    <th>权限标识</th>
-                                    <th>菜单类型</th>
+                                    <th>URL 地址</th>
+                                    <th>资源类型</th>
                                     <th>状态</th>
+                                    <th>角色列表</th>
                                     <th>操作</th>
                                 </tr>
                             </thead>
@@ -103,11 +104,11 @@
                                     </td>
                                     <td>{{title}}</td>
                                     <td>{{url}}</td>
-                                    <td>{{perms}}</td>
-                                    <td>{{remark}}</td>
+                                    <td>{{type}}</td>
                                     <td>正常</td>
+                                    <td>{{perms}}</td>
                                     <td>
-                                        <a class="open-popup popup-edit" data-title="编辑菜单"
+                                        <a class="open-popup popup-edit" data-title="编辑资源"
                                            th:attr="data-url=@{'/system/menu/edit/{{id}}'}" href="#">编辑
                                         </a>
                                         <a class="open-popup" data-title="详细信息"