Просмотр исходного кода

完成角色管理模块的页面和接口优化

reghao 4 лет назад
Родитель
Сommit
f1f20c147a
23 измененных файлов с 324 добавлено и 192 удалено
  1. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/interceptor/AppIntegrateReinitInterceptor.java
  2. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/MenuController.java
  3. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/MenuPageController.java
  4. 37 32
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/RoleController.java
  5. 37 33
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/RolePageController.java
  6. 10 12
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/UserPageController.java
  7. 24 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/db/query/MenuQuery.java
  8. 57 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/db/query/RoleQuery.java
  9. 2 6
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/db/query/UserQuery.java
  10. 5 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/po/Role.java
  11. 0 5
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/po/User.java
  12. 28 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/vo/RoleVO.java
  13. 7 35
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/service/RoleService.java
  14. 58 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/service/RoleServiceImpl.java
  15. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/controller/TestController.java
  16. 0 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/controller/GuestController.java
  17. 0 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/controller/HostController.java
  18. 0 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/vm/controller/StorageController.java
  19. 11 6
      dmaster/src/main/resources/templates/auth/role/add.html
  20. 6 13
      dmaster/src/main/resources/templates/auth/role/detail.html
  21. 21 25
      dmaster/src/main/resources/templates/auth/role/index.html
  22. 13 9
      dmaster/src/main/resources/templates/auth/role/menus.html
  23. 1 3
      dmaster/src/main/resources/templates/auth/role/users.html

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/interceptor/AppIntegrateReinitInterceptor.java

@@ -36,7 +36,7 @@ public class AppIntegrateReinitInterceptor {
         MethodSignature signature = (MethodSignature) joinPoint.getSignature();
         String methodName = signature.getName();
         Object[] args = joinPoint.getArgs();
-        log.info("拦截 {} 方法...", methodName);
+        //log.info("拦截 {} 方法...", methodName);
         /*if ("update".equals(methodName) && args[0] instanceof AppOrchestration) {
             AppOrchestration app = (AppOrchestration) args[0];
             String appId = app.getAppId();

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/ResourceController.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/MenuController.java

@@ -20,10 +20,10 @@ import java.util.Map;
 @Api(tags = "资源接口")
 @RequestMapping("/api/auth/menu")
 @RestController
-public class ResourceController {
+public class MenuController {
     private ResourceService resourceService;
 
-    public ResourceController(ResourceService resourceService) {
+    public MenuController(ResourceService resourceService) {
         this.resourceService = resourceService;
     }
 

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/ResourcePageController.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/MenuPageController.java

@@ -19,10 +19,10 @@ import java.util.*;
 @Api(tags = "资源页面")
 @RequestMapping("/auth/menu")
 @Controller
-public class ResourcePageController {
+public class MenuPageController {
     private ResourceService resourceService;
 
-    public ResourcePageController(ResourceService resourceService) {
+    public MenuPageController(ResourceService resourceService) {
         this.resourceService = resourceService;
     }
 

+ 37 - 32
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/RoleController.java

@@ -1,18 +1,19 @@
 package cn.reghao.autodop.dmaster.auth.controller;
 
+import cn.reghao.autodop.dmaster.auth.db.query.MenuQuery;
 import cn.reghao.autodop.dmaster.auth.entity.po.Menu;
 import cn.reghao.autodop.dmaster.auth.entity.po.Role;
-import cn.reghao.autodop.dmaster.auth.repository.MenuRepository;
-import cn.reghao.autodop.dmaster.auth.repository.RoleRepository;
 import cn.reghao.autodop.dmaster.auth.service.RoleService;
 import cn.reghao.autodop.dmaster.utils.WebBody;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.http.MediaType;
-import org.springframework.stereotype.Controller;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.HashSet;
+import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 /**
  * @author reghao
@@ -20,46 +21,50 @@ import java.util.List;
  */
 @Api(tags = "角色接口")
 @RequestMapping("/api/auth/role")
-@Controller
+@RestController
 public class RoleController {
+    private MenuQuery menuQuery;
     private RoleService roleService;
-    private RoleRepository roleRepository;
-    private MenuRepository menuRepository;
 
-    public RoleController(RoleService roleService,
-                          RoleRepository roleRepository,
-                          MenuRepository menuRepository) {
+    public RoleController(MenuQuery menuQuery, RoleService roleService) {
+        this.menuQuery = menuQuery;
         this.roleService = roleService;
-        this.roleRepository = roleRepository;
-        this.menuRepository = menuRepository;
     }
 
-    @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 -> {
+    @ApiOperation("添加或修改角色")
+    @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE)
+    public String addOrModifyRole(@Validated Role role) {
+        roleService.addOrModify(role);
+        return WebBody.success();
+    }
+
+    @ApiOperation("删除角色")
+    @DeleteMapping(value = "/{roleId}", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String deleteRole(@PathVariable("roleId") Integer roleId) {
+        roleService.delete(roleId);
+        return WebBody.success();
+    }
+
+    @ApiOperation("获取角色可访问的资源")
+    @GetMapping(value = "/menus/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String getRoleMenus(@PathVariable("id") Role role) {
+        List<Menu> allMenus = menuQuery.getAllMenus();
+        allMenus.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();
+        return WebBody.success(allMenus);
     }
 
-    @PostMapping(value = "/save", produces = MediaType.APPLICATION_JSON_VALUE)
-    @ResponseBody
-    public String addRole(Role role) {
-        roleService.addRole(role);
+    @ApiOperation("设置角色可访问的资源")
+    @PostMapping(value = "/menus", produces = MediaType.APPLICATION_JSON_VALUE)
+    public String setRoleMenus(@RequestParam(value = "id") Integer roleId,
+                               @RequestParam(value = "menuId", required = false) Set<Menu> menus) {
+        if (menus == null) {
+            menus = Collections.emptySet();
+        }
+        roleService.setRoleMenus(roleId, menus);
         return WebBody.success();
     }
 }

+ 37 - 33
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/RolePageController.java

@@ -1,22 +1,21 @@
 package cn.reghao.autodop.dmaster.auth.controller;
 
-import cn.reghao.autodop.dmaster.auth.entity.po.GrantedAuthorityImpl;
+import cn.reghao.autodop.dmaster.auth.db.query.RoleQuery;
 import cn.reghao.autodop.dmaster.auth.entity.po.Role;
 import cn.reghao.autodop.dmaster.auth.entity.po.User;
-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.auth.entity.vo.RoleVO;
 import cn.reghao.autodop.dmaster.utils.db.PageList;
 import cn.reghao.autodop.dmaster.utils.db.PageSort;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * @author reghao
@@ -26,61 +25,66 @@ import java.util.stream.Collectors;
 @RequestMapping("/auth/role")
 @Controller
 public class RolePageController {
-    private RoleService roleService;
-    private UserRepository userRepository;
-    private RoleRepository roleRepository;
+    private RoleQuery roleQuery;
 
-    public RolePageController(RoleService roleService,
-                              UserRepository userRepository,
-                              RoleRepository roleRepository) {
-        this.roleService = roleService;
-        this.userRepository = userRepository;
-        this.roleRepository = roleRepository;
+    public RolePageController(RoleQuery roleQuery) {
+        this.roleQuery = roleQuery;
     }
 
+    @ApiOperation("角色列表页面")
     @GetMapping
-    public String rolePage(Model model) {
-        PageRequest pageRequest = PageSort.pageRequest();
-        Page<Role> rolePage = roleRepository.findAll(pageRequest);
-        PageList<Role> pageList = PageList.pageList(rolePage);
+    public String rolePage(@RequestParam(value = "name", required = false) String name, Model model) {
+        Page<RoleVO> page;
+        PageList<RoleVO> pageList;
+        if (name != null) {
+            List<RoleVO> list = roleQuery.queryByMatchName(name);
+            page = new PageImpl<>(list);
+            pageList = PageList.pageList(page);
+        } else {
+            PageRequest pageRequest = PageSort.pageRequest();
+            page = roleQuery.getRoleVOByPage(pageRequest);
+            pageList = PageList.pageList(page);
+        }
 
-        model.addAttribute("page", rolePage);
+        model.addAttribute("page", page);
         model.addAttribute("list", pageList.getList());
         return "/auth/role/index";
     }
 
+    @ApiOperation("角色新增页面")
     @GetMapping("/add")
     public String addRolePage() {
         return "/auth/role/add";
     }
 
+    @ApiOperation("角色编辑页面")
     @GetMapping("/edit/{id}")
     public String editRolePage(@PathVariable("id") int id, Model model) {
-        Role role = roleService.findById(id);
-        model.addAttribute("role", role);
+        RoleVO vo = roleQuery.getRoleVOById(id);
+        model.addAttribute("role", vo);
         return "/auth/role/add";
     }
 
+    @ApiOperation("角色详细信息页面")
     @GetMapping("/detail/{id}")
     public String roleDetailPage(@PathVariable("id") int id, Model model) {
-        Role role = roleService.findById(id);
-        model.addAttribute("role", role);
+        RoleVO vo = roleQuery.getRoleVOById(id);
+        model.addAttribute("role", vo);
         return "/auth/role/detail";
     }
 
-    @GetMapping("/auth")
-    public String authPage(@RequestParam(value = "ids") Long id, Model model){
+    @ApiOperation("设置角色可访问的资源页面")
+    @GetMapping("/menus/{id}")
+    public String menusPage(@PathVariable(value = "id") Integer id, Model model){
         model.addAttribute("id", id);
-        return "/auth/role/auth";
+        return "/auth/role/menus";
     }
 
-    @GetMapping("/resource/{id}")
-    public String userListWithRole(@PathVariable("id") Role role, Model model) {
-        List<User> list = userRepository.findAll().stream()
-                .filter(user -> user.getAuthorities().contains(new GrantedAuthorityImpl(role.getTitle())))
-                .collect(Collectors.toList());
-
+    @ApiOperation("拥有角色的所有用户页面")
+    @GetMapping("/users/{id}")
+    public String userListWithRole(@PathVariable("id") Integer roleId, Model model) {
+        List<User> list = roleQuery.getUsersByRoleId(roleId);
         model.addAttribute("list", list);
-        return "/auth/role/resource";
+        return "/auth/role/users";
     }
 }

+ 10 - 12
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/controller/UserPageController.java

@@ -39,21 +39,19 @@ public class UserPageController {
     @ApiOperation(value = "用户列表页面")
     @GetMapping
     public String userPage(@RequestParam(value = "nickname", required = false) String nickname, Model model) {
+        Page<UserVO> page;
+        PageList<UserVO> pageList;
         if (nickname != null) {
-            List<User> list = userQuery.queryByMatchNickname(nickname);
-            Page<User> page = new PageImpl<>(list);
-            PageList<User> pageList = PageList.pageList(page);
-
-            model.addAttribute("page", page);
-            model.addAttribute("list", pageList.getList());
-            return "/auth/user/index";
+            List<UserVO> list = userQuery.queryByMatchNickname(nickname);
+            page = new PageImpl<>(list);
+            pageList = PageList.pageList(page);
+        } else {
+            PageRequest pageRequest = PageSort.pageRequest();
+            page = userQuery.getUserVOByPage(pageRequest);
+            pageList = PageList.pageList(page);
         }
 
-        PageRequest pageRequest = PageSort.pageRequest();
-        Page<UserVO> userPage = userQuery.getUserVOByPage(pageRequest);
-        PageList<UserVO> pageList = PageList.pageList(userPage);
-
-        model.addAttribute("page", userPage);
+        model.addAttribute("page", page);
         model.addAttribute("list", pageList.getList());
         return "/auth/user/index";
     }

+ 24 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/db/query/MenuQuery.java

@@ -0,0 +1,24 @@
+package cn.reghao.autodop.dmaster.auth.db.query;
+
+import cn.reghao.autodop.dmaster.auth.entity.po.Menu;
+import cn.reghao.autodop.dmaster.auth.repository.MenuRepository;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2021-07-12 15:32:26
+ */
+@Service
+public class MenuQuery {
+    private MenuRepository menuRepository;
+
+    public MenuQuery(MenuRepository menuRepository) {
+        this.menuRepository = menuRepository;
+    }
+
+    public List<Menu> getAllMenus() {
+        return menuRepository.findAll();
+    }
+}

+ 57 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/db/query/RoleQuery.java

@@ -1,10 +1,20 @@
 package cn.reghao.autodop.dmaster.auth.db.query;
 
+import cn.reghao.autodop.dmaster.auth.entity.po.GrantedAuthorityImpl;
 import cn.reghao.autodop.dmaster.auth.entity.po.Role;
+import cn.reghao.autodop.dmaster.auth.entity.po.User;
+import cn.reghao.autodop.dmaster.auth.entity.vo.RoleVO;
 import cn.reghao.autodop.dmaster.auth.repository.RoleRepository;
+import cn.reghao.autodop.dmaster.auth.repository.UserRepository;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.SetJoin;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author reghao
@@ -13,12 +23,58 @@ import java.util.List;
 @Service
 public class RoleQuery {
     private RoleRepository roleRepository;
+    private UserRepository userRepository;
 
-    public RoleQuery(RoleRepository roleRepository) {
+    public RoleQuery(RoleRepository roleRepository, UserRepository userRepository) {
         this.roleRepository = roleRepository;
+        this.userRepository = userRepository;
     }
 
     public List<Role> getAllRoles() {
         return roleRepository.findAll();
     }
+
+    public Page<RoleVO> getRoleVOByPage(PageRequest pageRequest) {
+        return roleRepository.findAll(pageRequest).map(RoleVO::new);
+    }
+
+    public List<RoleVO> queryByMatchName(String name) {
+        Specification<Role> specification = (root, query, cb) -> {
+            String likeQuery = String.format("%%%s%%", name);
+            Predicate predicate = cb.like(root.get("name"), likeQuery);
+            return cb.and(predicate);
+        };
+        return roleRepository.findAll(specification).stream().map(RoleVO::new).collect(Collectors.toList());
+    }
+
+    public Role getRoleById(Integer id) {
+        return roleRepository.findById(id).orElse(null);
+    }
+
+    public RoleVO getRoleVOById(Integer id) {
+        Role role = getRoleById(id);
+        return role != null ? new RoleVO(role) : null;
+    }
+
+    /**
+     * 拥有角色的所有用户
+     *
+     * @param
+     * @return
+     * @date 2021-07-14 下午2:57
+     */
+    public List<User> getUsersByRoleId(Integer id) {
+        Role role = getRoleById(id);
+        return getUsersByRole(role);
+    }
+
+    public List<User> getUsersByRole(Role role) {
+        String title = role.getTitle();
+        Specification<User> specification = ((root, query, cb) -> {
+            SetJoin<User, GrantedAuthorityImpl> setJoin = root.joinSet("authorities");
+            Predicate predicate = cb.equal(setJoin.get("role"), title);
+            return cb.and(predicate);
+        });
+        return userRepository.findAll(specification);
+    }
 }

+ 2 - 6
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/db/query/UserQuery.java

@@ -36,17 +36,13 @@ public class UserQuery {
         return userRepository.findAll(pageRequest).map(UserVO::new);
     }
 
-    public Page<User> getUserByPage(PageRequest pageRequest) {
-        return userRepository.findAll(pageRequest);
-    }
-
-    public List<User> queryByMatchNickname(String nickname) {
+    public List<UserVO> queryByMatchNickname(String nickname) {
         Specification<User> specification = (root, query, cb) -> {
             String likeQuery = String.format("%%%s%%", nickname);
             Predicate predicate = cb.like(root.get("nickname"), likeQuery);
             return cb.and(predicate);
         };
-        return userRepository.findAll(specification);
+        return userRepository.findAll(specification).stream().map(UserVO::new).collect(Collectors.toList());
     }
 
     public List<Role> getUserRoles(User user) {

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

@@ -8,6 +8,7 @@ import lombok.NoArgsConstructor;
 import lombok.ToString;
 
 import javax.persistence.*;
+import javax.validation.constraints.Pattern;
 import java.util.Set;
 
 /**
@@ -16,13 +17,15 @@ import java.util.Set;
  */
 @NoArgsConstructor
 @Data
-@EqualsAndHashCode(callSuper = false, exclude = {"remark", "menus"})
+@EqualsAndHashCode(callSuper = false, exclude = {"description", "menus"})
 @ToString(exclude = {"menus"})
 @Entity
 public class Role extends BaseEntity<Integer> {
+    @Pattern(regexp = "^\\w+$", message = "只能是数字、英文字符和下划线")
     private String title;
+    @Pattern(regexp = "^[\\u4e00-\\u9fa5]{0,}$", message = "只能是中文字符")
     private String name;
-    private String remark;
+    private String description;
     // 角色可访问的资源,一个角色可访问多个资源
     @ManyToMany
     @JoinTable(name = "role_menu",

+ 0 - 5
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/po/User.java

@@ -125,9 +125,4 @@ public class User extends BaseEntity<Integer> implements UserDetails {
     public Set<GrantedAuthorityImpl> getAuthoritiesSet() {
         return authorities;
     }
-
-    public void setAuthorities(Set<GrantedAuthorityImpl> set) {
-        authorities.clear();
-        authorities.addAll(set);
-    }
 }

+ 28 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/entity/vo/RoleVO.java

@@ -0,0 +1,28 @@
+package cn.reghao.autodop.dmaster.auth.entity.vo;
+
+import cn.reghao.autodop.common.utils.DateTimeConverter;
+import cn.reghao.autodop.dmaster.auth.entity.po.Role;
+import lombok.Data;
+
+/**
+ * @author reghao
+ * @date 2021-07-14 14:14:07
+ */
+@Data
+public class RoleVO {
+    private Integer roleId;
+    private String title;
+    private String name;
+    private String description;
+    private String createTime;
+    private String updateTime;
+
+    public RoleVO(Role role) {
+        this.roleId = role.getId();
+        this.title = role.getTitle().split("ROLE_")[1];
+        this.name = role.getName();
+        this.description = role.getDescription();
+        this.createTime = DateTimeConverter.format(role.getCreateTime());
+        this.updateTime = DateTimeConverter.format(role.getUpdateTime());
+    }
+}

+ 7 - 35
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/service/RoleService.java

@@ -1,44 +1,16 @@
 package cn.reghao.autodop.dmaster.auth.service;
 
+import cn.reghao.autodop.dmaster.auth.entity.po.Menu;
 import cn.reghao.autodop.dmaster.auth.entity.po.Role;
-import cn.reghao.autodop.dmaster.auth.repository.RoleRepository;
-import cn.reghao.autodop.dmaster.utils.db.PageList;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Sort;
-import org.springframework.stereotype.Service;
+
+import java.util.Set;
 
 /**
  * @author reghao
  * @date 2020-06-19 16:36:53
  */
-@Service
-public class RoleService {
-    private final String ROLE_PREFIX = "ROLE_";
-    private final RoleRepository roleRepository;
-    
-    public RoleService(RoleRepository roleRepository) {
-        this.roleRepository = roleRepository;
-    }
-
-    public void addRole(Role role) {
-        String title = ROLE_PREFIX + role.getTitle();
-        role.setTitle(title.toUpperCase());
-        roleRepository.save(role);
-    }
-
-    public void updateRole(Role role) {
-        roleRepository.save(role);
-    }
-
-    public PageList<Role> findByPage(int page, int size) {
-        PageRequest pageRequest =
-                PageRequest.of(page-1, size, Sort.by(Sort.Direction.DESC, "updateTime"));
-        Page<Role> list = roleRepository.findAll(pageRequest);
-        return PageList.pageList(list);
-    }
-
-    public Role findById(int id) {
-        return roleRepository.findById(id);
-    }
+public interface RoleService {
+    void addOrModify(Role role);
+    void delete(Integer roleId);
+    void setRoleMenus(Integer roleId, Set<Menu> menus);
 }

+ 58 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/auth/service/RoleServiceImpl.java

@@ -0,0 +1,58 @@
+package cn.reghao.autodop.dmaster.auth.service;
+
+import cn.reghao.autodop.dmaster.auth.db.query.RoleQuery;
+import cn.reghao.autodop.dmaster.auth.entity.po.Menu;
+import cn.reghao.autodop.dmaster.auth.entity.po.Role;
+import cn.reghao.autodop.dmaster.auth.entity.po.User;
+import cn.reghao.autodop.dmaster.auth.repository.RoleRepository;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author reghao
+ * @date 2020-06-19 16:36:53
+ */
+@Slf4j
+@Service
+public class RoleServiceImpl implements RoleService {
+    private final String rolePrefix = "ROLE_";
+    private final RoleRepository roleRepository;
+    private RoleQuery roleQuery;
+
+    public RoleServiceImpl(RoleRepository roleRepository, RoleQuery roleQuery) {
+        this.roleRepository = roleRepository;
+        this.roleQuery = roleQuery;
+    }
+
+    @Override
+    public void addOrModify(Role role) {
+        String title = rolePrefix + role.getTitle();
+        role.setTitle(title);
+        roleRepository.save(role);
+    }
+
+    // TODO 待实现
+    @Override
+    public void delete(Integer roleId) {
+        Role role = roleQuery.getRoleById(roleId);
+        List<User> users = roleQuery.getUsersByRole(role);
+        if (!users.isEmpty()) {
+            log.error("还有用户分配有本角色");
+            return;
+        }
+
+        role.getMenus().clear();
+        roleRepository.save(role);
+        roleRepository.delete(role);
+    }
+
+    @Override
+    public void setRoleMenus(Integer roleId, Set<Menu> menus) {
+        Role role = roleQuery.getRoleById(roleId);
+        role.setMenus(menus);
+        roleRepository.save(role);
+    }
+}

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/sys/controller/TestController.java

@@ -56,12 +56,12 @@ public class TestController {
         Role admin = new Role();
         admin.setTitle("ROLE_ADMIN");
         admin.setName("管理员");
-        admin.setRemark("具有所有访问权限");
+        admin.setDescription("具有所有访问权限");
 
         Role user = new Role();
         user.setTitle("ROLE_USER");
         user.setName("用户");
-        user.setRemark("具有最基本的访问权限");
+        user.setDescription("具有最基本的访问权限");
 
         List<Role> roles = new ArrayList<>();
         roles.add(admin);

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

@@ -10,7 +10,6 @@ import org.springframework.web.bind.annotation.*;
  * @author reghao
  * @date 2020-10-31 16:04:58
  */
-@Api(tags = "虚拟机管理接口")
 @RestController
 @RequestMapping("/api/vm/guest")
 public class GuestController {

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

@@ -11,7 +11,6 @@ import org.springframework.web.bind.annotation.*;
  * @date 2020-10-31 16:04:58
  */
 @Slf4j
-@Api(tags = "宿主机管理接口")
 @RestController
 @RequestMapping("/api/vm/host")
 public class HostController {

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

@@ -10,7 +10,6 @@ import org.springframework.web.bind.annotation.*;
  * @author reghao
  * @date 2020-10-31 16:04:58
  */
-@Api(tags = "虚拟磁盘管理接口")
 @RestController
 @RequestMapping("/api/vm/storage")
 public class StorageController {

+ 11 - 6
dmaster/src/main/resources/templates/auth/role/add.html

@@ -4,24 +4,29 @@
 </head>
 <body>
 <div class="layui-form timo-compile">
-    <form th:action="@{/auth/role/save}">
-        <input type="hidden" name="id" th:if="${role}" th:value="${role.id}"/>
+    <form th:action="@{/api/auth/role}">
+        <input type="hidden" name="id" th:if="${role}" th:value="${role?.roleId}"/>
         <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="${role?.title}">
+                <span th:if="${role} != null">
+                    <input class="layui-input" type="text" name="title"  readonly="true" th:value="${role?.title}">
+                </span>
+                <span th:if="${role} == null">
+                    <input class="layui-input" type="text" name="title"  placeholder="请输入角色(只能是英文字符)" th:value="${role?.title}">
+                </span>
             </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="name"  placeholder="请输入角色名" th:value="${role?.name}">
+                <input class="layui-input" type="text" name="name"  placeholder="请输入角色名(只能是中文字符)" th:value="${role?.name}">
             </div>
         </div>
         <div class="layui-form-item layui-form-text">
-            <label class="layui-form-label">备注</label>
+            <label class="layui-form-label">描述</label>
             <div class="layui-input-block">
-                <textarea placeholder="请输入内容" class="layui-textarea" name="remark">[[${role?.remark}]]</textarea>
+                <textarea placeholder="请输入内容" class="layui-textarea" name="description">[[${role?.description}]]</textarea>
             </div>
         </div>
         <div class="layui-form-item timo-finally">

+ 6 - 13
dmaster/src/main/resources/templates/auth/role/detail.html

@@ -8,30 +8,23 @@
         <table class="layui-table timo-detail-table">
             <tbody>
             <tr>
-                <th width='100px'>角色ID</th>
-                <td th:text="${role.id}"></td>
+                <th width='100px'>角色 ID</th>
+                <td th:text="${role.roleId}"></td>
                 <th width='100px'>角色和角色名</th>
                 <td>[[${role.title}]]([[${role.name}]])</td>
             </tr>
-            <!--<tr>
-                <th>创建用户</th>
-                <td th:text="${role.createBy?.nickname}"></td>
-                <th>更新用户</th>
-                <td th:text="${role.updateBy?.nickname}"></td>
-            </tr>-->
+            <tr>
+                <th width='100px'>角色描述</th>
+                <td th:text="${role.description}"></td>
+            </tr>
             <tr>
                 <th>创建时间</th>
                 <td th:text="${role.createTime}"></td>
                 <th>最后修改</th>
                 <td th:text="${role.updateTime}"></td>
             </tr>
-            <tr>
-                <th>备注</th>
-                <td th:text="${role.remark}" colspan="4"></td>
-            </tr>
             </tbody>
         </table>
-        <!--<div th:replace="/common/fragment :: log(${role})"></div>-->
     </div>
 <script th:replace="/common/template :: script"></script>
 </body>

+ 21 - 25
dmaster/src/main/resources/templates/auth/role/index.html

@@ -1,6 +1,5 @@
 <!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org"
-      xmlns:mo="https://gitee.com/aun/Timo">
+<html xmlns:th="http://www.thymeleaf.org">
 <head th:replace="/common/template :: header(~{::title},~{::link},~{::style})">
 </head>
 <body class="timo-layout-page">
@@ -13,9 +12,9 @@
         <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>
+                    <label class="layui-form-label">角色</label>
                     <div class="layui-input-block">
-                        <input type="text" name="title" th:value="${param.name}" placeholder="请输入角色"
+                        <input type="text" name="name" th:value="${param.name}" placeholder="请输入角色"
                                autocomplete="off" class="layui-input">
                     </div>
                 </div>
@@ -30,47 +29,44 @@
                         data-size="460,357">
                     <i class="fa fa-plus"></i> 添加
                 </button>
-                <button class="layui-btn open-popup-param" data-type="radio" data-title="授权管理"
-                        th:attr="data-url=@{/auth/role/auth}" data-size="600,500">
-                    <i class="fa fa-user-secret"></i> 分配权限
-                </button>
             </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="title">角色</th>
-                    <th class="sortable" data-field="name">角色名</th>
-                    <th class="sortable" data-field="createTime">创建时间</th>
-                    <th class="sortable" data-field="updateTime">更新时间</th>
-                    <th>可访问的资源</th>
+                    <th data-field="title">角色</th>
+                    <th data-field="name">角色名</th>
+                    <th data-field="description">描述</th>
+                    <th data-field="createTime">创建时间</th>
+                    <th>拥有角色的用户</th>
+                    <th>授权资源</th>
                     <th>操作</th>
                 </tr>
                 </thead>
                 <tbody>
                 <tr th:each="item:${list}">
-                    <td><label class="timo-checkbox"><input type="checkbox" th:value="${item.id}">
-                        <i class="layui-icon layui-icon-ok"></i></label></td>
                     <td th:text="${item.title}">角色</td>
                     <td th:text="${item.name}">角色名</td>
+                    <td th:text="${item.description}">描述</td>
                     <td th:text="${item.createTime}">创建时间</td>
-                    <td th:text="${item.updateTime}">更新时间</td>
                     <td>
-                        <a class="open-popup" data-title="可访问的资源"
-                           th:attr="data-url=@{'/auth/role/resource/'+${item.id}}" data-size="800,600"
+                        <a class="open-popup" data-title="拥有角色的用户"
+                           th:attr="data-url=@{'/auth/role/users/'+${item.roleId}}" data-size="800,600"
                            href="#">查看</a>
                     </td>
                     <td>
-                        <a class="open-popup" data-title="编辑角色" th:attr="data-url=@{'/auth/role/edit/'+${item.id}}"
+                        <a class="open-popup" data-title="资源授权"
+                           th:attr="data-url=@{'/auth/role/menus/'+${item.roleId}}" data-size="800,600"
+                           href="#">设置</a>
+                    </td>
+                    <td>
+                        <a class="open-popup" data-title="编辑角色" th:attr="data-url=@{'/auth/role/edit/'+${item.roleId}}"
                            data-size="460,357" href="#">编辑</a>
-                        <a class="open-popup" data-title="详细信息" th:attr="data-url=@{'/auth/role/detail/'+${item.id}}"
+                        <a class="open-popup" data-title="详细信息" th:attr="data-url=@{'/auth/role/detail/'+${item.roleId}}"
                            data-size="800,600" href="#">详细</a>
-                        <a class="ajax-get" data-msg="您是否确认删除" th:href="@{/auth/role/status/delete(ids=${item.id})}">删除</a>
+                        <a class="ajax-delete" th:attr="data-msg='确定要删除 '+ ${item.title} + '?'"
+                           th:href="@{'/api/auth/role/' + ${item.roleId}}">删除</a>
                     </td>
                 </tr>
                 </tbody>

+ 13 - 9
dmaster/src/main/resources/templates/auth/role/auth.html → dmaster/src/main/resources/templates/auth/role/menus.html

@@ -20,10 +20,14 @@
 </head>
 <body>
 <div class="layui-form timo-compile">
-    <ul id="authTree" class="ztree" th:attr="data-url=@{/auth/role/authList(ids=${id})}"></ul>
+    <ul id="authTree" class="ztree" th:attr="data-url=@{'/api/auth/role/menus/'+${id}}"></ul>
     <div class="layui-form-item timo-finally">
-        <button id="submit" class="layui-btn" th:attr="data-url=@{/auth/role/auth}, data-id=${id}"><i class="fa fa-check-circle"></i> 保存</button>
-        <button class="layui-btn btn-secondary close-popup"><i class="fa fa-times-circle"></i> 关闭</button>
+        <button id="submit" class="layui-btn" th:attr="data-url=@{/api/auth/role/menus}, data-id=${id}">
+            <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>
 </div>
 <script th:replace="/common/template :: script"></script>
@@ -83,15 +87,15 @@
         // 提交请求
         $("#submit").click(function () {
             var zTreeObj = $.fn.zTree.getZTreeObj("authTree");
-            var authList = zTreeObj.getCheckedNodes(true);
-            var authIds = [];
-            authIds.push("id="+$(this).data("id"));
-            authList.forEach(function(item){
+            var menuList = zTreeObj.getCheckedNodes(true);
+            var menuIds = [];
+            menuIds.push("id="+$(this).data("id"));
+            menuList.forEach(function(item){
                 if(item.id > 0){
-                    authIds.push("authId="+item.id);
+                    menuIds.push("menuId="+item.id);
                 }
             });
-            $.post($(this).data("url"), authIds.join("&"), function(result){
+            $.post($(this).data("url"), menuIds.join("&"), function(result){
                 if (result.data == null) {
                     result.data = 'submit[refresh]';
                 }

+ 1 - 3
dmaster/src/main/resources/templates/auth/role/resource.html → dmaster/src/main/resources/templates/auth/role/users.html

@@ -17,15 +17,13 @@
             <thead>
             <tr>
                 <th>用户名</th>
-                <th>用户昵称</th>
                 <th>操作</th>
             </tr>
             </thead>
             <tbody>
             <tr th:each="item:${list}">
-                <td>[[${item.username}]]</td>
                 <td>[[${item.nickname}]]</td>
-                <td><a th:href="@{/auth/user/index(id=${item.id})}">查看</a></td>
+                <td><a th:href="@{'/auth/user/detail/'+${item.id}}">查看</a></td>
             </tr>
             <tr th:if="${list.isEmpty()}">
                 <td style="text-align: center" colspan="3">未有分配该角色的用户</td>