初始化

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;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.nflg.wms.admin.service.MenuControllerService;
import com.nflg.wms.common.pojo.ApiResult;
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.MenuButtonVO;
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.annotation.ApiMark;
import jakarta.annotation.Resource;
@ -17,7 +14,6 @@ import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.*;
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.stp.StpUtil;
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.RestController;
@ -10,6 +11,7 @@ import org.springframework.web.bind.annotation.RestController;
* Sa-Token SSO
*/
@RestController
@RequestMapping("/sso")
public class SsoClientController {
// // 首页
@ -26,7 +28,7 @@ public class SsoClientController {
/**
* 判断是否登录
**/
@RequestMapping("/sso/isLogin")
@GetMapping("/isLogin")
public ApiResult<Boolean> isLogin() {
return ApiResult.success(StpUtil.isLogin());
}
@ -34,7 +36,7 @@ public class SsoClientController {
/**
* 返回SSO认证中心登录地址
**/
@RequestMapping("/sso/getLoginUrl")
@GetMapping("/getLoginUrl")
public ApiResult<String> getLoginUrl() {
// String serverAuthUrl = SaSsoUtil.buildServerAuthUrl(clientLoginUrl, "");
// return ApiResult.success(serverAuthUrl);

View File

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

View File

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

View File

@ -1,11 +1,16 @@
package com.nflg.wms.gateway;
import com.nflg.wms.repository.service.IUserService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
@Component
public class AuthService {
@Resource
private IUserService userService;
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 reactor.core.publisher.Mono;
import java.util.Optional;
@Component
public class TraceIdFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 从请求头中获取 TraceId
String traceId = exchange.getRequest().getHeaders().getFirst(Constant.TRACE_ID_HEADER);
// 如果没有就生成新的
if (StrUtil.isBlank(traceId)) {
traceId = IdUtil.getSnowflakeNextIdStr();
}
// TraceId 放入请求头中
// 获取 TraceId
String traceId = Optional.ofNullable(
exchange.getRequest().getHeaders().getFirst(Constant.TRACE_ID_HEADER))
.orElse(IdUtil.getSnowflakeNextIdStr());
// 构建新请求并注入 TraceId header
ServerHttpRequest mutatedRequest = exchange.getRequest().mutate()
.header(Constant.TRACE_ID_HEADER, traceId)
.build();
// TraceId 写入 MDC用于日志
// 设置 MDC用于日志
MDC.put(Constant.TRACE_ID, traceId);
// 清理 MDC 防止内存泄漏
// 继续过滤链
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

View File

@ -13,4 +13,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
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 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("用户不存在");
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"?>
<!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>
<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>

View File

@ -8,6 +8,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@ -20,6 +21,8 @@ public class JacksonConfig {
.serializerByType(Long.class, new ToStringSerializer())
.serializerByType(Long.TYPE, new ToStringSerializer())
.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) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer serializer = new StringRedisSerializer();
// 设置 Key 的序列化器
template.setKeySerializer(new StringRedisSerializer());
template.setKeySerializer(serializer);
// 设置 Value 的序列化器
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setValueSerializer(serializer);
template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}
@ -26,14 +28,16 @@ public class RedisConfig {
public RedisTemplate<String, String> redisStringTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, String> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer serializer = new StringRedisSerializer();
// 设置 Key 的序列化器
template.setKeySerializer(new StringRedisSerializer());
template.setKeySerializer(serializer);
// 设置 Value 的序列化器
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setValueSerializer(serializer);
// 设置 Hash Key 的序列化器
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(serializer);
// 设置 Hash Value 的序列化器
template.setHashValueSerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}
}

View File

@ -33,7 +33,7 @@
<spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version>
<hutool-all.version>5.8.37</hutool-all.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>-->
<postgresql.version>42.7.5</postgresql.version>
<oss.version>3.17.4</oss.version>