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

This commit is contained in:
hxr
2023-12-12 23:23:45 +08:00
parent e16ffe3a95
commit 28646fdf73
24 changed files with 83 additions and 61 deletions

View File

@@ -1,7 +1,7 @@
<p align="center"> <p align="center">
<img alt="有来技术" src="https://img.shields.io/badge/Java -17-brightgreen.svg"/> <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"> <a href="https://gitee.com/youlaitech/youlai-boot" target="_blank">
<img alt="有来技术" src="https://gitee.com/youlaiorg/youlai-boot/badge/star.svg"/> <img alt="有来技术" src="https://gitee.com/youlaiorg/youlai-boot/badge/star.svg"/>
</a> </a>
@@ -45,6 +45,9 @@ youlai-boot
├── mysql5 # MySQL5 脚本 ├── mysql5 # MySQL5 脚本
├── mysql8 # MySQL8 脚本 ├── mysql8 # MySQL8 脚本
├── src # 源码目录 ├── src # 源码目录
├── base # 核心模块
├── mybatisplus # Mybatis-Plus 配置和插件
├── security # Spring Security 安全配置和扩展
├── common # 公共模块 ├── common # 公共模块
├── config # 自动装配配置 ├── config # 自动装配配置
├── CorsConfig # 跨域共享配置 ├── CorsConfig # 跨域共享配置
@@ -53,9 +56,6 @@ youlai-boot
├── WebMvcConfig # WebMvc 配置 ├── WebMvcConfig # WebMvc 配置
├── controller # 控制层 ├── controller # 控制层
├── converter # MapStruct转换器 ├── converter # MapStruct转换器
├── core # 核心模块
├── mybatisplus # Mybatis-Plus 配置和插件
├── security # Spring Security 安全配置和扩展
├── filter # 过滤器 ├── filter # 过滤器
├── RequestLogFilter # 请求日志过滤器 ├── RequestLogFilter # 请求日志过滤器
├── VerifyCodeFilter # 验证码过滤器 ├── VerifyCodeFilter # 验证码过滤器

View File

@@ -1,4 +1,4 @@
package com.youlai.system.core.mybatisplus.annotation; package com.youlai.system.base.mybatisplus.annotation;
import java.lang.annotation.*; import java.lang.annotation.*;

View File

@@ -1,13 +1,12 @@
package com.youlai.system.core.mybatisplus.config; package com.youlai.system.base.mybatisplus.config;
import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.config.GlobalConfig; import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.youlai.system.core.mybatisplus.handler.MyDataPermissionHandler; import com.youlai.system.base.mybatisplus.handler.MyDataPermissionHandler;
import com.youlai.system.core.mybatisplus.handler.MyMetaObjectHandler; import com.youlai.system.base.mybatisplus.handler.MyMetaObjectHandler;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;

View File

@@ -1,10 +1,9 @@
package com.youlai.system.core.mybatisplus.handler; package com.youlai.system.base.mybatisplus.handler;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.extension.plugins.handler.DataPermissionHandler; 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.base.IBaseEnum;
import com.youlai.system.common.enums.DataScopeEnum; import com.youlai.system.common.enums.DataScopeEnum;
import com.youlai.system.common.util.SecurityUtils; import com.youlai.system.common.util.SecurityUtils;

View File

@@ -1,4 +1,4 @@
package com.youlai.system.core.mybatisplus.handler; package com.youlai.system.base.mybatisplus.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.MetaObject;

View File

@@ -1,11 +1,11 @@
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.common.constant.SecurityConstants;
import com.youlai.system.core.security.exception.MyAccessDeniedHandler; import com.youlai.system.base.security.exception.MyAccessDeniedHandler;
import com.youlai.system.core.security.exception.MyAuthenticationEntryPoint; import com.youlai.system.base.security.exception.MyAuthenticationEntryPoint;
import com.youlai.system.core.security.jwt.JwtTokenFilter; import com.youlai.system.base.security.jwt.JwtTokenFilter;
import com.youlai.system.filter.VerifyCodeFilter; 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 lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;

View File

@@ -1,4 +1,4 @@
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.result.ResultCode;
import com.youlai.system.common.util.ResponseUtils; import com.youlai.system.common.util.ResponseUtils;

View File

@@ -1,4 +1,4 @@
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.result.ResultCode;
import com.youlai.system.common.util.ResponseUtils; import com.youlai.system.common.util.ResponseUtils;

View File

@@ -1,4 +1,4 @@
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.result.ResultCode;
import com.youlai.system.common.util.ResponseUtils; import com.youlai.system.common.util.ResponseUtils;

View File

@@ -1,8 +1,8 @@
package com.youlai.system.core.security.jwt; package com.youlai.system.base.security.jwt;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import com.youlai.system.common.constant.JwtClaimConstants; 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.Claims;
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.SignatureAlgorithm;

View File

@@ -1,4 +1,4 @@
package com.youlai.system.core.security.model; package com.youlai.system.base.security.model;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;

View File

@@ -1,4 +1,4 @@
package com.youlai.system.core.security.service; package com.youlai.system.base.security.service;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;

View File

@@ -1,6 +1,6 @@
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.model.dto.UserAuthInfo;
import com.youlai.system.service.SysUserService; import com.youlai.system.service.SysUserService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;

View File

@@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.youlai.system.common.constant.SystemConstants; 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.Authentication;
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;

View File

@@ -3,7 +3,7 @@ package com.youlai.system.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants; 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 com.youlai.system.model.entity.SysDept;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;

View File

@@ -2,7 +2,7 @@ package com.youlai.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.bo.UserBO;
import com.youlai.system.model.entity.SysUser; import com.youlai.system.model.entity.SysUser;
import com.youlai.system.model.dto.UserAuthInfo; import com.youlai.system.model.dto.UserAuthInfo;

View File

@@ -1,8 +1,10 @@
package com.youlai.system.model.dto; package com.youlai.system.model.dto;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
/** /**
* 验证码响应对象 * 验证码响应对象
@@ -13,6 +15,8 @@ import lombok.Data;
@Schema(description ="验证码响应对象") @Schema(description ="验证码响应对象")
@Builder @Builder
@Data @Data
@AllArgsConstructor
@NoArgsConstructor
public class CaptchaResult { public class CaptchaResult {
@Schema(description = "验证码缓存key") @Schema(description = "验证码缓存key")

View File

@@ -5,6 +5,7 @@ import cn.hutool.captcha.CircleCaptcha;
import cn.hutool.captcha.generator.CodeGenerator; import cn.hutool.captcha.generator.CodeGenerator;
import cn.hutool.captcha.generator.MathGenerator; import cn.hutool.captcha.generator.MathGenerator;
import cn.hutool.captcha.generator.RandomGenerator; import cn.hutool.captcha.generator.RandomGenerator;
import com.youlai.system.model.dto.CaptchaResult;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@@ -16,7 +17,7 @@ import org.springframework.context.annotation.Configuration;
* @since 2023/11/24 * @since 2023/11/24
*/ */
@Configuration @Configuration
public class CaptchaConfig { public class CaptchaGenerator {
@Autowired @Autowired
private CaptchaProperties captchaProperties; private CaptchaProperties captchaProperties;
@@ -27,7 +28,7 @@ public class CaptchaConfig {
* @return CodeGenerator * @return CodeGenerator
*/ */
@Bean @Bean
public CodeGenerator captchaGenerator() { public CodeGenerator codeGenerator() {
String codeType = captchaProperties.getCode().getType(); String codeType = captchaProperties.getCode().getType();
int codeLength = captchaProperties.getCode().getLength(); int codeLength = captchaProperties.getCode().getLength();
if ("math".equalsIgnoreCase(codeType)) { 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 * @return AbstractCaptcha
*/ */
@Bean public AbstractCaptcha getCaptcha() {
public AbstractCaptcha abstractCaptcha() {
AbstractCaptcha captcha = null; AbstractCaptcha captcha = null;
String type = captchaProperties.getType(); String type = captchaProperties.getType();
@@ -67,7 +79,7 @@ public class CaptchaConfig {
throw new IllegalArgumentException("Invalid captcha type: " + type); throw new IllegalArgumentException("Invalid captcha type: " + type);
} }
captcha.setGenerator(captchaGenerator()); captcha.setGenerator(codeGenerator());
return captcha; return captcha;
} }

View File

@@ -0,0 +1,24 @@
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;
}

View File

@@ -4,7 +4,7 @@ import cn.hutool.core.util.StrUtil;
import com.youlai.system.plugin.dupsubmit.annotation.PreventDuplicateSubmit; import com.youlai.system.plugin.dupsubmit.annotation.PreventDuplicateSubmit;
import com.youlai.system.common.result.ResultCode; import com.youlai.system.common.result.ResultCode;
import com.youlai.system.common.exception.BusinessException; 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 jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

View File

@@ -1,9 +0,0 @@
package com.youlai.system.plugin.websocket;
/**
* @author haoxr
* @since 2023/11/7
*/
public class StompPrincipal {
}

View File

@@ -1,7 +1,7 @@
package com.youlai.system.plugin.websocket; package com.youlai.system.plugin.websocket;
import cn.hutool.core.util.StrUtil; 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 lombok.RequiredArgsConstructor;
import org.springframework.messaging.Message; import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel; import org.springframework.messaging.MessageChannel;

View File

@@ -1,21 +1,19 @@
package com.youlai.system.service.impl; package com.youlai.system.service.impl;
import cn.hutool.captcha.AbstractCaptcha; 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.IdUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.youlai.system.common.constant.CacheConstants; 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.CaptchaResult;
import com.youlai.system.model.dto.LoginResult; 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.plugin.captcha.CaptchaProperties;
import com.youlai.system.service.AuthService; import com.youlai.system.service.AuthService;
import io.jsonwebtoken.Claims; import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; 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.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.context.request.ServletRequestAttributes;
import java.awt.*;
import java.util.Date; import java.util.Date;
import java.util.concurrent.TimeUnit; 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 AuthenticationManager authenticationManager;
private final StringRedisTemplate redisTemplate; private final StringRedisTemplate redisTemplate;
private final JwtTokenProvider jwtTokenProvider; private final JwtTokenProvider jwtTokenProvider;
private final AbstractCaptcha abstractCaptcha; private final CaptchaGenerator captchaGenerator;
private final CaptchaProperties captchaProperties; private final CaptchaProperties captchaProperties;
/** /**
@@ -94,17 +89,16 @@ public class AuthServiceImpl implements AuthService {
*/ */
@Override @Override
public CaptchaResult getCaptcha() { public CaptchaResult getCaptcha() {
String captchaCode = abstractCaptcha.getCode(); // 验证码 CaptchaModel captchaModel = captchaGenerator.generate();
String captchaBase64 = abstractCaptcha.getImageBase64Data(); // 验证码图片Base64
// 验证码文本缓存至Redis用于登录校验 // 验证码文本缓存至Redis用于登录校验
String captchaKey = IdUtil.fastSimpleUUID(); 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); captchaProperties.getExpireSeconds(), TimeUnit.SECONDS);
return CaptchaResult.builder() return CaptchaResult.builder()
.captchaKey(captchaKey) .captchaKey(captchaKey)
.captchaBase64(captchaBase64) .captchaBase64(captchaModel.getBase64())
.build(); .build();
} }

View File

@@ -10,7 +10,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.system.common.constant.SystemConstants; import com.youlai.system.common.constant.SystemConstants;
import com.youlai.system.common.model.Option; import com.youlai.system.common.model.Option;
import com.youlai.system.converter.RoleConverter; 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.mapper.SysRoleMapper;
import com.youlai.system.model.entity.SysRole; import com.youlai.system.model.entity.SysRole;
import com.youlai.system.model.entity.SysRoleMenu; import com.youlai.system.model.entity.SysRoleMenu;
@@ -27,7 +27,6 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
/** /**
* 角色业务实现类 * 角色业务实现类