From c59cbfa92147058b828f78ed35b15d4ef4a7ef94 Mon Sep 17 00:00:00 2001 From: wu <731351411@qq.com> Date: 星期三, 26 六月 2024 14:47:25 +0800 Subject: [PATCH] 恢复Git删除的代码 --- hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/filter/JwtAuthenticationTokenFilter.java | 80 ++ hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/vo/SysRoleVO.java | 44 + hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRoleMenu.java | 36 + hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/JwtUtil.java | 55 + hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginFailureHandler.java | 31 + hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/SysMenuService.java | 66 ++ hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/impl/SysMenuServiceImpl.java | 148 +++++ hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleService.java | 51 + hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/controller/SysRoleController.java | 63 ++ hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginSuccessHandler.java | 38 + hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleMenuService.java | 16 hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAuthenticationEntryPoint.java | 33 + hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/RedisUtil.java | 235 ++++++++ hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/WebUtils.java | 30 + hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/RedisConfig.java | 37 + hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/TokenWebSecurityConfig.java | 94 +++ hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMapper.xml | 5 hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/controller/SysMenuController.java | 77 ++ hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtLogoutSuccessHandler.java | 40 + hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleMenuServiceImpl.java | 20 /dev/null | 18 hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/entity/SysMenu.java | 87 +++ hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMenuMapper.xml | 5 hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/mapper/SysMenuMapper.java | 21 hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMenuMapper.java | 18 hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/FastJsonRedisSerializer.java | 55 + hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/UserInfoUtils.java | 26 hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMapper.java | 18 hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRole.java | 50 + hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleServiceImpl.java | 123 ++++ hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAccessDeniedHandler.java | 35 + 31 files changed, 1,637 insertions(+), 18 deletions(-) diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeLayoutMapper.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeLayoutMapper.java deleted file mode 100644 index 1cef895..0000000 --- a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/OptimizeLayoutMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.mes.pp.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.mes.pp.entity.OptimizeLayout; -import org.apache.ibatis.annotations.Mapper; - -/** - * <p> - * Mapper 鎺ュ彛 - * </p> - * - * @author zhoush - * @since 2024-04-16 - */ -@Mapper -public interface OptimizeLayoutMapper extends BaseMapper<OptimizeLayout> { - -} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/RedisConfig.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/RedisConfig.java new file mode 100644 index 0000000..e469272 --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/RedisConfig.java @@ -0,0 +1,37 @@ +package com.mes.common.config; + +import com.mes.common.utils.FastJsonRedisSerializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +/** + * @Author : zhoush + * @Date: 2024/4/9 19:13 + * @Description: + */ +@Configuration +public class RedisConfig { + + @Bean + @SuppressWarnings(value = {"unchecked", "rawtypes"}) + public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate<Object, Object> template = new RedisTemplate<>(); + template.setConnectionFactory(connectionFactory); + + FastJsonRedisSerializer serializer = new FastJsonRedisSerializer(Object.class); + + // 浣跨敤StringRedisSerializer鏉ュ簭鍒楀寲鍜屽弽搴忓垪鍖杛edis鐨刱ey鍊� + template.setKeySerializer(new StringRedisSerializer()); + template.setValueSerializer(serializer); + + // Hash鐨刱ey涔熼噰鐢⊿tringRedisSerializer鐨勫簭鍒楀寲鏂瑰紡 + template.setHashKeySerializer(new StringRedisSerializer()); + template.setHashValueSerializer(serializer); + + template.afterPropertiesSet(); + return template; + } +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/TokenWebSecurityConfig.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/TokenWebSecurityConfig.java new file mode 100644 index 0000000..a130533 --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/config/TokenWebSecurityConfig.java @@ -0,0 +1,94 @@ +package com.mes.common.config; + + +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; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +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.authentication.UsernamePasswordAuthenticationFilter; + +@Configuration +@EnableWebSecurity +@EnableGlobalMethodSecurity(prePostEnabled = true) +public class TokenWebSecurityConfig extends WebSecurityConfigurerAdapter { + @Autowired + private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter; + @Autowired + LoginFailureHandler loginFailureHandler; + + @Autowired + LoginSuccessHandler loginSuccessHandler; + + @Autowired + JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; + + @Autowired + JwtAccessDeniedHandler jwtAccessDeniedHandler; + + @Autowired + JwtLogoutSuccessHandler jwtLogoutSuccessHandler; + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + /** + * 閰嶇疆杩囨护瑙勫垯 + */ + @Override + protected void configure(HttpSecurity http) throws Exception { + + http.cors().and().csrf().disable() + + // 鐧诲綍閰嶇疆 + .formLogin() + .successHandler(loginSuccessHandler) + .failureHandler(loginFailureHandler) + + .and() + .logout() + .logoutSuccessHandler(jwtLogoutSuccessHandler) + + // 绂佺敤session + .and() + .sessionManagement() + .sessionCreationPolicy(SessionCreationPolicy.STATELESS) + + // 閰嶇疆鎷︽埅瑙勫垯 + .and() + .authorizeRequests() + .antMatchers("/sys/user/login").anonymous() + .antMatchers("/swagger-ui.html").permitAll() + .antMatchers("/webjars/**").permitAll() + .antMatchers("/v2/**").permitAll() + .antMatchers("/swagger-resources/**").permitAll() + .antMatchers("/**").permitAll() + .anyRequest().authenticated() + + // 寮傚父澶勭悊鍣� + .and() + .exceptionHandling() + .authenticationEntryPoint(jwtAuthenticationEntryPoint) + .accessDeniedHandler(jwtAccessDeniedHandler) + + // 閰嶇疆鑷畾涔夌殑杩囨护鍣� + .and() + .addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); + } + + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/filter/JwtAuthenticationTokenFilter.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/filter/JwtAuthenticationTokenFilter.java new file mode 100644 index 0000000..1505d1b --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/filter/JwtAuthenticationTokenFilter.java @@ -0,0 +1,80 @@ +package com.mes.common.filter; + +import com.mes.common.utils.JwtUtil; +import com.mes.common.utils.RedisUtil; +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; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.annotation.Resource; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @Author : zhoush + * @Date: 2024/4/10 9:42 + * @Description: + */ +@Component +public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { + // 姝ゅ瑙i噴涓轰粈涔堜笉鍘诲疄鐜癋ilter鎺ュ彛锛屽洜涓哄湪鏌愪簺鎯呭喌涓嬩細杩囨护涓ゆ锛屾墽琛屼袱娆ilter閲岄潰鐨勬柟娉曪紝鎵�浠ユ垜浠�夋嫨缁ф壙SpringSecurity涓殑OncePerRequestFilter + @Autowired + private RedisUtil redisUtil; + + @Resource + private SysUserService sysUserService; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + //鑾峰彇token + String token = request.getHeader("token"); + if (!StringUtils.hasText(token)) { + //鏀捐 + filterChain.doFilter(request, response); + return; // 姝ゅ鍔犱笂return濂藉鏄悗闈㈢粨鏋滆繑鍥炵殑鏃跺�欏氨涓嶄細鍐嶈蛋涓�閬嶆杩囨护鍣ㄧ殑鏂规硶浜� + } + //瑙f瀽token + String userid; + try { + Claims claims = JwtUtil.getClaimByToken(token); + userid = claims.getSubject(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("token闈炴硶"); + } + //浠巖edis涓幏鍙栫敤鎴蜂俊鎭� + String redisKey = "login:" + userid; + LoginUser loginUser = redisUtil.getCacheObject(redisKey); + if (Objects.isNull(loginUser)) { + response.setHeader("token", ""); + throw new RuntimeException("鐢ㄦ埛鏈櫥褰�"); + } + //灏嗙敤鎴蜂俊鎭斁鍏ュ綋鍓嶇嚎绋� + UserInfoUtils.set(loginUser.getUser()); + //瀛樺叆SecurityContextHolder锛屼互渚涘悗闈㈢殑杩囨护鍣ㄤ娇鐢� + List<String> permissionKeyList = sysUserService.getUserAuthorityInfo(Long.parseLong(userid)); + List<GrantedAuthority> authorities = permissionKeyList.stream(). + map(SimpleGrantedAuthority::new) + .collect(Collectors.toList()); + UsernamePasswordAuthenticationToken authenticationToken = + new UsernamePasswordAuthenticationToken(loginUser, null, authorities); + SecurityContextHolder.getContext().setAuthentication(authenticationToken); + //鏀捐 + filterChain.doFilter(request, response); + } +} \ No newline at end of file diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAccessDeniedHandler.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAccessDeniedHandler.java new file mode 100644 index 0000000..aad53aa --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAccessDeniedHandler.java @@ -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(); + + } +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAuthenticationEntryPoint.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAuthenticationEntryPoint.java new file mode 100644 index 0000000..a95ca0c --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtAuthenticationEntryPoint.java @@ -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(); + } +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtLogoutSuccessHandler.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtLogoutSuccessHandler.java new file mode 100644 index 0000000..3757d4d --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/JwtLogoutSuccessHandler.java @@ -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(); + } +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginFailureHandler.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginFailureHandler.java new file mode 100644 index 0000000..72abdbe --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginFailureHandler.java @@ -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(); + } +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginSuccessHandler.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginSuccessHandler.java new file mode 100644 index 0000000..c5458bb --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/handler/LoginSuccessHandler.java @@ -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(); + } + +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/FastJsonRedisSerializer.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/FastJsonRedisSerializer.java new file mode 100644 index 0000000..f8ab417 --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/FastJsonRedisSerializer.java @@ -0,0 +1,55 @@ +package com.mes.common.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.parser.ParserConfig; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.type.TypeFactory; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.SerializationException; + +import java.nio.charset.Charset; + +/** + * @Author : zhoush + * @Date: 2024/4/11 15:28 + * @Description: + */ +public class FastJsonRedisSerializer<T> implements RedisSerializer<T> { + + public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); + + private Class<T> clazz; + + static { + ParserConfig.getGlobalInstance().setAutoTypeSupport(true); + } + + public FastJsonRedisSerializer(Class<T> clazz) { + super(); + this.clazz = clazz; + } + + @Override + public byte[] serialize(T t) throws SerializationException { + if (t == null) { + return new byte[0]; + } + return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET); + } + + @Override + public T deserialize(byte[] bytes) throws SerializationException { + if (bytes == null || bytes.length <= 0) { + return null; + } + String str = new String(bytes, DEFAULT_CHARSET); + + return JSON.parseObject(str, clazz); + } + + + protected JavaType getJavaType(Class<?> clazz) { + return TypeFactory.defaultInstance().constructType(clazz); + } +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/JwtUtil.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/JwtUtil.java new file mode 100644 index 0000000..f7af90a --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/JwtUtil.java @@ -0,0 +1,55 @@ +package com.mes.common.utils; + + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import lombok.Data; + +import java.util.Date; + +/** + * @Author : zhoush + * @Date: 2024/4/9 19:15 + * @Description: + */ +@Data +public class JwtUtil { + + private static final long expire = 60 * 60 * 1000L; + private static final String secret = "beibo"; + private static final String header = "Authorization"; + + // 鐢熸垚jwt + public static String generateToken(String username) { + + Date nowDate = new Date(); + Date expireDate = new Date(nowDate.getTime() + 1000 * expire); + + return Jwts.builder() + .setHeaderParam("typ", "JWT") + .setSubject(username) + .setIssuedAt(nowDate) + .setExpiration(expireDate)// 7澶╅亷鏈� + .signWith(SignatureAlgorithm.HS512, secret) + .compact(); + } + + // 瑙f瀽jwt + public static Claims getClaimByToken(String jwt) { + try { + return Jwts.parser() + .setSigningKey(secret) + .parseClaimsJws(jwt) + .getBody(); + } catch (Exception e) { + return null; + } + } + + // jwt鏄惁杩囨湡 + public boolean isTokenExpired(Claims claims) { + return claims.getExpiration().before(new Date()); + } + +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/RedisUtil.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/RedisUtil.java new file mode 100644 index 0000000..d11f2bc --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/RedisUtil.java @@ -0,0 +1,235 @@ +package com.mes.common.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.BoundSetOperations; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** + * spring redis 宸ュ叿绫� + **/ +@Component +public class RedisUtil { + @Autowired + public RedisTemplate redisTemplate; + + /** + * 缂撳瓨鍩烘湰鐨勫璞★紝Integer銆丼tring銆佸疄浣撶被绛� + * + * @param key 缂撳瓨鐨勯敭鍊� + * @param value 缂撳瓨鐨勫�� + */ + public <T> void setCacheObject(final String key, final T value) { + redisTemplate.opsForValue().set(key, value); + } + + /** + * 缂撳瓨鍩烘湰鐨勫璞★紝Integer銆丼tring銆佸疄浣撶被绛� + * + * @param key 缂撳瓨鐨勯敭鍊� + * @param value 缂撳瓨鐨勫�� + * @param timeout 鏃堕棿 + * @param timeUnit 鏃堕棿棰楃矑搴� + */ + public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) { + redisTemplate.opsForValue().set(key, value, timeout, timeUnit); + } + + /** + * 璁剧疆鏈夋晥鏃堕棿 + * + * @param key Redis閿� + * @param timeout 瓒呮椂鏃堕棿 + * @return true=璁剧疆鎴愬姛锛沠alse=璁剧疆澶辫触 + */ + public boolean expire(final String key, final long timeout) { + return expire(key, timeout, TimeUnit.SECONDS); + } + + /** + * 璁剧疆鏈夋晥鏃堕棿 + * + * @param key Redis閿� + * @param timeout 瓒呮椂鏃堕棿 + * @param unit 鏃堕棿鍗曚綅 + * @return true=璁剧疆鎴愬姛锛沠alse=璁剧疆澶辫触 + */ + public boolean expire(final String key, final long timeout, final TimeUnit unit) { + return redisTemplate.expire(key, timeout, unit); + } + + /** + * 鑾峰緱缂撳瓨鐨勫熀鏈璞°�� + * + * @param key 缂撳瓨閿�� + * @return 缂撳瓨閿�煎搴旂殑鏁版嵁 + */ + public <T> T getCacheObject(final String key) { + ValueOperations<String, T> operation = redisTemplate.opsForValue(); + return operation.get(key); + } + + /** + * 鍒犻櫎鍗曚釜瀵硅薄 + * + * @param key + */ + public boolean deleteObject(final String key) { + return redisTemplate.delete(key); + } + + /** + * 鍒犻櫎闆嗗悎瀵硅薄 + * + * @param collection 澶氫釜瀵硅薄 + * @return + */ + public long deleteObject(final Collection collection) { + return redisTemplate.delete(collection); + } + + /** + * 缂撳瓨List鏁版嵁 + * + * @param key 缂撳瓨鐨勯敭鍊� + * @param dataList 寰呯紦瀛樼殑List鏁版嵁 + * @return 缂撳瓨鐨勫璞� + */ + public <T> long setCacheList(final String key, final List<T> dataList) { + Long count = redisTemplate.opsForList().rightPushAll(key, dataList); + return count == null ? 0 : count; + } + + /** + * 鑾峰緱缂撳瓨鐨刲ist瀵硅薄 + * + * @param key 缂撳瓨鐨勯敭鍊� + * @return 缂撳瓨閿�煎搴旂殑鏁版嵁 + */ + public <T> List<T> getCacheList(final String key) { + return redisTemplate.opsForList().range(key, 0, -1); + } + + /** + * 缂撳瓨Set + * + * @param key 缂撳瓨閿�� + * @param dataSet 缂撳瓨鐨勬暟鎹� + * @return 缂撳瓨鏁版嵁鐨勫璞� + */ + public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet) { + BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key); + Iterator<T> it = dataSet.iterator(); + while (it.hasNext()) { + setOperation.add(it.next()); + } + return setOperation; + } + + /** + * 鑾峰緱缂撳瓨鐨剆et + * + * @param key + * @return + */ + public <T> Set<T> getCacheSet(final String key) { + return redisTemplate.opsForSet().members(key); + } + + /** + * 缂撳瓨Map + * + * @param key + * @param dataMap + */ + public <T> void setCacheMap(final String key, final Map<String, T> dataMap) { + if (dataMap != null) { + redisTemplate.opsForHash().putAll(key, dataMap); + } + } + + /** + * 鑾峰緱缂撳瓨鐨凪ap + * + * @param key + * @return + */ + public <T> Map<String, T> getCacheMap(final String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * 寰�Hash涓瓨鍏ユ暟鎹� + * + * @param key Redis閿� + * @param hKey Hash閿� + * @param value 鍊� + */ + public <T> void setCacheMapValue(final String key, final String hKey, final T value) { + redisTemplate.opsForHash().put(key, hKey, value); + } + + /** + * 鑾峰彇Hash涓殑鏁版嵁 + * + * @param key Redis閿� + * @param hKey Hash閿� + * @return Hash涓殑瀵硅薄 + */ + public <T> T getCacheMapValue(final String key, final String hKey) { + HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash(); + return opsForHash.get(key, hKey); + } + + /** + * 鍒犻櫎Hash涓殑鏁版嵁 + * + * @param key + * @param hkey + */ + public void delCacheMapValue(final String key, final String hkey) { + HashOperations hashOperations = redisTemplate.opsForHash(); + hashOperations.delete(key, hkey); + } + + /** + * 鑾峰彇澶氫釜Hash涓殑鏁版嵁 + * + * @param key Redis閿� + * @param hKeys Hash閿泦鍚� + * @return Hash瀵硅薄闆嗗悎 + */ + public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys) { + return redisTemplate.opsForHash().multiGet(key, hKeys); + } + + /** + * 鑾峰緱缂撳瓨鐨勫熀鏈璞″垪琛� + * + * @param pattern 瀛楃涓插墠缂� + * @return 瀵硅薄鍒楄〃 + */ + public Collection<String> keys(final String pattern) { + return redisTemplate.keys(pattern); + } + + /** + * 鍒ゆ柇key鏄惁瀛樺湪 + * + * @param key 閿� + * @return true 瀛樺湪 false涓嶅瓨鍦� + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } +} \ No newline at end of file diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/UserInfoUtils.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/UserInfoUtils.java new file mode 100644 index 0000000..292797c --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/UserInfoUtils.java @@ -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(); + } + } +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/WebUtils.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/WebUtils.java new file mode 100644 index 0000000..618144d --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/common/utils/WebUtils.java @@ -0,0 +1,30 @@ +package com.mes.common.utils; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Author : zhoush + * @Date: 2024/4/9 19:16 + * @Description: + */ +public class WebUtils { + /** + * 灏嗗瓧绗︿覆娓叉煋鍒板鎴风 + * + * @param response 娓叉煋瀵硅薄 + * @param string 寰呮覆鏌撶殑瀛楃涓� + * @return null + */ + public static String renderString(HttpServletResponse response, String string) { + try { + response.setStatus(200); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().print(string); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/controller/SysMenuController.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/controller/SysMenuController.java new file mode 100644 index 0000000..4ca0cb9 --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/controller/SysMenuController.java @@ -0,0 +1,77 @@ +package com.mes.menu.controller; + +import com.mes.entity.request.GeneralRequest; +import com.mes.menu.entity.SysMenu; +import com.mes.menu.service.SysMenuService; +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.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * @author zhoush + * @since 2024-04-11 + */ +@Api(description = "鑿滃崟绠$悊") +@RestController +@RequestMapping("/sys/menu") +public class SysMenuController { + + @Autowired + private SysMenuService sysMenuService; + + @ApiOperation("鏂板鑿滃崟") + @PostMapping("/save") +// @PreAuthorize("hasAuthority('sys:menu:save')") + public Result save(@Validated @RequestBody SysMenu sysMenu) { + return Result.success(sysMenuService.save(sysMenu)); + } + + @ApiOperation("淇敼鑿滃崟淇℃伅") + @PostMapping("/updateMenu") +// @PreAuthorize("hasAuthority('sys:menu:update')") + public Result updateMenu(@Validated @RequestBody SysMenu sysMenu) { + sysMenuService.updateMenu(sysMenu); + return Result.success(sysMenu); + } + + @ApiOperation("鑾峰彇鐢ㄦ埛鏈夋潈闄愮殑鎵�鏈夎彍鍗�") + @GetMapping("/getMenuTree") + public Result<List<SysMenu>> getMenuTree(GeneralRequest request) { + return Result.success(sysMenuService.getMenuTree(request)); + } + + @ApiOperation("鑾峰彇鐢ㄦ埛鐨勬潈闄�") + @GetMapping("/getAuthorityInfo") + public Result<List<String>> getAuthorityInfo() { + return Result.success(sysMenuService.getAuthorityInfo()); + } + + + @ApiOperation("鐢ㄦ埛褰撳墠鐢ㄦ埛鐨勮彍鍗曞拰鏉冮檺淇℃伅") + @GetMapping("/nav") + public Result<Map<Object, Object>> nav() { + return Result.success(sysMenuService.nav()); + } + + @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)); + } + +} + diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/entity/SysMenu.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/entity/SysMenu.java new file mode 100644 index 0000000..37476c6 --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/entity/SysMenu.java @@ -0,0 +1,87 @@ +package com.mes.menu.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * <p> + * + * </p> + * + * @author zhoush + * @since 2024-04-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SysMenu implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 鑷id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 鐖秈d + */ + private Long parentId; + + /** + * 妯″潡鍚嶇О + */ + private String menuName; + + /** + * 鍥炬爣 + */ + private String icon; + + /** + * 鍦板潃 + */ + private String url; + + /** + * 璇█绫诲瀷 + */ + private String languageType; + + /** + * 鐘舵�� + */ + private Integer status; + + /** + * 鎺掑簭 + */ + private String listSort; + + /** + * 鍒涘缓鏃堕棿 + */ + private Date createTime; + + /** + * 鏉冮檺 + */ + private String perms; + + /** + * 瀛愯彍鍗� + */ + @TableField(exist = false) + private List<SysMenu> children; + + +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/mapper/SysMenuMapper.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/mapper/SysMenuMapper.java new file mode 100644 index 0000000..b1ef2d6 --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/mapper/SysMenuMapper.java @@ -0,0 +1,21 @@ +package com.mes.menu.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import com.mes.menu.entity.SysMenu; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * <p> + * 鑿滃崟琛� Mapper 鎺ュ彛 + * </p> + * + * @author zhoush + * @since 2024-04-11 + */ +@Mapper +public interface SysMenuMapper extends MPJBaseMapper<SysMenu> { + + List<String> selectPermsByUserId(long parseLong); +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/SysMenuService.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/SysMenuService.java new file mode 100644 index 0000000..014d1cd --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/SysMenuService.java @@ -0,0 +1,66 @@ +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> + * 鑿滃崟琛� 鏈嶅姟绫� + * </p> + * + * @author zhoush + * @since 2024-04-11 + */ +public interface SysMenuService extends IService<SysMenu> { + + /** + * 鏇存柊鑿滃崟淇℃伅 + * + * @param menu + * @return + */ + SysMenu updateMenu(SysMenu menu); + + /** + * 鑾峰彇鐢ㄦ埛鏈夋潈闄愮殑鑿滃崟鏍� + * + * @return + */ + List<SysMenu> getMenuTree(GeneralRequest request); + + /** + * 鑾峰彇鐢ㄦ埛鐨勬潈闄� + * + * @return + */ + List<String> getAuthorityInfo(); + + + /** + * 鑾峰彇鐢ㄦ埛鑿滃崟鍙婃潈闄愪俊鎭� + * + * @return + */ + Map<Object, Object> nav(); + + /** + * 鍒犻櫎鑿滃崟淇℃伅 + * + * @param menuId + * @return + */ + String deleteMenu(Long menuId); + + /** + * 鎵归噺鍒犻櫎鑿滃崟淇℃伅 + * + * @param menuIds + * @return + */ + String batchDeleteMenu(List<Long> menuIds); + +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/impl/SysMenuServiceImpl.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..597f93c --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/menu/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,148 @@ +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; + +/** + * <p> + * 鑿滃崟琛� 鏈嶅姟瀹炵幇绫� + * </p> + * + * @author zhoush + * @since 2024-04-11 + */ +@Service +@Slf4j +public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService { + + @Autowired + SysUserService sysUserService; + + @Autowired + SysUserRoleMapper sysUserRoleMapper; + + @Autowired + SysRoleMenuService sysRoleMenuService; + + @Override + public SysMenu updateMenu(SysMenu menu) { + baseMapper.updateById(menu); + // 娓呴櫎鎵�鏈変笌璇ヨ彍鍗曠浉鍏崇殑鏉冮檺缂撳瓨 + sysUserService.clearUserAuthorityInfoByMenuId(menu.getId()); + return menu; + } + + @Override + public List<SysMenu> getMenuTree(GeneralRequest request) { + //todo:闇�瑕佸厛鑾峰彇鐢ㄦ埛鐨勮鑹诧紝瑙掕壊涓嬬殑鑿滃崟鏉冮檺锛屾嬁鍒拌彍鍗昳d鑾峰彇鎵�鏈夎彍鍗� + SysUser user = UserInfoUtils.get(); + MPJLambdaWrapper<SysUserRole> wrapper = new MPJLambdaWrapper<>(); + + wrapper.selectAll(SysMenu.class).distinct() + .innerJoin(SysUser.class, SysUser::getId, SysUserRole::getUserId) + .innerJoin(SysRoleMenu.class, SysRoleMenu::getRoleId, SysUserRole::getRoleId) + .innerJoin(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); + log.info("userinfos:{}",menuList); + return create(menuList); + } + + @Override + public List<String> getAuthorityInfo() { + SysUser user = UserInfoUtils.get(); + log.info("鑾峰彇鐢ㄦ埛淇℃伅锛岀敤鎴峰悕涓簕}", user); + // 鑾峰彇鏉冮檺淇℃伅 + // ROLE_admin,ROLE_normal,sys:user:list,.... + 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 "鎵归噺鍒犻櫎鎴愬姛"; + } + + + /** + * 灏嗘暟鎹簱涓煡璇㈠嚭鏉ョ殑list闆嗗悎浼犲叆姝ゆ柟娉曞嵆鍙幏寰楁帓鎴愭爲褰㈢粨鏋勭殑list闆嗗悎 + * + * @param lists + * @return + */ + public List<SysMenu> create(List<SysMenu> lists) { + List<SysMenu> deptTreeList = lists.stream() + .filter(item -> item.getParentId() == 0) + .map(item -> { + item.setChildren(getChildren(item, lists)); + return item; + }).collect(Collectors.toList()); + return deptTreeList; + } + + /** + * 姝ゆ柟娉曞皢琚�掑綊璋冪敤 + * + * @param menu + * @param menus + * @return + */ + private List<SysMenu> getChildren(SysMenu menu, List<SysMenu> menus) { + List<SysMenu> res = menus.stream() + .filter(item -> item.getParentId().equals(menu.getId())) + .collect(Collectors.toList()); + log.info("鑿滃崟鏍�:{}", JSONUtil.toJsonStr(res)); + return res; + } + +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/controller/SysRoleController.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/controller/SysRoleController.java new file mode 100644 index 0000000..cb6da80 --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/controller/SysRoleController.java @@ -0,0 +1,63 @@ +package com.mes.role.controller; + + +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; + +/** + * @author zhoush + * @since 2024-04-11 + */ +@Api(description = "瑙掕壊绠$悊") +@RestController +@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)); + } + +} \ No newline at end of file diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRole.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRole.java new file mode 100644 index 0000000..14fd4a3 --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRole.java @@ -0,0 +1,50 @@ +package com.mes.role.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * <p> + * 瑙掕壊琛� + * </p> + * + * @author zhoush + * @since 2024-04-11 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class SysRole implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private String name; + + /** + * 瑙掕壊鏉冮檺瀛楃涓� + */ + private String roleKey; + + /** + * 瑙掕壊鐘舵�侊紙0姝e父 1鍋滅敤锛� + */ + private String status; + + /** + * 鍒犻櫎鏍囧織 + */ + private Integer delFlag; + + /** + * 澶囨敞 + */ + private String remark; + + +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRoleMenu.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRoleMenu.java new file mode 100644 index 0000000..aae2aed --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/SysRoleMenu.java @@ -0,0 +1,36 @@ +package com.mes.role.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + * <p> + * + * </p> + * + * @author zhoush + * @since 2024-04-11 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class SysRoleMenu implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 瑙掕壊ID + */ + @TableId(type = IdType.NONE) + private Long roleId; + + /** + * 鑿滃崟id + */ + private Long menuId; + + +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/vo/SysRoleVO.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/vo/SysRoleVO.java new file mode 100644 index 0000000..45efd61 --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/entity/vo/SysRoleVO.java @@ -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姝e父 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; + +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMapper.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMapper.java new file mode 100644 index 0000000..d9251c1 --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMapper.java @@ -0,0 +1,18 @@ +package com.mes.role.mapper; + +import com.github.yulichang.base.MPJBaseMapper; +import com.mes.role.entity.SysRole; +import org.apache.ibatis.annotations.Mapper; + +/** + * <p> + * 瑙掕壊琛� Mapper 鎺ュ彛 + * </p> + * + * @author zhoush + * @since 2024-04-11 + */ +@Mapper +public interface SysRoleMapper extends MPJBaseMapper<SysRole> { + +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMenuMapper.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMenuMapper.java new file mode 100644 index 0000000..451d7fe --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/SysRoleMenuMapper.java @@ -0,0 +1,18 @@ +package com.mes.role.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mes.role.entity.SysRoleMenu; +import org.apache.ibatis.annotations.Mapper; + +/** + * <p> + * Mapper 鎺ュ彛 + * </p> + * + * @author zhoush + * @since 2024-04-11 + */ +@Mapper +public interface SysRoleMenuMapper extends BaseMapper<SysRoleMenu> { + +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMapper.xml b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMapper.xml new file mode 100644 index 0000000..9a0cd27 --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMapper.xml @@ -0,0 +1,5 @@ +<?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.mes.role.mapper.SysRoleMapper"> + +</mapper> diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMenuMapper.xml b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMenuMapper.xml new file mode 100644 index 0000000..af0749b --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/mapper/xml/SysRoleMenuMapper.xml @@ -0,0 +1,5 @@ +<?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.mes.role.mapper.SysRoleMenuMapper"> + +</mapper> diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleMenuService.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleMenuService.java new file mode 100644 index 0000000..e4d23dc --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleMenuService.java @@ -0,0 +1,16 @@ +package com.mes.role.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mes.role.entity.SysRoleMenu; + +/** + * <p> + * 鏈嶅姟绫� + * </p> + * + * @author zhoush + * @since 2024-04-11 + */ +public interface SysRoleMenuService extends IService<SysRoleMenu> { + +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleService.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleService.java new file mode 100644 index 0000000..9592106 --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/SysRoleService.java @@ -0,0 +1,51 @@ +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> + * 瑙掕壊琛� 鏈嶅姟绫� + * </p> + * + * @author zhoush + * @since 2024-04-11 + */ +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); +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleMenuServiceImpl.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleMenuServiceImpl.java new file mode 100644 index 0000000..4c8a475 --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleMenuServiceImpl.java @@ -0,0 +1,20 @@ +package com.mes.role.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mes.role.entity.SysRoleMenu; +import com.mes.role.mapper.SysRoleMenuMapper; +import com.mes.role.service.SysRoleMenuService; +import org.springframework.stereotype.Service; + +/** + * <p> + * 鏈嶅姟瀹炵幇绫� + * </p> + * + * @author zhoush + * @since 2024-04-11 + */ +@Service +public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuMapper, SysRoleMenu> implements SysRoleMenuService { + +} diff --git a/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleServiceImpl.java b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..2d08603 --- /dev/null +++ b/hangzhoumesParent/common/springsecurity/src/main/java/com/mes/role/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,123 @@ +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> + * 瑙掕壊琛� 鏈嶅姟瀹炵幇绫� + * </p> + * + * @author zhoush + * @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"; + } +} -- Gitblit v1.8.0