初始化

This commit is contained in:
曹鹏飞 2025-06-16 09:32:35 +08:00
parent d4163cbeb3
commit 3fab56df80
13 changed files with 68 additions and 42 deletions

View File

@ -1,7 +1,5 @@
package com.nflg.wms.admin.controller; package com.nflg.wms.admin.controller;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.nflg.wms.admin.service.MenuControllerService; import com.nflg.wms.admin.service.MenuControllerService;
import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.PageData;
@ -9,7 +7,6 @@ import com.nflg.wms.common.pojo.qo.*;
import com.nflg.wms.common.pojo.vo.ApiVO; import com.nflg.wms.common.pojo.vo.ApiVO;
import com.nflg.wms.common.pojo.vo.MenuButtonVO; import com.nflg.wms.common.pojo.vo.MenuButtonVO;
import com.nflg.wms.common.pojo.vo.MenuVO; import com.nflg.wms.common.pojo.vo.MenuVO;
import com.nflg.wms.repository.entity.DictionaryItem;
import com.nflg.wms.starter.BaseController; import com.nflg.wms.starter.BaseController;
import com.nflg.wms.starter.annotation.ApiMark; import com.nflg.wms.starter.annotation.ApiMark;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@ -17,7 +14,6 @@ import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List; import java.util.List;
import java.util.Objects;
/** /**
* 菜单管理 * 菜单管理

View File

@ -3,6 +3,7 @@ package com.nflg.wms.admin.controller;
import cn.dev33.satoken.sso.processor.SaSsoClientProcessor; import cn.dev33.satoken.sso.processor.SaSsoClientProcessor;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.ApiResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -10,6 +11,7 @@ import org.springframework.web.bind.annotation.RestController;
* Sa-Token SSO * Sa-Token SSO
*/ */
@RestController @RestController
@RequestMapping("/sso")
public class SsoClientController { public class SsoClientController {
// // 首页 // // 首页
@ -26,7 +28,7 @@ public class SsoClientController {
/** /**
* 判断是否登录 * 判断是否登录
**/ **/
@RequestMapping("/sso/isLogin") @GetMapping("/isLogin")
public ApiResult<Boolean> isLogin() { public ApiResult<Boolean> isLogin() {
return ApiResult.success(StpUtil.isLogin()); return ApiResult.success(StpUtil.isLogin());
} }
@ -34,7 +36,7 @@ public class SsoClientController {
/** /**
* 返回SSO认证中心登录地址 * 返回SSO认证中心登录地址
**/ **/
@RequestMapping("/sso/getLoginUrl") @GetMapping("/getLoginUrl")
public ApiResult<String> getLoginUrl() { public ApiResult<String> getLoginUrl() {
// String serverAuthUrl = SaSsoUtil.buildServerAuthUrl(clientLoginUrl, ""); // String serverAuthUrl = SaSsoUtil.buildServerAuthUrl(clientLoginUrl, "");
// return ApiResult.success(serverAuthUrl); // return ApiResult.success(serverAuthUrl);

View File

@ -10,8 +10,6 @@ import java.util.UUID;
@Accessors(chain = true) @Accessors(chain = true)
public class LdapUserDTO { public class LdapUserDTO {
private Long id;
/** /**
* 用户名 * 用户名
*/ */

View File

@ -33,6 +33,7 @@ import java.util.stream.Collectors;
* Sa-Token-SSO Server端 * Sa-Token-SSO Server端
*/ */
@RestController @RestController
@RequestMapping("/sso")
public class SsoServerController { public class SsoServerController {
private static final PasswordEncoder PASSWORDENCODER = new BCryptPasswordEncoder(); private static final PasswordEncoder PASSWORDENCODER = new BCryptPasswordEncoder();
@ -44,18 +45,10 @@ public class SsoServerController {
private IUserRoleMapService userRoleMapService; private IUserRoleMapService userRoleMapService;
/** /**
* 处理所有SSO相关请求 * 登录
*/ */
@RequestMapping("/sso/*") @PostMapping("/doLogin")
public Object ssoRequest() { public Object doLogin() {
return SaSsoServerProcessor.instance.dister();
}
/**
* 处理所有SSO相关请求
*/
@PostMapping("/sso/*")
public Object ssoRequest1() {
return SaSsoServerProcessor.instance.dister(); return SaSsoServerProcessor.instance.dister();
} }

View File

@ -1,11 +1,16 @@
package com.nflg.wms.gateway; package com.nflg.wms.gateway;
import com.nflg.wms.repository.service.IUserService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component
public class AuthService { public class AuthService {
@Resource
private IUserService userService;
public boolean hasPermission(Long userId,String url) { public boolean hasPermission(Long userId,String url) {
return true; return userService.hasPermission(userId,url);
} }
} }

View File

@ -12,26 +12,36 @@ import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import java.util.Optional;
@Component @Component
public class TraceIdFilter implements GlobalFilter, Ordered { public class TraceIdFilter implements GlobalFilter, Ordered {
@Override @Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 从请求头中获取 TraceId // 获取 TraceId
String traceId = exchange.getRequest().getHeaders().getFirst(Constant.TRACE_ID_HEADER); String traceId = Optional.ofNullable(
// 如果没有就生成新的 exchange.getRequest().getHeaders().getFirst(Constant.TRACE_ID_HEADER))
if (StrUtil.isBlank(traceId)) { .orElse(IdUtil.getSnowflakeNextIdStr());
traceId = IdUtil.getSnowflakeNextIdStr();
} // 构建新请求并注入 TraceId header
// TraceId 放入请求头中
ServerHttpRequest mutatedRequest = exchange.getRequest().mutate() ServerHttpRequest mutatedRequest = exchange.getRequest().mutate()
.header(Constant.TRACE_ID_HEADER, traceId) .header(Constant.TRACE_ID_HEADER, traceId)
.build(); .build();
// TraceId 写入 MDC用于日志
// 设置 MDC用于日志
MDC.put(Constant.TRACE_ID, traceId); MDC.put(Constant.TRACE_ID, traceId);
// 清理 MDC 防止内存泄漏
// 继续过滤链
return chain.filter(exchange.mutate().request(mutatedRequest).build()) return chain.filter(exchange.mutate().request(mutatedRequest).build())
.doFinally(signalType -> MDC.remove(Constant.TRACE_ID)); .contextWrite(ctx -> ctx.put(Constant.TRACE_ID, traceId))
.doFinally(signalType -> {
// 添加 traceId 到响应头防止响应头已被提交
if (!exchange.getResponse().isCommitted()) {
exchange.getResponse().getHeaders().add(Constant.TRACE_ID_HEADER, traceId);
}
MDC.remove(Constant.TRACE_ID);
});
} }
@Override @Override

View File

@ -13,4 +13,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/ */
public interface UserMapper extends BaseMapper<User> { public interface UserMapper extends BaseMapper<User> {
boolean hasPermission(Long userId, String url);
} }

View File

@ -26,4 +26,6 @@ public interface IUserService extends IService<User> {
void update(List<User> users); void update(List<User> users);
void delete(Long id); void delete(Long id);
boolean hasPermission(Long userId, String url);
} }

View File

@ -74,4 +74,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
VUtil.trueThrowBusinessError(Objects.isNull(user)).throwMessage("用户不存在"); VUtil.trueThrowBusinessError(Objects.isNull(user)).throwMessage("用户不存在");
auditLogService.addDelete(User.class, user, UserUtil.getUserName()); auditLogService.addDelete(User.class, user, UserUtil.getUserName());
} }
@Override
public boolean hasPermission(Long userId, String url) {
return baseMapper.hasPermission(userId,url);
}
} }

View File

@ -1,5 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nflg.wms.repository.mapper.UserMapper"> <mapper namespace="com.nflg.wms.repository.mapper.UserMapper">
<select id="hasPermission" resultType="boolean">
SELECT EXISTS(SELECT 1
FROM user_role_map urm
INNER JOIN role_menu_map rmm ON urm.role_id = rmm.role_id
INNER JOIN menu m ON rmm.menu_id = m."id"
WHERE m.url = #{url}
AND urm.user_id = #{userId})
</select>
</mapper> </mapper>

View File

@ -8,6 +8,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
@ -20,6 +21,8 @@ public class JacksonConfig {
.serializerByType(Long.class, new ToStringSerializer()) .serializerByType(Long.class, new ToStringSerializer())
.serializerByType(Long.TYPE, new ToStringSerializer()) .serializerByType(Long.TYPE, new ToStringSerializer())
.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN))) .serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)))
.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN))); .deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN)))
.serializerByType(LocalDate.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)))
.deserializerByType(LocalDate.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN)));
} }
} }

View File

@ -14,11 +14,13 @@ public class RedisConfig {
public RedisTemplate<String, Object> redisObjectTemplate(RedisConnectionFactory redisConnectionFactory) { public RedisTemplate<String, Object> redisObjectTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>(); RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory); template.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer serializer = new StringRedisSerializer();
// 设置 Key 的序列化器 // 设置 Key 的序列化器
template.setKeySerializer(new StringRedisSerializer()); template.setKeySerializer(serializer);
// 设置 Value 的序列化器 // 设置 Value 的序列化器
template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setValueSerializer(serializer);
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template; return template;
} }
@ -26,14 +28,16 @@ public class RedisConfig {
public RedisTemplate<String, String> redisStringTemplate(RedisConnectionFactory redisConnectionFactory) { public RedisTemplate<String, String> redisStringTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, String> template = new RedisTemplate<>(); RedisTemplate<String, String> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory); template.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer serializer = new StringRedisSerializer();
// 设置 Key 的序列化器 // 设置 Key 的序列化器
template.setKeySerializer(new StringRedisSerializer()); template.setKeySerializer(serializer);
// 设置 Value 的序列化器 // 设置 Value 的序列化器
template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setValueSerializer(serializer);
// 设置 Hash Key 的序列化器 // 设置 Hash Key 的序列化器
template.setHashKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(serializer);
// 设置 Hash Value 的序列化器 // 设置 Hash Value 的序列化器
template.setHashValueSerializer(new StringRedisSerializer()); template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template; return template;
} }
} }

View File

@ -33,7 +33,7 @@
<spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version> <spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version>
<hutool-all.version>5.8.37</hutool-all.version> <hutool-all.version>5.8.37</hutool-all.version>
<sa-token.version>1.42.0</sa-token.version> <sa-token.version>1.42.0</sa-token.version>
<mybatis-plus.version>3.5.9</mybatis-plus.version> <mybatis-plus.version>3.5.12</mybatis-plus.version>
<!-- <mysql-connector.version>8.4.0</mysql-connector.version>--> <!-- <mysql-connector.version>8.4.0</mysql-connector.version>-->
<postgresql.version>42.7.5</postgresql.version> <postgresql.version>42.7.5</postgresql.version>
<oss.version>3.17.4</oss.version> <oss.version>3.17.4</oss.version>