Browse Source

resource 页面接口开发中

reghao 5 years ago
parent
commit
f9e7cadf06
27 changed files with 314 additions and 1100 deletions
  1. 9 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/DataStatus.java
  2. 6 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/Menu.java
  3. 1 14
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/MenuType.java
  4. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/repository/MenuRepository.java
  5. 4 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/HomePageController.java
  6. 5 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/LoginPageController.java
  7. 0 26
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/ResourceController.java
  8. 72 44
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/ResourcePageController.java
  9. 0 59
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/RoleController.java
  10. 46 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/RolePageController.java
  11. 0 48
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/UserController.java
  12. 28 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/UserPageController.java
  13. 77 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/service/ResourceService.java
  14. 5 6
      dmaster/src/main/java/cn/reghao/autodop/dmaster/view/thymeleaf/attribute/SelectDictAttrProcessor.java
  15. 37 11
      dmaster/src/main/resources/static/js/main.js
  16. 0 50
      dmaster/src/main/resources/templates/system/actionLog/detail.html
  17. 0 87
      dmaster/src/main/resources/templates/system/actionLog/index.html
  18. 0 87
      dmaster/src/main/resources/templates/system/dept/add.html
  19. 0 52
      dmaster/src/main/resources/templates/system/dept/detail.html
  20. 0 110
      dmaster/src/main/resources/templates/system/dept/index.html
  21. 0 267
      dmaster/src/main/resources/templates/system/dict/add.html
  22. 0 51
      dmaster/src/main/resources/templates/system/dict/detail.html
  23. 0 126
      dmaster/src/main/resources/templates/system/dict/index.html
  24. 2 11
      dmaster/src/main/resources/templates/system/menu/add.html
  25. 5 5
      dmaster/src/main/resources/templates/system/menu/detail.html
  26. 16 31
      dmaster/src/main/resources/templates/system/menu/index.html
  27. 0 2
      dmaster/src/main/resources/templates/system/menu/roleList.html

+ 9 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/DataStatus.java

@@ -0,0 +1,9 @@
+package cn.reghao.autodop.dmaster.auth.entity;
+
+/**
+ * @author reghao
+ * @date 2021-05-17 13:50:14
+ */
+public enum DataStatus {
+    ENABLE, DISABLE
+}

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

@@ -30,8 +30,8 @@ public class Menu extends BaseEntity<Integer> {
     // Menu 类型
     private String type;
     private String icon;
-    @Transient
     private String remark;
+    private String status;
     // 可访问资源的角色,一个资源可被多个角色访问
     @ManyToMany(mappedBy = "menus")
     private Set<Role> roles;
@@ -39,4 +39,9 @@ public class Menu extends BaseEntity<Integer> {
     // 不持久化
     @Transient
     private Map<Integer, Menu> children = new HashMap<>();
+
+    public Menu(int id, String title) {
+        this.id = id;
+        this.title = title;
+    }
 }

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

@@ -5,18 +5,5 @@ package cn.reghao.autodop.dmaster.auth.entity;
  * @date 2021-04-05 02:22:44
  */
 public enum MenuType {
-    /**
-     * 目录
-     */
-    DIR(1),
-    /**
-     * 按钮
-     */
-    BUTTON(2);
-
-    private int code;
-
-    MenuType(int code) {
-        this.code = code;
-    }
+    DIR, BUTTON
 }

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

@@ -12,4 +12,5 @@ import java.util.List;
 public interface MenuRepository extends JpaRepository<Menu, Integer> {
     Menu findById(int id);
     List<Menu> findByPid(int pid);
+    List<Menu> findByStatus(String status);
 }

+ 4 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/HomeController.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/HomePageController.java

@@ -5,6 +5,7 @@ import cn.reghao.autodop.dmaster.auth.entity.Menu;
 import cn.reghao.autodop.dmaster.auth.entity.User;
 import cn.reghao.autodop.dmaster.auth.repository.UserRepository;
 import cn.reghao.autodop.dmaster.auth.repository.MenuRepository;
+import io.swagger.annotations.Api;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -16,12 +17,13 @@ import java.util.stream.Collectors;
  * @author reghao
  * @date 2021-04-04 21:24:18
  */
+@Api("首页页面")
 @Controller
-public class HomeController {
+public class HomePageController {
     private final UserRepository userRepository;
     private final MenuRepository menuRepository;
 
-    public HomeController(UserRepository userRepository, MenuRepository menuRepository) {
+    public HomePageController(UserRepository userRepository, MenuRepository menuRepository) {
         this.userRepository = userRepository;
         this.menuRepository = menuRepository;
     }
@@ -35,10 +37,8 @@ public class HomeController {
         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);
         menus.forEach(menu -> keyMenu.put(menu.getId(), menu));

+ 5 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/LoginController.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/LoginPageController.java

@@ -1,5 +1,6 @@
 package cn.reghao.autodop.dmaster.view.controller;
 
+import io.swagger.annotations.Api;
 import org.springframework.boot.web.servlet.error.ErrorController;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
@@ -9,11 +10,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import javax.servlet.http.HttpServletRequest;
 
 /**
- * @author 小懒虫
- * @date 2018/8/14
+ * @author reghao
+ * @date 2021-04-04 21:24:18
  */
+@Api(tags = "登录页面")
 @Controller
-public class LoginController implements ErrorController {
+public class LoginPageController implements ErrorController {
     /**
      * 跳转到登录页面
      */

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

@@ -1,26 +0,0 @@
-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");
-    }
-}

+ 72 - 44
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/controller/ResourcePageController.java

@@ -1,74 +1,61 @@
 package cn.reghao.autodop.dmaster.view.controller;
 
-import cn.reghao.autodop.dmaster.auth.entity.GrantedAuthorityImpl;
+import cn.reghao.autodop.dmaster.auth.entity.DataStatus;
 import cn.reghao.autodop.dmaster.auth.entity.Role;
-import cn.reghao.autodop.dmaster.auth.entity.User;
-import cn.reghao.autodop.dmaster.auth.repository.RoleRepository;
 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.view.service.ResourceService;
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 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 org.springframework.web.bind.annotation.*;
 
 import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * @author reghao
  * @date 2021-04-04 21:24:18
  */
+@Api(tags = "资源页面")
 @RequestMapping("/system/menu")
 @Controller
 public class ResourcePageController {
-    private final UserRepository userRepository;
-    private final RoleRepository roleRepository;
-    private final MenuRepository menuRepository;
+    private ResourceService resourceService;
 
-    public ResourcePageController(UserRepository userRepository,
-                                  RoleRepository roleRepository,
-                                  MenuRepository menuRepository) {
-        this.userRepository = userRepository;
-        this.roleRepository = roleRepository;
-        this.menuRepository = menuRepository;
+    public ResourcePageController(ResourceService resourceService) {
+        this.resourceService = resourceService;
     }
 
+    @ApiOperation(value = "获取资源页面")
     @GetMapping
-    public String systemMenu(Model model) {
+    public String systemMenu(@RequestParam(value = "status", required = false) String status, Model model) {
+        if (status == null) {
+            status = DataStatus.ENABLE.name();
+        }
+        model.addAttribute("status", status);
         return "/system/menu/index";
     }
 
     @ApiOperation(value = "获取所有的资源")
-    @GetMapping(value = "/list", produces = MediaType.APPLICATION_JSON_VALUE)
+    @GetMapping(value = "/list/{status}", 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()));
-        });
+    public String list(@PathVariable(value = "status", required = false) String status) {
+        if (status == null) {
+            status = DataStatus.ENABLE.name();
+        }
+        List<Menu> list = resourceService.getResourceByStatus(status);
         return WebBody.success(list);
     }
 
-    @ApiOperation(value = "资源添加页面")
+    @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());
+            pMenu = resourceService.getResourceById(pid);
         }
         model.addAttribute("pMenu", pMenu);
         return "/system/menu/add";
@@ -79,20 +66,61 @@ public class ResourcePageController {
     @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", "用户管理");
+        Map<Integer, String> map = resourceService.getMapByPid(pid);
         return WebBody.success(map);
     }
 
+    // TODO Hibernate 会根据传入的 id 自动查找相应的 Menu
     @GetMapping("/roleList/{id}")
-    public String roleListWithResource(@PathVariable("id") Role role, Model model) {
-        List<Role> list = roleRepository.findAll();
+    public String roleListWithResource(@PathVariable("id") Menu menu, Model model) {
+        List<Role> list = new ArrayList<>(menu.getRoles());
         model.addAttribute("list", list);
         return "/system/menu/roleList";
     }
+
+    @ApiOperation(value = "获取资源编辑页面")
+    @GetMapping("/edit/{id}")
+    public String toEdit(@PathVariable("id") Menu menu, Model model) {
+        int pid = menu.getPid();
+        Menu pMenu;
+        if (pid == 0) {
+            pMenu = new Menu(pid, "根菜单");
+        } else {
+            pMenu = resourceService.getResourceById(pid);
+        }
+
+        model.addAttribute("menu", menu);
+        model.addAttribute("pMenu", pMenu);
+        return "/system/menu/add";
+    }
+
+    @ApiOperation(value = "获取资源详细页面")
+    @GetMapping("/detail/{id}")
+    public String toDetail(@PathVariable("id") Menu menu, Model model) {
+        model.addAttribute("menu", menu);
+        return "/system/menu/detail";
+    }
+
+    @ApiOperation(value = "添加资源")
+    @PostMapping(value = "/save", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ResponseBody
+    public String addMenu(Menu menu) {
+        resourceService.addResource(menu);
+        return WebBody.success("ok");
+    }
+
+    @ApiOperation(value = "修改资源状态")
+    @PostMapping(value = "/status/{status}", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ResponseBody
+    public String menuStatus(@PathVariable("status") String status,
+                             @RequestParam("ids") List<Integer> ids) {
+        return WebBody.success("ok");
+    }
+
+    @ApiOperation(value = "删除资源")
+    @DeleteMapping(value = "/status1/{ids}", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ResponseBody
+    public String deleteMenu(@PathVariable("ids") List<Integer> ids) {
+        return WebBody.success("ok");
+    }
 }

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

@@ -1,59 +0,0 @@
-package cn.reghao.autodop.dmaster.view.controller;
-
-import cn.reghao.autodop.dmaster.auth.repository.MenuRepository;
-import cn.reghao.autodop.dmaster.auth.repository.RoleRepository;
-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;
-import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-
-
-/**
- * @author reghao
- * @date 2021-04-04 21:24:18
- */
-@RequestMapping("/system/role")
-@RestController
-public class RoleController {
-    private RoleService roleService;
-    private MenuRepository menuRepository;
-    private RoleRepository roleRepository;
-
-    public RoleController(RoleService roleService, MenuRepository menuRepository, RoleRepository roleRepository) {
-        this.roleService = roleService;
-        this.menuRepository = menuRepository;
-        this.roleRepository = roleRepository;
-    }
-
-    @GetMapping(value = "/authList", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String authList(@RequestParam(value = "ids") Role role) {
-        List<Menu> list = menuRepository.findAll();
-        list.forEach(menu -> {
-            if (menu.getRoles().contains(role)) {
-                menu.setRemark("auth:true");
-            }
-        });
-
-        return WebBody.success(list);
-    }
-
-    @PostMapping(value = "/auth", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String auth(@RequestParam(value = "id", required = true) Role role,
-                       @RequestParam(value = "authId", required = false) HashSet<Menu> menus) {
-        role.setMenus(menus);
-        roleRepository.save(role);
-        return WebBody.success("ok");
-    }
-
-    @PostMapping("/save")
-    public String addRole(Role role) {
-        roleService.addRole(role);
-        return WebBody.success("ok");
-    }
-}

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

@@ -1,18 +1,22 @@
 package cn.reghao.autodop.dmaster.view.controller;
 
 import cn.reghao.autodop.dmaster.auth.entity.GrantedAuthorityImpl;
+import cn.reghao.autodop.dmaster.auth.entity.Menu;
 import cn.reghao.autodop.dmaster.auth.entity.Role;
 import cn.reghao.autodop.dmaster.auth.entity.User;
+import cn.reghao.autodop.dmaster.auth.repository.MenuRepository;
+import cn.reghao.autodop.dmaster.auth.repository.RoleRepository;
 import cn.reghao.autodop.dmaster.auth.repository.UserRepository;
 import cn.reghao.autodop.dmaster.auth.service.RoleService;
 import cn.reghao.autodop.dmaster.common.db.PageList;
+import cn.reghao.autodop.dmaster.utils.WebBody;
+import io.swagger.annotations.Api;
+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.RequestParam;
+import org.springframework.web.bind.annotation.*;
 
+import java.util.HashSet;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -20,15 +24,23 @@ import java.util.stream.Collectors;
  * @author reghao
  * @date 2021-04-04 21:24:18
  */
+@Api(tags = "角色页面")
 @RequestMapping("/system/role")
 @Controller
 public class RolePageController {
     private RoleService roleService;
     private UserRepository userRepository;
+    private RoleRepository roleRepository;
+    private MenuRepository menuRepository;
 
-    public RolePageController(RoleService roleService, UserRepository userRepository) {
+    public RolePageController(RoleService roleService,
+                              UserRepository userRepository,
+                              RoleRepository roleRepository,
+                              MenuRepository menuRepository) {
         this.roleService = roleService;
         this.userRepository = userRepository;
+        this.roleRepository = roleRepository;
+        this.menuRepository = menuRepository;
     }
 
     @GetMapping
@@ -76,4 +88,33 @@ public class RolePageController {
         model.addAttribute("list", list);
         return "/system/role/userList";
     }
+
+    @GetMapping(value = "/authList", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ResponseBody
+    public String authList(@RequestParam(value = "ids") Role role) {
+        List<Menu> list = menuRepository.findAll();
+        list.forEach(menu -> {
+            if (menu.getRoles().contains(role)) {
+                menu.setRemark("auth:true");
+            }
+        });
+
+        return WebBody.success(list);
+    }
+
+    @PostMapping(value = "/auth", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ResponseBody
+    public String auth(@RequestParam(value = "id", required = true) Role role,
+                       @RequestParam(value = "authId", required = false) HashSet<Menu> menus) {
+        role.setMenus(menus);
+        roleRepository.save(role);
+        return WebBody.success("ok");
+    }
+
+    @PostMapping(value = "/save", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ResponseBody
+    public String addRole(Role role) {
+        roleService.addRole(role);
+        return WebBody.success("ok");
+    }
 }

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

@@ -1,48 +0,0 @@
-package cn.reghao.autodop.dmaster.view.controller;
-
-import cn.reghao.autodop.dmaster.auth.entity.Role;
-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.*;
-
-import java.util.HashSet;
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2021-04-04 21:24:18
- */
-@RequestMapping("/system/user")
-@RestController
-public class UserController {
-    private final UserService userService;
-
-    public UserController(UserService userService) {
-        this.userService = userService;
-    }
-
-    @PostMapping("/save")
-    @ResponseBody
-    public String addOrUpdateUser(User user) {
-        userService.addOrUpdate(user);
-        return WebBody.success("ok");
-    }
-
-    @PostMapping("/pwd")
-    @ResponseBody
-    public String modifyPassword(String password,
-                                 String confirm,
-                                 @RequestParam(value = "ids", required = false) List<Long> ids,
-                                 @RequestParam(value = "ids", required = false) List<User> users) {
-        return WebBody.success("");
-    }
-
-    @PostMapping("/role")
-    @ResponseBody
-    public String assignRole(@RequestParam(value = "id") User user,
-                             @RequestParam(value = "roleId", required = false) HashSet<Role> roles) {
-        userService.modifyUserRoles(user, roles);
-        return WebBody.success("ok");
-    }
-}

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

@@ -5,16 +5,20 @@ import cn.reghao.autodop.dmaster.auth.entity.User;
 import cn.reghao.autodop.dmaster.auth.repository.RoleRepository;
 import cn.reghao.autodop.dmaster.auth.service.UserService;
 import cn.reghao.autodop.dmaster.common.db.PageList;
+import cn.reghao.autodop.dmaster.utils.WebBody;
+import io.swagger.annotations.Api;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.HashSet;
 import java.util.List;
 
 /**
  * @author reghao
  * @date 2021-04-04 21:24:18
  */
+@Api(tags = "用户页面")
 @RequestMapping("/system/user")
 @Controller
 public class UserPageController {
@@ -72,4 +76,28 @@ public class UserPageController {
         model.addAttribute("authRoles", authRoles);
         return "/system/user/role";
     }
+
+    @PostMapping("/save")
+    @ResponseBody
+    public String addOrUpdateUser(User user) {
+        userService.addOrUpdate(user);
+        return WebBody.success("ok");
+    }
+
+    @PostMapping("/pwd")
+    @ResponseBody
+    public String modifyPassword(String password,
+                                 String confirm,
+                                 @RequestParam(value = "ids", required = false) List<Long> ids,
+                                 @RequestParam(value = "ids", required = false) List<User> users) {
+        return WebBody.success("");
+    }
+
+    @PostMapping("/role")
+    @ResponseBody
+    public String assignRole(@RequestParam(value = "id") User user,
+                             @RequestParam(value = "roleId", required = false) HashSet<Role> roles) {
+        userService.modifyUserRoles(user, roles);
+        return WebBody.success("ok");
+    }
 }

+ 77 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/view/service/ResourceService.java

@@ -0,0 +1,77 @@
+package cn.reghao.autodop.dmaster.view.service;
+
+import cn.reghao.autodop.dmaster.auth.entity.DataStatus;
+import cn.reghao.autodop.dmaster.auth.entity.Menu;
+import cn.reghao.autodop.dmaster.auth.repository.MenuRepository;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2021-05-17 17:16:19
+ */
+@Service
+public class ResourceService {
+    private final MenuRepository menuRepository;
+
+    public ResourceService(MenuRepository menuRepository) {
+        this.menuRepository = menuRepository;
+    }
+
+    public void addResource(Menu menu) {
+        menu.setStatus(DataStatus.ENABLE.name());
+        int pid = menu.getPid();
+        int sort = menu.getSort();
+
+        List<Menu> menus = menuRepository.findByPid(pid);
+        if (menus.isEmpty()) {
+            menu.setSort(1);
+        } else {
+            if (sort == 0) {
+                menu.setSort(1);
+                List<Menu> tmpList = menus.stream().peek(menu1 -> {
+                    int tmp = menu1.getSort();
+                    menu1.setSort(tmp+1);
+                }).collect(Collectors.toList());
+                menuRepository.saveAll(tmpList);
+                menuRepository.save(menu);
+            } else {
+                Map<Integer, Menu> map = menus.stream().collect(Collectors.toMap(Menu::getSort, menu1 -> menu1));
+                System.out.println();
+            }
+        }
+    }
+
+    public void updateResource(Menu menu) {
+
+    }
+
+    public List<Menu> getResourceByStatus(String status) {
+        List<Menu> menuList = menuRepository.findByStatus(status);
+        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 list;
+    }
+
+    public Map<Integer, String> getMapByPid(int pid) {
+        List<Menu> menus = menuRepository.findByPid(pid);
+        Map<Integer, String> map = new HashMap<>();
+        menus.forEach(menu -> {
+            map.put(menu.getSort(), menu.getTitle());
+        });
+        return map;
+    }
+
+    public Menu getResourceById(int id) {
+        return menuRepository.findById(id);
+    }
+}

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

@@ -21,12 +21,12 @@ 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.get("SEARCH_STATUS").put("ENABLE", "ENABLE");
+        localCache.get("SEARCH_STATUS").put("DISABLE", "DISABLE");
 
         localCache.put("MENU_TYPE", new HashMap<>());
-        localCache.get("MENU_TYPE").put("1", "目录");
-        localCache.get("MENU_TYPE").put("2", "按钮");
+        localCache.get("MENU_TYPE").put("DIR", "DIR");
+        localCache.get("MENU_TYPE").put("BUTTON", "BUTTON");
     }
     
     public static final int PRECEDENCE = 1400;
@@ -42,7 +42,6 @@ public class SelectDictAttrProcessor extends AbstractAttributeTagProcessor {
         super(templateMode, dialectPrefix, null, false, attrName, true, precedence, true);
     }
 
-
     @Override
     protected void doProcess(
             final ITemplateContext context,
@@ -102,7 +101,7 @@ public class SelectDictAttrProcessor extends AbstractAttributeTagProcessor {
         StringBuilder optionContent = new StringBuilder();
         valueList.forEach((key, val) -> {
             optionContent.append("<option value = '").append(key);
-            if(keyList.contains(String.valueOf(key))){
+            if (keyList.contains(String.valueOf(val))){
                 optionContent.append("' ").append("selected='selected");
             }
             optionContent.append("'>").append(val).append("</option>");

+ 37 - 11
dmaster/src/main/resources/static/js/main.js

@@ -91,7 +91,7 @@ layui.use(['element', 'form', 'layer', 'upload'], function () {
         location.reload();
     });
 
-    /* AJAX请求默认选项,处理连接超时问题 */
+    /* ajax 请求默认选项,处理连接超时问题 */
     $.ajaxSetup({
         beforeSend: function () {
             layer.load(0);
@@ -130,18 +130,17 @@ layui.use(['element', 'form', 'layer', 'upload'], function () {
         }
     };
 
-    /* 提交表单数据 */
+    /* 提交表单数据(返回 application/json 数据) */
     $(document).on("click", ".ajax-submit", function (e) {
         e.preventDefault();
         var form = $(this).parents("form");
         var url = form.attr("action");
         var serializeArray = form.serializeArray();
         $.post(url, serializeArray, function (result) {
-            var resBody = JSON.parse(result)
-            if (resBody.data == null) {
-                resBody.data = 'submit[refresh]';
+            if (result.data == null) {
+                result.data = 'submit[refresh]';
             }
-            $.fn.Messager(resBody);
+            $.fn.Messager(result);
         });
     });
 
@@ -165,7 +164,35 @@ layui.use(['element', 'form', 'layer', 'upload'], function () {
         }
     });
 
-    // post方式异步-操作状态
+    /* ajax delete 操作 */
+    $(document).on("click", ".ajax-delete", function (e) {
+        e.preventDefault();
+        var msg = $(this).data("msg");
+        if (msg !== undefined) {
+            layer.confirm(msg + '?', {
+                title: '提示',
+                btn: ['确认', '取消']
+            }, function () {
+                $.ajax({
+                    url: e.target.href,
+                    type: 'DELETE',
+                    success: function (result) {
+                        $.fn.Messager(result);
+                    }
+                })
+            });
+        } else {
+            $.ajax({
+                url: e.target.href,
+                type: 'DELETE',
+                success: function (result) {
+                    $.fn.Messager(result);
+                }
+            })
+        }
+    });
+
+    /* post 方式异步-操作状态 */
     $(".ajax-status").on("click", function (e) {
         e.preventDefault();
         var checked = [];
@@ -190,11 +217,11 @@ layui.use(['element', 'form', 'layer', 'upload'], function () {
             var tdcheckbox = $(".timo-table td .timo-checkbox :checkbox:checked");
             var param = '';
             if (tdcheckbox.length === 0) {
-                layer.msg('请选择一条记录');
+                layer.msg('请选择一条或多条记录');
                 return;
             }
             if (tdcheckbox.length > 1 && $(this).data("type") === 'radio') {
-                layer.msg('只允许选中一');
+                layer.msg('只允许选中一条记录');
                 return;
             }
             tdcheckbox.each(function (key, val) {
@@ -328,7 +355,7 @@ layui.use(['element', 'form', 'layer', 'upload'], function () {
         $("[data-field='"+ field +"']").addClass(isAsc);
     }
 
-    /** 上传图片操作 */
+    /* 上传图片操作 */
     upload.render({
         elem: '.upload-image' //绑定元素
         ,url: $('.upload-image').attr('up-url') //上传接口
@@ -370,5 +397,4 @@ layui.use(['element', 'form', 'layer', 'upload'], function () {
     $(document).on("click", ".upload-item-close", function () {
         $(this).parent('.upload-item').remove();
     });
-
 });

+ 0 - 50
dmaster/src/main/resources/templates/system/actionLog/detail.html

@@ -1,50 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org">
-<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
-</head>
-<body>
-    <div class="timo-detail-page">
-        <div class="timo-detail-title">基本信息</div>
-        <table class="layui-table timo-detail-table">
-            <tbody>
-            <tr>
-                <th width='100px'>日志编号</th>
-                <td th:text="${actionLog.id}"></td>
-                <th width='100px'>日志名称</th>
-                <td th:text="${actionLog.name}"></td>
-            </tr>
-            <tr>
-                <th>日志类型</th>
-                <td th:text="${#dicts.keyValue('LOG_TYPE', actionLog.type)}"></td>
-                <th>操作IP地址</th>
-                <td th:text="${actionLog.ipaddr}"></td>
-            </tr>
-            <tr>
-                <th>产生日志的表</th>
-                <td th:text="${actionLog.model}"></td>
-                <th>产生日志数据id</th>
-                <td th:text="${actionLog.recordId}"></td>
-            </tr>
-            <tr>
-                <th>操作人</th>
-                <td th:if="${actionLog.operBy eq null}">[[${actionLog.operName}]]</td>
-                <td th:if="${actionLog.operBy ne null}">
-                    <a th:href="@{/system/user/index(id=${actionLog.operBy?.id})}">[[${actionLog.operName}]]([[${actionLog.operBy?.id}]])</a>
-                </td>
-                <th>记录时间</th>
-                <td th:text="${#dates.format(actionLog.createDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
-            </tr>
-            <tr>
-                <th>切入点</th>
-                <td colspan="4" th:text="${actionLog.clazz}+'.'+${actionLog.method}+'()'"></td>
-            </tr>
-            <tr>
-                <th>日志消息</th>
-                <td colspan="4"><pre>[[${actionLog.message}]]</pre></td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-<script th:replace="/common/template :: script"></script>
-</body>
-</html>

+ 0 - 87
dmaster/src/main/resources/templates/system/actionLog/index.html

@@ -1,87 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org"
-      xmlns:mo="https://gitee.com/aun/Timo"
-      xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
-<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
-</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>
-    </div>
-    <div class="layui-card-body">
-        <div class="layui-row timo-card-screen">
-            <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="type" mo:dict="LOG_TYPE" mo-selected="${param.type}"
-                                mo-empty="全部"></select>
-                    </div>
-                </div>
-                <div class="layui-inline">
-                    <label class="layui-form-label">日志名称 </label>
-                    <div class="layui-input-block">
-                        <input type="text" name="name" th:value="${param.name}" 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">
-                <a class="layui-btn ajax-get" data-msg="您是否确认清空日志" th:href="@{/system/actionLog/status/delete}"
-                   shiro:hasPermission="system:actionLog:status">
-                    <i class="fa fa-trash"></i> 清空日志</a>
-            </div>
-        </div>
-        <div class="timo-table-wrap">
-            <table class="layui-table timo-table timo-table-fixed">
-                <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="name">日志名称</th>
-                    <th class="sortable" data-field="operBy">操作人</th>
-                    <th class="sortable" data-field="type">日志类型</th>
-                    <th class="sortable" data-field="ipaddr">IP地址</th>
-                    <th class="sortable" data-field="message">日志消息</th>
-                    <th class="sortable" data-field="createDate">记录时间</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.name}">日志名称</td>
-                    <td th:text="${item.operName}">操作人</td>
-                    <td th:text="${#dicts.keyValue('LOG_TYPE', item.type)}">日志类型</td>
-                    <td th:text="${item.ipaddr}">IP地址</td>
-                    <td th:text="${item.message}">日志消息</td>
-                    <td th:text="${#dates.format(item.createDate, 'yyyy-MM-dd HH:mm:ss')}">创建时间</td>
-                    <td>
-                        <a class="open-popup" data-title="详细信息"
-                           th:attr="data-url=@{'/system/actionLog/detail/'+${item.id}}"
-                           shiro:hasPermission="system:actionLog:detail" data-size="800,600"
-                           href="#">详细</a>
-                        <a class="ajax-get" data-msg="您是否确认删除"
-                           th:href="@{/system/actionLog/status/delete(ids=${item.id})}"
-                           shiro:hasPermission="system:actionLog:status">删除</a>
-                    </td>
-                </tr>
-                </tbody>
-            </table>
-        </div>
-        <div th:replace="/common/fragment :: page"></div>
-    </div>
-</div>
-<script th:replace="/common/template :: script"></script>
-</body>
-</html>

+ 0 - 87
dmaster/src/main/resources/templates/system/dept/add.html

@@ -1,87 +0,0 @@
-<!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>
-<div class="layui-form timo-compile">
-    <form th:action="@{/system/dept/save}">
-        <input type="hidden" name="id" th:if="${dept}" th:value="${dept.id}"/>
-        <div class="layui-form-item">
-            <label class="layui-form-label required">部门名称</label>
-            <div class="layui-input-inline">
-                <input class="layui-input" type="text" name="title"  placeholder="请输入标题" th:value="${dept?.title}">
-            </div>
-        </div>
-        <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/dept/list}, data-value=${pDept?.id}" type="text" name="pid"  placeholder="请输入父级部门" th:value="${pDept?.title}">
-            </div>
-        </div>
-        <div class="layui-form-item">
-            <label class="layui-form-label">排序</label>
-            <div class="layui-input-inline">
-                <select class="select-sort" name="sort"
-                        th:attr="data-url=@{/system/dept/sortList}, data-id=${dept?.id}, data-sort=${dept?.sort}" lay-verify="sort"></select>
-            </div>
-            <div class="layui-input-info">(之后)</div>
-        </div>
-        <div class="layui-form-item layui-form-text">
-            <label class="layui-form-label">备注</label>
-            <div class="layui-input-block">
-                <textarea placeholder="请输入内容" class="layui-textarea" name="remark">[[${dept?.remark}]]</textarea>
-            </div>
-        </div>
-        <div class="layui-form-item timo-finally">
-            <button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
-            <button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
-        </div>
-    </form>
-</div>
-<script th:replace="/common/template :: script"></script>
-<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">
-    layui.use(['form'], function () {
-        window.form = layui.form;
-        // 初始化排序下拉选项
-        var pid = $(".select-tree").data('value');
-        if (pid != undefined){
-            sortRender({id: pid});
-        }
-    });
-
-    // 初始化下拉树
-    $.fn.selectTree({
-        rootTree: '顶级',
-        // 选中后事件
-        onSelected: sortRender
-    });
-
-    // 更新渲染排序下拉选项
-    function sortRender(treeNode) {
-        var pid = treeNode.id;
-        var sort = $(".select-sort");
-        var id = sort.data('id') ? sort.data('id') : 0;
-        var url = sort.data('url') + "/" + pid + "/" + id;
-        $.get(url, function (result) {
-            var options = '';
-            var sortNum = Object.keys(result).length;
-            if(pid === $(".select-tree").data('value') && sort.data('sort')){
-                sortNum = sort.data('sort') - 1;
-            }
-            result[0] = "首位";
-            for(var key in result){
-                var selected = sortNum == key ? "selected=''" : "";
-                options += "<option value='"+ key +"' " + selected + ">"+ result[key] +"</option>";
-            }
-            sort.html(options);
-            form.render('select');
-        });
-    }
-</script>
-</body>
-</html>

+ 0 - 52
dmaster/src/main/resources/templates/system/dept/detail.html

@@ -1,52 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org">
-<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
-</head>
-<body>
-    <div class="timo-detail-page">
-        <div class="timo-detail-title">基本信息</div>
-        <table class="layui-table timo-detail-table">
-            <colgroup>
-                <col width="100px"><col>
-                <col width="100px"><col>
-            </colgroup>
-            <tbody>
-            <tr>
-                <th>主键ID</th>
-                <td th:text="${dept.id}"></td>
-                <th>部门名称</th>
-                <td th:text="${dept.title}"></td>
-            </tr>
-            <tr>
-                <th>父级编号</th>
-                <td th:text="${dept.pid}"></td>
-                <th>排序</th>
-                <td th:text="${dept.sort}"></td>
-            </tr>
-            <tr>
-            </tr>
-            <tr>
-                <th>创建时间</th>
-                <td th:text="${#dates.format(dept.createDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
-                <th>更新时间</th>
-                <td th:text="${#dates.format(dept.updateDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
-            </tr>
-            <tr>
-            </tr>
-            <tr>
-                <th>创建者</th>
-                <td th:text="${dept.createBy?.nickname}"></td>
-                <th>更新者</th>
-                <td th:text="${dept.updateBy?.nickname}"></td>
-            </tr>
-            <tr>
-                <th>备注</th>
-                <td th:text="${dept.remark}" colspan="4"></td>
-            </tr>
-            </tbody>
-        </table>
-        <div th:replace="/common/fragment :: log(${dept})"></div>
-    </div>
-<script th:replace="/common/template :: script"></script>
-</body>
-</html>

+ 0 - 110
dmaster/src/main/resources/templates/system/dept/index.html

@@ -1,110 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org"
-      xmlns:mo="https://gitee.com/aun/Timo"
-      xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
-<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 timo-tree" th:attr="data-url=@{'/system/dept/list?'+${search}}">
-    <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-body">
-                    <ul class="ztree"></ul>
-                </div>
-            </div>
-        </div>
-        <div class="layui-col-lg10 layui-col-sm9">
-            <div class="layui-row timo-card-screen">
-                <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="title" th:value="${param.title}" 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">
-                    <button class="layui-btn open-popup popup-add" data-title="添加部门"
-                            th:attr="data-url=@{/system/dept/add}" shiro:hasPermission="system:dept:add"
-                            data-size="500,410">
-                        <i class="fa fa-plus"></i> 添加
-                    </button>
-                    <div class="btn-group" shiro:hasPermission="system:dept:status">
-                        <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/dept/status/ok}">启用</a></dd>
-                            <dd><a class="ajax-status" th:href="@{/system/dept/status/freezed}">冻结</a></dd>
-                            <dd><a class="ajax-status" th:href="@{/system/dept/status/delete}">删除</a></dd>
-                        </dl>
-                    </div>
-                </div>
-            </div>
-            <div class="timo-table-wrap">
-                <table class="layui-table timo-table timo-tree-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>名称</th>
-                        <th>序号</th>
-                        <th>状态</th>
-                        <th>操作</th>
-                    </tr>
-                    </thead>
-                    <tbody class="tree-hide">
-                    <tr class="{{$hide}}" tree-pid="{{pid}}" tree-id="{{id}}">
-                        <td><label class="timo-checkbox"><input type="checkbox" value="{{id}}">
-                            <i class="layui-icon layui-icon-ok"></i></label></td>
-                        <td>{{title}}</td>
-                        <td>{{sort}}</td>
-                        <td>正常</td>
-                        <td>
-                            <a class="open-popup popup-edit" data-title="编辑部门"
-                               th:attr="data-url=@{'/system/dept/edit/{{id}}'}" shiro:hasPermission="system:dept:edit"
-                               data-size="500,410" href="#">编辑</a>
-                            <a class="open-popup" data-title="详细信息" th:attr="data-url=@{'/system/dept/detail/{{id}}'}"
-                               shiro:hasPermission="system:dept:detail"
-                               data-size="800,600" href="#">详细</a>
-                            <a class="ajax-get popup-delete" th:attr="data-msg='您是否确定删除'"
-                               th:href="@{'/system/dept/status/delete?ids={{id}}'}"
-                               shiro:hasPermission="system:dept:status">删除</a>
-                        </td>
-                    </tr>
-                    </tbody>
-                </table>
-            </div>
-        </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="@{/lib/zTree_v3/js/jquery.ztree.exedit.min.js}"></script>
-<script type="text/javascript" th:src="@{/js/timoTree.js}"></script>
-<script type="text/javascript">
-    $.fn.timoTree();
-</script>
-</body>
-</html>

+ 0 - 267
dmaster/src/main/resources/templates/system/dict/add.html

@@ -1,267 +0,0 @@
-<!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})">
-    <style>
-        .dict-value {
-            max-width: 358px;
-            height: 130px;
-            border: 1px solid #e6e6e6;
-        }
-        .dict-value:hover,
-        .dict-value:hover .control {
-            border-color: #C9C9C9;
-        }
-        .dict-value .control {
-            padding: 4px 8px;
-            border-bottom: 1px solid #e6e6e6;
-        }
-        .dict-value .control button {
-            margin: 0;
-            border-color: #ffffff;
-        }
-        .dict-value .control button:hover {
-            border-color: #888888;
-        }
-        .dict-value .control button .fa {
-            margin-right: 4px;
-            color: #888888;
-        }
-        .dict-value .control .field-order .fa {
-            margin: 0;
-        }
-        .dict-value .control .field-order.active {
-            border-color: #C9C9C9;
-        }
-        .dict-value .content {
-            height: 95px;
-            padding: 2px 0;
-            overflow: auto;
-        }
-        .dict-value .content .dict-option {
-            margin: 0;
-            padding: 2px 0;
-            display: block;
-            width: 100%;
-            border: none;
-            text-indent: 4px;
-            font-size: 14px;
-        }
-        .dict-value .content .dict-option:hover {
-            background-color: rgba(1, 170, 237, 0.17);
-        }
-        .dict-value .content .dict-option.active {
-            background-color: rgba(1, 170, 237, 0.37);
-            font-weight: bold;
-        }
-        .dict-value .content .dict-option.error {
-            background-color: rgba(255, 16, 0, 0.41);
-            font-weight: bold;
-        }
-    </style>
-</head>
-<body>
-<div class="layui-form timo-compile">
-    <form th:action="@{/system/dict/add}">
-        <input type="hidden" name="id" th:if="${dict}" th:value="${dict.id}"/>
-        <div class="layui-form-item">
-            <label class="layui-form-label required">字典标识</label>
-            <div class="layui-input-inline">
-                <input class="layui-input" type="text" name="name" placeholder="请输入字典键名" th:value="${dict?.name}">
-            </div>
-        </div>
-        <div class="layui-form-item">
-            <label class="layui-form-label required">字典标题</label>
-            <div class="layui-input-inline">
-                <input class="layui-input" type="text" name="title" placeholder="请输入字典标题" th:value="${dict?.title}">
-            </div>
-        </div>
-        <div class="layui-form-item">
-            <label class="layui-form-label">字典类型</label>
-            <div class="layui-input-inline">
-                <select name="type" mo:dict="DICT_TYPE" mo-selected="${dict} ? ${dict.type} : 2"
-                        lay-verify="type"></select>
-            </div>
-        </div>
-        <div class="layui-form-item layui-form-text">
-            <label class="layui-form-label required">字典值</label>
-            <div class="layui-input-block">
-                <input id="dictValue" name="value" type="hidden" th:value="${dict?.value}">
-                <div class="dict-value">
-                    <div class="control">
-                        <button class="field-add layui-btn layui-btn-primary layui-btn-xs">
-                            <i class="fa fa-plus-circle"></i>添加
-                        </button>
-                        <button class="field-del layui-btn layui-btn-primary layui-btn-xs">
-                            <i class="fa fa-minus-circle"></i>删除
-                        </button>
-                        <button class="field-up layui-btn layui-btn-primary layui-btn-xs">
-                            <i class="fa fa-arrow-up"></i>向上
-                        </button>
-                        <button class="field-down layui-btn layui-btn-primary layui-btn-xs">
-                            <i class="fa fa-arrow-down"></i>向下
-                        </button>
-                        <button class="field-order pull-right layui-btn layui-btn-primary layui-btn-xs"><!--
-                        --><i class="fa fa-list-ol" aria-hidden="true"></i></button>
-                    </div>
-                    <div class="content"></div>
-                </div>
-            </div>
-        </div>
-        <div class="layui-form-item layui-form-text">
-            <label class="layui-form-label">备注</label>
-            <div class="layui-input-block">
-                <textarea placeholder="请输入内容" class="layui-textarea" name="remark">[[${dict?.remark}]]</textarea>
-            </div>
-        </div>
-        <div class="layui-form-item timo-finally">
-            <button class="layui-btn ajax-submit"><i class="fa fa-check-circle"></i> 保存</button>
-            <button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
-        </div>
-    </form>
-</div>
-<script th:replace="/common/template :: script"></script>
-<script>
-    layui.use(['element'], function () {
-        var $ = layui.jquery;
-        // 默认变量
-        var active = null;
-        var option = $("<input class='dict-option'>");
-        var optionSort = false;
-
-        // 初始化数据
-        var dictValue = $("#dictValue");
-        if(dictValue.val() !== ""){
-            var dict = dictValue.val().split(",");
-            var box = $(".dict-value>.content");
-            dict.forEach(function (val) {
-                box.append(option.clone().val(val));
-            });
-        }
-
-        // 获取焦点是选项事件
-        $(document).on("focus", ".dict-option", function () {
-            if (active != null) {
-                active.removeClass("active");
-            }
-            active = $(this).addClass("active");
-        });
-
-        // 失去焦点是选项事件
-        $(document).on("blur", ".dict-option", function () {
-            var kv = $(this).val().split(":");
-            if(kv.length > 1 && kv[1] !== ""){
-                $(this).removeClass("error");
-                updateDict();
-            }else{
-                $(this).addClass("error");
-            }
-        });
-
-        // 向下添加
-        var addOption = function () {
-            var clone = option.clone().val("").addClass("active");
-            active.after(clone).removeClass("active");
-            resetOrder();
-            clone.focus();
-        };
-
-        // 输入框回车事件
-        $(document).on("keypress", ".dict-option", function (e) {
-            if (e.keyCode === 13) {
-                e.preventDefault();
-                addOption();
-            }
-        });
-
-        // 添加字段
-        $(document).on("click", ".field-add", function (e) {
-            e.preventDefault();
-            if (active != null) {
-                addOption();
-            } else {
-                var clone = option.clone();
-                $(".dict-value>.content").append(clone);
-                clone.focus().addClass("active");
-            }
-        });
-
-        // 删除字段
-        $(document).on("click", ".field-del", function (e) {
-            e.preventDefault();
-            if (active != null) {
-                active.remove();
-                active = null;
-            }
-            updateDict();
-        });
-
-        // 上移字段
-        $(document).on("click", ".field-up", function (e) {
-            e.preventDefault();
-            if (active != null) {
-                var prev = active.prev();
-                active.insertBefore(prev);
-                resetOrder();
-            }
-            updateDict();
-        });
-
-        // 下移字段
-        $(document).on("click", ".field-down", function (e) {
-            e.preventDefault();
-            if (active != null) {
-                active.insertAfter(active.next());
-                resetOrder();
-            }
-            updateDict();
-        });
-
-        // 数字顺序开关
-        $(document).on("click", ".field-order", function (e) {
-            e.preventDefault();
-            if ((optionSort = !optionSort)) {
-                $(this).addClass("active");
-                resetOrder();
-                updateDict();
-            } else {
-                $(this).removeClass("active");
-            }
-        });
-
-        // 重置数字顺序
-        var resetOrder = function () {
-            if(!optionSort) return;
-            var index = 1;
-            $(".dict-value>.content input").each(function (key, val) {
-                var kv = $(val).val().split(":");
-                if (key === 0 && kv.length > 0 && kv[0] !== "") {
-                    index = kv[0];
-                }
-                var oVal = (index++) + ":";
-                if (kv.length > 1 && kv[1] !== "") {
-                    oVal += kv[1];
-                }
-                $(val).val(oVal);
-            });
-        }
-
-        // 更新字典值
-        var updateDict = function () {
-            var value = "";
-            $(".dict-value>.content input").each(function (key, val) {
-                var kv = $(val).val().split(":");
-                if(kv.length > 1 && kv[1] !== ""){
-                    value += kv[0] + ":" + kv[1] + ",";
-                }
-            });
-            if (value !== "") {
-                value = value.substr(0, value.length - 1);
-            }
-            dictValue.val(value);
-        }
-
-    });
-</script>
-</body>
-</html>

+ 0 - 51
dmaster/src/main/resources/templates/system/dict/detail.html

@@ -1,51 +0,0 @@
-<!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})">
-</head>
-<body>
-    <div class="timo-detail-page">
-        <div class="timo-detail-title">基本信息</div>
-        <table class="layui-table timo-detail-table">
-            <tbody>
-            <tr>
-                <th width='100px'>字典编号</th>
-                <td th:text="${dict.id}"></td>
-                <th width='100px'>字典标识</th>
-                <td th:text="${dict.name}"></td>
-            </tr>
-            <tr>
-                <th width='100px'>字典标题</th>
-                <td th:text="${dict.title}"></td>
-                <th width='100px'>字典类型</th>
-                <td th:text="${#dicts.keyValue('DICT_TYPE', dict.type)}">字典类型</td>
-            </tr>
-            <tr>
-                <th>字典值</th>
-                <td colspan="4">
-                    <div class="detail-remark">[[${dict.value}]]</div>
-                </td>
-            </tr>
-            <tr>
-                <th>创建用户</th>
-                <td th:text="${dict.createBy?.nickname}"></td>
-                <th>更新用户</th>
-                <td th:text="${dict.updateBy?.nickname}"></td>
-            </tr>
-            <tr>
-                <th>创建时间</th>
-                <td th:text="${#dates.format(dict.createDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
-                <th>最后修改</th>
-                <td th:text="${#dates.format(dict.updateDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
-            </tr>
-            <tr>
-                <th>备注</th>
-                <td th:text="${dict.remark}" colspan="4"></td>
-            </tr>
-            </tbody>
-        </table>
-        <div th:replace="/common/fragment :: log(${dict})"></div>
-    </div>
-<script th:replace="/common/template :: script"></script>
-</body>
-</html>

+ 0 - 126
dmaster/src/main/resources/templates/system/dict/index.html

@@ -1,126 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org"
-      xmlns:mo="https://gitee.com/aun/Timo"
-      xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
-<head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
-    <style>
-        .dict-value {
-            max-width: 300px;
-            overflow: hidden;
-            text-overflow: ellipsis;
-            white-space: nowrap;
-        }
-    </style>
-</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>
-    </div>
-    <div class="layui-card-body">
-        <div class="layui-row timo-card-screen">
-            <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="name" th:value="${param.name}" placeholder="请输入字典标识" autocomplete="off"
-                               class="layui-input">
-                    </div>
-                </div>
-                <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="请输入字典标题"
-                               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">
-                <button class="layui-btn open-popup" data-title="添加字典" th:attr="data-url=@{/system/dict/add}"
-                        shiro:hasPermission="system:dict:add" data-size="615,558">
-                    <i class="fa fa-plus"></i> 添加
-                </button>
-                <div class="btn-group" shiro:hasPermission="system:dict:status">
-                    <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/dict/status/ok}">启用</a></dd>
-                        <dd><a class="ajax-status" th:href="@{/system/dict/status/freezed}">冻结</a></dd>
-                        <dd><a class="ajax-status" th:href="@{/system/dict/status/delete}">删除</a></dd>
-                    </dl>
-                </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="name">字典标识</th>
-                    <th class="sortable" data-field="title">字典标题</th>
-                    <th class="sortable" data-field="type">字典类型</th>
-                    <th class="sortable" data-field="value">字典值</th>
-                    <th class="sortable" data-field="createDate">创建时间</th>
-                    <th class="sortable" data-field="updateDate">更新时间</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.name}">字典键名</td>
-                    <td th:text="${item.title}">字典标题</td>
-                    <td th:text="${#dicts.keyValue('DICT_TYPE', item.type)}">字典类型</td>
-                    <td th:text="${item.value}" class="dict-value">字典键值</td>
-                    <td th:text="${#dates.format(item.createDate, 'yyyy-MM-dd HH:mm:ss')}">创建时间</td>
-                    <td th:text="${#dates.format(item.updateDate, 'yyyy-MM-dd HH:mm:ss')}">更新时间</td>
-                    <td>
-                        <a class="open-popup" data-title="编辑字典" th:attr="data-url=@{'/system/dict/edit/'+${item.id}}"
-                           shiro:hasPermission="system:dict:edit"
-                           data-size="615,558" href="#">编辑</a>
-                        <a class="open-popup" data-title="详细信息" th:attr="data-url=@{'/system/dict/detail/'+${item.id}}"
-                           shiro:hasPermission="system:dict:detail"
-                           data-size="800,600" href="#">详细</a>
-                        <a class="ajax-get" data-msg="您是否确认删除" th:href="@{/system/dict/status/delete(ids=${item.id})}"
-                           shiro:hasPermission="system:dict:status">删除</a>
-                    </td>
-                </tr>
-                </tbody>
-            </table>
-        </div>
-        <div th:replace="/common/fragment :: page"></div>
-    </div>
-</div>
-<script th:replace="/common/template :: script"></script>
-<script>
-    layui.use(['element'], function () {
-        var $ = layui.jquery;
-        var dv = $(".dict-value");
-        $(window).on("resize", function () {
-            var width = $("body").width();
-            if (width > 1200) {
-                dv.css("max-width", width * 0.32);
-            } else {
-                dv.css("max-width", width * 0.20);
-            }
-        }).resize();
-    });
-</script>
-</body>
-</html>

+ 2 - 11
dmaster/src/main/resources/templates/system/menu/add.html

@@ -20,15 +20,6 @@
                 <input class="layui-input url-input" type="text" name="url"  placeholder="请输入URL地址" th:value="${menu?.url}">
             </div>
         </div>
-        <!--<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}">
-            </div>
-            <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 class="layui-form-item">
             <label class="layui-form-label">菜单图标</label>
             <div class="layui-input-inline">
@@ -39,7 +30,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/enable}, data-value=${pMenu?.id}" type="text" name="pid"  placeholder="请输入父级菜单(必须是目录类型)" th:value="${pMenu?.title}">
             </div>
         </div>
         <div class="layui-form-item">
@@ -106,7 +97,7 @@
             }
             result[0] = "首位";
             for(var key in result){
-                var selected = sortNum == key ? "selected=''" : "";
+                var selected = sortNum === key ? "selected=''" : "";
                 options += "<option value='"+ key +"' " + selected + ">"+ result[key] +"</option>";
             }
             sort.html(options);

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

@@ -23,8 +23,8 @@
             <tr>
                 <th width='100px'>URl地址</th>
                 <td th:text="${menu.url}"></td>
-                <th width='100px'>权限标识</th>
-                <td th:text="${menu.perms}"></td>
+                <!--<th width='100px'>权限标识</th>
+                <td th:text="${menu.perms}"></td>-->
             </tr>
             <tr>
                 <th width='100px'>菜单类型</th>
@@ -32,7 +32,7 @@
                 <th width='100px'>本级排序</th>
                 <td th:text="${menu.sort}"></td>
             </tr>
-                <tr>
+                <!--<tr>
                     <th>创建用户</th>
                     <td th:text="${menu.createBy?.nickname}"></td>
                     <th>更新用户</th>
@@ -43,14 +43,14 @@
                     <td th:text="${#dates.format(menu.createDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
                     <th>最后修改</th>
                     <td th:text="${#dates.format(menu.updateDate, 'yyyy-MM-dd HH:mm:ss')}"></td>
-                </tr>
+                </tr>-->
                 <tr>
                     <th>备注</th>
                     <td th:text="${menu.remark}" colspan="4"></td>
                 </tr>
             </tbody>
         </table>
-        <div th:replace="/common/fragment :: log(${menu})"></div>
+        <!--<div th:replace="/common/fragment :: log(${menu})"></div>-->
     </div>
 <script th:replace="/common/template :: script"></script>
 </body>

+ 16 - 31
dmaster/src/main/resources/templates/system/menu/index.html

@@ -5,7 +5,7 @@
         <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 timo-tree" th:attr="data-url=@{'/system/menu/list?'+${search}}">
+        <div class="layui-card timo-tree" th:attr="data-url=@{'/system/menu/list/' + ${status}}">
             <div class="layui-card-header timo-card-header">
                 <span>
                     <i class="fa fa-bars"></i>
@@ -28,29 +28,10 @@
                             <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>
+                                    <select id="getByStatus" class="timo-search-select" name="status" onchange="getListByStatus()"
+                                            mo:dict="SEARCH_STATUS" mo-selected="${status}"></select>
                                 </div>
                             </div>
-                            <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="请输入资源名称"
-                                           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地址"
-                                           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">
                             <button class="layui-btn open-popup popup-add" data-title="添加资源"
@@ -64,13 +45,10 @@
                                 </button>
                                 <dl class="layui-nav-child layui-anim layui-anim-upbit">
                                     <dd>
-                                        <a class="ajax-status" th:href="@{/system/menu/status/ok}">启用</a>
-                                    </dd>
-                                    <dd>
-                                        <a class="ajax-status" th:href="@{/system/menu/status/freezed}">冻结</a>
+                                        <a class="ajax-status" th:href="@{/system/menu/status/enable}">启用</a>
                                     </dd>
                                     <dd>
-                                        <a class="ajax-status" th:href="@{/system/menu/status/delete}">删除</a>
+                                        <a class="ajax-status" th:href="@{/system/menu/status/disable}">停用</a>
                                     </dd>
                                 </dl>
                             </div>
@@ -89,7 +67,7 @@
                                     <th>名称</th>
                                     <th>URL 地址</th>
                                     <th>资源类型</th>
-                                    <th>状态</th>
+                                    <!--<th>状态</th>-->
                                     <th>查看</th>
                                     <th>操作</th>
                                 </tr>
@@ -105,7 +83,7 @@
                                     <td>{{title}}</td>
                                     <td>{{url}}</td>
                                     <td>{{type}}</td>
-                                    <td>正常</td>
+                                    <!--<td>{{status}}</td>-->
                                     <td>
                                         <a class="open-popup" data-title="角色列表"
                                            th:attr="data-url=@{'/system/menu/roleList/{{id}}'}" data-size="800,600"
@@ -119,8 +97,8 @@
                                            th:attr="data-url=@{'/system/menu/detail/{{id}}'}"
                                            data-size="800,600" href="#">详细
                                         </a>
-                                        <a class="ajax-get popup-delete" th:attr="data-msg='您是否确定删除'"
-                                           th:href="@{'/system/menu/status/delete?ids={{id}}'}">删除
+                                        <a class="ajax-delete popup-delete" th:attr="data-msg='您是否确定删除'"
+                                           th:href="@{'/system/menu/status1/{{id}}'}">删除
                                         </a>
                                     </td>
                                 </tr>
@@ -137,6 +115,13 @@
         <script type="text/javascript" th:src="@{/js/timoTree.js}"></script>
         <script type="text/javascript">
             $.fn.timoTree();
+
+            function getListByStatus() {
+                var selectedOption = $("#getByStatus option:selected")
+                var param = selectedOption.text()
+                url = '?status=' + param
+                window.location.href = window.location.pathname + url;
+            }
         </script>
     </body>
 </html>

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

@@ -18,14 +18,12 @@
             <tr>
                 <th>角色</th>
                 <th>角色名</th>
-                <th>操作</th>
             </tr>
             </thead>
             <tbody>
             <tr th:each="item:${list}">
                 <td>[[${item.title}]]</td>
                 <td>[[${item.name}]]</td>
-                <td><a th:href="@{/system/user/index(id=${item.id})}">查看</a></td>
             </tr>
             <tr th:if="${list.isEmpty()}">
                 <td style="text-align: center" colspan="3">未有分配该资源的角色</td>