refactor: 项目结构合理性优化

This commit is contained in:
haoxr
2023-06-03 11:03:12 +08:00
parent 808c33789c
commit 532b632ccc
124 changed files with 419 additions and 414 deletions

View File

@@ -1,10 +1,11 @@
package com.youlai.system.framework.resubmit;
package com.youlai.system.aspect;
import cn.hutool.core.util.StrUtil;
import com.youlai.system.common.exception.BusinessException;
import com.youlai.system.common.result.ResultCode;
import com.youlai.system.common.util.RequestUtils;
import com.youlai.system.framework.security.JwtTokenManager;
import com.youlai.system.common.annotation.PreventDuplicateSubmit;
import com.youlai.system.security.JwtTokenManager;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -21,50 +22,48 @@ import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.concurrent.TimeUnit;
/**
* 重复提交切面
* 处理重复提交切面
*
* @author : haoxr
* @since : 2023/05/09
* @author haoxr
* @since 2023/05/09
*/
@Aspect
@Component
@Slf4j
@RequiredArgsConstructor
public class ResubmitAspect {
public class DuplicateSubmitAspect {
private final RedissonClient redissonClient;
private final JwtTokenManager jwtTokenManager;
private static final String RESUBMIT_LOCK_PREFIX = "LOCK:RESUBMIT:";
/**
* 防重复提交切点
*/
@Pointcut("@annotation(resubmit)")
public void preventDuplicateSubmitPointCut(Resubmit resubmit) {
@Pointcut("@annotation(preventDuplicateSubmit)")
public void preventDuplicateSubmitPointCut(PreventDuplicateSubmit preventDuplicateSubmit) {
log.info("定义防重复提交切点");
}
@Around("preventDuplicateSubmitPointCut(resubmit)")
public Object doAround(ProceedingJoinPoint pjp, Resubmit resubmit) throws Throwable {
@Around("preventDuplicateSubmitPointCut(preventDuplicateSubmit)")
public Object doAround(ProceedingJoinPoint pjp, PreventDuplicateSubmit preventDuplicateSubmit) throws Throwable {
String resubmitLockKey = generateResubmitLockKey();
if (resubmitLockKey != null) {
int expire = resubmit.expire(); // 防重提交锁过期时间
int expire = preventDuplicateSubmit.expire(); // 防重提交锁过期时间
RLock lock = redissonClient.getLock(resubmitLockKey);
boolean lockResult = lock.tryLock(0, expire, TimeUnit.SECONDS); // 获取锁失败直接返回 false
if (!lockResult) {
throw new BusinessException(ResultCode.REPEAT_SUBMIT_ERROR); // 抛出重复提交提示信息
}
}
Object result = pjp.proceed();
return result;
return pjp.proceed();
}
/**
* 获取重提交锁的 key
* 获取重提交锁的 key
*/
private String generateResubmitLockKey() {
String resubmitLockKey = null;
@@ -72,7 +71,7 @@ public class ResubmitAspect {
String jwt = RequestUtils.resolveToken(request);
if (StrUtil.isNotBlank(jwt)) {
String jti = (String) jwtTokenManager.getTokenClaims(jwt).get("jti");
resubmitLockKey = RESUBMIT_LOCK_PREFIX + jti + ":" + request.getMethod() + "-" + request.getRequestURI() + "-";
resubmitLockKey = RESUBMIT_LOCK_PREFIX + jti + ":" + request.getMethod() + "-" + request.getRequestURI();
}
return resubmitLockKey;
}

View File

@@ -1,4 +1,4 @@
package com.youlai.system.framework.mybatisplus;
package com.youlai.system.common.annotation;
import java.lang.annotation.*;
@@ -8,7 +8,7 @@ import java.lang.annotation.*;
* https://gitee.com/baomidou/mybatis-plus/issues/I37I90
*
* @author <a href="mailto:2256222053@qq.com">zc</a>
* @date 2021-12-10
* @since 2021-12-10
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)

View File

@@ -1,19 +1,19 @@
package com.youlai.system.framework.resubmit;
package com.youlai.system.common.annotation;
import java.lang.annotation.*;
/**
* 提交注解
* 止重复提交注解
*
* @author haoxr
* @since 2023/5/9
* @since 2.3.0
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Resubmit {
public @interface PreventDuplicateSubmit {
/**
* 防重提交锁过期时间()

View File

@@ -8,7 +8,7 @@ import lombok.Data;
* 基础分页请求对象
*
* @author haoxr
* @date 2021/2/28
* @since 2021/2/28
*/
@Data
@Schema

View File

@@ -9,7 +9,7 @@ import java.io.Serializable;
* 视图对象基类
*
* @author haoxr
* @date 2022/10/22
* @since 2022/10/22
*/
@Data
@ToString

View File

@@ -10,7 +10,7 @@ import java.util.Objects;
* 枚举通用接口
*
* @author haoxr
* @date 2022/3/27 12:06
* @since 2022/3/27 12:06
*/
public interface IBaseEnum<T> {

View File

@@ -3,8 +3,8 @@ package com.youlai.system.common.constant;
/**
* Excel 常量
*
* @author: haoxr
* @date: 2023/03/24
* @author haoxr
* @since 2023/03/24
*/
public interface ExcelConstants {

View File

@@ -3,8 +3,8 @@ package com.youlai.system.common.constant;
/**
* Security 常量
*
* @author: haoxr
* @date: 2023/03/24
* @author haoxr
* @since 2023/03/24
*/
public interface SecurityConstants {

View File

@@ -1,10 +1,10 @@
package com.youlai.system.framework.easycaptcha.enums;
package com.youlai.system.common.enums;
/**
* EasyCaptcha 验证码类型枚举
*
* @author: haoxr
* @date: 2023/03/24
* @author haoxr
* @since 2023/03/24
*/
public enum CaptchaTypeEnum {

View File

@@ -7,7 +7,7 @@ import lombok.Getter;
* 数据权限枚举
*
* @author haoxr
* @date 2022/10/14
* @since 2022/10/14
*/
public enum DataScopeEnum implements IBaseEnum<Integer> {

View File

@@ -8,7 +8,7 @@ import lombok.Getter;
* 性别枚举
*
* @author haoxr
* @date 2022/10/14
* @since 2022/10/14
*/
@Schema(enumAsRef = true)
public enum GenderEnum implements IBaseEnum<Integer> {

View File

@@ -8,7 +8,7 @@ import lombok.Getter;
* 菜单类型枚举
*
* @author haoxr
* @date 2022/4/23 9:36
* @since 2022/4/23 9:36
*/
public enum MenuTypeEnum implements IBaseEnum<Integer> {

View File

@@ -7,7 +7,7 @@ import lombok.Getter;
* 状态枚举
*
* @author haoxr
* @date 2022/10/14
* @since 2022/10/14
*/
public enum StatusEnum implements IBaseEnum<Integer> {

View File

@@ -7,7 +7,7 @@ import lombok.Getter;
* 自定义业务异常
*
* @author haoxr
* @date 2022/7/31
* @since 2022/7/31
*/
@Getter
public class BusinessException extends RuntimeException {

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.vo;
package com.youlai.system.common.model;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -11,7 +11,7 @@ import java.util.List;
* 下拉选项对象
*
* @author haoxr
* @date 2022/1/22
* @since 2022/1/22
*/
@Schema(description ="下拉选项对象")
@Data

View File

@@ -10,7 +10,7 @@ import java.util.List;
* 分页响应结构体
*
* @author haoxr
* @date 2022/2/18 23:29
* @since 2022/2/18 23:29
*/
@Data
public class PageResult<T> implements Serializable {

View File

@@ -8,7 +8,7 @@ import java.io.Serializable;
* 统一响应结构体
*
* @author haoxr
* @date 2022/1/30
* @since 2022/1/30
**/
@Data
public class Result<T> implements Serializable {

View File

@@ -9,7 +9,7 @@ import java.io.Serializable;
* 响应码枚举
*
* @author haoxr
* @date 2020-06-23
* @since 2020-06-23
**/
@AllArgsConstructor
@NoArgsConstructor

View File

@@ -1,21 +1,20 @@
package com.youlai.system.common.util;
import com.alibaba.excel.EasyExcel;
import com.youlai.system.framework.easyexcel.MyAnalysisEventListener;
import com.youlai.system.listener.easyexcel.MyAnalysisEventListener;
import java.io.InputStream;
/**
* Excel 工具类
*
* @author: haoxr
* @date: 2023/03/01
* @author haoxr
* @since 2023/03/01
*/
public class ExcelUtils {
public static <T> String importExcel(InputStream is, Class clazz, MyAnalysisEventListener<T> listener) {
EasyExcel.read(is, clazz, listener).sheet().doRead();
String msg = listener.getMsg();
return msg;
return listener.getMsg();
}
}

View File

@@ -14,7 +14,7 @@ import java.io.IOException;
* 响应工具类
*
* @author haoxr
* @date 2022/10/18
* @since 2022/10/18
*/
public class ResponseUtils {

View File

@@ -1,10 +1,10 @@
package com.youlai.system.framework.security.util;
package com.youlai.system.common.util;
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.framework.security.userdetails.SysUserDetails;
import com.youlai.system.security.userdetails.SysUserDetails;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;

View File

@@ -1,6 +1,6 @@
package com.youlai.system.framework.easycaptcha.config;
package com.youlai.system.config;
import com.youlai.system.framework.easycaptcha.enums.CaptchaTypeEnum;
import com.youlai.system.common.enums.CaptchaTypeEnum;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@@ -10,13 +10,13 @@ import java.awt.*;
/**
* EasyCaptcha 配置类
*
* @author: haoxr
* @date: 2023/03/24
* @author haoxr
* @since 2023/03/24
*/
@ConfigurationProperties(prefix = "easy-captcha")
@Configuration
@Data
public class EasyCaptchaConfig {
public class CaptchaConfig {
/**
* 验证码类型

View File

@@ -10,10 +10,10 @@ import org.springframework.web.filter.CorsFilter;
import java.util.Collections;
/**
* CORS资源共享配置
* CORS 资源共享配置
*
* @author haoxr
* @date 2023/4/17
* @since 2023/4/17
*/
@Configuration
public class CorsConfig {

View File

@@ -5,8 +5,8 @@ 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.framework.mybatisplus.MyDataPermissionHandler;
import com.youlai.system.framework.mybatisplus.MyMetaObjectHandler;
import com.youlai.system.handler.mybatisplus.MyDataPermissionHandler;
import com.youlai.system.handler.mybatisplus.MyMetaObjectHandler;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -23,7 +23,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
public class MybatisPlusConfig {
@Value("${system-config.data-permission.enabled}")
@Value("${system.config.data-permission-enabled}")
private Boolean dataPermissionEnabled;
/**

View File

@@ -1,20 +1,21 @@
package com.youlai.system.framework.security.config;
package com.youlai.system.config;
import com.youlai.system.common.constant.SecurityConstants;
import com.youlai.system.framework.security.filter.JwtAuthenticationFilter;
import com.youlai.system.framework.security.exception.MyAccessDeniedHandler;
import com.youlai.system.framework.security.exception.MyAuthenticationEntryPoint;
import com.youlai.system.framework.security.JwtTokenManager;
import com.youlai.system.framework.security.filter.VerifyCodeFilter;
import com.youlai.system.filter.JwtAuthenticationFilter;
import com.youlai.system.security.exception.MyAccessDeniedHandler;
import com.youlai.system.security.exception.MyAuthenticationEntryPoint;
import com.youlai.system.security.JwtTokenManager;
import com.youlai.system.filter.VerifyCodeFilter;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
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.WebSecurityCustomizer;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@@ -25,31 +26,33 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthentic
* Spring Security 权限配置
*
* @author haoxr
* @date 2023/2/17
* @since 2023/2/17
*/
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableMethodSecurity
@RequiredArgsConstructor
public class SecurityConfig {
private final MyAuthenticationEntryPoint myAuthenticationEntryPoint;
private final MyAccessDeniedHandler myAccessDeniedHandler;
private final MyAuthenticationEntryPoint authenticationEntryPoint;
private final MyAccessDeniedHandler accessDeniedHandler;
private final JwtTokenManager jwtTokenManager;
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeHttpRequests()
.requestMatchers(SecurityConstants.LOGIN_PATH).permitAll() // 登录接口放行但会走过滤器链-验证码校验
.anyRequest().authenticated()
.and()
.exceptionHandling()
.authenticationEntryPoint(myAuthenticationEntryPoint)
.accessDeniedHandler(myAccessDeniedHandler)
.authorizeHttpRequests(requestMatcherRegistry ->
requestMatcherRegistry.requestMatchers(SecurityConstants.LOGIN_PATH).permitAll()
.anyRequest().authenticated()
)
.sessionManagement(configurer -> configurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.exceptionHandling(httpSecurityExceptionHandlingConfigurer ->
httpSecurityExceptionHandlingConfigurer
.authenticationEntryPoint(authenticationEntryPoint)
.accessDeniedHandler(accessDeniedHandler)
)
.csrf(AbstractHttpConfigurer::disable)
;
// 验证码校验过滤器
@@ -63,7 +66,6 @@ public class SecurityConfig {
/**
* 不走过滤器链的放行配置
*
* @return
*/
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
@@ -74,7 +76,8 @@ public class SecurityConfig {
"/doc.html",
"/swagger-resources/**",
"/v3/api-docs/**",
"/swagger-ui/**"
"/swagger-ui/**",
"/ws/**"
);
}

View File

@@ -20,7 +20,7 @@ import java.util.TreeMap;
* Spring Doc FAQ: https://springdoc.org/#faq
*
* @author haoxr
* @date 2023/2/17
* @since 2023/2/17
*/
@Configuration
public class SwaggerConfig {

View File

@@ -1,4 +1,4 @@
package com.youlai.system.framework.xxljob;
package com.youlai.system.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.extern.slf4j.Slf4j;
@@ -13,7 +13,8 @@ import org.springframework.context.annotation.Configuration;
* @author xuxueli 2017-04-28
*/
@Configuration
@ConditionalOnProperty(name = "xxl.job.enabled")// xxl.job.enabled = true 才会自动配
// system.config.xxl-job-enabled = true 才会自动
@ConditionalOnProperty(name = "system.config.xxl-job-enabled")
@Slf4j
public class XxlJobConfig {

View File

@@ -4,10 +4,10 @@ import cn.hutool.core.util.StrUtil;
import com.youlai.system.common.constant.SecurityConstants;
import com.youlai.system.common.result.Result;
import com.youlai.system.common.util.RequestUtils;
import com.youlai.system.framework.easycaptcha.service.EasyCaptchaService;
import com.youlai.system.pojo.dto.CaptchaResult;
import com.youlai.system.pojo.dto.LoginResult;
import com.youlai.system.framework.security.JwtTokenManager;
import com.youlai.system.security.captcha.EasyCaptchaService;
import com.youlai.system.model.dto.CaptchaResult;
import com.youlai.system.model.dto.LoginResult;
import com.youlai.system.security.JwtTokenManager;
import io.jsonwebtoken.Claims;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;

View File

@@ -1,11 +1,11 @@
package com.youlai.system.controller;
import com.youlai.system.framework.resubmit.Resubmit;
import com.youlai.system.pojo.vo.Option;
import com.youlai.system.common.annotation.PreventDuplicateSubmit;
import com.youlai.system.common.model.Option;
import com.youlai.system.common.result.Result;
import com.youlai.system.pojo.form.DeptForm;
import com.youlai.system.pojo.query.DeptQuery;
import com.youlai.system.pojo.vo.DeptVO;
import com.youlai.system.model.form.DeptForm;
import com.youlai.system.model.query.DeptQuery;
import com.youlai.system.model.vo.DeptVO;
import com.youlai.system.service.SysDeptService;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
@@ -59,7 +59,7 @@ public class SysDeptController {
@Operation(summary = "新增部门", security = {@SecurityRequirement(name = "Authorization")})
@PostMapping
@PreAuthorize("@ss.hasPerm('sys:dept:add')")
@Resubmit
@PreventDuplicateSubmit
public Result saveDept(
@Valid @RequestBody DeptForm formData
) {

View File

@@ -3,14 +3,14 @@ package com.youlai.system.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.system.common.result.PageResult;
import com.youlai.system.common.result.Result;
import com.youlai.system.framework.resubmit.Resubmit;
import com.youlai.system.pojo.form.DictForm;
import com.youlai.system.pojo.form.DictTypeForm;
import com.youlai.system.pojo.query.DictPageQuery;
import com.youlai.system.pojo.query.DictTypePageQuery;
import com.youlai.system.pojo.vo.DictPageVO;
import com.youlai.system.pojo.vo.DictTypePageVO;
import com.youlai.system.pojo.vo.Option;
import com.youlai.system.common.annotation.PreventDuplicateSubmit;
import com.youlai.system.model.form.DictForm;
import com.youlai.system.model.form.DictTypeForm;
import com.youlai.system.model.query.DictPageQuery;
import com.youlai.system.model.query.DictTypePageQuery;
import com.youlai.system.model.vo.DictPageVO;
import com.youlai.system.model.vo.DictTypePageVO;
import com.youlai.system.common.model.Option;
import com.youlai.system.service.SysDictService;
import com.youlai.system.service.SysDictTypeService;
import io.swagger.v3.oas.annotations.Parameter;
@@ -55,7 +55,7 @@ public class SysDictController {
@Operation(summary = "新增字典", security = {@SecurityRequirement(name = "Authorization")})
@PostMapping
@PreAuthorize("@ss.hasPerm('sys:dict:add')")
@Resubmit
@PreventDuplicateSubmit
public Result saveDict(
@RequestBody DictForm DictForm
) {
@@ -117,7 +117,7 @@ public class SysDictController {
@Operation(summary = "新增字典类型", security = {@SecurityRequirement(name = "Authorization")})
@PostMapping("/types")
@PreAuthorize("@ss.hasPerm('sys:dict_type:add')")
@Resubmit
@PreventDuplicateSubmit
public Result saveDictType(@RequestBody DictTypeForm dictTypeForm) {
boolean result = dictTypeService.saveDictType(dictTypeForm);
return Result.judge(result);

View File

@@ -1,12 +1,12 @@
package com.youlai.system.controller;
import com.youlai.system.common.result.Result;
import com.youlai.system.framework.resubmit.Resubmit;
import com.youlai.system.pojo.form.MenuForm;
import com.youlai.system.pojo.query.MenuQuery;
import com.youlai.system.pojo.vo.MenuVO;
import com.youlai.system.pojo.vo.Option;
import com.youlai.system.pojo.vo.RouteVO;
import com.youlai.system.common.annotation.PreventDuplicateSubmit;
import com.youlai.system.model.form.MenuForm;
import com.youlai.system.model.query.MenuQuery;
import com.youlai.system.model.vo.MenuVO;
import com.youlai.system.common.model.Option;
import com.youlai.system.model.vo.RouteVO;
import com.youlai.system.service.SysMenuService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -25,7 +25,7 @@ import java.util.List;
* 菜单控制器
*
* @author haoxr
* @date 2020/11/06
* @since 2020/11/06
*/
@Tag(name = "04.菜单接口")
@RestController
@@ -69,7 +69,7 @@ public class SysMenuController {
@Operation(summary = "新增菜单",security = {@SecurityRequirement(name = "Authorization")})
@PostMapping
@PreAuthorize("@ss.hasPerm('sys:menu:add')")
@Resubmit
@PreventDuplicateSubmit
@CacheEvict(cacheNames = "system", key = "'routes'")
public Result addMenu(@RequestBody MenuForm menuForm) {
boolean result = menuService.saveMenu(menuForm);

View File

@@ -1,13 +1,13 @@
package com.youlai.system.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.system.framework.resubmit.Resubmit;
import com.youlai.system.pojo.vo.Option;
import com.youlai.system.common.annotation.PreventDuplicateSubmit;
import com.youlai.system.common.model.Option;
import com.youlai.system.common.result.PageResult;
import com.youlai.system.common.result.Result;
import com.youlai.system.pojo.form.RoleForm;
import com.youlai.system.pojo.query.RolePageQuery;
import com.youlai.system.pojo.vo.RolePageVO;
import com.youlai.system.model.form.RoleForm;
import com.youlai.system.model.query.RolePageQuery;
import com.youlai.system.model.vo.RolePageVO;
import com.youlai.system.service.SysRoleService;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
@@ -48,7 +48,7 @@ public class SysRoleController {
@Operation(summary = "新增角色",security = {@SecurityRequirement(name = "Authorization")})
@PostMapping
@PreAuthorize("@ss.hasPerm('sys:role:add')")
@Resubmit
@PreventDuplicateSubmit
public Result addRole(@Valid @RequestBody RoleForm roleForm) {
boolean result = roleService.saveRole(roleForm);
return Result.judge(result);

View File

@@ -8,15 +8,15 @@ import com.youlai.system.common.constant.ExcelConstants;
import com.youlai.system.common.result.PageResult;
import com.youlai.system.common.result.Result;
import com.youlai.system.common.util.ExcelUtils;
import com.youlai.system.framework.resubmit.Resubmit;
import com.youlai.system.listener.UserImportListener;
import com.youlai.system.pojo.vo.UserImportVO;
import com.youlai.system.pojo.form.UserForm;
import com.youlai.system.pojo.entity.SysUser;
import com.youlai.system.pojo.query.UserPageQuery;
import com.youlai.system.pojo.vo.UserExportVO;
import com.youlai.system.pojo.vo.UserInfoVO;
import com.youlai.system.pojo.vo.UserPageVO;
import com.youlai.system.common.annotation.PreventDuplicateSubmit;
import com.youlai.system.listener.easyexcel.UserImportListener;
import com.youlai.system.model.vo.UserImportVO;
import com.youlai.system.model.form.UserForm;
import com.youlai.system.model.entity.SysUser;
import com.youlai.system.model.query.UserPageQuery;
import com.youlai.system.model.vo.UserExportVO;
import com.youlai.system.model.vo.UserInfoVO;
import com.youlai.system.model.vo.UserPageVO;
import com.youlai.system.service.SysUserService;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
@@ -43,7 +43,7 @@ import java.util.List;
* 用户控制器
*
* @author haoxr
* @date 2022/10/16
* @since 2022/10/16
*/
@Tag(name = "02.用户接口")
@RestController
@@ -65,7 +65,7 @@ public class SysUserController {
@Operation(summary = "新增用户", security = {@SecurityRequirement(name = "Authorization")})
@PostMapping
@PreAuthorize("@ss.hasPerm('sys:user:add')")
@Resubmit
@PreventDuplicateSubmit
public Result saveUser(
@RequestBody @Valid UserForm userForm
) {

View File

@@ -1,15 +1,15 @@
package com.youlai.system.converter;
import com.youlai.system.pojo.entity.SysDept;
import com.youlai.system.pojo.form.DeptForm;
import com.youlai.system.pojo.vo.DeptVO;
import com.youlai.system.model.entity.SysDept;
import com.youlai.system.model.form.DeptForm;
import com.youlai.system.model.vo.DeptVO;
import org.mapstruct.Mapper;
/**
* 部门对象转换器
*
* @author haoxr
* @date 2022/7/29
* @since 2022/7/29
*/
@Mapper(componentModel = "spring")
public interface DeptConverter {

View File

@@ -1,9 +1,9 @@
package com.youlai.system.converter;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.system.pojo.entity.SysDict;
import com.youlai.system.pojo.form.DictForm;
import com.youlai.system.pojo.vo.DictPageVO;
import com.youlai.system.model.entity.SysDict;
import com.youlai.system.model.form.DictForm;
import com.youlai.system.model.vo.DictPageVO;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mapper;
@@ -11,7 +11,7 @@ import org.mapstruct.Mapper;
* 字典数据项对象转换器
*
* @author haoxr
* @date 2022/6/8
* @since 2022/6/8
*/
@Mapper(componentModel = "spring")
public interface DictConverter {

View File

@@ -1,16 +1,16 @@
package com.youlai.system.converter;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.system.pojo.entity.SysDictType;
import com.youlai.system.pojo.form.DictTypeForm;
import com.youlai.system.pojo.vo.DictTypePageVO;
import com.youlai.system.model.entity.SysDictType;
import com.youlai.system.model.form.DictTypeForm;
import com.youlai.system.model.vo.DictTypePageVO;
import org.mapstruct.Mapper;
/**
* 字典类型对象转换器
*
* @author haoxr
* @date 2022/6/8
* @since 2022/6/8
*/
@Mapper(componentModel = "spring")
public interface DictTypeConverter {

View File

@@ -1,15 +1,15 @@
package com.youlai.system.converter;
import com.youlai.system.pojo.entity.SysMenu;
import com.youlai.system.pojo.form.MenuForm;
import com.youlai.system.pojo.vo.MenuVO;
import com.youlai.system.model.entity.SysMenu;
import com.youlai.system.model.form.MenuForm;
import com.youlai.system.model.vo.MenuVO;
import org.mapstruct.Mapper;
/**
* 菜单对象转换器
*
* @author haoxr
* @date 2022/7/29
* @since 2022/7/29
*/
@Mapper(componentModel = "spring")
public interface MenuConverter {

View File

@@ -1,10 +1,10 @@
package com.youlai.system.converter;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.system.pojo.vo.Option;
import com.youlai.system.pojo.entity.SysRole;
import com.youlai.system.pojo.form.RoleForm;
import com.youlai.system.pojo.vo.RolePageVO;
import com.youlai.system.common.model.Option;
import com.youlai.system.model.entity.SysRole;
import com.youlai.system.model.form.RoleForm;
import com.youlai.system.model.vo.RolePageVO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@@ -15,7 +15,7 @@ import java.util.List;
* 角色对象转换器
*
* @author haoxr
* @date 2022/5/29
* @since 2022/5/29
*/
@Mapper(componentModel = "spring")
public interface RoleConverter {

View File

@@ -1,13 +1,13 @@
package com.youlai.system.converter;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.system.pojo.bo.UserBO;
import com.youlai.system.pojo.entity.SysUser;
import com.youlai.system.pojo.form.UserForm;
import com.youlai.system.pojo.bo.UserFormBO;
import com.youlai.system.pojo.vo.UserImportVO;
import com.youlai.system.pojo.vo.UserInfoVO;
import com.youlai.system.pojo.vo.UserPageVO;
import com.youlai.system.model.bo.UserBO;
import com.youlai.system.model.entity.SysUser;
import com.youlai.system.model.form.UserForm;
import com.youlai.system.model.bo.UserFormBO;
import com.youlai.system.model.vo.UserImportVO;
import com.youlai.system.model.vo.UserInfoVO;
import com.youlai.system.model.vo.UserPageVO;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@@ -17,7 +17,7 @@ import org.mapstruct.Mappings;
* 用户对象转换器
*
* @author haoxr
* @date 2022/6/8
* @since 2022/6/8
*/
@Mapper(componentModel = "spring")
public interface UserConverter {

View File

@@ -1,11 +1,11 @@
package com.youlai.system.framework.security.filter;
package com.youlai.system.filter;
import cn.hutool.core.util.StrUtil;
import com.youlai.system.common.constant.SecurityConstants;
import com.youlai.system.common.result.ResultCode;
import com.youlai.system.common.util.RequestUtils;
import com.youlai.system.common.util.ResponseUtils;
import com.youlai.system.framework.security.JwtTokenManager;
import com.youlai.system.security.JwtTokenManager;
import io.jsonwebtoken.Claims;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
@@ -22,7 +22,7 @@ import java.io.IOException;
* JWT 校验过滤器
*
* @author haoxr
* @date 2022/10/1
* @since 2022/10/1
*/
public class JwtAuthenticationFilter extends OncePerRequestFilter {

View File

@@ -8,8 +8,8 @@ import org.springframework.web.filter.CommonsRequestLoggingFilter;
/**
* 请求日志打印过滤器
*
* @author: haoxr
* @date: 2023/03/03
* @author haoxr
* @since 2023/03/03
*/
@Configuration
@Slf4j

View File

@@ -1,4 +1,4 @@
package com.youlai.system.framework.security.filter;
package com.youlai.system.filter;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
@@ -21,7 +21,7 @@ import java.io.IOException;
* 验证码校验过滤器
*
* @author haoxr
* @date 2022/10/1
* @since 2022/10/1
*/
public class VerifyCodeFilter extends OncePerRequestFilter {

View File

@@ -1,12 +1,13 @@
package com.youlai.system.framework.mybatisplus;
package com.youlai.system.handler.mybatisplus;
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.common.annotation.DataPermission;
import com.youlai.system.common.base.IBaseEnum;
import com.youlai.system.common.enums.DataScopeEnum;
import com.youlai.system.framework.security.util.SecurityUtils;
import com.youlai.system.common.util.SecurityUtils;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression;
@@ -19,7 +20,7 @@ import java.lang.reflect.Method;
* 数据权限控制器
*
* @author zc
* @date 2021-12-10 13:28
* @since 2021-12-10 13:28
*/
@Slf4j
public class MyDataPermissionHandler implements DataPermissionHandler {

View File

@@ -1,4 +1,4 @@
package com.youlai.system.framework.mybatisplus;
package com.youlai.system.handler.mybatisplus;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
@@ -10,7 +10,7 @@ import java.time.LocalDateTime;
* mybatis-plus 字段自动填充
*
* @author haoxr
* @date 2022/10/14
* @since 2022/10/14
* @link https://mp.baomidou.com/guide/auto-fill-metainfo.html
*/
@Component

View File

@@ -1,4 +1,4 @@
package com.youlai.system.framework.xxljob;
package com.youlai.system.handler.xxljob;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;

View File

@@ -1,12 +1,12 @@
package com.youlai.system.framework.easyexcel;
package com.youlai.system.listener.easyexcel;
import com.alibaba.excel.event.AnalysisEventListener;
/**
* 自定义解析结果监听器
*
* @author: haoxr
* @date: 2023/03/01
* @author haoxr
* @since 2023/03/01
*/
public abstract class MyAnalysisEventListener<T> extends AnalysisEventListener<T> {

View File

@@ -1,4 +1,4 @@
package com.youlai.system.listener;
package com.youlai.system.listener.easyexcel;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Validator;
@@ -12,11 +12,10 @@ import com.youlai.system.common.constant.SystemConstants;
import com.youlai.system.common.enums.GenderEnum;
import com.youlai.system.common.enums.StatusEnum;
import com.youlai.system.converter.UserConverter;
import com.youlai.system.framework.easyexcel.MyAnalysisEventListener;
import com.youlai.system.pojo.entity.SysRole;
import com.youlai.system.pojo.entity.SysUser;
import com.youlai.system.pojo.entity.SysUserRole;
import com.youlai.system.pojo.vo.UserImportVO;
import com.youlai.system.model.entity.SysRole;
import com.youlai.system.model.entity.SysUser;
import com.youlai.system.model.entity.SysUserRole;
import com.youlai.system.model.vo.UserImportVO;
import com.youlai.system.service.SysRoleService;
import com.youlai.system.service.SysUserRoleService;
import com.youlai.system.service.SysUserService;

View File

@@ -0,0 +1,8 @@
package com.youlai.system.listener.rabbitmq;
/**
* @author haoxr
* @since 0.0.1
*/
public class TestListener {
}

View File

@@ -3,8 +3,8 @@ 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.framework.mybatisplus.DataPermission;
import com.youlai.system.pojo.entity.SysDept;
import com.youlai.system.common.annotation.DataPermission;
import com.youlai.system.model.entity.SysDept;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

View File

@@ -1,7 +1,7 @@
package com.youlai.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.youlai.system.pojo.entity.SysDict;
import com.youlai.system.model.entity.SysDict;
import org.apache.ibatis.annotations.Mapper;
@Mapper

View File

@@ -1,7 +1,7 @@
package com.youlai.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.youlai.system.pojo.entity.SysDictType;
import com.youlai.system.model.entity.SysDictType;
import org.apache.ibatis.annotations.Mapper;
@Mapper

View File

@@ -4,12 +4,12 @@ package com.youlai.system.mapper;
* 菜单持久接口层
*
* @author haoxr
* @date 2022/1/24
* @since 2022/1/24
*/
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.youlai.system.pojo.entity.SysMenu;
import com.youlai.system.pojo.bo.RouteBO;
import com.youlai.system.model.entity.SysMenu;
import com.youlai.system.model.bo.RouteBO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;

View File

@@ -1,7 +1,7 @@
package com.youlai.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.youlai.system.pojo.entity.SysRole;
import com.youlai.system.model.entity.SysRole;
import org.apache.ibatis.annotations.Mapper;
import java.util.Set;

View File

@@ -1,7 +1,7 @@
package com.youlai.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.youlai.system.pojo.entity.SysRoleMenu;
import com.youlai.system.model.entity.SysRoleMenu;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@@ -10,7 +10,7 @@ import java.util.List;
* 角色菜单持久层
*
* @author haoxr
* @date 2022/6/4
* @since 2022/6/4
*/
@Mapper
public interface SysRoleMenuMapper extends BaseMapper<SysRoleMenu> {

View File

@@ -2,13 +2,13 @@ package com.youlai.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.system.framework.mybatisplus.DataPermission;
import com.youlai.system.pojo.bo.UserBO;
import com.youlai.system.pojo.entity.SysUser;
import com.youlai.system.pojo.bo.UserAuthInfo;
import com.youlai.system.pojo.bo.UserFormBO;
import com.youlai.system.pojo.query.UserPageQuery;
import com.youlai.system.pojo.vo.UserExportVO;
import com.youlai.system.common.annotation.DataPermission;
import com.youlai.system.model.bo.UserBO;
import com.youlai.system.model.entity.SysUser;
import com.youlai.system.model.dto.UserAuthInfo;
import com.youlai.system.model.bo.UserFormBO;
import com.youlai.system.model.query.UserPageQuery;
import com.youlai.system.model.vo.UserExportVO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@@ -17,7 +17,7 @@ import java.util.List;
* 用户持久层
*
* @author haoxr
* @date 2022/1/14
* @since 2022/1/14
*/
@Mapper
public interface SysUserMapper extends BaseMapper<SysUser> {

View File

@@ -1,14 +1,14 @@
package com.youlai.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.youlai.system.pojo.entity.SysUserRole;
import com.youlai.system.model.entity.SysUserRole;
import org.apache.ibatis.annotations.Mapper;
/**
* 用户角色持久层
*
* @author haoxr
* @date 2022/1/15
* @since 2022/1/15
*/
@Mapper
public interface SysUserRoleMapper extends BaseMapper<SysUserRole> {

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.bo;
package com.youlai.system.model.bo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.bo;
package com.youlai.system.model.bo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
@@ -9,7 +9,7 @@ import java.util.Date;
* 用户持久化对象
*
* @author haoxr
* @date 2022/6/10
* @since 2022/6/10
*/
@Data
public class UserBO {

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.bo;
package com.youlai.system.model.bo;
import lombok.Data;
@@ -8,7 +8,7 @@ import java.util.List;
* user表单持久化对象
*
* @author haoxr
* @date 2022/6/10
* @since 2022/6/10
*/
@Data
public class UserFormBO {

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.dto;
package com.youlai.system.model.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
@@ -7,8 +7,8 @@ import lombok.Data;
/**
* 验证码响应对象
*
* @author: haoxr
* @date: 2023/03/24
* @author haoxr
* @since 2023/03/24
*/
@Schema(description ="验证码响应对象")
@Builder

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.dto;
package com.youlai.system.model.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.bo;
package com.youlai.system.model.dto;
import lombok.Data;
@@ -8,7 +8,7 @@ import java.util.Set;
* 用户认证信息
*
* @author haoxr
* @date 2022/10/22
* @since 2022/10/22
*
*/
@Data

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.entity;
package com.youlai.system.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;

View File

@@ -1,9 +1,9 @@
package com.youlai.system.pojo.entity;
package com.youlai.system.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;
@@ -12,7 +12,7 @@ import lombok.Data;
* 字典数据表
*
* @author haoxr
* @date 2022/12/17
* @since 2022/12/17
*/
@Data
public class SysDict implements Serializable {

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.entity;
package com.youlai.system.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
@@ -9,7 +9,7 @@ import lombok.Data;
* 字典类型实体
*
* @author haoxr
* @date 2022/12/17
* @since 2022/12/17
*/
@Data
public class SysDictType extends BaseEntity {

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.entity;
package com.youlai.system.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
@@ -12,7 +12,7 @@ import lombok.Data;
* 菜单实体对象
*
* @author haoxr
* @date 2023/3/6
* @since 2023/3/6
*/
@TableName(value ="sys_menu")
@Data

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.entity;
package com.youlai.system.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.entity;
package com.youlai.system.model.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.entity;
package com.youlai.system.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.entity;
package com.youlai.system.model.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
@@ -10,7 +10,7 @@ import lombok.NoArgsConstructor;
* 用户和角色关联表
*
* @author haoxr
* @date 2022/12/17
* @since 2022/12/17
*/
@Data
@AllArgsConstructor

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.form;
package com.youlai.system.model.form;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.form;
package com.youlai.system.model.form;
import io.swagger.v3.oas.annotations.media.Schema;

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.form;
package com.youlai.system.model.form;
import io.swagger.v3.oas.annotations.media.Schema;

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.form;
package com.youlai.system.model.form;
import com.youlai.system.common.enums.MenuTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.form;
package com.youlai.system.model.form;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.form;
package com.youlai.system.model.form;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -12,7 +12,7 @@ import java.util.List;
* 用户表单对象
*
* @author haoxr
* @date 2022/4/12 11:04
* @since 2022/4/12 11:04
*/
@Schema(description = "用户表单对象")
@Data

View File

@@ -1,6 +1,5 @@
package com.youlai.system.pojo.query;
package com.youlai.system.model.query;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -8,7 +7,7 @@ import lombok.Data;
* 部门查询对象
*
* @author haoxr
* @date 2022/6/11
* @since 2022/6/11
*/
@Schema(description ="部门分页查询对象")
@Data

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.query;
package com.youlai.system.model.query;
import com.youlai.system.common.base.BasePageQuery;

View File

@@ -1,9 +1,8 @@
package com.youlai.system.pojo.query;
package com.youlai.system.model.query;
import com.youlai.system.common.base.BasePageQuery;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description ="字典类型分页查询对象")

View File

@@ -1,6 +1,5 @@
package com.youlai.system.pojo.query;
package com.youlai.system.model.query;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

View File

@@ -1,15 +1,14 @@
package com.youlai.system.pojo.query;
package com.youlai.system.model.query;
import com.youlai.system.common.base.BasePageQuery;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 权限分页查询对象
*
* @author haoxr
* @date 2022/1/14 22:22
* @since 2022/1/14 22:22
*/
@Data
@Schema

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.query;
package com.youlai.system.model.query;
import com.youlai.system.common.base.BasePageQuery;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -8,7 +8,7 @@ import lombok.Data;
* 角色分页查询实体
*
* @author haoxr
* @date 2022/6/3
* @since 2022/6/3
*
*/
@Data

View File

@@ -1,15 +1,14 @@
package com.youlai.system.pojo.query;
package com.youlai.system.model.query;
import com.youlai.system.common.base.BasePageQuery;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 用户分页查询对象
*
* @author haoxr
* @date 2022/1/14
* @since 2022/1/14
*/
@Schema
@Data

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.vo;
package com.youlai.system.model.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.vo;
package com.youlai.system.model.vo;
import io.swagger.v3.oas.annotations.media.Schema;

View File

@@ -1,7 +1,6 @@
package com.youlai.system.pojo.vo;
package com.youlai.system.model.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.vo;
package com.youlai.system.model.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.youlai.system.common.enums.MenuTypeEnum;

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.vo;
package com.youlai.system.model.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.vo;
package com.youlai.system.model.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -10,7 +10,7 @@ import java.util.List;
* 菜单路由视图对象
*
* @author haoxr
* @date 2020/11/28
* @since 2020/11/28
*/
@Schema(description = "路由对象")
@Data

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.vo;
package com.youlai.system.model.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
@@ -11,7 +11,7 @@ import java.time.LocalDateTime;
* 用户导出视图对象
*
* @author haoxr
* @date 2022/4/11 8:46
* @since 2022/4/11 8:46
*/
@Data

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.vo;
package com.youlai.system.model.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@@ -7,7 +7,7 @@ import lombok.Data;
* 用户导入对象
*
* @author haoxr
* @date 2022/4/10
* @since 2022/4/10
*/
@Data
public class UserImportVO {

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.vo;
package com.youlai.system.model.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -9,7 +9,7 @@ import java.util.Set;
* 用户登录视图对象
*
* @author haoxr
* @date 2022/1/14
* @since 2022/1/14
*/
@Schema(description ="当前登录用户视图对象")
@Data

View File

@@ -1,4 +1,4 @@
package com.youlai.system.pojo.vo;
package com.youlai.system.model.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -10,7 +10,7 @@ import java.util.Date;
* 用户分页视图对象
*
* @author haoxr
* @date 2022/1/15 9:41
* @since 2022/1/15 9:41
*/
@Schema(description ="用户分页对象")
@Data

View File

@@ -1,9 +1,9 @@
package com.youlai.system.framework.security;
package com.youlai.system.security;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.IdUtil;
import com.youlai.system.common.constant.SecurityConstants;
import com.youlai.system.framework.security.userdetails.SysUserDetails;
import com.youlai.system.security.userdetails.SysUserDetails;
import io.jsonwebtoken.*;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.io.DecodingException;
@@ -27,7 +27,7 @@ import java.util.stream.Collectors;
* JWT token manager
*
* @author haoxr
* @date 2022/10/22
* @since 2022/10/22
*/
@Component
public class JwtTokenManager {

View File

@@ -1,8 +1,8 @@
package com.youlai.system.framework.easycaptcha.producer;
package com.youlai.system.security.captcha;
import com.wf.captcha.*;
import com.wf.captcha.base.Captcha;
import com.youlai.system.framework.easycaptcha.config.EasyCaptchaConfig;
import com.youlai.system.config.CaptchaConfig;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
@@ -11,23 +11,23 @@ import java.awt.*;
/**
* 验证码生成器
*
* @author: haoxr
* @date: 2023/03/24
* @author haoxr
* @since 2023/03/24
*/
@Component
@RequiredArgsConstructor
public class EasyCaptchaProducer {
private final EasyCaptchaConfig easyCaptchaConfig;
private final CaptchaConfig captchaConfig;
public Captcha getCaptcha() {
Captcha captcha;
int width = easyCaptchaConfig.getWidth();
int height = easyCaptchaConfig.getHeight();
int length = easyCaptchaConfig.getLength();
String fontName = easyCaptchaConfig.getFontName();
int width = captchaConfig.getWidth();
int height = captchaConfig.getHeight();
int length = captchaConfig.getLength();
String fontName = captchaConfig.getFontName();
switch (easyCaptchaConfig.getType()) {
switch (captchaConfig.getType()) {
case ARITHMETIC:
captcha = new ArithmeticCaptcha(width, height);
//固定设置为两位图片为算数运算表达式
@@ -52,7 +52,7 @@ public class EasyCaptchaProducer {
default:
throw new RuntimeException("验证码配置信息错误!正确配置查看 CaptchaTypeEnum ");
}
captcha.setFont(new Font(fontName, easyCaptchaConfig.getFontStyle(), easyCaptchaConfig.getFontSize()));
captcha.setFont(new Font(fontName, captchaConfig.getFontStyle(), captchaConfig.getFontSize()));
return captcha;
}

View File

@@ -1,24 +1,23 @@
package com.youlai.system.framework.easycaptcha.service;
package com.youlai.system.security.captcha;
import cn.hutool.core.util.IdUtil;
import com.wf.captcha.base.Captcha;
import com.youlai.system.common.constant.SecurityConstants;
import com.youlai.system.framework.easycaptcha.config.EasyCaptchaConfig;
import com.youlai.system.framework.easycaptcha.producer.EasyCaptchaProducer;
import com.youlai.system.pojo.dto.CaptchaResult;
import com.youlai.system.config.CaptchaConfig;
import com.youlai.system.model.dto.CaptchaResult;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
/**
* EasyCaptcha 业务类
*
* @author: haoxr
* @date: 2023/03/24
* @author haoxr
* @since 2023/03/24
*/
@Service
@Component
@RequiredArgsConstructor
public class EasyCaptchaService {
@@ -26,7 +25,7 @@ public class EasyCaptchaService {
private final RedisTemplate redisTemplate;
private final EasyCaptchaConfig easyCaptchaConfig;
private final CaptchaConfig captchaConfig;
/**
* 获取验证码
@@ -42,13 +41,12 @@ public class EasyCaptchaService {
// 验证码文本缓存至Redis用于登录校验
String verifyCodeKey = IdUtil.fastSimpleUUID();
redisTemplate.opsForValue().set(SecurityConstants.VERIFY_CODE_CACHE_PREFIX + verifyCodeKey, captchaText,
easyCaptchaConfig.getTtl(), TimeUnit.SECONDS);
captchaConfig.getTtl(), TimeUnit.SECONDS);
CaptchaResult captchaResult = CaptchaResult.builder()
return CaptchaResult.builder()
.verifyCodeKey(verifyCodeKey)
.verifyCodeBase64(captchaBase64)
.build();
return captchaResult;
}
}

View File

@@ -1,4 +1,4 @@
package com.youlai.system.framework.security.exception;
package com.youlai.system.security.exception;
import com.youlai.system.common.result.ResultCode;
import com.youlai.system.common.util.ResponseUtils;
@@ -14,7 +14,7 @@ import java.io.IOException;
* Spring Security访问异常处理器
*
* @author haoxr
* @date 2022/10/18
* @since 2022/10/18
*/
@Component
public class MyAccessDeniedHandler implements AccessDeniedHandler {

View File

@@ -1,4 +1,4 @@
package com.youlai.system.framework.security.exception;
package com.youlai.system.security.exception;
import com.youlai.system.common.result.ResultCode;
import com.youlai.system.common.util.ResponseUtils;
@@ -15,7 +15,7 @@ import java.io.IOException;
* 认证异常处理
*
* @author haoxr
* @date 2022/10/18
* @since 2022/10/18
*/
@Component
public class MyAuthenticationEntryPoint implements AuthenticationEntryPoint {

View File

@@ -1,24 +1,25 @@
package com.youlai.system.framework.security.service;
package com.youlai.system.security.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.youlai.system.common.constant.SecurityConstants;
import com.youlai.system.framework.security.util.SecurityUtils;
import com.youlai.system.common.util.SecurityUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.util.PatternMatchUtils;
import java.util.Set;
/**
* SpringSecurity权限校验
* SpringSecurity 权限校验
*
* @author haoxr
* @since 2022/2/22
*/
@Service("ss")
@Component("ss")
@RequiredArgsConstructor
@Slf4j
public class PermissionService {

View File

@@ -1,8 +1,8 @@
package com.youlai.system.framework.security.userdetails;
package com.youlai.system.security.userdetails;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.youlai.system.pojo.bo.UserAuthInfo;
import com.youlai.system.model.dto.UserAuthInfo;
import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;

Some files were not shown because too many files have changed in this diff Show More