提交 28646fdf 编写于 作者: H hxr

fix: 验证码不刷新问题修复,项目包结构调整

上级 e16ffe3a
<p align="center">
<img alt="有来技术" src="https://img.shields.io/badge/Java -17-brightgreen.svg"/>
<img alt="有来技术" src="https://img.shields.io/badge/SpringBoot-3.1.5-green.svg"/>
<img alt="有来技术" src="https://img.shields.io/badge/SpringBoot-3.2.0-green.svg"/>
<a href="https://gitee.com/youlaitech/youlai-boot" target="_blank">
<img alt="有来技术" src="https://gitee.com/youlaiorg/youlai-boot/badge/star.svg"/>
</a>
......@@ -45,6 +45,9 @@ youlai-boot
├── mysql5 # MySQL5 脚本
├── mysql8 # MySQL8 脚本
├── src # 源码目录
├── base # 核心模块
├── mybatisplus # Mybatis-Plus 配置和插件
├── security # Spring Security 安全配置和扩展
├── common # 公共模块
├── config # 自动装配配置
├── CorsConfig # 跨域共享配置
......@@ -53,9 +56,6 @@ youlai-boot
├── WebMvcConfig # WebMvc 配置
├── controller # 控制层
├── converter # MapStruct转换器
├── core # 核心模块
├── mybatisplus # Mybatis-Plus 配置和插件
├── security # Spring Security 安全配置和扩展
├── filter # 过滤器
├── RequestLogFilter # 请求日志过滤器
├── VerifyCodeFilter # 验证码过滤器
......
package com.youlai.system.core.mybatisplus.annotation;
package com.youlai.system.base.mybatisplus.annotation;
import java.lang.annotation.*;
......
package com.youlai.system.core.mybatisplus.config;
package com.youlai.system.base.mybatisplus.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.youlai.system.core.mybatisplus.handler.MyDataPermissionHandler;
import com.youlai.system.core.mybatisplus.handler.MyMetaObjectHandler;
import org.springframework.beans.factory.annotation.Value;
import com.youlai.system.base.mybatisplus.handler.MyDataPermissionHandler;
import com.youlai.system.base.mybatisplus.handler.MyMetaObjectHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
......
package com.youlai.system.core.mybatisplus.handler;
package com.youlai.system.base.mybatisplus.handler;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.extension.plugins.handler.DataPermissionHandler;
import com.youlai.system.core.mybatisplus.annotation.DataPermission;
import com.youlai.system.base.mybatisplus.annotation.DataPermission;
import com.youlai.system.common.base.IBaseEnum;
import com.youlai.system.common.enums.DataScopeEnum;
import com.youlai.system.common.util.SecurityUtils;
......
package com.youlai.system.core.mybatisplus.handler;
package com.youlai.system.base.mybatisplus.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
......
package com.youlai.system.core.security.config;
package com.youlai.system.base.security.config;
import com.youlai.system.common.constant.SecurityConstants;
import com.youlai.system.core.security.exception.MyAccessDeniedHandler;
import com.youlai.system.core.security.exception.MyAuthenticationEntryPoint;
import com.youlai.system.core.security.jwt.JwtTokenFilter;
import com.youlai.system.base.security.exception.MyAccessDeniedHandler;
import com.youlai.system.base.security.exception.MyAuthenticationEntryPoint;
import com.youlai.system.base.security.jwt.JwtTokenFilter;
import com.youlai.system.filter.VerifyCodeFilter;
import com.youlai.system.core.security.jwt.JwtTokenProvider;
import com.youlai.system.base.security.jwt.JwtTokenProvider;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
......
package com.youlai.system.core.security.exception;
package com.youlai.system.base.security.exception;
import com.youlai.system.common.result.ResultCode;
import com.youlai.system.common.util.ResponseUtils;
......
package com.youlai.system.core.security.exception;
package com.youlai.system.base.security.exception;
import com.youlai.system.common.result.ResultCode;
import com.youlai.system.common.util.ResponseUtils;
......
package com.youlai.system.core.security.jwt;
package com.youlai.system.base.security.jwt;
import com.youlai.system.common.result.ResultCode;
import com.youlai.system.common.util.ResponseUtils;
......
package com.youlai.system.core.security.jwt;
package com.youlai.system.base.security.jwt;
import cn.hutool.core.convert.Convert;
import com.youlai.system.common.constant.JwtClaimConstants;
import com.youlai.system.core.security.model.SysUserDetails;
import com.youlai.system.base.security.model.SysUserDetails;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
......
package com.youlai.system.core.security.model;
package com.youlai.system.base.security.model;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
......
package com.youlai.system.core.security.service;
package com.youlai.system.base.security.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
......
package com.youlai.system.core.security.service;
package com.youlai.system.base.security.service;
import com.youlai.system.core.security.model.SysUserDetails;
import com.youlai.system.base.security.model.SysUserDetails;
import com.youlai.system.model.dto.UserAuthInfo;
import com.youlai.system.service.SysUserService;
import lombok.RequiredArgsConstructor;
......
......@@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import com.youlai.system.common.constant.SystemConstants;
import com.youlai.system.core.security.model.SysUserDetails;
import com.youlai.system.base.security.model.SysUserDetails;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
......
......@@ -3,7 +3,7 @@ package com.youlai.system.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.youlai.system.core.mybatisplus.annotation.DataPermission;
import com.youlai.system.base.mybatisplus.annotation.DataPermission;
import com.youlai.system.model.entity.SysDept;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
......
......@@ -2,7 +2,7 @@ package com.youlai.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.system.core.mybatisplus.annotation.DataPermission;
import com.youlai.system.base.mybatisplus.annotation.DataPermission;
import com.youlai.system.model.bo.UserBO;
import com.youlai.system.model.entity.SysUser;
import com.youlai.system.model.dto.UserAuthInfo;
......
package com.youlai.system.model.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 验证码响应对象
......@@ -13,6 +15,8 @@ import lombok.Data;
@Schema(description ="验证码响应对象")
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CaptchaResult {
@Schema(description = "验证码缓存key")
......
......@@ -5,6 +5,7 @@ import cn.hutool.captcha.CircleCaptcha;
import cn.hutool.captcha.generator.CodeGenerator;
import cn.hutool.captcha.generator.MathGenerator;
import cn.hutool.captcha.generator.RandomGenerator;
import com.youlai.system.model.dto.CaptchaResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
......@@ -16,7 +17,7 @@ import org.springframework.context.annotation.Configuration;
* @since 2023/11/24
*/
@Configuration
public class CaptchaConfig {
public class CaptchaGenerator {
@Autowired
private CaptchaProperties captchaProperties;
......@@ -27,7 +28,7 @@ public class CaptchaConfig {
* @return CodeGenerator
*/
@Bean
public CodeGenerator captchaGenerator() {
public CodeGenerator codeGenerator() {
String codeType = captchaProperties.getCode().getType();
int codeLength = captchaProperties.getCode().getLength();
if ("math".equalsIgnoreCase(codeType)) {
......@@ -39,13 +40,24 @@ public class CaptchaConfig {
}
}
/**
* 生成验证码
*
* @return CaptchaModel 验证码
*/
public CaptchaModel generate() {
AbstractCaptcha captcha = getCaptcha();
captcha.createCode();
return new CaptchaModel(captcha.getCode(), captcha.getImageBase64Data());
}
/**
* 验证码类
*
* @return AbstractCaptcha
*/
@Bean
public AbstractCaptcha abstractCaptcha() {
public AbstractCaptcha getCaptcha() {
AbstractCaptcha captcha = null;
String type = captchaProperties.getType();
......@@ -67,7 +79,7 @@ public class CaptchaConfig {
throw new IllegalArgumentException("Invalid captcha type: " + type);
}
captcha.setGenerator(captchaGenerator());
captcha.setGenerator(codeGenerator());
return captcha;
}
......
package com.youlai.system.plugin.captcha;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 验证码对象
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CaptchaModel {
/**
* 验证码编码
*/
private String code;
/**
* 验证码图片Base64
*/
private String base64;
}
......@@ -4,7 +4,7 @@ import cn.hutool.core.util.StrUtil;
import com.youlai.system.plugin.dupsubmit.annotation.PreventDuplicateSubmit;
import com.youlai.system.common.result.ResultCode;
import com.youlai.system.common.exception.BusinessException;
import com.youlai.system.core.security.jwt.JwtTokenProvider;
import com.youlai.system.base.security.jwt.JwtTokenProvider;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
......
package com.youlai.system.plugin.websocket;
/**
* @author haoxr
* @since 2023/11/7
*/
public class StompPrincipal {
}
package com.youlai.system.plugin.websocket;
import cn.hutool.core.util.StrUtil;
import com.youlai.system.core.security.jwt.JwtTokenProvider;
import com.youlai.system.base.security.jwt.JwtTokenProvider;
import lombok.RequiredArgsConstructor;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
......
package com.youlai.system.service.impl;
import cn.hutool.captcha.AbstractCaptcha;
import cn.hutool.captcha.CircleCaptcha;
import cn.hutool.captcha.ICaptcha;
import cn.hutool.captcha.generator.MathGenerator;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.youlai.system.common.constant.CacheConstants;
import com.youlai.system.core.security.jwt.JwtTokenProvider;
import com.youlai.system.base.security.jwt.JwtTokenProvider;
import com.youlai.system.model.dto.CaptchaResult;
import com.youlai.system.model.dto.LoginResult;
import com.youlai.system.plugin.captcha.CaptchaGenerator;
import com.youlai.system.plugin.captcha.CaptchaModel;
import com.youlai.system.plugin.captcha.CaptchaProperties;
import com.youlai.system.service.AuthService;
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
......@@ -25,12 +23,9 @@ import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.awt.*;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import static java.awt.Font.SANS_SERIF;
/**
* 认证服务实现类
*
......@@ -44,7 +39,7 @@ public class AuthServiceImpl implements AuthService {
private final AuthenticationManager authenticationManager;
private final StringRedisTemplate redisTemplate;
private final JwtTokenProvider jwtTokenProvider;
private final AbstractCaptcha abstractCaptcha;
private final CaptchaGenerator captchaGenerator;
private final CaptchaProperties captchaProperties;
/**
......@@ -94,17 +89,16 @@ public class AuthServiceImpl implements AuthService {
*/
@Override
public CaptchaResult getCaptcha() {
String captchaCode = abstractCaptcha.getCode(); // 验证码
String captchaBase64 = abstractCaptcha.getImageBase64Data(); // 验证码图片Base64
CaptchaModel captchaModel = captchaGenerator.generate();
// 验证码文本缓存至Redis,用于登录校验
String captchaKey = IdUtil.fastSimpleUUID();
redisTemplate.opsForValue().set(CacheConstants.CAPTCHA_CODE_PREFIX + captchaKey, captchaCode,
redisTemplate.opsForValue().set(CacheConstants.CAPTCHA_CODE_PREFIX + captchaKey, captchaModel.getCode(),
captchaProperties.getExpireSeconds(), TimeUnit.SECONDS);
return CaptchaResult.builder()
.captchaKey(captchaKey)
.captchaBase64(captchaBase64)
.captchaBase64(captchaModel.getBase64())
.build();
}
......
......@@ -10,7 +10,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.system.common.constant.SystemConstants;
import com.youlai.system.common.model.Option;
import com.youlai.system.converter.RoleConverter;
import com.youlai.system.core.security.service.PermissionService;
import com.youlai.system.base.security.service.PermissionService;
import com.youlai.system.mapper.SysRoleMapper;
import com.youlai.system.model.entity.SysRole;
import com.youlai.system.model.entity.SysRoleMenu;
......@@ -27,7 +27,6 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
/**
* 角色业务实现类
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册