UI-Project/src/layout/MainErpView.vue
@@ -23,7 +23,7 @@ //提取菜单模块列表 let menuList = $ref([]) request.get('/loadGlass/menu/sysMenu/list').then((res) => { request.get('/loadGlass/sys/menu/getMenuTree').then((res) => { if (res.code == 200) { menuList = deepClone(res.data) } else { UI-Project/src/router/index.js
@@ -1,5 +1,9 @@ import {createRouter, createWebHashHistory} from 'vue-router' import User from '../views/sys/User.vue' import Role from '../views/sys/Role.vue' import Menu from '../views/sys/Menu.vue' const router = createRouter({ history: createWebHashHistory(), routes: [ @@ -200,10 +204,34 @@ component: () => import('../views/Visualization/screenthree.vue') } ] }, /*----------- 管理系统 ----------------*/ { path: 'sys', name: 'screen', component: () => import('../views/Visualization/screen.vue'), children: [ { path: '/sys/users', name: 'SysUser', component: User }, { path: '/sys/roles', name: 'SysRole', component: Role }, { path: '/sys/menus', name: 'SysMenu', component: Menu }, ] }, { path: '', redirect:'/Slicecage/slicecage' redirect: '/Slicecage/slicecage' } ] }, UI-Project/src/views/LoginView.vue
@@ -48,7 +48,7 @@ if (valid) { loginLoadings.value = true request .post('/loadGlass/userinfo/login', userForm) .post('/loadGlass/sys/user/login', userForm) .then((res) => { if (res['code'] == 200) { store.$patch({user: res.data}) hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Swagger2Config.java
@@ -7,13 +7,14 @@ import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.schema.ModelRef; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.service.Parameter; import springfox.documentation.service.*; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.service.contexts.SecurityContext; import springfox.documentation.spring.web.plugins.Docket; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; /** @@ -46,9 +47,26 @@ .apis(RequestHandlerSelectors.basePackage("com.mes")) .paths(PathSelectors.any()) .build() .globalOperationParameters(pars); .globalOperationParameters(pars) .securitySchemes(Collections.EMPTY_LIST) .securityContexts(Arrays.asList(securityContext())); } private SecurityContext securityContext() { return SecurityContext.builder() .securityReferences(defaultAuth()) .forPaths(PathSelectors.any()) .build(); } private List<SecurityReference> defaultAuth() { AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; authorizationScopes[0] = authorizationScope; return Arrays.asList(new SecurityReference("Authorization", authorizationScopes)); } private ApiInfo webApiInfo() { return new ApiInfoBuilder() .title("网站-API文档") hangzhoumesParent/common/servicebase/src/main/java/com/mes/entity/request/GeneralRequest.java
File was renamed from hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/request/UserRequest.java @@ -1,4 +1,4 @@ package com.mes.userinfo.entity.request; package com.mes.entity.request; import cn.hutool.db.Page; import lombok.Data; @@ -9,9 +9,9 @@ * @Description: */ @Data public class UserRequest { public class GeneralRequest { private String userName; private String key; private Page page; } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/base/BaseController.java
File was deleted hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/TokenWebSecurityConfig.java
@@ -2,6 +2,7 @@ import com.mes.common.filter.JwtAuthenticationTokenFilter; import com.mes.common.handler.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -13,8 +14,6 @@ import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @Configuration @@ -23,12 +22,20 @@ public class TokenWebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter; @Autowired LoginFailureHandler loginFailureHandler; @Autowired private AuthenticationEntryPoint authenticationEntryPoint; LoginSuccessHandler loginSuccessHandler; @Autowired private AccessDeniedHandler accessDeniedHandler; JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; @Autowired JwtAccessDeniedHandler jwtAccessDeniedHandler; @Autowired JwtLogoutSuccessHandler jwtLogoutSuccessHandler; @Bean public PasswordEncoder passwordEncoder() { @@ -40,25 +47,42 @@ */ @Override protected void configure(HttpSecurity http) throws Exception { http //关闭csrf .csrf().disable() //不通过Session获取SecurityContext .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) http.cors().and().csrf().disable() // 登录配置 .formLogin() .successHandler(loginSuccessHandler) .failureHandler(loginFailureHandler) .and() .logout() .logoutSuccessHandler(jwtLogoutSuccessHandler) // 禁用session .and() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) // 配置拦截规则 .and() .authorizeRequests() // 对于登录接口 允许匿名访问 .antMatchers("/userinfo/login").anonymous() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated(); http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); .antMatchers("/sys/user/login").anonymous() .antMatchers("/swagger-ui.html").permitAll() .antMatchers("/webjars/**").permitAll() .antMatchers("/v2/**").permitAll() .antMatchers("/swagger-resources/**").permitAll() .anyRequest().authenticated() //配置异常处理器 http.exceptionHandling() .authenticationEntryPoint(authenticationEntryPoint) .accessDeniedHandler(accessDeniedHandler); //允许跨域 http.cors(); // 异常处理器 .and() .exceptionHandling() .authenticationEntryPoint(jwtAuthenticationEntryPoint) .accessDeniedHandler(jwtAccessDeniedHandler) // 配置自定义的过滤器 .and() .addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); } @Bean hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/filter/JwtAuthenticationTokenFilter.java
@@ -2,8 +2,9 @@ import com.mes.common.utils.JwtUtil; import com.mes.common.utils.RedisUtil; import com.mes.menu.mapper.SysMenuMapper; import com.mes.common.utils.UserInfoUtils; import com.mes.userinfo.entity.LoginUser; import com.mes.userinfo.service.SysUserService; import io.jsonwebtoken.Claims; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -36,7 +37,7 @@ private RedisUtil redisUtil; @Resource private SysMenuMapper menuMapper; private SysUserService sysUserService; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { @@ -63,9 +64,10 @@ response.setHeader("token", ""); throw new RuntimeException("用户未登录"); } //将用户信息放入当前线程 UserInfoUtils.set(loginUser.getUser()); //存入SecurityContextHolder,以供后面的过滤器使用 List<String> permissionKeyList = menuMapper.selectPermsByUserId(Long.parseLong(userid)); List<String> permissionKeyList = sysUserService.getUserAuthorityInfo(Long.parseLong(userid)); List<GrantedAuthority> authorities = permissionKeyList.stream(). map(SimpleGrantedAuthority::new) .collect(Collectors.toList()); hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/AccessDeniedHandlerImpl.java
File was deleted hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/AuthenticationEntryPointImpl.java
File was deleted hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAccessDeniedHandler.java
New file @@ -0,0 +1,35 @@ package com.mes.common.handler; import cn.hutool.json.JSONUtil; import com.mes.utils.Result; import org.springframework.http.HttpStatus; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.stereotype.Component; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class JwtAccessDeniedHandler implements AccessDeniedHandler { @Override public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException { response.setContentType("application/json;charset=UTF-8"); response.setStatus(HttpServletResponse.SC_FORBIDDEN); ServletOutputStream outputStream = response.getOutputStream(); Result result = Result.error(HttpStatus.FORBIDDEN.value(), "权限不足"); outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8")); outputStream.flush(); outputStream.close(); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAuthenticationEntryPoint.java
New file @@ -0,0 +1,33 @@ package com.mes.common.handler; import cn.hutool.json.JSONUtil; import com.mes.utils.Result; import org.springframework.http.HttpStatus; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.stereotype.Component; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint { @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { response.setContentType("application/json;charset=UTF-8"); response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); ServletOutputStream outputStream = response.getOutputStream(); Result result = Result.error(HttpStatus.UNAUTHORIZED.value(), "认证失败请重新登录"); outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8")); outputStream.flush(); outputStream.close(); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtLogoutSuccessHandler.java
New file @@ -0,0 +1,40 @@ package com.mes.common.handler; import cn.hutool.json.JSONUtil; import com.mes.utils.Result; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; import org.springframework.stereotype.Component; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class JwtLogoutSuccessHandler implements LogoutSuccessHandler { private static final String header = "Authorization"; @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { if (authentication != null) { new SecurityContextLogoutHandler().logout(request, response, authentication); } response.setContentType("application/json;charset=UTF-8"); ServletOutputStream outputStream = response.getOutputStream(); response.setHeader(header, ""); Result result = Result.success(""); outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8")); outputStream.flush(); outputStream.close(); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginFailureHandler.java
New file @@ -0,0 +1,31 @@ package com.mes.common.handler; import cn.hutool.json.JSONUtil; import com.mes.utils.Result; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.stereotype.Component; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class LoginFailureHandler implements AuthenticationFailureHandler { @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { response.setContentType("application/json;charset=UTF-8"); ServletOutputStream outputStream = response.getOutputStream(); Result result = Result.error("用户名或密码错误"); outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8")); outputStream.flush(); outputStream.close(); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginSuccessHandler.java
New file @@ -0,0 +1,38 @@ package com.mes.common.handler; import cn.hutool.json.JSONUtil; import com.mes.common.utils.JwtUtil; import com.mes.utils.Result; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.stereotype.Component; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class LoginSuccessHandler implements AuthenticationSuccessHandler { private static final String header = "Authorization"; @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { response.setContentType("application/json;charset=UTF-8"); ServletOutputStream outputStream = response.getOutputStream(); // 生成jwt,并放置到请求头中 String jwt = JwtUtil.generateToken(authentication.getName()); response.setHeader(header, jwt); Result result = Result.success(""); outputStream.write(JSONUtil.toJsonStr(result).getBytes("UTF-8")); outputStream.flush(); outputStream.close(); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/JwtUtil.java
@@ -48,7 +48,7 @@ } // jwt是否过期 public boolean isTokenExpired(Claims claims) { public static boolean isTokenExpired(Claims claims) { return claims.getExpiration().before(new Date()); } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/UserInfoUtils.java
New file @@ -0,0 +1,26 @@ package com.mes.common.utils; import com.mes.userinfo.entity.SysUser; /** * @Author : zhoush * @Date: 2024/4/25 15:41 * @Description: */ public class UserInfoUtils { private static InheritableThreadLocal<SysUser> tokenPool = new InheritableThreadLocal<SysUser>(); public static SysUser get() { return tokenPool.get(); } public static void set(SysUser user) { tokenPool.set(user); } public static void remove() { if (get() != null) { tokenPool.remove(); } } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/controller/SysMenuController.java
@@ -1,116 +1,76 @@ package com.mes.menu.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.mes.base.BaseController; import com.mes.entity.request.GeneralRequest; import com.mes.menu.entity.SysMenu; import com.mes.role.entity.SysRoleMenu; import com.mes.menu.service.SysMenuService; import com.mes.utils.Result; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; /** * <p> * 菜单表 * </p> * * @author zhoush * @since 2024-04-11 */ @ApiModel("获取菜单信息") @Api(description = "菜单管理") @RestController @RequestMapping("/menu/sysMenu") public class SysMenuController extends BaseController { @ApiOperation("获取用户有权限的所有菜单") @GetMapping("/list") public Result<List<SysMenu>> getMenuTree(String userName) { return Result.success(sysMenuService.getMenuTree()); } @RequestMapping("/sys/menu") public class SysMenuController { @ApiOperation("获取用户的权限") @GetMapping("/getAuthorityInfo") public Result<List<String>> getAuthorityInfo(String userName) { return Result.success(sysMenuService.getAuthorityInfo(userName)); } @Autowired private SysMenuService sysMenuService; /** * 用户当前用户的菜单和权限信息 * * @param userName * @return */ @GetMapping("/nav") public Result nav(String userName) { // SysUser sysUser = sysUserService.listByUserNameName(userName); // // // 获取权限信息 // sysUserService.getUserAuthorityInfo(sysUser.getId());// ROLE_admin,ROLE_normal,sys:user:list,.... // String[] authorityInfoArray = StringUtils.tokenizeToStringArray(authorityInfo, ","); // // // 获取导航栏信息 // List<SysMenuDto> navs = sysMenuService.getCurrentUserNav(); // // return Result.success(MapUtil.builder() // .put("authoritys", authorityInfoArray) // .put("nav", navs) // .map() // ); return null; } @GetMapping("/info/{id}") @PreAuthorize("hasAuthority('sys:menu:list')") public Result info(@PathVariable(name = "id") Long id) { return Result.success(sysMenuService.getById(id)); } // @GetMapping("/list") // @PreAuthorize("hasAuthority('sys:menu:list')") // public Result list() { // //// List<SysMenu> menus = sysMenuService.tree(); // return Result.success(null); // } @ApiOperation("新增菜单") @PostMapping("/save") @PreAuthorize("hasAuthority('sys:menu:save')") // @PreAuthorize("hasAuthority('sys:menu:save')") public Result save(@Validated @RequestBody SysMenu sysMenu) { return Result.success(sysMenuService.save(sysMenu)); } @PostMapping("/update") @PreAuthorize("hasAuthority('sys:menu:update')") public Result update(@Validated @RequestBody SysMenu sysMenu) { sysMenuService.updateById(sysMenu); // 清除所有与该菜单相关的权限缓存 sysUserService.clearUserAuthorityInfoByMenuId(sysMenu.getId()); @ApiOperation("修改菜单信息") @PostMapping("/updateMenu") // @PreAuthorize("hasAuthority('sys:menu:update')") public Result updateMenu(@Validated @RequestBody SysMenu sysMenu) { sysMenuService.updateMenu(sysMenu); return Result.success(sysMenu); } @PostMapping("/delete/{id}") @PreAuthorize("hasAuthority('sys:menu:delete')") public Result delete(@PathVariable("id") Long id) { @ApiOperation("获取用户有权限的所有菜单") @GetMapping("/getMenuTree") public Result<List<SysMenu>> getMenuTree(GeneralRequest request) { return Result.success(sysMenuService.getMenuTree(request)); } int count = sysMenuService.count(new QueryWrapper<SysMenu>().eq("parent_id", id)); if (count > 0) { return Result.error("请先删除子菜单"); } @ApiOperation("获取用户的权限") @GetMapping("/getAuthorityInfo") public Result<List<String>> getAuthorityInfo() { return Result.success(sysMenuService.getAuthorityInfo()); } // 清除所有与该菜单相关的权限缓存 sysUserService.clearUserAuthorityInfoByMenuId(id); sysMenuService.removeById(id); @ApiOperation("用户当前用户的菜单和权限信息") @GetMapping("/nav") public Result<Map<Object, Object>> nav() { return Result.success(sysMenuService.nav()); } // 同步删除中间关联表 sysRoleMenuService.remove(new QueryWrapper<SysRoleMenu>().eq("menu_id", id)); return Result.success(""); @ApiOperation("删除菜单") @PostMapping("/deleteMenu") // @PreAuthorize("hasAuthority('sys:menu:delete')") public Result<String> deleteMenu(Long menuId) { return Result.success(sysMenuService.deleteMenu(menuId)); } @ApiOperation("批量删除菜单") @PostMapping("/batchDeleteMenu") // @PreAuthorize("hasAuthority('sys:menu:delete')") public Result<String> batchDeleteMenu(@RequestBody List<Long> menuIds) { return Result.success(sysMenuService.batchDeleteMenu(menuIds)); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/entity/SysMenu.java
@@ -35,7 +35,7 @@ /** * 父id */ private Integer parentId; private Long parentId; /** * 模块名称 @@ -73,6 +73,11 @@ private Date createTime; /** * 权限 */ private String perms; /** * 子菜单 */ @TableField(exist = false) hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/mapper/SysMenuMapper.java
@@ -1,6 +1,6 @@ package com.mes.menu.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.github.yulichang.base.MPJBaseMapper; import com.mes.menu.entity.SysMenu; import org.apache.ibatis.annotations.Mapper; @@ -15,7 +15,7 @@ * @since 2024-04-11 */ @Mapper public interface SysMenuMapper extends BaseMapper<SysMenu> { public interface SysMenuMapper extends MPJBaseMapper<SysMenu> { List<String> selectPermsByUserId(long parseLong); } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/SysMenuService.java
@@ -1,9 +1,11 @@ package com.mes.menu.service; import com.baomidou.mybatisplus.extension.service.IService; import com.mes.entity.request.GeneralRequest; import com.mes.menu.entity.SysMenu; import java.util.List; import java.util.Map; /** * <p> @@ -16,17 +18,49 @@ public interface SysMenuService extends IService<SysMenu> { /** * 更新菜单信息 * * @param menu * @return */ SysMenu updateMenu(SysMenu menu); /** * 获取用户有权限的菜单树 * * @return */ List<SysMenu> getMenuTree(); List<SysMenu> getMenuTree(GeneralRequest request); /** * 获取用户的权限 * * @param userName * @return */ List<String> getAuthorityInfo(String userName); List<String> getAuthorityInfo(); /** * 获取用户菜单及权限信息 * * @return */ Map<Object, Object> nav(); /** * 删除菜单信息 * * @param menuId * @return */ String deleteMenu(Long menuId); /** * 批量删除菜单信息 * * @param menuIds * @return */ String batchDeleteMenu(List<Long> menuIds); } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/impl/SysMenuServiceImpl.java
@@ -1,18 +1,28 @@ package com.mes.menu.service.impl; import cn.hutool.core.map.MapUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.mes.common.utils.UserInfoUtils; import com.mes.entity.request.GeneralRequest; import com.mes.menu.entity.SysMenu; import com.mes.menu.mapper.SysMenuMapper; import com.mes.menu.service.SysMenuService; import com.mes.role.entity.SysRoleMenu; import com.mes.role.service.SysRoleMenuService; import com.mes.userinfo.entity.SysUser; import com.mes.userinfo.entity.SysUserRole; import com.mes.userinfo.mapper.SysUserRoleMapper; import com.mes.userinfo.service.SysUserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** @@ -30,21 +40,75 @@ @Autowired SysUserService sysUserService; @Autowired SysUserRoleMapper sysUserRoleMapper; @Autowired SysRoleMenuService sysRoleMenuService; @Override public List<SysMenu> getMenuTree() { public SysMenu updateMenu(SysMenu menu) { baseMapper.updateById(menu); // 清除所有与该菜单相关的权限缓存 sysUserService.clearUserAuthorityInfoByMenuId(menu.getId()); return menu; } @Override public List<SysMenu> getMenuTree(GeneralRequest request) { //todo:需要先获取用户的角色,角色下的菜单权限,拿到菜单id获取所有菜单 List<SysMenu> menuList = this.baseMapper.selectList(null); SysUser user = UserInfoUtils.get(); MPJLambdaWrapper<SysUserRole> wrapper = new MPJLambdaWrapper<>(); wrapper.selectAll(SysMenu.class).distinct() .leftJoin(SysUser.class, SysUser::getId, SysUserRole::getUserId) .leftJoin(SysRoleMenu.class, SysRoleMenu::getRoleId, SysUserRole::getRoleId) .leftJoin(SysMenu.class, SysMenu::getId, SysRoleMenu::getMenuId) .eq(SysUser::getId, user.getId()) .like(StringUtils.isNotBlank(request.getKey()), SysMenu::getMenuName, request.getKey()); List<SysMenu> menuList = sysUserRoleMapper.selectJoinList(SysMenu.class, wrapper); return create(menuList); } @Override public List<String> getAuthorityInfo(String userName) { log.info("获取用户信息,用户名为{}", userName); SysUser sysUser = sysUserService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, userName)); public List<String> getAuthorityInfo() { SysUser user = UserInfoUtils.get(); log.info("获取用户信息,用户名为{}", user); // 获取权限信息 // ROLE_admin,ROLE_normal,sys:user:list,.... return sysUserService.getUserAuthorityInfo(sysUser.getId()); return sysUserService.getUserAuthorityInfo(user.getId()); } @Override public Map<Object, Object> nav() { List<SysMenu> menuTree = getMenuTree(new GeneralRequest()); List<String> authorityInfo = getAuthorityInfo(); return MapUtil.builder().put("authoritys", authorityInfo) .put("tree", menuTree).map(); } @Override public String deleteMenu(Long menuId) { int count = this.count(new LambdaQueryWrapper<SysMenu>().eq(SysMenu::getParentId, menuId)); if (count > 0) { return "无法删除,请先删除子菜单"; } // 清除所有与该菜单相关的权限缓存 sysUserService.clearUserAuthorityInfoByMenuId(menuId); this.removeById(menuId); // 同步删除中间关联表 sysRoleMenuService.remove(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getMenuId, menuId)); return "删除成功"; } @Override public String batchDeleteMenu(List<Long> menuIds) { menuIds.stream().forEach(e -> deleteMenu(e)); return "批量删除成功"; } @@ -74,87 +138,9 @@ private List<SysMenu> getChildren(SysMenu menu, List<SysMenu> menus) { List<SysMenu> res = menus.stream() .filter(item -> item.getParentId().equals(menu.getId())) .map(item -> { item.setChildren(getChildren(item, menus)); return item; }).collect(Collectors.toList()); .collect(Collectors.toList()); log.info("菜单树:{}", JSONUtil.toJsonStr(res)); return res; } // // @Autowired // SysUserMapper sysUserMapper; // // @Override // public List<SysMenuDto> getCurrentUserNav() { // String username = (String) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); // SysUser sysUser = sysUserService.listByUserNameName(username); // // List<Long> menuIds = sysUserMapper.getNavMenuIds(sysUser.getId()); // List<SysMenu> menus = this.listByIds(menuIds); // // // 转树状结构 // List<SysMenu> menuTree = buildTreeMenu(menus); // // // 实体转DTO // return convert(menuTree); // } // // @Override // public List<SysMenu> tree() { // // 获取所有菜单信息 // List<SysMenu> sysMenus = this.list(new QueryWrapper<SysMenu>().orderByAsc("orderNum")); // // // 转成树状结构 // return buildTreeMenu(sysMenus); // } // // private List<SysMenuDto> convert(List<SysMenu> menuTree) { // List<SysMenuDto> menuDtos = new ArrayList<>(); // // menuTree.forEach(m -> { // SysMenuDto dto = new SysMenuDto(); // // dto.setId(m.getId()); // dto.setName(m.getPerms()); // dto.setTitle(m.getName()); // dto.setComponent(m.getComponent()); // dto.setPath(m.getPath()); // // if (m.getChildren().size() > 0) { // // // 子节点调用当前方法进行再次转换 // dto.setChildren(convert(m.getChildren())); // } // // menuDtos.add(dto); // }); // // return menuDtos; // } // // private List<SysMenu> buildTreeMenu(List<SysMenu> menus) { // // List<SysMenu> finalMenus = new ArrayList<>(); // // // 先各自寻找到各自的孩子 // for (SysMenu menu : menus) { // // for (SysMenu e : menus) { // if (menu.getId() == e.getParentId()) { // menu.getChildren().add(e); // } // } // // // 提取出父节点 // if (menu.getParentId() == 0L) { // finalMenus.add(menu); // } // } // // System.out.println(JSONUtil.toJsonStr(finalMenus)); // return finalMenus; // } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/controller/SysRoleController.java
@@ -1,20 +1,63 @@ package com.mes.role.controller; import com.mes.base.BaseController; import com.mes.entity.request.GeneralRequest; import com.mes.role.entity.SysRole; import com.mes.role.entity.vo.SysRoleVO; import com.mes.role.service.SysRoleService; import com.mes.utils.Result; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * <p> * 角色表 前端控制器 * </p> * * @author zhoush * @since 2024-04-11 */ @Api(description = "角色管理") @RestController @RequestMapping("/role/sys-role") public class SysRoleController extends BaseController { } @RequestMapping("/sys/role") public class SysRoleController { @Autowired private SysRoleService sysRoleService; @ApiOperation("新增角色及角色下的权限信息") @PostMapping("/saveRole") // @PreAuthorize("hasAuthority('sys:role:save')") public Result<SysRole> saveRole(@Validated @RequestBody SysRoleVO sysRoleVO) { return Result.success(sysRoleService.saveRole(sysRoleVO)); } @ApiOperation("编辑角色及角色下的权限信息") @PostMapping("/updateRole") // @PreAuthorize("hasAuthority('sys:role:save')") public Result<String> updateRole(@Validated @RequestBody SysRoleVO sysRoleVO) { return Result.success(sysRoleService.updateRole(sysRoleVO)); } @ApiOperation("查询角色及角色下的权限信息") @PostMapping("/queryRole") // @PreAuthorize("hasAuthority('sys:role:save')") public Result<List<SysRoleVO>> queryRole(@Validated @RequestBody GeneralRequest request) { return Result.success(sysRoleService.queryRole(request)); } @ApiOperation("删除角色及角色下的权限信息") @PostMapping("/delete") // @PreAuthorize("hasAuthority('sys:role:delete')") @Transactional public Result<String> deleteRole(@RequestBody List<Long> ids) { return Result.success(sysRoleService.deleteRole(ids)); } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRoleMenu.java
@@ -24,7 +24,7 @@ /** * 角色ID */ @TableId(value = "role_id", type = IdType.AUTO) @TableId(type = IdType.NONE) private Long roleId; /** hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/vo/SysRoleVO.java
New file @@ -0,0 +1,44 @@ package com.mes.role.entity.vo; import com.mes.menu.entity.SysMenu; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.List; /** * @Author : zhoush * @Date: 2024/4/26 13:57 * @Description: */ @Api(description = "角色信息") @Data public class SysRoleVO implements Serializable { @ApiModelProperty(hidden = true) private static final long serialVersionUID = 1L; @ApiModelProperty(value = "角色ID", position = 2) private Long id; @ApiModelProperty(value = "角色名称", position = 3) private String name; @ApiModelProperty(value = "角色权限字符串", position = 4) private String roleKey; @ApiModelProperty(value = "角色状态(0正常 1停用)", position = 5) private String status; @ApiModelProperty(value = "删除标志", position = 6) private Integer delFlag; @ApiModelProperty(value = "备注", position = 7) private String remark; @ApiModelProperty(value = "角色菜单信息", position = 8) private List<SysMenu> menuList; } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMapper.java
@@ -1,6 +1,6 @@ package com.mes.role.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.github.yulichang.base.MPJBaseMapper; import com.mes.role.entity.SysRole; import org.apache.ibatis.annotations.Mapper; @@ -13,6 +13,6 @@ * @since 2024-04-11 */ @Mapper public interface SysRoleMapper extends BaseMapper<SysRole> { public interface SysRoleMapper extends MPJBaseMapper<SysRole> { } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleService.java
@@ -1,7 +1,11 @@ package com.mes.role.service; import com.baomidou.mybatisplus.extension.service.IService; import com.mes.entity.request.GeneralRequest; import com.mes.role.entity.SysRole; import com.mes.role.entity.vo.SysRoleVO; import java.util.List; /** * <p> @@ -13,4 +17,35 @@ */ public interface SysRoleService extends IService<SysRole> { /** * 创建角色信息 * * @param sysRoleVO * @return */ SysRole saveRole(SysRoleVO sysRoleVO); /** * 修改角色信息及权限 * * @param sysRoleVO * @return */ String updateRole(SysRoleVO sysRoleVO); /** * 按照角色名查询角色信息 * * @param request * @return */ List<SysRoleVO> queryRole(GeneralRequest request); /** * 查询角色及角色下的权限信息 * * @param ids * @return */ String deleteRole(List<Long> ids); } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleServiceImpl.java
@@ -1,10 +1,28 @@ package com.mes.role.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.mes.entity.request.GeneralRequest; import com.mes.menu.entity.SysMenu; import com.mes.role.entity.SysRole; import com.mes.role.entity.SysRoleMenu; import com.mes.role.entity.vo.SysRoleVO; import com.mes.role.mapper.SysRoleMapper; import com.mes.role.service.SysRoleMenuService; import com.mes.role.service.SysRoleService; import com.mes.userinfo.entity.SysUserRole; import com.mes.userinfo.service.SysUserRoleService; import com.mes.userinfo.service.SysUserService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import java.util.List; import java.util.stream.Collectors; /** * <p> @@ -15,6 +33,91 @@ * @since 2024-04-11 */ @Service @Slf4j public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements SysRoleService { @Autowired SysRoleMenuService sysRoleMenuService; @Autowired SysUserService sysUserService; @Autowired SysUserRoleService sysUserRoleService; @Override @Transactional(rollbackFor = Exception.class) public SysRole saveRole(SysRoleVO sysRoleVO) { log.info("保存角色信息,生成对应的角色id"); SysRole sysRole = new SysRole(); BeanUtils.copyProperties(sysRoleVO, sysRole); this.save(sysRole); //保存角色权限信息 saveRoleMenu(sysRole.getId(), sysRoleVO.getMenuList()); return sysRole; } @Override @Transactional(rollbackFor = Exception.class) public String updateRole(SysRoleVO sysRoleVO) { log.info("保存角色信息,生成对应的角色id"); SysRole sysRole = new SysRole(); BeanUtils.copyProperties(sysRoleVO, sysRole); this.updateById(sysRole); //保存角色权限信息 return saveRoleMenu(sysRole.getId(), sysRoleVO.getMenuList()); } @Override public List<SysRoleVO> queryRole(GeneralRequest request) { MPJLambdaWrapper<SysRole> wrapper = new MPJLambdaWrapper<>(); wrapper.selectAll(SysRole.class) .selectCollection(SysMenu.class, SysRoleVO::getMenuList) .leftJoin(SysRoleMenu.class, SysRoleMenu::getRoleId, SysRole::getId) .leftJoin(SysMenu.class, SysMenu::getId, SysRoleMenu::getMenuId) .like(StringUtils.hasText(request.getKey()), SysRole::getName, request.getKey()); return baseMapper.selectJoinList(SysRoleVO.class, wrapper); } @Override @Transactional(rollbackFor = Exception.class) public String deleteRole(List<Long> ids) { log.info("删除角色信息"); this.removeByIds(ids); log.info("删除中间表信息"); sysUserRoleService.remove(new LambdaQueryWrapper<SysUserRole>().in(SysUserRole::getRoleId, ids)); sysRoleMenuService.remove(new LambdaQueryWrapper<SysRoleMenu>().in(SysRoleMenu::getRoleId, ids)); log.info("清空缓存中的权限信息"); ids.stream().forEach(id -> sysUserService.clearUserAuthorityInfoByRoleId(id)); return "success"; } /** * 保存角色权限信息 * * @param roleId * @param menuList * @return */ private String saveRoleMenu(Long roleId, List<SysMenu> menuList) { log.info("配置角色菜单关心"); List<SysRoleMenu> roleMenuList = menuList.stream().map(menu -> { SysRoleMenu roleMenu = new SysRoleMenu(); roleMenu.setRoleId(roleId); roleMenu.setMenuId(menu.getId()); return roleMenu; }).collect(Collectors.toList()); log.info("清空角色权限表中该角色信息"); // 先删除原来的记录,再保存新的 sysRoleMenuService.remove(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, roleId)); sysRoleMenuService.saveBatch(roleMenuList); // 删除缓存 sysUserService.clearUserAuthorityInfoByRoleId(roleId); return "success"; } } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/controller/SysUserController.java
@@ -1,13 +1,15 @@ package com.mes.userinfo.controller; import com.mes.base.BaseController; import com.mes.entity.request.GeneralRequest; import com.mes.userinfo.entity.SysUser; import com.mes.userinfo.entity.request.UserRequest; import com.mes.userinfo.entity.vo.SysUserVO; import com.mes.userinfo.service.SysUserService; import com.mes.utils.Result; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -25,10 +27,13 @@ * @author zhoush * @since 2024-04-11 */ @ApiModel("用户信息") @Api(description = "用户管理") @RestController @RequestMapping("/userinfo") public class SysUserController extends BaseController { @RequestMapping("/sys/user") public class SysUserController { @Autowired private SysUserService sysUserService; @ApiOperation("用户登录") @PostMapping("/login") @@ -38,6 +43,8 @@ @ApiOperation("退出登录") @PostMapping("/logout") // @PreAuthorize("hasRole('ROLE_admin')") @PreAuthorize("hasAuthority('xt:yh')") public Result<String> logout() { return Result.success(sysUserService.logout()); } @@ -57,17 +64,18 @@ return Result.success(sysUserService.updateUser(sysUser)); } @ApiOperation("重置密码") @PostMapping("/resetPassword") // @PreAuthorize("hasAuthority('sys:user:resetPassword')") public Result resetPassword(@RequestBody Long userId) { return Result.success(sysUserService.resetPassword(userId)); public Result resetPassword(String userId) { return Result.success(sysUserService.resetPassword(Long.parseLong(userId))); } @ApiOperation("获取用户列表") @PostMapping("/listByUserName") // @PreAuthorize("hasAuthority('sys:user:list')") public Result<List<SysUserVO>> listByUserName(@RequestBody UserRequest request) { public Result<List<SysUserVO>> listByUserName(@RequestBody GeneralRequest request) { return Result.success(sysUserService.listByUserName(request)); } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/SysUserRole.java
@@ -1,5 +1,7 @@ package com.mes.userinfo.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; @@ -24,6 +26,7 @@ /** * 用户id */ @TableId(type = IdType.NONE) private Long userId; /** hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/entity/vo/SysUserVO.java
@@ -1,7 +1,7 @@ package com.mes.userinfo.entity.vo; import com.mes.role.entity.SysRole; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -16,7 +16,7 @@ * @author zhoush * @since 2024-04-11 */ @ApiModel(description = "<p> 用户信息 </p>") @Api(description = "用户信息") @Data public class SysUserVO implements Serializable { hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/SysUserRoleMapper.java
@@ -1,6 +1,6 @@ package com.mes.userinfo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.github.yulichang.base.MPJBaseMapper; import com.mes.userinfo.entity.SysUserRole; import org.apache.ibatis.annotations.Mapper; @@ -13,6 +13,6 @@ * @since 2024-04-11 */ @Mapper public interface SysUserRoleMapper extends BaseMapper<SysUserRole> { public interface SysUserRoleMapper extends MPJBaseMapper<SysUserRole> { } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/SysUserRoleService.java
@@ -1,6 +1,6 @@ package com.mes.userinfo.service; import com.baomidou.mybatisplus.extension.service.IService; import com.github.yulichang.base.MPJBaseService; import com.mes.userinfo.entity.SysUserRole; /** @@ -11,6 +11,7 @@ * @author zhoush * @since 2024-04-11 */ public interface SysUserRoleService extends IService<SysUserRole> { public interface SysUserRoleService extends MPJBaseService<SysUserRole> { } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/SysUserService.java
@@ -1,8 +1,8 @@ package com.mes.userinfo.service; import com.baomidou.mybatisplus.extension.service.IService; import com.mes.entity.request.GeneralRequest; import com.mes.userinfo.entity.SysUser; import com.mes.userinfo.entity.request.UserRequest; import com.mes.userinfo.entity.vo.SysUserVO; import java.util.List; @@ -60,10 +60,18 @@ /** * 按名称获取用户信息 * * @param userName * @return */ SysUser queryByUserName(String userName); /** * 按关键字获取用户信息列表 * * @param request * @return */ List<SysUserVO> listByUserName(UserRequest request); List<SysUserVO> listByUserName(GeneralRequest request); /** * 删除用户信息 @@ -81,5 +89,22 @@ */ List<String> getUserAuthorityInfo(Long userId); void clearUserAuthorityInfoByMenuId(Long userId); /** * 清空用户权限信息通过用户信息 */ void clearUserAuthorityInfo(String userName); /** * 清空用户权限信息通过角色id * * @param roleId */ void clearUserAuthorityInfoByRoleId(Long roleId); /** * 清空用户权限信息通过菜单id * * @param menuId */ void clearUserAuthorityInfoByMenuId(Long menuId); } hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/service/impl/SysUserServiceImpl.java
@@ -1,5 +1,6 @@ package com.mes.userinfo.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -7,13 +8,15 @@ import com.mes.common.config.Const; import com.mes.common.utils.JwtUtil; import com.mes.common.utils.RedisUtil; import com.mes.common.utils.UserInfoUtils; import com.mes.entity.request.GeneralRequest; import com.mes.menu.mapper.SysMenuMapper; import com.mes.role.entity.SysRole; import com.mes.role.entity.SysRoleMenu; import com.mes.role.service.SysRoleService; import com.mes.userinfo.entity.LoginUser; import com.mes.userinfo.entity.SysUser; import com.mes.userinfo.entity.SysUserRole; import com.mes.userinfo.entity.request.UserRequest; import com.mes.userinfo.entity.vo.SysUserVO; import com.mes.userinfo.mapper.SysUserMapper; import com.mes.userinfo.service.SysUserRoleService; @@ -21,10 +24,10 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; @@ -69,8 +72,12 @@ @Resource BCryptPasswordEncoder passwordEncoder; @Value("${test.common}") private String value; @Override public Map<String, String> login(SysUser user) { log.info(value); UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(user.getUserName(), user.getPassword()); Authentication authenticate = authenticationManager.authenticate(authenticationToken); if (Objects.isNull(authenticate)) { @@ -93,10 +100,9 @@ @Override public String logout() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); LoginUser loginUser = (LoginUser) authentication.getPrincipal(); Long userid = loginUser.getUser().getId(); redisUtil.deleteObject("login:" + userid); log.info("用户退出"); SysUser user = UserInfoUtils.get(); redisUtil.deleteObject("login:" + user.getId()); return "注销成功"; } @@ -122,10 +128,12 @@ BeanUtils.copyProperties(user, sysUser); this.updateById(sysUser); log.info("删除用户角色信息"); sysUserRoleService.removeByIds(user.getRoleList()); List<Long> roleIds = user.getRoleList().stream().map(SysRole::getId).collect(Collectors.toList()); sysUserRoleService.remove(new LambdaQueryWrapper<SysUserRole>() .eq(SysUserRole::getUserId, sysUser.getId()).in(CollectionUtil.isNotEmpty(roleIds), SysUserRole::getRoleId, roleIds)); log.info("保存用户角色信息"); saveUserRole(user.getRoleList(), sysUser.getId()); return null; return user; } @Override @@ -140,13 +148,18 @@ } @Override public List<SysUserVO> listByUserName(UserRequest request) { public SysUser queryByUserName(String userName) { return baseMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, userName)); } @Override public List<SysUserVO> listByUserName(GeneralRequest request) { MPJLambdaWrapper<SysUser> wrapper = new MPJLambdaWrapper<>(); wrapper.selectAll(SysUser.class) .selectCollection(SysRole.class, SysUserVO::getRoleList) .leftJoin(SysUserRole.class, SysUserRole::getUserId, SysUser::getId) .leftJoin(SysRole.class, SysRole::getId, SysUserRole::getRoleId) .like(StringUtils.hasText(request.getUserName()), SysUser::getUserName, request.getUserName()); .like(StringUtils.hasText(request.getKey()), SysUser::getUserName, request.getKey()); return baseMapper.selectJoinList(SysUserVO.class, wrapper); } @@ -191,8 +204,31 @@ } @Override public void clearUserAuthorityInfoByMenuId(Long userId) { public void clearUserAuthorityInfo(String userName) { redisUtil.deleteObject("GrantedAuthority:" + userName); } @Override public void clearUserAuthorityInfoByRoleId(Long roleId) { List<SysUser> sysUsers = this.list(new QueryWrapper<SysUser>() .inSql("id", "select user_id from sys_user_role where role_id = " + roleId)); sysUsers.forEach(u -> { this.clearUserAuthorityInfo(u.getUserName()); }); } @Override public void clearUserAuthorityInfoByMenuId(Long menuId) { MPJLambdaWrapper<SysUserRole> wrapper = new MPJLambdaWrapper<SysUserRole>().selectAll(SysUser.class).distinct() .leftJoin(SysUser.class, SysUser::getId, SysUserRole::getUserId) .leftJoin(SysRoleMenu.class, SysRoleMenu::getRoleId, SysUserRole::getRoleId) .eq(SysRoleMenu::getMenuId, menuId); List<SysUser> sysUsers = sysUserRoleService.selectJoinList(SysUser.class, wrapper); sysUsers.forEach(u -> { this.clearUserAuthorityInfo(u.getUserName()); }); } /** hangzhoumesParent/common/springsecurity/src/main/resources/application.yml
@@ -1,11 +1,25 @@ server: port: 8089 spring: profiles: active: dev application: name: security mybatis-plus: mapper-locations: classpath*:mapper/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #server: # port: 8089 #spring: # datasource: # driver-class-name: com.mysql.cj.jdbc.Driver # url: jdbc:mysql://192.168.56.10:3306/hangzhoumes?serverTimezone=GMT%2b8&characterEncoding=utf-8&useSSL=false # username: root # password: root # cloud: # nacos: # discovery: # server-addr: 127.0.0.1:8848 # application: # name: security # redis: # database: 0 # host: 127.0.0.1 # port: 6379 # password: # session: # store-type: redis #mybatis-plus: # mapper-locations: classpath*:mapper/*.xml # configuration: # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/controller/EdgStorageCageController.java
@@ -3,17 +3,12 @@ import com.mes.edgstoragecage.entity.EdgStorageCage; import com.mes.edgstoragecage.entity.EdgStorageCageDetails; import com.mes.edgstoragecage.service.EdgStorageCageService; import com.mes.edgstoragecage.service.impl.EdgStorageCageServiceImpl; import com.mes.taskcache.entity.TaskCache; import com.mes.taskcache.service.impl.TaskCacheServiceImpl; import com.mes.utils.Result; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.awt.image.ImageProducer; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -25,7 +20,7 @@ * @author zhoush * @since 2024-04-07 */ @Api(tags = "理片笼缓存") @Api(description = "理片笼缓存") @RestController @RequestMapping("/edgStorageCage") public class EdgStorageCageController { hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/glassinfo/controller/GlassInfoController.java
@@ -10,10 +10,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import com.mes.glassinfo.service.impl.GlassInfoServiceImpl; import java.util.List; import java.util.Map; /** * <p> @@ -23,7 +21,7 @@ * @author zhoush * @since 2024-04-07 */ @Api(tags = "玻璃信息小片") @Api(description = "玻璃信息小片") @RestController @RequestMapping("/glassInfo") public class GlassInfoController { hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/controller/TaskCacheController.java
@@ -12,7 +12,6 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; /** * <p> @@ -22,7 +21,7 @@ * @author zhoush * @since 2024-04-07 */ @Api(tags = "识别显示") @Api(description = "识别显示") @RestController @RequestMapping("/taskCache") public class TaskCacheController { hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application.yml
@@ -8,4 +8,4 @@ mybatis-plus: mapper-locations: classpath*:mapper/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl log-impl: org.apache.ibatis.logging.stdout.StdOutImpl hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageController.java
@@ -2,7 +2,7 @@ import com.mes.bigstorage.entity.BigStorageCage; import com.mes.bigstorage.service.BigStorageCageService; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -19,7 +19,7 @@ * @author zhoush * @since 2024-03-27 */ @ApiModel("理片笼信息") @Api(description = "理片笼信息") @RestController @RequestMapping("/bigStorageCage") public class BigStorageCageController { hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageDetailsController.java
@@ -3,10 +3,9 @@ import com.mes.bigstorage.entity.BigStorageCageDetails; import com.mes.bigstorage.service.BigStorageCageDetailsService; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -21,7 +20,7 @@ * @author zhoush * @since 2024-03-27 */ @ApiModel(description = "理片笼详情") @Api(description = "理片笼详情") @RestController @RequestMapping("/bigStorageCageDetails") public class BigStorageCageDetailsController { hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageCage.java
@@ -3,7 +3,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; @@ -19,7 +19,7 @@ * @author zhoush * @since 2024-03-27 */ @ApiModel(description = "<p> 大理片笼 </p>") @Api(description = "大理片笼") @Data @EqualsAndHashCode(callSuper = false) public class BigStorageCage implements Serializable { hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageCageDetails.java
@@ -2,22 +2,22 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import java.io.Serializable; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; /** * <p> * * * </p> * * @author zhoush * @since 2024-03-27 */ @ApiModel(description = "<p> 大理片笼详情 </p>") @Api(description = "大理片笼详情") @Data @EqualsAndHashCode(callSuper = false) public class BigStorageCageDetails implements Serializable { hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/controller/BigStorageCageFeedTaskController.java
@@ -3,7 +3,7 @@ import com.mes.bigstoragetask.entity.BigStorageCageFeedTask; import com.mes.bigstoragetask.service.BigStorageCageFeedTaskService; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -20,7 +20,7 @@ * @author zhoush * @since 2024-04-16 */ @ApiModel("进片任务信息") @Api(description = "进片任务信息") @RestController @RequestMapping("/big-storage-cage-feed-task") public class BigStorageCageFeedTaskController { hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/controller/BigStorageCageOutTaskController.java
@@ -3,7 +3,7 @@ import com.mes.bigstoragetask.entity.BigStorageCageOutTask; import com.mes.bigstoragetask.service.BigStorageCageOutTaskService; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -20,7 +20,7 @@ * @author zhoush * @since 2024-04-16 */ @ApiModel("出片任务信息") @Api(description = "出片任务信息") @RestController @RequestMapping("/big-storage-cage-out-task") public class BigStorageCageOutTaskController { hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application.yml
@@ -8,4 +8,7 @@ mybatis-plus: mapper-locations: classpath*:mapper/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl log-impl: org.apache.ibatis.logging.stdout.StdOutImpl test: common: 123789 hangzhoumesParent/moduleService/LoadGlassModule/src/test/java/com/mes/ApplicationTest.java
@@ -1,7 +1,11 @@ package com.mes; import com.mes.common.utils.UserInfoUtils; import com.mes.menu.entity.SysMenu; import com.mes.menu.service.SysMenuService; import com.mes.pp.entity.OptimizeDetail; import com.mes.pp.service.OptimizeDetailService; import com.mes.userinfo.entity.SysUser; import lombok.extern.slf4j.Slf4j; import org.junit.Test; import org.junit.runner.RunWith; @@ -25,6 +29,18 @@ @Resource OptimizeDetailService optimizationDetailService; @Resource SysMenuService service; @Test public void test1() { SysUser user = new SysUser(); user.setId(1l); UserInfoUtils.set(user); List<SysMenu> menuTree = service.getMenuTree(null); System.out.println("获取记录数:" + menuTree); } @Test public void test() { List<OptimizeDetail> list = optimizationDetailService.list(); hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/controller/DownStorageCageDetailsController.java
@@ -11,7 +11,7 @@ import java.util.List; import java.util.Map; @Api(tags = "缓存") @Api(description = "缓存") @RestController @RequestMapping("/downStorage") public class DownStorageCageDetailsController { hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/entity/DownStorageCage.java
@@ -2,7 +2,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModel; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; @@ -17,7 +17,7 @@ * @author zhoush * @since 2024-03-27 */ @ApiModel(description = "<p> 缓存</p>") @Api(description = "缓存") @Data @EqualsAndHashCode(callSuper = false) public class DownStorageCage implements Serializable { hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/controller/DownWorkstationController.java
@@ -25,7 +25,7 @@ */ @RestController @Api(tags = "工位") @Api(description = "工位") @RequestMapping("/downWorkStation") public class DownWorkstationController {