feat(菜单模块): 优化菜单模块

This commit is contained in:
vertoryao 2024-12-24 17:12:19 +08:00
parent 6a1fcc9871
commit b6c72c9b90
9 changed files with 70 additions and 33 deletions

View File

@ -24,7 +24,7 @@ public class CustomAuthenticationSuccessHandler implements AuthenticationSuccess
@Override @Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
// response.sendRedirect("/api/rest/user/me"); // response.sendRedirect("/api/rest/user/me");
// request.getRequestDispatcher("/api/rest/user/me").forward(request, response); request.getRequestDispatcher("/api/rest/user/me").forward(request, response);
// Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); // Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
// String sessionId = request.getRequestedSessionId(); // String sessionId = request.getRequestedSessionId();
// String remoteAddr = request.getRemoteAddr(); // String remoteAddr = request.getRemoteAddr();

View File

@ -84,8 +84,9 @@ public class SpringSecurityConfig {
return http return http
.authorizeHttpRequests(auth -> auth .authorizeHttpRequests(auth -> auth
.requestMatchers(HttpMethod.GET, "/api/rest/user/me","/api/rest/user/menu","/api/rest/user/register","/api/rest/user/send-email").permitAll() .requestMatchers(HttpMethod.GET, "/api/rest/user/menu","/api/rest/user/register","/api/rest/user/send-email").permitAll()
.requestMatchers(HttpMethod.POST, "/api/rest/user/login","/api/rest/user/register").permitAll() .requestMatchers(HttpMethod.POST, "/api/rest/user/login","/api/rest/user/register").permitAll()
.requestMatchers("/api/rest/user/me").permitAll()
.requestMatchers("/api/**").authenticated() .requestMatchers("/api/**").authenticated()
) )
// 不用注解直接通过判断路径实现动态访问权限 // 不用注解直接通过判断路径实现动态访问权限

View File

@ -1,5 +1,6 @@
package com.zsc.edu.gateway.modules.system.controller; package com.zsc.edu.gateway.modules.system.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zsc.edu.gateway.framework.security.UserDetailsImpl; import com.zsc.edu.gateway.framework.security.UserDetailsImpl;
@ -8,6 +9,7 @@ import com.zsc.edu.gateway.modules.system.dto.UserSelfUpdateDto;
import com.zsc.edu.gateway.modules.system.dto.UserSelfUpdatePasswordDto; import com.zsc.edu.gateway.modules.system.dto.UserSelfUpdatePasswordDto;
import com.zsc.edu.gateway.modules.system.dto.UserUpdateDto; import com.zsc.edu.gateway.modules.system.dto.UserUpdateDto;
import com.zsc.edu.gateway.modules.system.entity.Authority; import com.zsc.edu.gateway.modules.system.entity.Authority;
import com.zsc.edu.gateway.modules.system.entity.Menu;
import com.zsc.edu.gateway.modules.system.entity.Role; import com.zsc.edu.gateway.modules.system.entity.Role;
import com.zsc.edu.gateway.modules.system.entity.User; import com.zsc.edu.gateway.modules.system.entity.User;
import com.zsc.edu.gateway.modules.system.query.UserQuery; import com.zsc.edu.gateway.modules.system.query.UserQuery;
@ -37,7 +39,6 @@ public class UserController {
private final RoleService roleService; private final RoleService roleService;
private final DeptService deptService; private final DeptService deptService;
private final RoleAuthService roleAuthService;
private final AuthorityService authorityService; private final AuthorityService authorityService;
private final MenuService menuService; private final MenuService menuService;
@ -49,7 +50,7 @@ public class UserController {
* @param csrfToken csrf令牌 * @param csrfToken csrf令牌
* @return 包含csrf令牌和登录用户的认证主体信息 * @return 包含csrf令牌和登录用户的认证主体信息
*/ */
@GetMapping("me") @RequestMapping(value = "me", method = {RequestMethod.POST, RequestMethod.GET})
public Map<String, Object> me(@AuthenticationPrincipal Object principal, CsrfToken csrfToken) { public Map<String, Object> me(@AuthenticationPrincipal Object principal, CsrfToken csrfToken) {
Map<String, Object> map = new LinkedHashMap<>(); Map<String, Object> map = new LinkedHashMap<>();
map.put("user", principal); map.put("user", principal);
@ -193,8 +194,8 @@ public class UserController {
* 根据ID查询用户 * 根据ID查询用户
* */ * */
@GetMapping("/menu") @GetMapping("/menu")
public List<MenuVo> menu() { public List<MenuVo> menu(@AuthenticationPrincipal UserDetailsImpl userDetails) {
List<MenuVo> list = menuService.list().stream().map(MenuVo::new).toList(); List<MenuVo> list = menuService.selectByUserId(userDetails.getId(), Menu.Type.PAGE).stream().map(MenuVo::new).toList();
return TreeUtil.makeTree( return TreeUtil.makeTree(
list, list,
x -> x.getPid() == null, x -> x.getPid() == null,

View File

@ -12,13 +12,12 @@ import lombok.*;
@Getter @Getter
@Setter @Setter
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor() @AllArgsConstructor
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@TableName("sys_menu") @TableName("sys_menu")
public class Menu extends BaseEntity { public class Menu extends BaseEntity {
private Long pid; private Long pid;
private Type type; private Type type;
private String name; private String name;
private String path; private String path;
@ -34,12 +33,10 @@ public class Menu extends BaseEntity {
@AllArgsConstructor @AllArgsConstructor
public enum Type { public enum Type {
PAGE(1, "页面"), PAGE(1, "页面"),
BUTTON(2, "按钮"); OPERATION(2, "操作");
@EnumValue @EnumValue
private final Integer code; private final Integer code;
private final String desc; private final String desc;
} }
} }

View File

@ -1,12 +1,19 @@
package com.zsc.edu.gateway.modules.system.repo; package com.zsc.edu.gateway.modules.system.repo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.zsc.edu.gateway.modules.system.entity.Menu; import com.zsc.edu.gateway.modules.system.entity.Menu;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/** /**
* @author yao * @author yao
*/ */
public interface MenuRepository extends BaseMapper<Menu> { public interface MenuRepository extends BaseMapper<Menu> {
List<Menu> selectByRoleId(Long roleId);
List<Menu> selectByUserId(Long userId, Menu.Type type);
} }

View File

@ -3,8 +3,14 @@ package com.zsc.edu.gateway.modules.system.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.zsc.edu.gateway.modules.system.entity.Menu; import com.zsc.edu.gateway.modules.system.entity.Menu;
import java.util.List;
/** /**
* @author zhuang * @author zhuang
*/ */
public interface MenuService extends IService<Menu> { public interface MenuService extends IService<Menu> {
List<Menu> selectByRoleId(Long roleId);
List<Menu> selectByUserId(Long userId, Menu.Type type);
} }

View File

@ -7,10 +7,21 @@ import com.zsc.edu.gateway.modules.system.service.MenuService;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
/** /**
* @author zhuang * @author zhuang
*/ */
@AllArgsConstructor @AllArgsConstructor
@Service @Service
public class MenuServiceImpl extends ServiceImpl<MenuRepository, Menu> implements MenuService { public class MenuServiceImpl extends ServiceImpl<MenuRepository, Menu> implements MenuService {
@Override
public List<Menu> selectByRoleId(Long roleId) {
return baseMapper.selectByRoleId(roleId);
}
@Override
public List<Menu> selectByUserId(Long userId, Menu.Type type) {
return baseMapper.selectByUserId(userId, type);
}
} }

View File

@ -1,4 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zsc.edu.gateway.modules.system.repo.MenuRepository"> <mapper namespace="com.zsc.edu.gateway.modules.system.repo.MenuRepository">
<select id="selectByRoleId" resultType="Menu">
select m.* from sys_menu m,sys_role_menu rm where m.id=rm.menu_id and rm.role_id=#{roleId}
</select>
<select id="selectByUserId" resultType="Menu">
select m.* from sys_menu m,sys_role_menu rm, sys_user u
where m.id=rm.menu_id and rm.role_id=u.role_id and u.id=#{userId} and m.type=#{type}
</select>
</mapper> </mapper>

View File

@ -11,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import java.util.List; import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest @SpringBootTest
class MenuServiceImplTest { class MenuServiceImplTest {
@ -33,38 +34,43 @@ class MenuServiceImplTest {
menuService.saveBatch(List.of(dashboard, system, user, message)); menuService.saveBatch(List.of(dashboard, system, user, message));
Menu workplace = new Menu(dashboard.getId(), Menu.Type.PAGE, "Workplace", "workplace", "工作台", "icon-dashboard", true, false, 1, "dashboard:workplace", ""); Menu workplace = new Menu(dashboard.getId(), Menu.Type.PAGE, "Workplace", "workplace", "工作台", "icon-dashboard", true, false, 1, "dashboard:workplace", "");
Menu role = new Menu(system.getId(), Menu.Type.PAGE, "Role", "role", "角色管理", null, true, false, 1, "system:role", ""); Menu role = new Menu(system.getId(), Menu.Type.PAGE, "Role", "role", "角色管理", null, true, false, 1, "system:role", "");
Menu roleDelete = new Menu(role.getId(), Menu.Type.BUTTON, "roleDelete", null, "角色删除", null, true, false, 1, "system:role:delete", "");
Menu dept = new Menu(system.getId(), Menu.Type.PAGE, "Dept", "dept", "部门管理", null, true, false, 2, "system:dept", ""); Menu dept = new Menu(system.getId(), Menu.Type.PAGE, "Dept", "dept", "部门管理", null, true, false, 2, "system:dept", "");
Menu users = new Menu(system.getId(), Menu.Type.PAGE, "User", "user", "用户管理", null, true, false, 3, "system:user", ""); Menu users = new Menu(system.getId(), Menu.Type.PAGE, "User", "user", "用户管理", null, true, false, 3, "system:user", "");
Menu authority = new Menu(system.getId(), Menu.Type.BUTTON, "Authority", "authority", "权限管理", null, true, false, 4, "system:authority", ""); Menu authority = new Menu(system.getId(), Menu.Type.PAGE, "Authority", "authority", "权限管理", null, true, false, 4, "system:authority", "");
Menu menu = new Menu(system.getId(), Menu.Type.PAGE, "Menu", "menu", "菜单管理", null, true, false, 5, "system:menu", ""); Menu menu = new Menu(system.getId(), Menu.Type.PAGE, "Menu", "menu", "菜单管理", null, true, false, 5, "system:menu", "");
Menu notice = new Menu(message.getId(), Menu.Type.PAGE, "Notice", "notice", "通知管理", null, true, false, 1, "message:notice", ""); Menu notice = new Menu(message.getId(), Menu.Type.PAGE, "Notice", "notice", "通知管理", null, true, false, 1, "message:notice", "");
Menu bulletin = new Menu(message.getId(), Menu.Type.PAGE, "Bulletin", "bulletin", "公告管理", null, true, false, 2, "message:bulletin", ""); Menu bulletin = new Menu(message.getId(), Menu.Type.PAGE, "Bulletin", "bulletin", "公告管理", null, true, false, 2, "message:bulletin", "");
menuService.saveBatch(List.of(workplace, roleDelete, dept, users, authority, menu, notice, bulletin)); menuService.saveBatch(List.of(workplace, dept, users, authority, menu, notice, bulletin));
Menu roleCreate = new Menu(role.getId(), Menu.Type.BUTTON, "roleCreate", null, "角色新增", null, true, false, 1, "system:role:create", ""); Menu roleCreate = new Menu(role.getId(), Menu.Type.OPERATION, "roleCreate", null, "角色新增", null, true, false, 1, "system:role:create", "");
Menu roleUpdate = new Menu(role.getId(), Menu.Type.BUTTON, "roleUpdate", null, "角色修改", null, true, false, 1, "system:role:update", ""); Menu roleDelete = new Menu(role.getId(), Menu.Type.OPERATION, "roleDelete", null, "角色删除", null, true, false, 1, "system:role:delete", "");
Menu roleQuery = new Menu(role.getId(), Menu.Type.BUTTON, "roleQuery", null, "角色查询", null, true, false, 1, "system:role:query", ""); Menu roleUpdate = new Menu(role.getId(), Menu.Type.OPERATION, "roleUpdate", null, "角色修改", null, true, false, 1, "system:role:update", "");
Menu deptSave = new Menu(dept.getId(), Menu.Type.BUTTON, "deptCreate", null, "部门新增", null, true, false, 1, "system:dept:create", ""); Menu roleQuery = new Menu(role.getId(), Menu.Type.OPERATION, "roleQuery", null, "角色查询", null, true, false, 1, "system:role:query", "");
Menu deptUpdate = new Menu(dept.getId(), Menu.Type.BUTTON, "deptUpdate", null, "部门修改", null, true, false, 1, "system:dept:update", ""); Menu deptSave = new Menu(dept.getId(), Menu.Type.OPERATION, "deptCreate", null, "部门新增", null, true, false, 1, "system:dept:create", "");
Menu deptQuery = new Menu(dept.getId(), Menu.Type.BUTTON, "deptQuery", null, "部门查询", null, true, false, 1, "system:dept:query", ""); Menu deptUpdate = new Menu(dept.getId(), Menu.Type.OPERATION, "deptUpdate", null, "部门修改", null, true, false, 1, "system:dept:update", "");
Menu deptDelete = new Menu(dept.getId(), Menu.Type.BUTTON, "deptDelete", null, "部门删除", null, true, false, 1, "system:dept:delete", ""); Menu deptQuery = new Menu(dept.getId(), Menu.Type.OPERATION, "deptQuery", null, "部门查询", null, true, false, 1, "system:dept:query", "");
Menu userSave = new Menu(dept.getId(), Menu.Type.BUTTON, "userCreate", null, "用户新增", null, true, false, 1, "system:user:create", ""); Menu deptDelete = new Menu(dept.getId(), Menu.Type.OPERATION, "deptDelete", null, "部门删除", null, true, false, 1, "system:dept:delete", "");
Menu userUpdate = new Menu(dept.getId(), Menu.Type.BUTTON, "userUpdate", null, "用户修改", null, true, false, 1, "system:user:update", ""); Menu userSave = new Menu(dept.getId(), Menu.Type.OPERATION, "userCreate", null, "用户新增", null, true, false, 1, "system:user:create", "");
Menu userQuery = new Menu(dept.getId(), Menu.Type.BUTTON, "userQuery", null, "用户查询", null, true, false, 1, "system:user:query", ""); Menu userUpdate = new Menu(dept.getId(), Menu.Type.OPERATION, "userUpdate", null, "用户修改", null, true, false, 1, "system:user:update", "");
Menu userDelete = new Menu(dept.getId(), Menu.Type.BUTTON, "userDelete", null, "用户删除", null, true, false, 1, "system:user:delete", ""); Menu userQuery = new Menu(dept.getId(), Menu.Type.OPERATION, "userQuery", null, "用户查询", null, true, false, 1, "system:user:query", "");
Menu menuSave = new Menu(menu.getId(), Menu.Type.BUTTON, "menuCreate", null, "菜单新增", null, true, false, 1, "system:menu:create", ""); Menu userDelete = new Menu(dept.getId(), Menu.Type.OPERATION, "userDelete", null, "用户删除", null, true, false, 1, "system:user:delete", "");
Menu menuUpdate = new Menu(menu.getId(), Menu.Type.BUTTON, "menuUpdate", null, "菜单修改", null, true, false, 1, "system:menu:update", ""); Menu menuSave = new Menu(menu.getId(), Menu.Type.OPERATION, "menuCreate", null, "菜单新增", null, true, false, 1, "system:menu:create", "");
Menu menuQuery = new Menu(menu.getId(), Menu.Type.BUTTON, "menuQuery", null, "菜单查询", null, true, false, 1, "system:menu:query", ""); Menu menuUpdate = new Menu(menu.getId(), Menu.Type.OPERATION, "menuUpdate", null, "菜单修改", null, true, false, 1, "system:menu:update", "");
Menu menuDelete = new Menu(menu.getId(), Menu.Type.BUTTON, "menuDelete", null, "菜单删除", null, true, false, 1, "system:menu:delete", ""); Menu menuQuery = new Menu(menu.getId(), Menu.Type.OPERATION, "menuQuery", null, "菜单查询", null, true, false, 1, "system:menu:query", "");
menuService.saveBatch(List.of(roleCreate, roleUpdate, roleQuery, deptSave, deptUpdate, deptQuery, deptDelete, userSave, userUpdate, userQuery, userDelete, menuSave, menuUpdate, menuQuery, menuDelete)); Menu menuDelete = new Menu(menu.getId(), Menu.Type.OPERATION, "menuDelete", null, "菜单删除", null, true, false, 1, "system:menu:delete", "");
menuService.saveBatch(List.of(roleCreate, roleDelete, roleUpdate, roleQuery, deptSave, deptUpdate, deptQuery, deptDelete, userSave, userUpdate, userQuery, userDelete, menuSave, menuUpdate, menuQuery, menuDelete));
} }
@Test @Test
public void test() { public void test() {
Role admin = roleService.lambdaQuery().eq(Role::getName, "admin").one(); Role admin = roleService.lambdaQuery().eq(Role::getName, "admin").one();
menuService.list().forEach(menu -> { menuService.list().forEach(menu -> roleMenuRepository.insert(new RoleMenu(admin.getId(), menu.getId())));
roleMenuRepository.insert(new RoleMenu(admin.getId(), menu.getId())); }
});
@Test
public void testRole() {
Role admin = roleService.lambdaQuery().eq(Role::getName, "admin").one();
List<Menu> menus = menuService.selectByRoleId(admin.getId());
assertEquals(27, menus.size());
} }
@Test @Test