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
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
// 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();
// String sessionId = request.getRequestedSessionId();
// String remoteAddr = request.getRemoteAddr();

View File

@ -84,8 +84,9 @@ public class SpringSecurityConfig {
return http
.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("/api/rest/user/me").permitAll()
.requestMatchers("/api/**").authenticated()
)
// 不用注解直接通过判断路径实现动态访问权限

View File

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

View File

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

View File

@ -1,12 +1,19 @@
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.toolkit.Constants;
import com.zsc.edu.gateway.modules.system.entity.Menu;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author yao
*/
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.zsc.edu.gateway.modules.system.entity.Menu;
import java.util.List;
/**
* @author zhuang
*/
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 org.springframework.stereotype.Service;
import java.util.List;
/**
* @author zhuang
*/
@AllArgsConstructor
@Service
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"?>
<!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">
<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>

View File

@ -11,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class MenuServiceImplTest {
@ -33,38 +34,43 @@ class MenuServiceImplTest {
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 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 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 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", "");
menuService.saveBatch(List.of(workplace, roleDelete, 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 roleUpdate = new Menu(role.getId(), Menu.Type.BUTTON, "roleUpdate", null, "角色修改", null, true, false, 1, "system:role:update", "");
Menu roleQuery = new Menu(role.getId(), Menu.Type.BUTTON, "roleQuery", null, "角色查询", null, true, false, 1, "system:role:query", "");
Menu deptSave = new Menu(dept.getId(), Menu.Type.BUTTON, "deptCreate", null, "部门新增", null, true, false, 1, "system:dept:create", "");
Menu deptUpdate = new Menu(dept.getId(), Menu.Type.BUTTON, "deptUpdate", null, "部门修改", null, true, false, 1, "system:dept:update", "");
Menu deptQuery = new Menu(dept.getId(), Menu.Type.BUTTON, "deptQuery", null, "部门查询", null, true, false, 1, "system:dept:query", "");
Menu deptDelete = new Menu(dept.getId(), Menu.Type.BUTTON, "deptDelete", null, "部门删除", null, true, false, 1, "system:dept:delete", "");
Menu userSave = new Menu(dept.getId(), Menu.Type.BUTTON, "userCreate", null, "用户新增", null, true, false, 1, "system:user:create", "");
Menu userUpdate = new Menu(dept.getId(), Menu.Type.BUTTON, "userUpdate", null, "用户修改", null, true, false, 1, "system:user:update", "");
Menu userQuery = new Menu(dept.getId(), Menu.Type.BUTTON, "userQuery", null, "用户查询", null, true, false, 1, "system:user:query", "");
Menu userDelete = new Menu(dept.getId(), Menu.Type.BUTTON, "userDelete", null, "用户删除", null, true, false, 1, "system:user:delete", "");
Menu menuSave = new Menu(menu.getId(), Menu.Type.BUTTON, "menuCreate", null, "菜单新增", null, true, false, 1, "system:menu:create", "");
Menu menuUpdate = new Menu(menu.getId(), Menu.Type.BUTTON, "menuUpdate", null, "菜单修改", null, true, false, 1, "system:menu:update", "");
Menu menuQuery = new Menu(menu.getId(), Menu.Type.BUTTON, "menuQuery", null, "菜单查询", null, true, false, 1, "system:menu:query", "");
Menu menuDelete = new Menu(menu.getId(), Menu.Type.BUTTON, "menuDelete", null, "菜单删除", null, true, false, 1, "system:menu:delete", "");
menuService.saveBatch(List.of(roleCreate, roleUpdate, roleQuery, deptSave, deptUpdate, deptQuery, deptDelete, userSave, userUpdate, userQuery, userDelete, menuSave, menuUpdate, menuQuery, menuDelete));
menuService.saveBatch(List.of(workplace, dept, users, authority, menu, notice, bulletin));
Menu roleCreate = new Menu(role.getId(), Menu.Type.OPERATION, "roleCreate", null, "角色新增", null, true, false, 1, "system:role:create", "");
Menu roleDelete = new Menu(role.getId(), Menu.Type.OPERATION, "roleDelete", null, "角色删除", null, true, false, 1, "system:role:delete", "");
Menu roleUpdate = new Menu(role.getId(), Menu.Type.OPERATION, "roleUpdate", null, "角色修改", null, true, false, 1, "system:role:update", "");
Menu roleQuery = new Menu(role.getId(), Menu.Type.OPERATION, "roleQuery", null, "角色查询", null, true, false, 1, "system:role:query", "");
Menu deptSave = new Menu(dept.getId(), Menu.Type.OPERATION, "deptCreate", null, "部门新增", null, true, false, 1, "system:dept:create", "");
Menu deptUpdate = new Menu(dept.getId(), Menu.Type.OPERATION, "deptUpdate", null, "部门修改", null, true, false, 1, "system:dept:update", "");
Menu deptQuery = new Menu(dept.getId(), Menu.Type.OPERATION, "deptQuery", null, "部门查询", null, true, false, 1, "system:dept:query", "");
Menu deptDelete = new Menu(dept.getId(), Menu.Type.OPERATION, "deptDelete", null, "部门删除", null, true, false, 1, "system:dept:delete", "");
Menu userSave = new Menu(dept.getId(), Menu.Type.OPERATION, "userCreate", null, "用户新增", null, true, false, 1, "system:user:create", "");
Menu userUpdate = new Menu(dept.getId(), Menu.Type.OPERATION, "userUpdate", null, "用户修改", null, true, false, 1, "system:user:update", "");
Menu userQuery = new Menu(dept.getId(), Menu.Type.OPERATION, "userQuery", null, "用户查询", null, true, false, 1, "system:user:query", "");
Menu userDelete = new Menu(dept.getId(), Menu.Type.OPERATION, "userDelete", null, "用户删除", null, true, false, 1, "system:user:delete", "");
Menu menuSave = new Menu(menu.getId(), Menu.Type.OPERATION, "menuCreate", null, "菜单新增", null, true, false, 1, "system:menu:create", "");
Menu menuUpdate = new Menu(menu.getId(), Menu.Type.OPERATION, "menuUpdate", null, "菜单修改", null, true, false, 1, "system:menu:update", "");
Menu menuQuery = new Menu(menu.getId(), Menu.Type.OPERATION, "menuQuery", null, "菜单查询", null, true, false, 1, "system:menu:query", "");
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
public void test() {
Role admin = roleService.lambdaQuery().eq(Role::getName, "admin").one();
menuService.list().forEach(menu -> {
roleMenuRepository.insert(new RoleMenu(admin.getId(), menu.getId()));
});
menuService.list().forEach(menu -> 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