Selaa lähdekoodia

将 rbac 包的 model 和 db 调整得和 adminweb 一致,但 db 包中接口的方法尚未调整

reghao 4 vuotta sitten
vanhempi
commit
341dda00df
26 muutettua tiedostoa jossa 703 lisäystä ja 303 poistoa
  1. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/controller/page/HomePageController.java
  2. 2 2
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/controller/page/MenuPageController.java
  3. 4 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/controller/page/UserPageController.java
  4. 2 28
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/MenuCrud.java
  5. 41 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/MenuCrudImpl.java
  6. 5 43
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/MenuQuery.java
  7. 59 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/MenuQueryImpl.java
  8. 2 28
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/RoleCrud.java
  9. 41 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/RoleCrudImpl.java
  10. 8 57
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/RoleQuery.java
  11. 94 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/RoleQueryImpl.java
  12. 2 22
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/UserCrud.java
  13. 40 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/UserCrudImpl.java
  14. 7 55
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/UserQuery.java
  15. 86 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/UserQueryImpl.java
  16. 45 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/model/dto/MenuAddDTO.java
  17. 53 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/model/dto/MenuUpdateDTO.java
  18. 46 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/model/dto/RoleDTO.java
  19. 47 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/model/dto/UserAddDTO.java
  20. 24 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/model/dto/UserUpdateDTO.java
  21. 15 15
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/model/po/Menu.java
  22. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/model/po/Role.java
  23. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/model/po/User.java
  24. 3 44
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/service/HomeService.java
  25. 71 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/service/HomeServiceImpl.java
  26. 1 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/service/UserServiceImpl.java

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/controller/page/HomePageController.java

@@ -33,7 +33,7 @@ public class HomePageController implements ErrorController {
     @GetMapping("/")
     public String index(Model model) {
         User user = UserContext.currentUser();
-        List<Menu> menus = homeService.userMenus(user.getRoles());
+        List<Menu> menus = homeService.userMenus(user.getRole());
         Map<Integer, Menu> treeMenu = homeService.treeMenu(menus);
 
         model.addAttribute("user", user);

+ 2 - 2
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/controller/page/MenuPageController.java

@@ -49,7 +49,7 @@ public class MenuPageController {
             pMenu = menuQuery.findById(pid);
         }
 
-        Set<Role> allRoles = roleQuery.findAll();
+        Set<Role> allRoles = new HashSet<>(roleQuery.findAll());
         Set<Role> menuRoles = Collections.emptySet();
 
         model.addAttribute("allRoles", allRoles);
@@ -69,7 +69,7 @@ public class MenuPageController {
             pMenu = menuQuery.findById(pid);
         }
 
-        Set<Role> allRoles = roleQuery.findAll();
+        Set<Role> allRoles = new HashSet<>(roleQuery.findAll());
         Set<Role> menuRoles = menu.getRoles();
 
         model.addAttribute("allRoles", allRoles);

+ 4 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/controller/page/UserPageController.java

@@ -17,6 +17,7 @@ import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -60,7 +61,7 @@ public class UserPageController {
     @ApiOperation(value = "新增用户页面")
     @GetMapping("/add")
     public String addUserPage(Model model) {
-        Set<Role> allRoles = roleQuery.findAll();
+        Set<Role> allRoles = new HashSet<>(new HashSet<>(roleQuery.findAll()));
         Set<Role> userRoles = Collections.emptySet();
 
         model.addAttribute("allRoles", allRoles);
@@ -71,7 +72,7 @@ public class UserPageController {
     @ApiOperation(value = "用户信息编辑页面")
     @GetMapping("/edit/{id}")
     public String editUserPage(@PathVariable("id") User user, Model model) {
-        Set<Role> allRoles = roleQuery.findAll();
+        Set<Role> allRoles = new HashSet<>(roleQuery.findAll());
         Set<Role> userRoles = userQuery.getUserRoles(user);
 
         model.addAttribute("allRoles", allRoles);
@@ -102,7 +103,7 @@ public class UserPageController {
     @ApiOperation(value = "用户角色分配页面")
     @GetMapping("/role/{id}")
     public String assignRolePage(@PathVariable("id") User user, Model model) {
-        Set<Role> roles = roleQuery.findAll();
+        Set<Role> roles = new HashSet<>(roleQuery.findAll());
         int userId = user.getId();
         Set<Role> authRoles = userQuery.getUserRoles(userId);
 

+ 2 - 28
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/MenuCrud.java

@@ -1,37 +1,11 @@
 package cn.reghao.autodop.dmaster.rbac.db.crud;
 
-import cn.reghao.autodop.dmaster.rbac.db.repository.MenuRepository;
 import cn.reghao.autodop.dmaster.rbac.model.po.Menu;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
+import cn.reghao.util.db.BaseCrud;
 
 /**
  * @author reghao
  * @date 2021-09-10 18:55:38
  */
-@Service
-public class MenuCrud {
-    private final MenuRepository menuRepository;
-
-    public MenuCrud(MenuRepository menuRepository) {
-        this.menuRepository = menuRepository;
-    }
-
-    public Menu save(Menu menu) {
-        menuRepository.save(menu);
-        return menu;
-    }
-
-    public void saveAll(List<Menu> menus) {
-        menuRepository.saveAll(menus);
-    }
-
-    public void update(Menu menu) {
-        menuRepository.save(menu);
-    }
-
-    public void delete(Menu menu) {
-        menuRepository.delete(menu);
-    }
+public interface MenuCrud extends BaseCrud<Menu> {
 }

+ 41 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/MenuCrudImpl.java

@@ -0,0 +1,41 @@
+package cn.reghao.autodop.dmaster.rbac.db.crud;
+
+import cn.reghao.autodop.dmaster.rbac.db.repository.MenuRepository;
+import cn.reghao.autodop.dmaster.rbac.model.po.Menu;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2021-09-10 18:55:38
+ */
+@Service
+public class MenuCrudImpl implements MenuCrud {
+    private final MenuRepository menuRepository;
+
+    public MenuCrudImpl(MenuRepository menuRepository) {
+        this.menuRepository = menuRepository;
+    }
+
+    @Override
+    public Menu save(Menu menu) {
+        menuRepository.save(menu);
+        return menu;
+    }
+
+    @Override
+    public void saveAll(List<Menu> menus) {
+        menuRepository.saveAll(menus);
+    }
+
+    @Override
+    public void update(Menu menu) {
+        menuRepository.save(menu);
+    }
+
+    @Override
+    public void delete(Menu menu) {
+        menuRepository.delete(menu);
+    }
+}

+ 5 - 43
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/MenuQuery.java

@@ -1,54 +1,16 @@
 package cn.reghao.autodop.dmaster.rbac.db.crud;
 
 import cn.reghao.autodop.dmaster.rbac.model.po.Menu;
-import cn.reghao.autodop.dmaster.rbac.db.repository.MenuRepository;
-import org.springframework.stereotype.Service;
+import cn.reghao.util.db.BaseQuery;
 
 import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * @author reghao
  * @date 2021-07-12 15:32:26
  */
-@Service
-public class MenuQuery {
-    private final MenuRepository menuRepository;
-
-    public MenuQuery(MenuRepository menuRepository) {
-        this.menuRepository = menuRepository;
-    }
-
-    public List<Menu> findAll() {
-        return menuRepository.findAll();
-    }
-
-    public Menu findById(Integer id) {
-        return menuRepository.getOne(id);
-    }
-
-    public List<Menu> findByPid(Integer pid) {
-        return menuRepository.findByPid(pid);
-    }
-
-    public List<Menu> getSortedMenusByStatus(Boolean isEnabled) {
-        List<Menu> menuList = menuRepository.findByIsEnabled(isEnabled);
-        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::getPos))
-                    .collect(Collectors.toList()));
-        });
-
-        return list;
-    }
-
-    public Map<Integer, String> getSortedChildGroupByPid(int pid) {
-        List<Menu> menus = menuRepository.findByPid(pid);
-        menus.sort(Comparator.comparingInt(Menu::getPos));
-        Map<Integer, String> map = new HashMap<>();
-        menus.forEach(menu -> map.put(menu.getPos(), menu.getName()));
-        return map;
-    }
+public interface MenuQuery extends BaseQuery<Menu> {
+    List<Menu> findByPid(Integer pid);
+    List<Menu> getSortedMenusByStatus(Boolean isEnabled);
+    Map<Integer, String> getSortedChildGroupByPid(int pid);
 }

+ 59 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/MenuQueryImpl.java

@@ -0,0 +1,59 @@
+package cn.reghao.autodop.dmaster.rbac.db.crud;
+
+import cn.reghao.autodop.dmaster.rbac.db.repository.MenuRepository;
+import cn.reghao.autodop.dmaster.rbac.model.po.Menu;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2021-07-12 15:32:26
+ */
+@Service
+public class MenuQueryImpl implements MenuQuery {
+    private final MenuRepository menuRepository;
+
+    public MenuQueryImpl(MenuRepository menuRepository) {
+        this.menuRepository = menuRepository;
+    }
+
+    @Override
+    public List<Menu> findAll() {
+        return menuRepository.findAll();
+    }
+
+    @Override
+    public Menu findById(int id) {
+        return menuRepository.getOne(id);
+    }
+
+    @Override
+    public List<Menu> findByPid(Integer pid) {
+        return menuRepository.findByPid(pid);
+    }
+
+    @Override
+    public List<Menu> getSortedMenusByStatus(Boolean isEnabled) {
+        List<Menu> menuList = menuRepository.findByIsEnabled(isEnabled);
+        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::getPos))
+                    .collect(Collectors.toList()));
+        });
+
+        return list;
+    }
+
+    @Override
+    public Map<Integer, String> getSortedChildGroupByPid(int pid) {
+        List<Menu> menus = menuRepository.findByPid(pid);
+        menus.sort(Comparator.comparingInt(Menu::getPos));
+        Map<Integer, String> map = new HashMap<>();
+        menus.forEach(menu -> map.put(menu.getPos(), menu.getName()));
+        return map;
+    }
+}

+ 2 - 28
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/RoleCrud.java

@@ -1,37 +1,11 @@
 package cn.reghao.autodop.dmaster.rbac.db.crud;
 
 import cn.reghao.autodop.dmaster.rbac.model.po.Role;
-import cn.reghao.autodop.dmaster.rbac.db.repository.RoleRepository;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
+import cn.reghao.util.db.BaseCrud;
 
 /**
  * @author reghao
  * @date 2021-05-11 18:26:15
  */
-@Service
-public class RoleCrud {
-    private final RoleRepository roleRepository;
-
-    public RoleCrud(RoleRepository roleRepository) {
-        this.roleRepository = roleRepository;
-    }
-
-    public Role save(Role role) {
-        roleRepository.save(role);
-        return role;
-    }
-
-    public void saveAll(List<Role> roles) {
-        roleRepository.saveAll(roles);
-    }
-
-    public void update(Role role) {
-        roleRepository.save(role);
-    }
-
-    public void delete(Role role) {
-        roleRepository.delete(role);
-    }
+public interface RoleCrud extends BaseCrud<Role> {
 }

+ 41 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/RoleCrudImpl.java

@@ -0,0 +1,41 @@
+package cn.reghao.autodop.dmaster.rbac.db.crud;
+
+import cn.reghao.autodop.dmaster.rbac.db.repository.RoleRepository;
+import cn.reghao.autodop.dmaster.rbac.model.po.Role;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2021-05-11 18:26:15
+ */
+@Service
+public class RoleCrudImpl implements RoleCrud {
+    private final RoleRepository roleRepository;
+
+    public RoleCrudImpl(RoleRepository roleRepository) {
+        this.roleRepository = roleRepository;
+    }
+
+    @Override
+    public Role save(Role role) {
+        roleRepository.save(role);
+        return role;
+    }
+
+    @Override
+    public void saveAll(List<Role> roles) {
+        roleRepository.saveAll(roles);
+    }
+
+    @Override
+    public void update(Role role) {
+        roleRepository.save(role);
+    }
+
+    @Override
+    public void delete(Role role) {
+        roleRepository.delete(role);
+    }
+}

+ 8 - 57
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/RoleQuery.java

@@ -4,12 +4,10 @@ import cn.reghao.autodop.dmaster.rbac.model.po.UserAuthority;
 import cn.reghao.autodop.dmaster.rbac.model.po.Role;
 import cn.reghao.autodop.dmaster.rbac.model.po.User;
 import cn.reghao.autodop.dmaster.rbac.model.vo.RoleVO;
-import cn.reghao.autodop.dmaster.rbac.db.repository.RoleRepository;
-import cn.reghao.autodop.dmaster.rbac.db.repository.UserRepository;
+import cn.reghao.util.db.BaseQuery;
 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;
@@ -22,46 +20,11 @@ import java.util.stream.Collectors;
  * @author reghao
  * @date 2021-07-12 15:32:26
  */
-@Service
-public class RoleQuery {
-    private final RoleRepository roleRepository;
-    private final UserRepository userRepository;
-
-    public RoleQuery(RoleRepository roleRepository, UserRepository userRepository) {
-        this.roleRepository = roleRepository;
-        this.userRepository = userRepository;
-    }
-
-    public Set<Role> findAll() {
-        return new HashSet<>(roleRepository.findAll());
-    }
-
-    public Role findById(Integer id) {
-        return roleRepository.findById(id).orElse(null);
-    }
-
-    public Role findByTitle(String title) {
-        return roleRepository.findByTitle(title);
-    }
-
-    public Page<RoleVO> getRoleVOByPage(PageRequest pageRequest) {
-        return roleRepository.findAll(pageRequest).map(RoleVO::new);
-    }
-
-    public List<RoleVO> getByMatchName(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 RoleVO getRoleVOById(Integer id) {
-        Role role = findById(id);
-        return role != null ? new RoleVO(role) : null;
-    }
-
+public interface RoleQuery extends BaseQuery<Role> {
+    Role findByTitle(String title);
+    Page<RoleVO> getRoleVOByPage(PageRequest pageRequest);
+    List<RoleVO> getByMatchName(String name);
+    RoleVO getRoleVOById(Integer id);
     /**
      * 获取拥有角色的用户
      *
@@ -69,18 +32,6 @@ public class RoleQuery {
      * @return
      * @date 2021-07-14 下午2:57
      */
-    public List<User> getUsersByRoleId(Integer id) {
-        Role role = findById(id);
-        return getUsersByRole(role);
-    }
-
-    public List<User> getUsersByRole(Role role) {
-        String title = role.getTitle();
-        Specification<User> specification = ((root, query, cb) -> {
-            SetJoin<User, UserAuthority> setJoin = root.joinSet("authorities");
-            Predicate predicate = cb.equal(setJoin.get("role"), title);
-            return cb.and(predicate);
-        });
-        return userRepository.findAll(specification);
-    }
+    List<User> getUsersByRoleId(Integer id);
+    List<User> getUsersByRole(Role role);
 }

+ 94 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/RoleQueryImpl.java

@@ -0,0 +1,94 @@
+package cn.reghao.autodop.dmaster.rbac.db.crud;
+
+import cn.reghao.autodop.dmaster.rbac.db.repository.RoleRepository;
+import cn.reghao.autodop.dmaster.rbac.db.repository.UserRepository;
+import cn.reghao.autodop.dmaster.rbac.model.po.Role;
+import cn.reghao.autodop.dmaster.rbac.model.po.User;
+import cn.reghao.autodop.dmaster.rbac.model.po.UserAuthority;
+import cn.reghao.autodop.dmaster.rbac.model.vo.RoleVO;
+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.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2021-07-12 15:32:26
+ */
+@Service
+public class RoleQueryImpl implements RoleQuery {
+    private final RoleRepository roleRepository;
+    private final UserRepository userRepository;
+
+    public RoleQueryImpl(RoleRepository roleRepository, UserRepository userRepository) {
+        this.roleRepository = roleRepository;
+        this.userRepository = userRepository;
+    }
+
+    @Override
+    public List<Role> findAll() {
+        return roleRepository.findAll();
+    }
+
+    @Override
+    public Role findById(int id) {
+        return roleRepository.findById(id).orElse(null);
+    }
+
+    @Override
+    public Role findByTitle(String title) {
+        return roleRepository.findByTitle(title);
+    }
+
+    @Override
+    public Page<RoleVO> getRoleVOByPage(PageRequest pageRequest) {
+        return roleRepository.findAll(pageRequest).map(RoleVO::new);
+    }
+
+    @Override
+    public List<RoleVO> getByMatchName(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());
+    }
+
+    @Override
+    public RoleVO getRoleVOById(Integer id) {
+        Role role = findById(id);
+        return role != null ? new RoleVO(role) : null;
+    }
+
+    /**
+     * 获取拥有角色的用户
+     *
+     * @param
+     * @return
+     * @date 2021-07-14 下午2:57
+     */
+    @Override
+    public List<User> getUsersByRoleId(Integer id) {
+        Role role = findById(id);
+        return getUsersByRole(role);
+    }
+
+    @Override
+    public List<User> getUsersByRole(Role role) {
+        String title = role.getTitle();
+        Specification<User> specification = ((root, query, cb) -> {
+            SetJoin<User, UserAuthority> setJoin = root.joinSet("authorities");
+            Predicate predicate = cb.equal(setJoin.get("role"), title);
+            return cb.and(predicate);
+        });
+        return userRepository.findAll(specification);
+    }
+}

+ 2 - 22
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/UserCrud.java

@@ -1,31 +1,11 @@
 package cn.reghao.autodop.dmaster.rbac.db.crud;
 
-import cn.reghao.autodop.dmaster.rbac.db.repository.UserRepository;
 import cn.reghao.autodop.dmaster.rbac.model.po.User;
-import org.springframework.stereotype.Service;
+import cn.reghao.util.db.BaseCrud;
 
 /**
  * @author reghao
  * @date 2021-09-10 19:12:38
  */
-@Service
-public class UserCrud {
-    private final UserRepository userRepository;
-
-    public UserCrud(UserRepository userRepository) {
-        this.userRepository = userRepository;
-    }
-
-    public User save(User user) {
-        userRepository.save(user);
-        return user;
-    }
-
-    public void update(User user) {
-        userRepository.save(user);
-    }
-
-    public void delete(User user) {
-        userRepository.delete(user);
-    }
+public interface UserCrud extends BaseCrud<User> {
 }

+ 40 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/UserCrudImpl.java

@@ -0,0 +1,40 @@
+package cn.reghao.autodop.dmaster.rbac.db.crud;
+
+import cn.reghao.autodop.dmaster.rbac.db.repository.UserRepository;
+import cn.reghao.autodop.dmaster.rbac.model.po.User;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2021-09-10 19:12:38
+ */
+@Service
+public class UserCrudImpl implements UserCrud {
+    private final UserRepository userRepository;
+
+    public UserCrudImpl(UserRepository userRepository) {
+        this.userRepository = userRepository;
+    }
+
+    @Override
+    public User save(User user) {
+        userRepository.save(user);
+        return user;
+    }
+
+    @Override
+    public void saveAll(List<User> users) {
+    }
+
+    @Override
+    public void update(User user) {
+        userRepository.save(user);
+    }
+
+    @Override
+    public void delete(User user) {
+        userRepository.delete(user);
+    }
+}

+ 7 - 55
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/UserQuery.java

@@ -1,55 +1,22 @@
 package cn.reghao.autodop.dmaster.rbac.db.crud;
 
-import cn.reghao.autodop.dmaster.rbac.model.po.UserAuthority;
 import cn.reghao.autodop.dmaster.rbac.model.po.Role;
 import cn.reghao.autodop.dmaster.rbac.model.po.User;
 import cn.reghao.autodop.dmaster.rbac.model.vo.UserVO;
-import cn.reghao.autodop.dmaster.rbac.db.repository.RoleRepository;
-import cn.reghao.autodop.dmaster.rbac.db.repository.UserRepository;
+import cn.reghao.util.db.BaseQuery;
 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 java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * @author reghao
  * @date 2021-07-12 15:32:26
  */
-@Service
-public class UserQuery {
-    private final UserRepository userRepository;
-    private final RoleRepository roleRepository;
-
-    public UserQuery(UserRepository userRepository, RoleRepository roleRepository) {
-        this.userRepository = userRepository;
-        this.roleRepository = roleRepository;
-    }
-
-    public User findById(Integer id) {
-        return userRepository.getOne(id);
-    }
-
-    public User findByUsername(String username) {
-        return userRepository.findByUsername(username);
-    }
-
-    public Page<UserVO> getUserVOByPage(PageRequest pageRequest) {
-        return userRepository.findAll(pageRequest).map(UserVO::new);
-    }
-
-    public List<UserVO> getByMatchNickname(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).stream().map(UserVO::new).collect(Collectors.toList());
-    }
-
+public interface UserQuery extends BaseQuery<User> {
+    User findByUsername(String username);
+    Page<UserVO> getUserVOByPage(PageRequest pageRequest);
+    List<UserVO> getByMatchNickname(String nickname);
     /**
      * 获取用户拥有的角色
      *
@@ -57,21 +24,6 @@ public class UserQuery {
      * @return
      * @date 2021-09-10 下午11:12
      */
-    public Set<Role> getUserRoles(User user) {
-        Set<UserAuthority> set = user.getAuthoritiesSet();
-        List<String> roles = set.stream()
-                .map(UserAuthority::getAuthority)
-                .collect(Collectors.toList());
-        Specification<Role> spec = ((root, query, criteriaBuilder) -> root.get("title").in(roles));
-        return new HashSet<>(roleRepository.findAll(spec));
-    }
-
-    public Set<Role> getUserRoles(Integer userId) {
-        User user = findById(userId);
-        if (user == null) {
-            return Collections.emptySet();
-        }
-
-        return getUserRoles(user);
-    }
+    Set<Role> getUserRoles(User user);
+    Set<Role> getUserRoles(Integer userId);
 }

+ 86 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/db/crud/UserQueryImpl.java

@@ -0,0 +1,86 @@
+package cn.reghao.autodop.dmaster.rbac.db.crud;
+
+import cn.reghao.autodop.dmaster.rbac.db.repository.RoleRepository;
+import cn.reghao.autodop.dmaster.rbac.db.repository.UserRepository;
+import cn.reghao.autodop.dmaster.rbac.model.po.Role;
+import cn.reghao.autodop.dmaster.rbac.model.po.User;
+import cn.reghao.autodop.dmaster.rbac.model.po.UserAuthority;
+import cn.reghao.autodop.dmaster.rbac.model.vo.UserVO;
+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 java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2021-07-12 15:32:26
+ */
+@Service
+public class UserQueryImpl implements UserQuery {
+    private final UserRepository userRepository;
+    private final RoleRepository roleRepository;
+
+    public UserQueryImpl(UserRepository userRepository, RoleRepository roleRepository) {
+        this.userRepository = userRepository;
+        this.roleRepository = roleRepository;
+    }
+
+    @Override
+    public User findById(int id) {
+        return userRepository.getOne(id);
+    }
+
+    @Override
+    public User findByUsername(String username) {
+        return userRepository.findByUsername(username);
+    }
+
+    @Override
+    public Page<UserVO> getUserVOByPage(PageRequest pageRequest) {
+        return userRepository.findAll(pageRequest).map(UserVO::new);
+    }
+
+    @Override
+    public List<UserVO> getByMatchNickname(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).stream().map(UserVO::new).collect(Collectors.toList());
+    }
+
+    /**
+     * 获取用户拥有的角色
+     *
+     * @param
+     * @return
+     * @date 2021-09-10 下午11:12
+     */
+    @Override
+    public Set<Role> getUserRoles(User user) {
+        Set<UserAuthority> set = user.getAuthoritiesSet();
+        List<String> roles = set.stream()
+                .map(UserAuthority::getAuthority)
+                .collect(Collectors.toList());
+        Specification<Role> spec = ((root, query, criteriaBuilder) -> root.get("title").in(roles));
+        return new HashSet<>(roleRepository.findAll(spec));
+    }
+
+    @Override
+    public Set<Role> getUserRoles(Integer userId) {
+        User user = findById(userId);
+        if (user == null) {
+            return Collections.emptySet();
+        }
+
+        return getUserRoles(user);
+    }
+}

+ 45 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/model/dto/MenuAddDTO.java

@@ -0,0 +1,45 @@
+package cn.reghao.autodop.dmaster.rbac.model.dto;
+
+import cn.reghao.autodop.dmaster.rbac.model.po.Menu;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Set;
+
+/**
+ * @author reghao
+ * @date 2021-04-04 22:42:14
+ */
+@NoArgsConstructor
+@Data
+public class MenuAddDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    // Menu 类型
+    @NotBlank(message = "菜单类型不能为空白字符串")
+    private String type;
+    @NotBlank(message = "菜单名不能为空白字符串")
+    private String name;
+    @NotBlank(message = "URL 地址不能为空白字符串,目录类型使用可使用 # 字符")
+    private String url;
+    // 父级菜单 ID
+    @NotNull(message = "父级菜单不能为 NULL")
+    private Integer pid;
+    // 在同一个 pid 组内的位置,作为排序使用
+    private Integer pos;
+
+    public Menu to() {
+        Menu menu = new Menu();
+        menu.setType(this.getType());
+        menu.setName(this.getName());
+        menu.setUrl(this.getUrl());
+        menu.setIcon("layui-icon layui-icon-face-smile");
+        menu.setPid(this.getPid());
+        menu.setPos(this.getPos());
+        menu.setIsEnabled(true);
+        return menu;
+    }
+}

+ 53 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/model/dto/MenuUpdateDTO.java

@@ -0,0 +1,53 @@
+package cn.reghao.autodop.dmaster.rbac.model.dto;
+
+import cn.reghao.autodop.dmaster.rbac.model.po.Menu;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Set;
+
+/**
+ * @author reghao
+ * @date 2021-07-15 14:06:13
+ */
+@NoArgsConstructor
+@Data
+public class MenuUpdateDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @NotNull(message = "菜单 ID 不能为 NULL")
+    private Integer menuId;
+    @NotBlank(message = "菜单名不能为空白字符串")
+    private String name;
+    @NotBlank(message = "URL 地址不能为空白字符串,目录类型使用可使用 # 字符")
+    private String url;
+    private String icon;
+    // 父级菜单 ID
+    @NotNull(message = "父级菜单不能为 NULL")
+    private Integer pid;
+    // 在同一个 pid 组内的位置,作为排序使用
+    private Integer pos;
+
+    public MenuUpdateDTO(Menu menu) {
+        this.menuId = menu.getId();
+        this.name = menu.getName();
+        this.url = menu.getUrl();
+        this.icon = menu.getIcon();
+        this.pid = menu.getPid();
+        this.pos = menu.getPos();
+    }
+
+    public Menu to() {
+        Menu menu = new Menu();
+        menu.setId(this.getMenuId());
+        menu.setName(this.getName());
+        menu.setUrl(this.getUrl());
+        menu.setIcon(this.getIcon());
+        menu.setPid(this.getPid());
+        menu.setPos(this.getPos());
+        return menu;
+    }
+}

+ 46 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/model/dto/RoleDTO.java

@@ -0,0 +1,46 @@
+package cn.reghao.autodop.dmaster.rbac.model.dto;
+
+import cn.reghao.autodop.dmaster.rbac.model.po.Role;
+import cn.reghao.util.text.DateTimeConverter;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.Pattern;
+
+/**
+ * @author reghao
+ * @date 2021-07-14 14:14:07
+ */
+@NoArgsConstructor
+@Data
+public class RoleDTO {
+    private Integer roleId;
+    @Pattern(regexp = "^\\w+$", message = "角色只能是数字、英文字符和下划线")
+    private String title;
+    @Pattern(regexp = "^[\\u4e00-\\u9fa5]{0,}$", message = "角色名只能是中文字符")
+    private String name;
+    @Length(max = 100, message = "描述的长度不超过 100 个中文字符")
+    private String description;
+    private String createTime;
+
+    public RoleDTO(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());
+    }
+
+    public Role to() {
+        Role role = new Role();
+        if (this.getRoleId() != null) {
+            role.setId(this.getRoleId());
+        }
+
+        role.setTitle("ROLE_" + this.getTitle());
+        role.setName(this.getName());
+        role.setDescription(this.getDescription());
+        return role;
+    }
+}

+ 47 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/model/dto/UserAddDTO.java

@@ -0,0 +1,47 @@
+package cn.reghao.autodop.dmaster.rbac.model.dto;
+
+import cn.reghao.autodop.dmaster.rbac.model.po.User;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+import java.util.Set;
+
+/**
+ * @author reghao
+ * @date 2021-09-13 17:12:59
+ */
+@Data
+public class UserAddDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    // 用户名和密码
+    @NotBlank(message = "登录名不能为空白字符串")
+    private String username;
+    @NotBlank(message = "密码不能为空白字符串")
+    private String password;
+    @NotEmpty(message = "必须指定角色")
+    @Size(min = 1, max = 1, message = "只能指定一个角色")
+    private Set<Integer> roleIds;
+
+    @NotBlank(message = "用户名不能为空白字符串")
+    private String nickname;
+    private int gender;
+    private String mobilePhone;
+    private String email;
+
+    public User to() {
+        User user = new User();
+        user.setUsername(username);
+        user.setPassword(password);
+        //user.setRoleIds(roleIds);
+        user.setNickname(nickname);
+        user.setGender(gender);
+        user.setMobilePhone(mobilePhone);
+        user.setEmail(email);
+        return user;
+    }
+}

+ 24 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/model/dto/UserUpdateDTO.java

@@ -0,0 +1,24 @@
+package cn.reghao.autodop.dmaster.rbac.model.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @author reghao
+ * @date 2021-07-12 16:06:11
+ */
+@Data
+public class UserUpdateDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @NotNull(message = "用户 ID 不能为 NULL")
+    private Integer userId;
+    @NotBlank(message = "用户名不能为空白字符串")
+    private String nickname;
+    // TODO 验证邮箱和手机号码是否有效
+    private String mobilePhone;
+    private String email;
+}

+ 15 - 15
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/model/po/Menu.java

@@ -23,31 +23,31 @@ import java.util.*;
 @ToString(exclude = {"roles"})
 @Entity
 public class Menu extends BaseEntity<Integer> {
-    // 父级菜单 ID
-    @NotNull(message = "父级菜单不能为 NULL")
-    private Integer pid;
-    // 在同一个 pid 组内的位置,作为排序使用
-    private Integer pos;
+    // Menu 类型
+    @NotBlank(message = "菜单类型不能为空白字符串")
+    private String type;
     @NotBlank(message = "菜单名不能为空白字符串")
     private String name;
     @NotBlank(message = "URL 地址不能为空白字符串,目录类型使用可使用 # 字符")
     private String url;
-    // Menu 类型
-    @NotBlank(message = "菜单类型不能为空白字符串")
-    private String type;
+    @NotNull
     private String icon;
-    @Transient
-    private String remark;
+    // 父级菜单 ID
+    @NotNull(message = "父级菜单不能为 NULL")
+    private Integer pid;
+    // 在同一个 pid 组内的位置,作为排序使用
+    @NotNull
+    private Integer pos;
+    @NotNull
     private Boolean isEnabled;
-    // 可访问资源的角色,一个资源可被多个角色访问
+    // Menu 拥有的所有子 Menu(按排序顺序, 不持久化)
+    @Transient
+    private Map<Integer, Menu> children;
     @ManyToMany(mappedBy = "menus")
     @NotNull(message = "角色不能为 NULL")
     private Set<Role> roles;
-    // Menu 拥有的所有子 Menu(按排序顺序)
-    // 不持久化
     @Transient
-    private Map<Integer, Menu> children;
-    //private Map<Integer, Menu> children = new HashMap<>();
+    private String remark;
 
     public Menu(int id, String name) {
         this.id = id;

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/model/po/Role.java

@@ -6,6 +6,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 import lombok.ToString;
+import org.hibernate.validator.constraints.Length;
 
 import javax.persistence.*;
 import javax.validation.constraints.Pattern;
@@ -27,13 +28,12 @@ public class Role extends BaseEntity<Integer> {
     @Pattern(regexp = "^[\\u4e00-\\u9fa5]{0,}$", message = "只能是中文字符")
     @Column(nullable = false)
     private String name;
+    @Length(max = 100, message = "描述的长度不超过 100 个中文字符")
     private String description;
-    // 角色可访问的资源,一个角色可访问多个资源
-    // TODO Role 端维护 Role 和 Menu 之间的关系
+    // Role 端维护 Role 和 Menu 之间的关系
     @ManyToMany
     @JoinTable(name = "role_menu",
             joinColumns = @JoinColumn(name = "role_id"),
             inverseJoinColumns = @JoinColumn(name = "menu_id"))
-    @JsonIgnore
     private Set<Menu> menus;
 }

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/model/po/User.java

@@ -36,7 +36,7 @@ public class User extends BaseEntity<Integer> implements UserDetails {
     private String salt;
     // roles 和 authorities 是同一个东东, 只是 authorities 用于 Spring Security
     @ElementCollection(fetch = FetchType.EAGER)
-    private Set<String> roles;
+    private Set<String> role;
     @Transient
     private Set<UserAuthority> authorities;
     private Boolean isEnabled;

+ 3 - 44
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/service/HomeService.java

@@ -1,9 +1,6 @@
 package cn.reghao.autodop.dmaster.rbac.service;
 
-import cn.reghao.autodop.dmaster.rbac.db.crud.RoleQuery;
 import cn.reghao.autodop.dmaster.rbac.model.po.Menu;
-import cn.reghao.autodop.dmaster.rbac.model.po.Role;
-import org.springframework.stereotype.Service;
 
 import java.util.*;
 
@@ -11,14 +8,7 @@ import java.util.*;
  * @author reghao
  * @date 2021-04-04 23:36:10
  */
-@Service
-public class HomeService {
-    private final RoleQuery roleQuery;
-
-    public HomeService(RoleQuery roleQuery) {
-        this.roleQuery = roleQuery;
-    }
-
+public interface HomeService {
     /**
      * 用户拥有的角色可访问的资源
      *
@@ -26,16 +16,7 @@ public class HomeService {
      * @return
      * @date 2021-09-10 下午6:27
      */
-    public List<Menu> userMenus(Set<String> roles) {
-        List<Menu> menus = new ArrayList<>();
-        roles.forEach(roleTitle -> {
-            Role role = roleQuery.findByTitle(roleTitle);
-            menus.addAll(role.getMenus());
-        });
-
-        return menus;
-    }
-
+    List<Menu> userMenus(Set<String> roles);
     /**
      * 根据 menu 集合生成页面侧边栏的树形菜单
      *
@@ -43,27 +24,5 @@ public class HomeService {
      * @return
      * @date 2021-09-10 下午6:24
      */
-    public Map<Integer, Menu> treeMenu(List<Menu> menus) {
-        // id -> menu
-        Map<Integer, Menu> keyMenu = new HashMap<>(16);
-        menus.forEach(menu -> keyMenu.put(menu.getId(), menu));
-
-        // 树形菜单数据
-        Map<Integer, Menu> treeMenu = new HashMap<>(16);
-        keyMenu.forEach((id, menu) -> {
-            Menu parentMenu = keyMenu.get(menu.getPid());
-            if (parentMenu != null) {
-                Map<Integer, Menu> childMenus = parentMenu.getChildren();
-                if (childMenus == null) {
-                    childMenus = new HashMap<>();
-                    parentMenu.setChildren(childMenus);
-                }
-                childMenus.put(menu.getPos(), menu);
-            } else {
-                treeMenu.put(menu.getPos(), menu);
-            }
-        });
-
-        return treeMenu;
-    }
+    Map<Integer, Menu> treeMenu(List<Menu> menus);
 }

+ 71 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/service/HomeServiceImpl.java

@@ -0,0 +1,71 @@
+package cn.reghao.autodop.dmaster.rbac.service;
+
+import cn.reghao.autodop.dmaster.rbac.db.crud.RoleQuery;
+import cn.reghao.autodop.dmaster.rbac.model.po.Menu;
+import cn.reghao.autodop.dmaster.rbac.model.po.Role;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * @author reghao
+ * @date 2021-04-04 23:36:10
+ */
+@Service
+public class HomeServiceImpl implements HomeService {
+    private final RoleQuery roleQuery;
+
+    public HomeServiceImpl(RoleQuery roleQuery) {
+        this.roleQuery = roleQuery;
+    }
+
+    /**
+     * 用户拥有的角色可访问的资源
+     *
+     * @param
+     * @return
+     * @date 2021-09-10 下午6:27
+     */
+    @Override
+    public List<Menu> userMenus(Set<String> roles) {
+        List<Menu> menus = new ArrayList<>();
+        roles.forEach(roleTitle -> {
+            Role role = roleQuery.findByTitle(roleTitle);
+            menus.addAll(role.getMenus());
+        });
+
+        return menus;
+    }
+
+    /**
+     * 根据 menu 集合生成页面侧边栏的树形菜单
+     *
+     * @param
+     * @return
+     * @date 2021-09-10 下午6:24
+     */
+    @Override
+    public Map<Integer, Menu> treeMenu(List<Menu> menus) {
+        // id -> menu
+        Map<Integer, Menu> keyMenu = new HashMap<>(16);
+        menus.forEach(menu -> keyMenu.put(menu.getId(), menu));
+
+        // 树形菜单数据
+        Map<Integer, Menu> treeMenu = new HashMap<>(16);
+        keyMenu.forEach((id, menu) -> {
+            Menu parentMenu = keyMenu.get(menu.getPid());
+            if (parentMenu != null) {
+                Map<Integer, Menu> childMenus = parentMenu.getChildren();
+                if (childMenus == null) {
+                    childMenus = new HashMap<>();
+                    parentMenu.setChildren(childMenus);
+                }
+                childMenus.put(menu.getPos(), menu);
+            } else {
+                treeMenu.put(menu.getPos(), menu);
+            }
+        });
+
+        return treeMenu;
+    }
+}

+ 1 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/rbac/service/UserServiceImpl.java

@@ -44,7 +44,7 @@ public class UserServiceImpl implements UserService {
     }
 
     private void setGrantedAuthorities(User user) {
-        Set<UserAuthority> grantedAuthorities = user.getRoles().stream()
+        Set<UserAuthority> grantedAuthorities = user.getRole().stream()
                 .map(UserAuthority::new)
                 .collect(Collectors.toSet());
         user.setAuthorities(grantedAuthorities);