diff --git a/common/common-generator/pom.xml b/common/common-generator/pom.xml new file mode 100644 index 0000000..c99ab7e --- /dev/null +++ b/common/common-generator/pom.xml @@ -0,0 +1,70 @@ + + 4.0.0 + + cn.bunny + common + 0.0.1-SNAPSHOT + + + common-generator + jar + + common-utils + https://maven.apache.org + + + UTF-8 + + + + + org.projectlombok + lombok + + + javax.xml.bind + jaxb-api + 2.1 + + + + mysql + mysql-connector-java + + + + com.zaxxer + HikariCP + 5.1.0 + + + + com.baomidou + mybatis-plus-spring-boot3-starter + + + + com.baomidou + mybatis-plus-generator + 3.5.6 + + + org.apache.velocity + velocity-engine-core + 2.3 + + + + + + + + + + + + + + + diff --git a/common/common-utils/src/main/java/cn/bunny/common/generator/NewCodeGet.java b/common/common-generator/src/main/java/cn/bunny/common/generator/NewCodeGet.java similarity index 93% rename from common/common-utils/src/main/java/cn/bunny/common/generator/NewCodeGet.java rename to common/common-generator/src/main/java/cn/bunny/common/generator/NewCodeGet.java index fb3fb5d..27d0fe9 100644 --- a/common/common-utils/src/main/java/cn/bunny/common/generator/NewCodeGet.java +++ b/common/common-generator/src/main/java/cn/bunny/common/generator/NewCodeGet.java @@ -1,6 +1,5 @@ package cn.bunny.common.generator; - import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.OutputFile; @@ -11,16 +10,16 @@ import java.util.Collections; public class NewCodeGet { // 数据连接 - public static final String sqlHost = "jdbc:mysql://106.15.251.123:3305/guigu-oa?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8&allowPublicKeyRetrieval=true"; + public static final String sqlHost = "jdbc:mysql://106.15.251.123:3305/bunny_docs?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8&allowPublicKeyRetrieval=true"; // 作者名称 public static final String author = "Bunny"; // 公共路径 - public static final String outputDir = "G:\\web项目\\Bunny-Cli\\Java\\java-template\\service"; + public static final String outputDir = "F:\\web项目\\PC\\BunnyNote\\BunnyBBS-server\\service\\service-web"; // 实体类名称 public static final String entity = "Bunny"; public static void main(String[] args) { - Generation("sys_menu"); + Generation("article"); } /** @@ -42,7 +41,7 @@ public class NewCodeGet { .packageConfig(builder -> { builder.entity(entity)// 实体类包名 // TODO 父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名 - .parent("cn.bunny.service") + .parent("cn.bunny.service.web") .controller("controller")// 控制层包名 .mapper("mapper")// mapper层包名 .service("service")// service层包名 diff --git a/common/common-utils/src/main/java/cn/bunny/common/generator/OldCodeGet.java b/common/common-generator/src/main/java/cn/bunny/common/generator/OldCodeGet.java similarity index 100% rename from common/common-utils/src/main/java/cn/bunny/common/generator/OldCodeGet.java rename to common/common-generator/src/main/java/cn/bunny/common/generator/OldCodeGet.java diff --git a/common/common-utils/pom.xml b/common/common-utils/pom.xml index 44d76da..f832c59 100644 --- a/common/common-utils/pom.xml +++ b/common/common-utils/pom.xml @@ -19,36 +19,9 @@ - org.apache.httpcomponents - httpclient - 4.5.14 + cn.bunny + model + 0.0.1-SNAPSHOT - - javax.xml.bind - jaxb-api - 2.1 - - - - com.baomidou - mybatis-plus-generator - 3.5.6 - - - org.apache.velocity - velocity-engine-core - 2.3 - - - - - - - - - - - - diff --git a/common/common-utils/src/main/java/cn/bunny/common/constant/CommonMessageConstant.java b/common/common-utils/src/main/java/cn/bunny/common/constant/CommonMessageConstant.java deleted file mode 100644 index 910d164..0000000 --- a/common/common-utils/src/main/java/cn/bunny/common/constant/CommonMessageConstant.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.bunny.common.constant; - -import lombok.Data; - -/** - * 信息提示常量类 - */ -@Data -public class CommonMessageConstant { - public static final String PASSWORD_ERROR = "密码错误"; - public static final String OLD_PASSWORD_ERROR = "旧密码不匹配"; - public static final String OLD_PASSWORD_SAME_NEW_PASSWORD = "旧密码与新密码相同"; - public static final String ACCOUNT_NOT_FOUND = "账号不存在"; - public static final String ACCOUNT_LOCKED = "账号被锁定"; - public static final String UNKNOWN_ERROR = "未知错误"; - public static final String USER_NOT_LOGIN = "用户未登录"; - public static final String USER_TOKEN_OUT_OF_DATE = "用户登录过期"; - public static final String LOGIN_FAILED = "登录失败"; - public static final String UPLOAD_FAILED = "文件上传失败"; - public static final String PASSWORD_EDIT_FAILED = "密码修改失败"; - public static final String ALREADY_EXISTS = "已存在"; - public static final String REQUEST_NOT_EMPTY = "请求不为空"; - public static final String UPDATE_ID_IS_NOT_EMPTY = "删除id不能为空"; - public static final String DELETE_ID_IS_NOT_EMPTY = "修改id不能为空"; - public static final String MENU_IS_NOT_EXIST = "菜单不存在"; - public static final String SAVE_DTO_IS_NULL = "添加参数不能为空"; - public static final String UPDATE_DTO_IS_NULL = "修改参数不能为空"; - public static final String FIND_ID_IS_NOT_EMPTY = "查询ID不能为空"; - public static final String MESSAGE_CODE_NOT_PASS = "短信验证码未过期"; - public static final String MESSAGE_CODE_UNAUTHORIZED = "短信验证码未授权,请联系管理员"; - public static final String VERIFICATION_CODE_ERROR = "验证码错误"; - public static final String USER_DOES_NOT_EXIST = "用户不存在"; - public static final String USER_DOES_IS_EXIST = "用户已存在"; - public static final String VERIFICATION_CODE_IS_EMPTY = "请先发送验证码"; - public static final String LOGIN_DTO_IS_EMPTY = "登录参数不能为空"; - public static final String TOKEN_IS_EMPTY = "token为空"; - public static final String DATA_IS_EMPTY = "数据为空"; -} diff --git a/common/common-utils/src/main/java/cn/bunny/common/constant/ExceptionConstant.java b/common/common-utils/src/main/java/cn/bunny/common/constant/ExceptionConstant.java deleted file mode 100644 index 64e0094..0000000 --- a/common/common-utils/src/main/java/cn/bunny/common/constant/ExceptionConstant.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bunny.common.constant; - - -import lombok.Data; - -@Data -public class ExceptionConstant { - public static final String USER_NOT_FOUND = "用户不存在"; - public static final String USERNAME_IS_EMPTY = "用户名不能为空"; - public static final String PASSWORD_ERROR = "密码错误"; - public static final String PASSWORD_IS_EMPTY = "密码不能为空"; - public static final String CAPTCHA_IS_EMPTY = "提交验证码不能为空"; - public static final String KEY_IS_EMPTY = "验证码key不能为空"; - public static final String VERIFICATION_CODE_DOES_NOT_MATCH = "验证码不匹配"; - public static final String VERIFICATION_CODE_IS_EMPTY = "验证码失效或不存在"; -} diff --git a/common/common-utils/src/main/java/cn/bunny/common/constant/PasswordConstant.java b/common/common-utils/src/main/java/cn/bunny/common/constant/PasswordConstant.java deleted file mode 100644 index 0633ea0..0000000 --- a/common/common-utils/src/main/java/cn/bunny/common/constant/PasswordConstant.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.bunny.common.constant; - -import lombok.Data; - -/** - * 密码常量 - */ -@Data -public class PasswordConstant { - // 默认密码 - public static final String DEFAULT_PASSWORD = "123456"; - // JWT密码 - public static final String DEFAULT_JWT_PASSWORD = "123456"; - // 默认头像 - public static final String AVTAR = "https://oss.aliyuncs.com/aliyun_id_photo_bucket/default_handsome.jpg"; - // 设置token过期时间 - public static final long TOKEN_EXPIRATION = 365L * 24 * 60 * 60 * 1000; -} diff --git a/common/common-utils/src/main/java/cn/bunny/common/constant/RedisUserConstant.java b/common/common-utils/src/main/java/cn/bunny/common/constant/RedisUserConstant.java deleted file mode 100644 index ca4b151..0000000 --- a/common/common-utils/src/main/java/cn/bunny/common/constant/RedisUserConstant.java +++ /dev/null @@ -1,11 +0,0 @@ -package cn.bunny.common.constant; - -import lombok.Data; - -/** - * Redis用户前缀设置 - */ -@Data -public class RedisUserConstant { - public static final String REDIS_CART_KEY = "user::"; -} diff --git a/common/common-utils/src/main/java/cn/bunny/common/utils/CommentUtil.java b/common/common-utils/src/main/java/cn/bunny/common/utils/CommentUtil.java new file mode 100644 index 0000000..b733f66 --- /dev/null +++ b/common/common-utils/src/main/java/cn/bunny/common/utils/CommentUtil.java @@ -0,0 +1,51 @@ +package cn.bunny.common.utils; + +import cn.bunny.vo.system.comment.CommentVo; + +import java.util.ArrayList; +import java.util.List; + +public class CommentUtil { + /** + * 构建树型结构 + * + * @param commentList 评论列表 + * @return 结构列表 + */ + public static List buildTree(List commentList) { + // 构建树形结构 + List tree = new ArrayList<>(); + // 遍历评论列表 + for (CommentVo comment : commentList) { + // 找到顶级评论(没有父评论) + if (comment.getPCommentId() == 0) { + // 递归构建子评论 + comment.setChildren(getChildren(comment.getId(), commentList)); + tree.add(comment); + } + } + return tree; + } + + /** + * 递归获取子评论 + * + * @param commentId 当前评论ID + * @param commentList 评论列表 + * @return 子评论列表 + */ + private static List getChildren(Long commentId, List commentList) { + List children = new ArrayList<>(); + + // 遍历评论列表 + for (CommentVo comment : commentList) { + // 找到当前评论的子评论 + if (Long.valueOf(comment.getPCommentId()).equals(commentId)) { + // 递归构建子评论的子评论 + comment.setChildren(getChildren(comment.getId(), commentList)); + children.add(comment); + } + } + return children; + } +} diff --git a/common/common-utils/src/main/java/cn/bunny/common/utils/FileUtil.java b/common/common-utils/src/main/java/cn/bunny/common/utils/FileUtil.java new file mode 100644 index 0000000..739253c --- /dev/null +++ b/common/common-utils/src/main/java/cn/bunny/common/utils/FileUtil.java @@ -0,0 +1,25 @@ +package cn.bunny.common.utils; + +public class FileUtil { + public static String getSize(Long fileSize) { + double fileSizeInKB = fileSize / 1024.00; + double fileSizeInMB = fileSizeInKB / 1024; + double fileSizeInGB = fileSizeInMB / 1024; + + String size; + if (fileSizeInGB >= 1) { + fileSizeInGB = Double.parseDouble(String.format("%.2f", fileSizeInGB)); + size = fileSizeInGB + "GB"; + } else if (fileSizeInMB >= 1) { + fileSizeInMB = Double.parseDouble(String.format("%.2f", fileSizeInMB)); + size = fileSizeInMB + "MB"; + } else if (fileSizeInKB >= 1) { + fileSizeInKB = Double.parseDouble(String.format("%.2f", fileSizeInKB)); + size = fileSizeInKB + "KB"; + } else { + size = fileSize + "B"; + } + + return size; + } +} diff --git a/common/pom.xml b/common/pom.xml index f201208..c04ed68 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -13,15 +13,14 @@ https://maven.apache.org service-utils + common-generator common-utils - spring-security - cn.bunny - model - 0.0.1-SNAPSHOT + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 io.jsonwebtoken diff --git a/common/service-utils/pom.xml b/common/service-utils/pom.xml index 3a851e6..86666e4 100644 --- a/common/service-utils/pom.xml +++ b/common/service-utils/pom.xml @@ -17,11 +17,25 @@ + + org.apache.httpcomponents + httpclient + 4.5.14 + cn.bunny - common-utils + model 0.0.1-SNAPSHOT + + + com.github.xiaoymin + knife4j-openapi3-jakarta-spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + org.springframework.boot @@ -33,5 +47,10 @@ redisson 3.26.1 + + + com.github.pagehelper + pagehelper + diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/config/Knife4jConfig.java b/common/service-utils/src/main/java/cn/bunny/common/service/config/Knife4jConfig.java index 00ccf95..eee1b94 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/config/Knife4jConfig.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/config/Knife4jConfig.java @@ -29,6 +29,12 @@ public class Knife4jConfig { // 管理员相关分类接口 @Bean public GroupedOpenApi groupedOpenApi() { + return GroupedOpenApi.builder().group("前台接口管理").pathsToMatch("/api/**").build(); + } + + // 管理员相关分类接口 + @Bean + public GroupedOpenApi groupedOpenAdminApi() { return GroupedOpenApi.builder().group("管理员接口请求").pathsToMatch("/admin/**").build(); } diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/config/MybatisPlusConfig.java b/common/service-utils/src/main/java/cn/bunny/common/service/config/MybatisPlusConfig.java index 86bdd5c..013c778 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/config/MybatisPlusConfig.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/config/MybatisPlusConfig.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.github.pagehelper.PageInterceptor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -23,7 +24,9 @@ public class MybatisPlusConfig { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 分页插件 - interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL); + paginationInnerInterceptor.setMaxLimit(100L);// ? 设置最大分页为100 + interceptor.addInnerInterceptor(paginationInnerInterceptor); // 乐观锁 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 防止全表删除 @@ -31,4 +34,9 @@ public class MybatisPlusConfig { return interceptor; } + + @Bean// pagehelper分页插件需要配的拦截器 + public PageInterceptor pageInterceptor() { + return new PageInterceptor(); + } } diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/config/RedisConfiguration.java b/common/service-utils/src/main/java/cn/bunny/common/service/config/RedisConfiguration.java index 72cce70..1b5c8d7 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/config/RedisConfiguration.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/config/RedisConfiguration.java @@ -63,14 +63,12 @@ public class RedisConfiguration { log.info("RedisConfiguration===>解决cache(@Cacheable)把数据缓存到redis中的value是乱码问题"); // 配置序列化 - RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); - config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jsonRedisSerializer())) - .entryTtl(Duration.ofDays(365)); + .entryTtl(Duration.ofDays(30)); - RedisCacheManager cacheManager = RedisCacheManager.builder(factory) - .cacheDefaults(config).build(); - return cacheManager; + return RedisCacheManager.builder(factory).cacheDefaults(config).build(); } /** diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/config/WebMvcConfiguration.java b/common/service-utils/src/main/java/cn/bunny/common/service/config/WebMvcConfiguration.java deleted file mode 100644 index 7624b83..0000000 --- a/common/service-utils/src/main/java/cn/bunny/common/service/config/WebMvcConfiguration.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.bunny.common.service.config; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -@Configuration -@Slf4j -public class WebMvcConfiguration implements WebMvcConfigurer { - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - log.info("WebMvcConfiguration===>设置"); - - registry.addResourceHandler("/favicon.ico").addResourceLocations("classpath:/"); - registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/"); - registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); - } - - /** - * 跨域配置 - * - * @param registry 跨域注册表 - */ - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/**") - // 是否发送Cookies - .allowCredentials(true) - // 放行哪些原始域 - .allowedOriginPatterns("*").allowedMethods("GET", "POST", "PUT", "DELETE").allowedHeaders("*").exposedHeaders("*"); - } -} diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/context/BaseContext.java b/common/service-utils/src/main/java/cn/bunny/common/service/context/BaseContext.java index 2910d37..1a01c70 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/context/BaseContext.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/context/BaseContext.java @@ -3,8 +3,8 @@ package cn.bunny.common.service.context; public class BaseContext { private static final ThreadLocal userId = new ThreadLocal<>(); private static final ThreadLocal username = new ThreadLocal(); - private static final ThreadLocal wareId = new ThreadLocal<>(); private static final ThreadLocal adminId = new ThreadLocal<>(); + private static final ThreadLocal adminName = new ThreadLocal<>(); // 用户id相关 public static Long getUserId() { @@ -15,10 +15,6 @@ public class BaseContext { userId.set(_userId); } - public static void removeUserId() { - userId.remove(); - } - public static String getUsername() { return username.get(); } @@ -27,6 +23,11 @@ public class BaseContext { username.set(_username); } + public static void removeUser() { + username.remove(); + userId.remove(); + } + // adminId 相关 public static Long getAdminId() { return adminId.get(); @@ -36,7 +37,16 @@ public class BaseContext { adminId.set(_adminId); } - public static void removeAdminId() { + public static String getAdminName() { + return adminName.get(); + } + + public static void setAdminName(String _adminName) { + adminName.set(_adminName); + } + + public static void removeAdmin() { + adminName.remove(); adminId.remove(); } } \ No newline at end of file diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/exception/BunnyException.java b/common/service-utils/src/main/java/cn/bunny/common/service/exception/BunnyException.java index fb87984..1012971 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/exception/BunnyException.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/exception/BunnyException.java @@ -1,6 +1,6 @@ package cn.bunny.common.service.exception; -import cn.bunny.enums.ResultCodeEnum; +import cn.bunny.result.ResultCodeEnum; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/exception/GlobalExceptionHandler.java b/common/service-utils/src/main/java/cn/bunny/common/service/exception/GlobalExceptionHandler.java index 715dfc0..345d29b 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/exception/GlobalExceptionHandler.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/exception/GlobalExceptionHandler.java @@ -1,8 +1,9 @@ package cn.bunny.common.service.exception; -import cn.bunny.common.constant.CommonMessageConstant; -import cn.bunny.common.result.Result; -import cn.bunny.enums.ResultCodeEnum; + +import cn.bunny.result.Result; +import cn.bunny.result.ResultCodeEnum; +import cn.bunny.result.constant.ExceptionConstant; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @@ -58,7 +59,7 @@ public class GlobalExceptionHandler { public Result error(AccessDeniedException exception) throws AccessDeniedException { log.error("GlobalExceptionHandler===>spring security异常:{}", exception.getMessage()); - return Result.error(ResultCodeEnum.PERMISSION); + return Result.error(ResultCodeEnum.SERVICE_ERROR); } // 处理SQL异常 @@ -72,10 +73,10 @@ public class GlobalExceptionHandler { // 截取用户名 String username = message.split(" ")[2]; // 错误信息 - String errorMessage = username + CommonMessageConstant.ALREADY_EXISTS; + String errorMessage = username + ExceptionConstant.ALREADY_USER_Exception; return Result.error(errorMessage); } else { - return Result.error(CommonMessageConstant.UNKNOWN_ERROR); + return Result.error(ExceptionConstant.UNKNOWN_Exception); } } } diff --git a/common/common-utils/src/main/java/cn/bunny/common/properties/SnowflakeProperties.java b/common/service-utils/src/main/java/cn/bunny/common/service/properties/SnowflakeProperties.java similarity index 83% rename from common/common-utils/src/main/java/cn/bunny/common/properties/SnowflakeProperties.java rename to common/service-utils/src/main/java/cn/bunny/common/service/properties/SnowflakeProperties.java index fe073ad..19b0057 100644 --- a/common/common-utils/src/main/java/cn/bunny/common/properties/SnowflakeProperties.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/properties/SnowflakeProperties.java @@ -1,10 +1,10 @@ -package cn.bunny.common.properties; +package cn.bunny.common.service.properties; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; +import org.springframework.context.annotation.Configuration; -@Component +@Configuration @ConfigurationProperties(prefix = "bunny.snowflake") @Data public class SnowflakeProperties { diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/utils/JwtHelper.java b/common/service-utils/src/main/java/cn/bunny/common/service/utils/JwtHelper.java index 318b6bb..cbce3e2 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/utils/JwtHelper.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/utils/JwtHelper.java @@ -6,13 +6,13 @@ import org.springframework.util.StringUtils; import java.util.Date; public class JwtHelper { - private static final long tokenExpiration = 365L * 24 * 60 * 60 * 1000; + private static final long tokenExpiration = 24 * 60 * 60 * 1000; private static final String tokenSignKey = "Bunny-Java-Template"; - public static String createToken(Long userId, String userName) { + public static String createToken(Long userId, String userName, Integer day) { return Jwts.builder() .setSubject("Bunny-USER") - .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration)) + .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration * day)) .claim("userId", userId) .claim("userName", userName) .signWith(SignatureAlgorithm.HS256, tokenSignKey) @@ -25,11 +25,11 @@ public class JwtHelper { Jws claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token); Claims claims = claimsJws.getBody(); - Integer userId = (Integer) claims.get("userId"); - return userId.longValue(); + + return Long.valueOf(String.valueOf(claims.get("userId"))); } - public static String getUserName(String token) { + public static String getUsername(String token) { if (!StringUtils.hasText(token)) return ""; Jws claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token); @@ -42,9 +42,9 @@ public class JwtHelper { } public static void main(String[] args) { - String token = JwtHelper.createToken(7L, "admin"); - System.out.println(token); + String token = JwtHelper.createToken(7L, "admin", 7); + // token = "eyJhbGciOiJIUzI1NiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_6tWKi5NUrJScirNy6vUDQ12DVLSUUqtKFCyMjQ3MTc0NrYwNddRKi1OLfJMUbKyNDIwNLQwMDAzg4j5JeamAjUbGhtaWhoYGJqaOBQW6iXn5yrVAgCrO9jLWAAAAA.DS1wYprXGoIMrjtUWfDSN9AG5gWoRZ17oAgcvC0kwag"; System.out.println(JwtHelper.getUserId(token)); - System.out.println(JwtHelper.getUserName(token)); + System.out.println(JwtHelper.getUsername(token)); } } \ No newline at end of file diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/utils/ResponseUtil.java b/common/service-utils/src/main/java/cn/bunny/common/service/utils/ResponseUtil.java index 3e822a0..2f3f1f2 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/utils/ResponseUtil.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/utils/ResponseUtil.java @@ -1,21 +1,24 @@ package cn.bunny.common.service.utils; -import cn.bunny.common.result.Result; +import cn.bunny.result.Result; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import jakarta.servlet.http.HttpServletResponse; import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import java.io.IOException; public class ResponseUtil { - public static void out(HttpServletResponse response, Result r) { + public static void out(HttpServletResponse response, Result result) { ObjectMapper mapper = new ObjectMapper(); + + // 注册JavaTimeModule模块 + mapper.registerModule(new JavaTimeModule()); + response.setContentType("application/json;charset=UTF-8"); response.setStatus(HttpStatus.OK.value()); - response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE); try { - mapper.writeValue(response.getWriter(), r); + mapper.writeValue(response.getWriter(), result); } catch (IOException e) { e.printStackTrace(); } diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/utils/SnowflakeIdGenerator.java b/common/service-utils/src/main/java/cn/bunny/common/service/utils/SnowflakeIdGenerator.java index 72215e9..8504b27 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/utils/SnowflakeIdGenerator.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/utils/SnowflakeIdGenerator.java @@ -1,7 +1,7 @@ package cn.bunny.common.service.utils; -import cn.bunny.common.properties.SnowflakeProperties; +import cn.bunny.common.service.properties.SnowflakeProperties; import org.springframework.stereotype.Component; import java.util.ArrayList; diff --git a/common/spring-security/src/main/java/cn/bunny/security/filter/TokenAuthenticationFilter.java b/common/spring-security/src/main/java/cn/bunny/security/filter/TokenAuthenticationFilter.java deleted file mode 100644 index dea5c18..0000000 --- a/common/spring-security/src/main/java/cn/bunny/security/filter/TokenAuthenticationFilter.java +++ /dev/null @@ -1,74 +0,0 @@ -package cn.bunny.security.filter; - -import cn.bunny.common.service.context.BaseContext; -import cn.bunny.common.service.utils.JwtHelper; -import com.alibaba.fastjson2.JSON; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.util.StringUtils; -import org.springframework.web.filter.OncePerRequestFilter; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -public class TokenAuthenticationFilter extends OncePerRequestFilter { - private final RedisTemplate redisTemplate; - - public TokenAuthenticationFilter(RedisTemplate redisTemplate) { - this.redisTemplate = redisTemplate; - } - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { - String token = request.getHeader("token"); - - // login请求就没token,直接放行,因为后边有其他的过滤器 - if (token == null) { - doFilter(request, response, chain); - return; - } - - // 如果是登录接口,直接放行 - UsernamePasswordAuthenticationToken authentication = getAuthentication(request); - SecurityContextHolder.getContext().setAuthentication(authentication); - chain.doFilter(request, response); - } - - private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) { - // 请求头是否有token - String token = request.getHeader("token"); - if (StringUtils.hasText(token)) { - String username = JwtHelper.getUserName(token); - if (StringUtils.hasText(username)) { - // 当前用户信息放到ThreadLocal里面 - BaseContext.setUserId(JwtHelper.getUserId(token)); - BaseContext.setUsername(username); - - // 通过username从redis获取权限数据 - String authString = (String) redisTemplate.opsForValue().get(username); - // 把redis获取字符串权限数据转换要求集合类型 List - if (StringUtils.hasText(authString)) { - List maplist = JSON.parseArray(authString, Map.class); - System.out.println(maplist); - List authList = new ArrayList<>(); - for (Map map : maplist) { - String authority = (String) map.get("authority"); - authList.add(new SimpleGrantedAuthority(authority)); - } - return new UsernamePasswordAuthenticationToken(username, null, authList); - } else { - return new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>()); - } - } - } - return null; - } -} diff --git a/common/spring-security/src/main/java/cn/bunny/security/filter/TokenLoginFilter.java b/common/spring-security/src/main/java/cn/bunny/security/filter/TokenLoginFilter.java deleted file mode 100644 index b78ac46..0000000 --- a/common/spring-security/src/main/java/cn/bunny/security/filter/TokenLoginFilter.java +++ /dev/null @@ -1,80 +0,0 @@ -package cn.bunny.security.filter; - -import cn.bunny.common.result.Result; -import cn.bunny.common.service.utils.JwtHelper; -import cn.bunny.common.service.utils.ResponseUtil; -import cn.bunny.entity.system.Login; -import cn.bunny.enums.ResultCodeEnum; -import cn.bunny.security.custom.CustomUser; -import cn.bunny.security.handelr.SecurityAuthenticationFailureHandler; -import cn.bunny.security.handelr.SecurityAuthenticationSuccessHandler; -import cn.bunny.vo.system.LoginVo; -import com.alibaba.fastjson2.JSON; -import com.fasterxml.jackson.databind.ObjectMapper; -import jakarta.servlet.FilterChain; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; -import org.springframework.security.web.util.matcher.AntPathRequestMatcher; - -import java.io.IOException; - -/** - * 由于SpringSecurity的登录只能是表单形式 并且用户名密码需要时username、password,可以通过继承 UsernamePasswordAuthenticationFilter 获取登录请求的参数 - * 再去设置到 UsernamePasswordAuthenticationToken 中 来改变请求传参方式、参数名等 或者也可以在登录的时候加入其他参数等等 - * 也可以在这里添加验证码、短信等的验证 - */ -public class TokenLoginFilter extends UsernamePasswordAuthenticationFilter { - private final RedisTemplate redisTemplate; - - // 构造方法 - public TokenLoginFilter(AuthenticationConfiguration authenticationConfiguration, RedisTemplate redisTemplate) throws Exception { - this.setAuthenticationSuccessHandler(new SecurityAuthenticationSuccessHandler()); - this.setAuthenticationFailureHandler(new SecurityAuthenticationFailureHandler()); - this.setPostOnly(false); - // 指定登录接口及提交方式,可以指定任意路径 - this.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher("/admin/system/index/login", "POST")); - this.setAuthenticationManager(authenticationConfiguration.getAuthenticationManager()); - this.redisTemplate = redisTemplate; - } - - // 登录认证 - // 获取输入的用户名和密码,调用方法认证 - public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { - try { - // 获取用户信息 - LoginVo loginVo = new ObjectMapper().readValue(request.getInputStream(), LoginVo.class); - // 封装对象 - Authentication authenticationToken = new UsernamePasswordAuthenticationToken(loginVo.getUsername(), loginVo.getPassword()); - // 调用方法 - return this.getAuthenticationManager().authenticate(authenticationToken); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - // 认证成功调用方法 - protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication auth) { - // 获取当前用户 - CustomUser customUser = (CustomUser) auth.getPrincipal(); - // 生成token - String token = JwtHelper.createToken(customUser.getSysUser().getId(), customUser.getSysUser().getUsername()); - - // 获取当前用户权限数据,放到Redis里面 key:username value:权限数据 - redisTemplate.opsForValue().set(customUser.getUsername(), JSON.toJSONString(customUser.getAuthorities())); - - // 返回 - Login login = Login.builder().token(token).build(); - ResponseUtil.out(response, Result.success(login)); - } - - // 认证失败调用方法 - protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) { - ResponseUtil.out(response, Result.error(null, ResultCodeEnum.LOGIN_MOBLE_ERROR)); - } -} diff --git a/common/spring-security/src/main/java/cn/bunny/security/service/CustomUserDetailsService.java b/common/spring-security/src/main/java/cn/bunny/security/service/CustomUserDetailsService.java deleted file mode 100644 index 7786e8c..0000000 --- a/common/spring-security/src/main/java/cn/bunny/security/service/CustomUserDetailsService.java +++ /dev/null @@ -1,12 +0,0 @@ -package cn.bunny.security.service; - -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UsernameNotFoundException; - -public interface CustomUserDetailsService extends org.springframework.security.core.userdetails.UserDetailsService { - /** - * 根据用户名获取用户对象(获取不到直接抛异常) - */ - @Override - UserDetails loadUserByUsername(String username) throws UsernameNotFoundException; -} diff --git a/model/pom.xml b/model/pom.xml index 5f33789..300ad17 100644 --- a/model/pom.xml +++ b/model/pom.xml @@ -62,5 +62,11 @@ org.springframework.boot spring-boot-starter-web + + + io.swagger + swagger-annotations + 1.6.14 + diff --git a/model/src/main/java/cn/bunny/dto/article/LoadArticleListDto.java b/model/src/main/java/cn/bunny/dto/article/LoadArticleListDto.java new file mode 100644 index 0000000..c3b5e3b --- /dev/null +++ b/model/src/main/java/cn/bunny/dto/article/LoadArticleListDto.java @@ -0,0 +1,22 @@ +package cn.bunny.dto.article; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Objects; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class LoadArticleListDto { + private Integer pBoardId; + private Integer boardId; + private Integer orderType = 1; + + public void getOrderType(Integer orderType) { + this.orderType = Objects.requireNonNullElse(orderType, 1); + } +} diff --git a/model/src/main/java/cn/bunny/entity/system/RoleByUser.java b/model/src/main/java/cn/bunny/dto/article/LoadUserArticleDto.java similarity index 50% rename from model/src/main/java/cn/bunny/entity/system/RoleByUser.java rename to model/src/main/java/cn/bunny/dto/article/LoadUserArticleDto.java index 4b1b929..a644f4f 100644 --- a/model/src/main/java/cn/bunny/entity/system/RoleByUser.java +++ b/model/src/main/java/cn/bunny/dto/article/LoadUserArticleDto.java @@ -1,17 +1,15 @@ -package cn.bunny.entity.system; +package cn.bunny.dto.article; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.List; - @Data -@Builder @AllArgsConstructor @NoArgsConstructor -public class RoleByUser { - private List assginRoleList; - private List allRolesList; +@Builder +public class LoadUserArticleDto { + private Long userId; + private Integer type; } diff --git a/model/src/main/java/cn/bunny/dto/common/CommentPostDto.java b/model/src/main/java/cn/bunny/dto/common/CommentPostDto.java new file mode 100644 index 0000000..18a0ec4 --- /dev/null +++ b/model/src/main/java/cn/bunny/dto/common/CommentPostDto.java @@ -0,0 +1,19 @@ +package cn.bunny.dto.common; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.web.multipart.MultipartFile; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CommentPostDto { + private String articleId; + private Integer pCommentId; + private String content; + private MultipartFile image; + private Long replyUserId; +} diff --git a/model/src/main/java/cn/bunny/dto/common/CommentQueryDto.java b/model/src/main/java/cn/bunny/dto/common/CommentQueryDto.java new file mode 100644 index 0000000..2ad59bc --- /dev/null +++ b/model/src/main/java/cn/bunny/dto/common/CommentQueryDto.java @@ -0,0 +1,16 @@ +package cn.bunny.dto.common; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CommentQueryDto { + private String articleId; + // time 时间查询、goods 点赞数量 + private String orderType; +} diff --git a/model/src/main/java/cn/bunny/dto/common/QueryTopTypeDto.java b/model/src/main/java/cn/bunny/dto/common/QueryTopTypeDto.java new file mode 100644 index 0000000..843a9de --- /dev/null +++ b/model/src/main/java/cn/bunny/dto/common/QueryTopTypeDto.java @@ -0,0 +1,15 @@ +package cn.bunny.dto.common; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class QueryTopTypeDto { + private Long commentId; + private Integer topType; +} diff --git a/model/src/main/java/cn/bunny/dto/email/EmailTemplateDto.java b/model/src/main/java/cn/bunny/dto/email/EmailTemplateDto.java new file mode 100644 index 0000000..734a1c0 --- /dev/null +++ b/model/src/main/java/cn/bunny/dto/email/EmailTemplateDto.java @@ -0,0 +1,21 @@ +package cn.bunny.dto.email; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class EmailTemplateDto { + // 模板名称 + private String templateName; + // 主题 + private String subject; + // 邮件内容 + private String body; + // 邮件类型 + private String type; +} diff --git a/model/src/main/java/cn/bunny/dto/email/EmailUsersDto.java b/model/src/main/java/cn/bunny/dto/email/EmailUsersDto.java new file mode 100644 index 0000000..be3b1b4 --- /dev/null +++ b/model/src/main/java/cn/bunny/dto/email/EmailUsersDto.java @@ -0,0 +1,30 @@ +package cn.bunny.dto.email; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 添加邮箱用户 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class EmailUsersDto { + // 修改时需要传 + private Long id; + // 邮箱 + private String email; + // 密码 + private String password; + // SMTP服务器 + private String host; + // 端口号 + private Integer port; + // 邮箱协议 + private Integer smtpAgreement; + // 是否为默认邮件 + private Boolean isDefault; +} diff --git a/model/src/main/java/cn/bunny/vo/system/LoginVo.java b/model/src/main/java/cn/bunny/dto/user/LoginDto.java similarity index 61% rename from model/src/main/java/cn/bunny/vo/system/LoginVo.java rename to model/src/main/java/cn/bunny/dto/user/LoginDto.java index 1630ed7..1f4213b 100644 --- a/model/src/main/java/cn/bunny/vo/system/LoginVo.java +++ b/model/src/main/java/cn/bunny/dto/user/LoginDto.java @@ -1,26 +1,19 @@ -package cn.bunny.vo.system; - +package cn.bunny.dto.user; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -/** - * 登录对象 - */ @Data -@Builder @AllArgsConstructor @NoArgsConstructor -public class LoginVo { - /** - * 手机号 - */ +@Builder +public class LoginDto { + // 用户名 private String username; - - /** - * 密码 - */ + // 密码 private String password; + // 邮箱验证码 + private String emailCode; } diff --git a/model/src/main/java/cn/bunny/dto/user/RegisterDto.java b/model/src/main/java/cn/bunny/dto/user/RegisterDto.java new file mode 100644 index 0000000..5a15b4d --- /dev/null +++ b/model/src/main/java/cn/bunny/dto/user/RegisterDto.java @@ -0,0 +1,17 @@ +package cn.bunny.dto.user; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class RegisterDto { + private String email; + private String nickName; + private String password; + private String code; +} diff --git a/model/src/main/java/cn/bunny/dto/user/ResetPwdDto.java b/model/src/main/java/cn/bunny/dto/user/ResetPwdDto.java new file mode 100644 index 0000000..490dbbc --- /dev/null +++ b/model/src/main/java/cn/bunny/dto/user/ResetPwdDto.java @@ -0,0 +1,16 @@ +package cn.bunny.dto.user; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ResetPwdDto { + private String email; + private String password; + private String emailCode; +} diff --git a/model/src/main/java/cn/bunny/dto/user/UserInfoDto.java b/model/src/main/java/cn/bunny/dto/user/UserInfoDto.java new file mode 100644 index 0000000..4bbbc79 --- /dev/null +++ b/model/src/main/java/cn/bunny/dto/user/UserInfoDto.java @@ -0,0 +1,22 @@ +package cn.bunny.dto.user; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.web.multipart.MultipartFile; + +/** + * 修改用户信息 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class UserInfoDto { + private String nickName; + private String password; + private MultipartFile avatar; + private Integer sex; + private String personDescription; +} diff --git a/model/src/main/java/cn/bunny/dto/user/UserIntegralRecordDto.java b/model/src/main/java/cn/bunny/dto/user/UserIntegralRecordDto.java new file mode 100644 index 0000000..8320e0a --- /dev/null +++ b/model/src/main/java/cn/bunny/dto/user/UserIntegralRecordDto.java @@ -0,0 +1,15 @@ +package cn.bunny.dto.user; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class UserIntegralRecordDto { + private String startDate; + private String endDate; +} diff --git a/model/src/main/java/cn/bunny/entity/system/Login.java b/model/src/main/java/cn/bunny/dto/user/UserMessageDto.java similarity index 67% rename from model/src/main/java/cn/bunny/entity/system/Login.java rename to model/src/main/java/cn/bunny/dto/user/UserMessageDto.java index 140f575..575bd73 100644 --- a/model/src/main/java/cn/bunny/entity/system/Login.java +++ b/model/src/main/java/cn/bunny/dto/user/UserMessageDto.java @@ -1,4 +1,4 @@ -package cn.bunny.entity.system; +package cn.bunny.dto.user; import lombok.AllArgsConstructor; import lombok.Builder; @@ -6,9 +6,9 @@ import lombok.Data; import lombok.NoArgsConstructor; @Data -@Builder @AllArgsConstructor @NoArgsConstructor -public class Login { - private String token; +@Builder +public class UserMessageDto { + private String type; } diff --git a/model/src/main/java/cn/bunny/entity/base/BaseEntity.java b/model/src/main/java/cn/bunny/entity/base/BaseEntity.java index 505cfcd..451c19b 100644 --- a/model/src/main/java/cn/bunny/entity/base/BaseEntity.java +++ b/model/src/main/java/cn/bunny/entity/base/BaseEntity.java @@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; -import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @@ -15,19 +15,26 @@ import java.util.Map; @Data public class BaseEntity implements Serializable { - @TableId(type = IdType.ASSIGN_ID) - @Schema(description = "唯一标识") + @TableId(value = "id", type = IdType.ASSIGN_ID) + @ApiModelProperty("唯一标识") private Long id; @TableField("create_time") + @ApiModelProperty("创建时间") private Date createTime; @TableField("update_time") + @ApiModelProperty("更新时间") private Date updateTime; + @TableField("update_user") + @ApiModelProperty("操作用户ID") + private Long updateUser; + @TableLogic @TableField("is_deleted") - private Integer isDeleted; + @ApiModelProperty("是否被删除") + private Boolean isDeleted; @TableField(exist = false) private Map param = new HashMap<>(); diff --git a/model/src/main/java/cn/bunny/entity/system/SysDept.java b/model/src/main/java/cn/bunny/entity/system/SysDept.java deleted file mode 100644 index 4565f40..0000000 --- a/model/src/main/java/cn/bunny/entity/system/SysDept.java +++ /dev/null @@ -1,49 +0,0 @@ -package cn.bunny.entity.system; - -import cn.bunny.entity.base.BaseEntity; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Data -@Schema(description = "部门") -@TableName("sys_dept") -public class SysDept extends BaseEntity { - - private static final long serialVersionUID = 1L; - - @Schema(description = "部门名称") - @TableField("name") - private String name; - - @Schema(description = "上级部门id") - @TableField("parent_id") - private Long parentId; - - @Schema(description = "树结构") - @TableField("tree_path") - private String treePath; - - @Schema(description = "排序") - @TableField("sort_value") - private Integer sortValue; - - @Schema(description = "负责人") - @TableField("leader") - private String leader; - - @Schema(description = "电话") - @TableField("phone") - private String phone; - - @Schema(description = "状态(1正常 0停用)") - @TableField("status") - private Integer status; - - @Schema(description = "下级部门") - @TableField(exist = false) - private List children; -} \ No newline at end of file diff --git a/model/src/main/java/cn/bunny/entity/system/SysLoginLog.java b/model/src/main/java/cn/bunny/entity/system/SysLoginLog.java deleted file mode 100644 index 4675fbf..0000000 --- a/model/src/main/java/cn/bunny/entity/system/SysLoginLog.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.bunny.entity.system; - -import cn.bunny.entity.base.BaseEntity; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.util.Date; - -@EqualsAndHashCode(callSuper = true) -@Data -@Schema(description = "SysLoginLog") -@TableName("sys_login_log") -public class SysLoginLog extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - @Schema(description = "用户账号") - @TableField("username") - private String username; - - @Schema(description = "登录IP地址") - @TableField("ipaddr") - private String ipaddr; - - @Schema(description = "登录状态(0成功 1失败)") - @TableField("status") - private Integer status; - - @Schema(description = "提示信息") - @TableField("msg") - private String msg; - - @Schema(description = "访问时间") - @TableField("access_time") - private Date accessTime; - -} \ No newline at end of file diff --git a/model/src/main/java/cn/bunny/entity/system/SysMenu.java b/model/src/main/java/cn/bunny/entity/system/SysMenu.java deleted file mode 100644 index 75e4dde..0000000 --- a/model/src/main/java/cn/bunny/entity/system/SysMenu.java +++ /dev/null @@ -1,65 +0,0 @@ -package cn.bunny.entity.system; - -import cn.bunny.entity.base.BaseEntity; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.util.List; - -@EqualsAndHashCode(callSuper = true) -@Data -@Schema(description = "菜单") -@TableName("sys_menu") -public class SysMenu extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - @Schema(description = "所属上级") - @TableField("parent_id") - private Long parentId; - - @Schema(description = "名称") - @TableField("name") - private String name; - - @Schema(description = "类型(1:菜单,2:按钮)") - @TableField("type") - private Integer type; - - @Schema(description = "路由地址") - @TableField("path") - private String path; - - @Schema(description = "组件路径") - @TableField("component") - private String component; - - @Schema(description = "权限标识") - @TableField("perms") - private String perms; - - @Schema(description = "图标") - @TableField("icon") - private String icon; - - @Schema(description = "排序") - @TableField("sort_description") - private Integer sortdescription; - - @Schema(description = "状态(0:禁止,1:正常)") - @TableField("status") - private Integer status; - - // 下级列表 - @TableField(exist = false) - private List children; - // 是否选中 - @TableField(exist = false) - private boolean isSelect; -} - diff --git a/model/src/main/java/cn/bunny/entity/system/SysRole.java b/model/src/main/java/cn/bunny/entity/system/SysRole.java deleted file mode 100644 index 28b720d..0000000 --- a/model/src/main/java/cn/bunny/entity/system/SysRole.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.bunny.entity.system; - -import cn.bunny.entity.base.BaseEntity; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; - - -@EqualsAndHashCode(callSuper = true) -@Data -@Schema(description = "角色") -@TableName("sys_role") -public class SysRole extends BaseEntity { - @Serial - private static final long serialVersionUID = 1L; - - //@NotBlank(message = "角色名称不能为空") - @Schema(description = "角色名称") - @TableField("role_name") - private String roleName; - - @Schema(description = "角色编码") - @TableField("role_code") - private String roleCode; - - @Schema(description = "描述") - @TableField("description") - private String description; -} - diff --git a/model/src/main/java/cn/bunny/entity/system/SysUser.java b/model/src/main/java/cn/bunny/entity/system/SysUser.java deleted file mode 100644 index 1000b92..0000000 --- a/model/src/main/java/cn/bunny/entity/system/SysUser.java +++ /dev/null @@ -1,71 +0,0 @@ -package cn.bunny.entity.system; - -import cn.bunny.entity.base.BaseEntity; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serial; -import java.util.List; - -@EqualsAndHashCode(callSuper = true) -@Data -@Schema(description = "用户") -@TableName("sys_user") -public class SysUser extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - @Schema(description = "用户名") - @TableField("username") - private String username; - - @Schema(description = "密码") - @TableField("password") - private String password; - - @Schema(description = "姓名") - @TableField("name") - private String name; - - @Schema(description = "手机") - @TableField("phone") - private String phone; - - @Schema(description = "头像地址") - @TableField("head_url") - private String headUrl; - - @Schema(description = "部门id") - @TableField("dept_id") - private Long deptId; - - @Schema(description = "岗位id") - @TableField("post_id") - private Long postId; - - @Schema(description = "描述") - @TableField("description") - private String description; - - @Schema(description = "openId") - @TableField("open_id") - private String openId; - - @Schema(description = "状态(1:正常 0:停用)") - @TableField("status") - private Integer status; - - @TableField(exist = false) - private List roleList; - // 岗位 - @TableField(exist = false) - private String postName; - // 部门 - @TableField(exist = false) - private String deptName; -} - diff --git a/model/src/main/java/cn/bunny/entity/system/SysUserinfo.java b/model/src/main/java/cn/bunny/entity/system/SysUserinfo.java deleted file mode 100644 index 731524f..0000000 --- a/model/src/main/java/cn/bunny/entity/system/SysUserinfo.java +++ /dev/null @@ -1,22 +0,0 @@ -package cn.bunny.entity.system; - -import cn.bunny.vo.system.RouterVo; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.HashSet; -import java.util.List; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class SysUserinfo { - private HashSet roles; - private String name; - private String avatar; - private List buttons; - private List routers; -} diff --git a/model/src/main/java/cn/bunny/entity/system/admin/AdminPower.java b/model/src/main/java/cn/bunny/entity/system/admin/AdminPower.java new file mode 100644 index 0000000..2544ab8 --- /dev/null +++ b/model/src/main/java/cn/bunny/entity/system/admin/AdminPower.java @@ -0,0 +1,58 @@ +package cn.bunny.entity.system.admin; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * + *

+ * + * @author Bunny + * @since 2024-05-18 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("admin_power") +@ApiModel(value = "AdminPower对象", description = "") +public class AdminPower implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ApiModelProperty("权限ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty("权限名称") + private String powerName; + + @ApiModelProperty("权限编码") + private String powerCode; + + @ApiModelProperty("描述") + private String description; + + @ApiModelProperty("创建时间") + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + private LocalDateTime updateTime; + + @ApiModelProperty("更新用户") + private String updateUser; + + @ApiModelProperty("是否删除,0-未删除,1-已删除") + private Byte isDelete; +} diff --git a/model/src/main/java/cn/bunny/entity/system/admin/AdminRole.java b/model/src/main/java/cn/bunny/entity/system/admin/AdminRole.java new file mode 100644 index 0000000..59c36f4 --- /dev/null +++ b/model/src/main/java/cn/bunny/entity/system/admin/AdminRole.java @@ -0,0 +1,55 @@ +package cn.bunny.entity.system.admin; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * + *

+ * + * @author Bunny + * @since 2024-05-18 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("admin_role") +@ApiModel(value = "AdminRole对象", description = "") +public class AdminRole implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private String id; + + @ApiModelProperty("角色名称") + private String roleName; + + @ApiModelProperty("描述") + private String description; + + @ApiModelProperty("角色代码") + private String roleCode; + + @ApiModelProperty("创建时间") + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + private LocalDateTime updateTime; + + @ApiModelProperty("操作用户") + private String updateUser; + + @ApiModelProperty("是否删除") + private Byte isDeleted; +} diff --git a/model/src/main/java/cn/bunny/entity/system/admin/AdminRolePower.java b/model/src/main/java/cn/bunny/entity/system/admin/AdminRolePower.java new file mode 100644 index 0000000..26370de --- /dev/null +++ b/model/src/main/java/cn/bunny/entity/system/admin/AdminRolePower.java @@ -0,0 +1,56 @@ +package cn.bunny.entity.system.admin; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * + *

+ * + * @author Bunny + * @since 2024-05-18 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("admin_role_power") +@ApiModel(value = "AdminRolePower对象", description = "") +public class AdminRolePower implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + @TableId(value = "id", type = IdType.AUTO) + private String id; + + @ApiModelProperty("角色id") + private String roleId; + + @ApiModelProperty("权限id") + private String powerId; + + @ApiModelProperty("描述") + private String description; + + @ApiModelProperty("创建时间") + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + private LocalDateTime updateTime; + + @ApiModelProperty("更新用户") + private String updateUser; + + @ApiModelProperty("是否删除,0-未删除,1-已删除") + private Byte isDelete; +} diff --git a/model/src/main/java/cn/bunny/entity/system/admin/AdminUserRole.java b/model/src/main/java/cn/bunny/entity/system/admin/AdminUserRole.java new file mode 100644 index 0000000..78f954f --- /dev/null +++ b/model/src/main/java/cn/bunny/entity/system/admin/AdminUserRole.java @@ -0,0 +1,56 @@ +package cn.bunny.entity.system.admin; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * + *

+ * + * @author Bunny + * @since 2024-05-18 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("admin_user_role") +@ApiModel(value = "AdminUserRole对象", description = "") +public class AdminUserRole implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("ID") + @TableId(value = "id", type = IdType.AUTO) + private String id; + + @ApiModelProperty("用户id") + private String userId; + + @ApiModelProperty("角色id") + private String roleId; + + @ApiModelProperty("描述") + private String description; + + @ApiModelProperty("创建时间") + private LocalDateTime createTime; + + @ApiModelProperty("更新时间") + private LocalDateTime updateTime; + + @ApiModelProperty("更新用户") + private String updateUser; + + @ApiModelProperty("是否删除,0-未删除,1-已删除") + private Byte isDelete; +} diff --git a/model/src/main/java/cn/bunny/entity/system/admin/auth/AuthUserRole.java b/model/src/main/java/cn/bunny/entity/system/admin/auth/AuthUserRole.java new file mode 100644 index 0000000..f1b3794 --- /dev/null +++ b/model/src/main/java/cn/bunny/entity/system/admin/auth/AuthUserRole.java @@ -0,0 +1,21 @@ +package cn.bunny.entity.system.admin.auth; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class AuthUserRole { + // 用户id + private Long userId; + // 角色id + private Long roleId; + // 角色代码 + private String roleCode; + // 描述 + private String roleDescription; +} diff --git a/model/src/main/java/cn/bunny/entity/system/article/Article.java b/model/src/main/java/cn/bunny/entity/system/article/Article.java new file mode 100644 index 0000000..fe9f84d --- /dev/null +++ b/model/src/main/java/cn/bunny/entity/system/article/Article.java @@ -0,0 +1,83 @@ +package cn.bunny.entity.system.article; + +import cn.bunny.entity.base.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +/** + *

+ * 文章信息 + *

+ * + * @author Bunny + * @since 2024-05-17 + */ +@Getter +@Setter +@Accessors(chain = true) +@ApiModel(value = "Article对象", description = "文章信息") +public class Article extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ApiModelProperty("板块ID") + private Integer boardId; + + @ApiModelProperty("板块名称") + private String boardName; + + @ApiModelProperty("父级板块ID") + private Integer pBoardId; + + @ApiModelProperty("父板块名称") + private String pBoardName; + + @ApiModelProperty("用户ID") + private Long userId; + + @ApiModelProperty("昵称") + private String nickName; + + @ApiModelProperty("最后登录ip地址") + private String userIpAddress; + + @ApiModelProperty("标题") + private String title; + + @ApiModelProperty("封面") + private String cover; + + @ApiModelProperty("内容") + private String content; + + @ApiModelProperty("0:富文本编辑器 1:markdown编辑器") + private Byte editorType; + + @ApiModelProperty("摘要") + private String summary; + + @ApiModelProperty("阅读数量") + private Integer readCount; + + @ApiModelProperty("点赞数") + private Integer goodCount; + + @ApiModelProperty("评论数") + private Integer commentCount; + + @ApiModelProperty("0未置顶 1:已置顶") + private Byte topType; + + @ApiModelProperty("0:没有附件 1:有附件") + private Byte attachmentType; + + @ApiModelProperty("-1已删除 0:待审核 1:已审核 ") + private Byte status; +} diff --git a/model/src/main/java/cn/bunny/entity/system/article/ForumComment.java b/model/src/main/java/cn/bunny/entity/system/article/ForumComment.java new file mode 100644 index 0000000..bb3b0ff --- /dev/null +++ b/model/src/main/java/cn/bunny/entity/system/article/ForumComment.java @@ -0,0 +1,67 @@ +package cn.bunny.entity.system.article; + +import cn.bunny.entity.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +/** + *

+ * 评论 + *

+ * + * @author Bunny + * @since 2024-05-17 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("forum_comment") +@ApiModel(value = "ForumComment对象", description = "评论") +public class ForumComment extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ApiModelProperty("父级评论ID") + private Long pCommentId; + + @ApiModelProperty("文章ID") + private String articleId; + + @ApiModelProperty("回复内容") + private String content; + + @ApiModelProperty("图片") + private String imgPath; + + @ApiModelProperty("用户ID") + private Long userId; + + @ApiModelProperty("昵称") + private String nickName; + + @ApiModelProperty("用户ip地址") + private String userIpAddress; + + @ApiModelProperty("回复人ID") + private Long replyUserId; + + @ApiModelProperty("回复人昵称") + private String replyNickName; + + @ApiModelProperty("0:未置顶 1:置顶") + private Integer topType; + + @ApiModelProperty("good数量") + private Integer goodCount; + + @ApiModelProperty("0:待审核 1:已审核") + private Integer status; +} diff --git a/model/src/main/java/cn/bunny/entity/system/article/IntegralRecord.java b/model/src/main/java/cn/bunny/entity/system/article/IntegralRecord.java new file mode 100644 index 0000000..b88f1e8 --- /dev/null +++ b/model/src/main/java/cn/bunny/entity/system/article/IntegralRecord.java @@ -0,0 +1,40 @@ +package cn.bunny.entity.system.article; + +import cn.bunny.entity.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +/** + *

+ * 用户积分记录表 + *

+ * + * @author Bunny + * @since 2024-05-17 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("integral_record") +@ApiModel(value = "IntegralRecord对象", description = "用户积分记录表") +public class IntegralRecord extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ApiModelProperty("用户ID") + private Long userId; + + @ApiModelProperty("操作类型") + private Byte operType; + + @ApiModelProperty("积分") + private Integer integral; +} diff --git a/model/src/main/java/cn/bunny/entity/system/article/LikeRecord.java b/model/src/main/java/cn/bunny/entity/system/article/LikeRecord.java new file mode 100644 index 0000000..8d27cb9 --- /dev/null +++ b/model/src/main/java/cn/bunny/entity/system/article/LikeRecord.java @@ -0,0 +1,43 @@ +package cn.bunny.entity.system.article; + +import cn.bunny.entity.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +/** + *

+ * 点赞记录 + *

+ * + * @author Bunny + * @since 2024-05-17 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("like_record") +@ApiModel(value = "LikeRecord对象", description = "点赞记录") +public class LikeRecord extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ApiModelProperty("操作类型0:文章点赞 1:评论点赞") + private Byte opType; + + @ApiModelProperty("主体ID") + private String objectId; + + @ApiModelProperty("用户ID") + private Long userId; + + @ApiModelProperty("主体作者ID") + private Long authorUserId; +} diff --git a/model/src/main/java/cn/bunny/entity/system/board/ForumBoard.java b/model/src/main/java/cn/bunny/entity/system/board/ForumBoard.java new file mode 100644 index 0000000..0fad48c --- /dev/null +++ b/model/src/main/java/cn/bunny/entity/system/board/ForumBoard.java @@ -0,0 +1,49 @@ +package cn.bunny.entity.system.board; + +import cn.bunny.entity.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +/** + *

+ * 文章板块信息 + *

+ * + * @author Bunny + * @since 2024-05-19 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("forum_board") +@ApiModel(value = "ForumBoard对象", description = "文章板块信息") +public class ForumBoard extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ApiModelProperty("父级板块ID") + private Long parentId; + + @ApiModelProperty("板块名") + private String boardName; + + @ApiModelProperty("封面") + private String cover; + + @ApiModelProperty("描述") + private String boardDesc; + + @ApiModelProperty("排序") + private Integer sort; + + @ApiModelProperty("0:只允许管理员发帖 1:任何人可以发帖") + private Boolean postType; +} diff --git a/model/src/main/java/cn/bunny/entity/email/EmailSend.java b/model/src/main/java/cn/bunny/entity/system/email/EmailSend.java similarity index 93% rename from model/src/main/java/cn/bunny/entity/email/EmailSend.java rename to model/src/main/java/cn/bunny/entity/system/email/EmailSend.java index d3e69b7..1d2e779 100644 --- a/model/src/main/java/cn/bunny/entity/email/EmailSend.java +++ b/model/src/main/java/cn/bunny/entity/system/email/EmailSend.java @@ -1,4 +1,4 @@ -package cn.bunny.entity.email; +package cn.bunny.entity.system.email; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/model/src/main/java/cn/bunny/entity/email/EmailSendInit.java b/model/src/main/java/cn/bunny/entity/system/email/EmailSendInit.java similarity index 90% rename from model/src/main/java/cn/bunny/entity/email/EmailSendInit.java rename to model/src/main/java/cn/bunny/entity/system/email/EmailSendInit.java index acd6fb2..d2b3aa1 100644 --- a/model/src/main/java/cn/bunny/entity/email/EmailSendInit.java +++ b/model/src/main/java/cn/bunny/entity/system/email/EmailSendInit.java @@ -1,4 +1,4 @@ -package cn.bunny.entity.email; +package cn.bunny.entity.system.email; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/model/src/main/java/cn/bunny/entity/system/email/EmailTemplate.java b/model/src/main/java/cn/bunny/entity/system/email/EmailTemplate.java new file mode 100644 index 0000000..18cb9c2 --- /dev/null +++ b/model/src/main/java/cn/bunny/entity/system/email/EmailTemplate.java @@ -0,0 +1,42 @@ +package cn.bunny.entity.system.email; + +import cn.bunny.entity.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @author Bunny + * @since 2024-05-19 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("email_template") +@ApiModel(value = "EmailTemplate对象", description = "邮件模板") +public class EmailTemplate extends BaseEntity implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @ApiModelProperty("模板名称") + private String templateName; + + @ApiModelProperty("主题") + private String subject; + + @ApiModelProperty("邮件内容") + private String body; + + @ApiModelProperty("邮件类型") + private String type; +} diff --git a/model/src/main/java/cn/bunny/entity/system/email/EmailUsers.java b/model/src/main/java/cn/bunny/entity/system/email/EmailUsers.java new file mode 100644 index 0000000..def87bb --- /dev/null +++ b/model/src/main/java/cn/bunny/entity/system/email/EmailUsers.java @@ -0,0 +1,49 @@ +package cn.bunny.entity.system.email; + +import cn.bunny.entity.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +/** + *

+ * 邮箱发送表 + *

+ * + * @author Bunny + * @since 2024-05-17 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("email_users") +@ApiModel(value = "EmailUsers对象", description = "邮箱发送表") +public class EmailUsers extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ApiModelProperty("邮箱") + private String email; + + @ApiModelProperty("密码") + private String password; + + @ApiModelProperty("Host地址") + private String host; + + @ApiModelProperty("端口号") + private Integer port; + + @ApiModelProperty("邮箱协议") + private String smtpAgreement; + + @ApiModelProperty("是否为默认邮件") + private Integer isDefault; +} diff --git a/model/src/main/java/cn/bunny/entity/system/file/Files.java b/model/src/main/java/cn/bunny/entity/system/file/Files.java new file mode 100644 index 0000000..2597bb2 --- /dev/null +++ b/model/src/main/java/cn/bunny/entity/system/file/Files.java @@ -0,0 +1,50 @@ +package cn.bunny.entity.system.file; + +import cn.bunny.entity.base.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +/** + *

+ * 用于存储文件信息的数据表 + *

+ * + * @author Bunny + * @since 2024-05-17 + */ +@Getter +@Setter +@Accessors(chain = true) +@ApiModel(value = "Files对象", description = "用于存储文件信息的数据表") +public class Files extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ApiModelProperty("文章ID") + private Long articleId; + + @ApiModelProperty("文件的名称") + private String filename; + + @ApiModelProperty("文件在服务器上的存储路径") + private String filepath; + + @ApiModelProperty("文件的大小,以字节为单位") + private Long fileSize; + + @ApiModelProperty("文件的MIME类型") + private String fileType; + + @ApiModelProperty("创建用户") + private Long createUser; + + @ApiModelProperty("下载次数") + private Integer downloadCount; +} diff --git a/model/src/main/java/cn/bunny/entity/system/user/User.java b/model/src/main/java/cn/bunny/entity/system/user/User.java new file mode 100644 index 0000000..33c086d --- /dev/null +++ b/model/src/main/java/cn/bunny/entity/system/user/User.java @@ -0,0 +1,61 @@ +package cn.bunny.entity.system.user; + +import cn.bunny.entity.base.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 用户信息 + *

+ * + * @author Bunny + * @since 2024-05-17 + */ +@EqualsAndHashCode(callSuper = true) +@Data +@Accessors(chain = true) +@ApiModel(value = "User对象", description = "用户信息") +public class User extends BaseEntity implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + @ApiModelProperty("昵称") + private String nickName; + @ApiModelProperty("邮箱") + private String email; + @ApiModelProperty("密码") + private String password; + @ApiModelProperty("头像") + private String avatar; + @ApiModelProperty("0:女 1:男") + private Byte sex; + @ApiModelProperty("个人描述") + private String personDescription; + @ApiModelProperty("加入时间") + private LocalDateTime joinTime; + + @ApiModelProperty("最后登录时间") + private LocalDateTime lastLoginTime; + + @ApiModelProperty("最后登录IP") + private String lastLoginIp; + + @ApiModelProperty("最后登录ip地址") + private String lastLoginIpAddress; + + @ApiModelProperty("积分") + private Integer totalIntegral; + + @ApiModelProperty("当前积分") + private Integer currentIntegral; + + @ApiModelProperty("0:禁用 1:正常") + private Byte status; +} diff --git a/model/src/main/java/cn/bunny/entity/system/user/UserMessage.java b/model/src/main/java/cn/bunny/entity/system/user/UserMessage.java new file mode 100644 index 0000000..faa6cdf --- /dev/null +++ b/model/src/main/java/cn/bunny/entity/system/user/UserMessage.java @@ -0,0 +1,58 @@ +package cn.bunny.entity.system.user; + +import cn.bunny.entity.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.io.Serial; +import java.io.Serializable; + +/** + *

+ * 用户消息 + *

+ * + * @author Bunny + * @since 2024-05-17 + */ +@Getter +@Setter +@Accessors(chain = true) +@TableName("user_message") +@ApiModel(value = "UserMessage对象", description = "用户消息") +public class UserMessage extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ApiModelProperty("接收人用户ID") + private Long receivedUserId; + + @ApiModelProperty("文章ID") + private String articleId; + + @ApiModelProperty("文章标题") + private String articleTitle; + + @ApiModelProperty("评论ID") + private Integer commentId; + + @ApiModelProperty("发送人用户ID") + private Long sendUserId; + + @ApiModelProperty("发送人昵称") + private String sendNickName; + + @ApiModelProperty("sys:系统消息 reply:评论 likePost:文章点赞 likeComment:评论点赞 attachment:附件下载") + private String messageType; + + @ApiModelProperty("消息内容") + private String messageContent; + + @ApiModelProperty("1:未读 2:已读") + private Byte status; +} diff --git a/model/src/main/java/cn/bunny/enums/ResultCodeEnum.java b/model/src/main/java/cn/bunny/enums/ResultCodeEnum.java deleted file mode 100644 index 009f0c0..0000000 --- a/model/src/main/java/cn/bunny/enums/ResultCodeEnum.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.bunny.enums; - -import lombok.Getter; - -/** - * 统一返回结果状态信息类 - */ -@Getter -public enum ResultCodeEnum { - SUCCESS(200, "操作成功"), - SUCCESS_LOGOUT(200, "退出成功"), - FAIL(201, "失败"), - SERVICE_ERROR(2012, "服务异常"), - DATA_ERROR(204, "数据异常"), - LOGIN_MOBLE_ERROR(204, "登录错误"), - ILLEGAL_REQUEST(205, "非法请求"), - REPEAT_SUBMIT(206, "重复提交"), - - LOGIN_AUTH(208, "未登陆"), - PERMISSION(209, "没有权限"), - - URL_ENCODE_ERROR(216, "URL编码失败"), - ILLEGAL_CALLBACK_REQUEST_ERROR(217, "非法回调请求"), - FETCH_ACCESSTOKEN_FAILD(218, "获取accessToken失败"), - FETCH_USERINFO_ERROR(219, "获取用户信息失败"), - - - FAIL_REQUEST_NOT_AUTH(403, "用户未认证"), - FAIL_NO_ACCESS_DENIED(403, "无权访问"), - LOGGED_IN_FROM_ANOTHER_DEVICE(403, "没有权限访问"), - THE_SAME_USER_HAS_LOGGED_IN(403, "相同用户已登录"), - SESSION_EXPIRATION(403, "会话过期"); - - - private final Integer code; - - private final String message; - - ResultCodeEnum(Integer code, String message) { - this.code = code; - this.message = message; - } -} \ No newline at end of file diff --git a/common/common-utils/src/main/java/cn/bunny/common/result/Result.java b/model/src/main/java/cn/bunny/result/Result.java similarity index 96% rename from common/common-utils/src/main/java/cn/bunny/common/result/Result.java rename to model/src/main/java/cn/bunny/result/Result.java index 2b0bcd7..6484684 100644 --- a/common/common-utils/src/main/java/cn/bunny/common/result/Result.java +++ b/model/src/main/java/cn/bunny/result/Result.java @@ -1,6 +1,5 @@ -package cn.bunny.common.result; +package cn.bunny.result; -import cn.bunny.enums.ResultCodeEnum; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -64,7 +63,7 @@ public class Result { * @return Result */ public static Result success() { - return Result.success(null, ResultCodeEnum.SUCCESS); + return success(null, ResultCodeEnum.SUCCESS); } /** diff --git a/model/src/main/java/cn/bunny/result/ResultCodeEnum.java b/model/src/main/java/cn/bunny/result/ResultCodeEnum.java new file mode 100644 index 0000000..d391b55 --- /dev/null +++ b/model/src/main/java/cn/bunny/result/ResultCodeEnum.java @@ -0,0 +1,54 @@ +package cn.bunny.result; + +import lombok.Getter; + +/** + * 统一返回结果状态信息类 + */ +@Getter +public enum ResultCodeEnum { + // 成功操作 200 + SUCCESS(200, "操作成功"), + SUCCESS_LOGOUT(200, "退出成功"), + EMAIL_CODE_REFRESH(200, "邮箱验证码已刷新"), + // 验证错误 201 + USERNAME_NOT_EMPTY(201, "用户名不能为空"), + PASSWORD_NOT_EMPTY(201, "密码不能为空"), + EMAIL_CODE_NOT_EMPTY(201, "邮箱验证码不能为空"), + SEND_EMAIL_CODE_NOT_EMPTY(201, "请先发送邮箱验证码"), + EMAIL_CODE_NOT_MATCHING(201, "邮箱验证码不匹配"), + LOGIN_ERROR(201, "账号或密码错误"), + LOGIN_ERROR_USERNAME_PASSWORD_NOT_EMPTY(201, "登录信息不能为空"), + // 数据相关 206 + ILLEGAL_REQUEST(206, "非法请求"), + REPEAT_SUBMIT(206, "重复提交"), + DATA_ERROR(206, "数据异常"), + // 身份过期 208 + LOGIN_AUTH(208, "请先登陆"), + AUTHENTICATION_EXPIRED(208, "身份验证过期"), + SESSION_EXPIRATION(208, "会话过期"), + // 封禁 209 + FAIL_NO_ACCESS_DENIED_USER_LOCKED(209, "该账户被封禁"), + THE_SAME_USER_HAS_LOGGED_IN(209, "相同用户已登录"), + // 提示错误 + URL_ENCODE_ERROR(216, "URL编码失败"), + ILLEGAL_CALLBACK_REQUEST_ERROR(217, "非法回调请求"), + FETCH_USERINFO_ERROR(219, "获取用户信息失败"), + // 无权访问 403 + FAIL_REQUEST_NOT_AUTH(403, "用户未认证"), + FAIL_NO_ACCESS_DENIED(403, "无权访问"), + FAIL_NO_ACCESS_DENIED_USER_OFFLINE(403, "用户强制下线"), + LOGGED_IN_FROM_ANOTHER_DEVICE(403, "没有权限访问"), + // 系统错误 500 + SERVICE_ERROR(500, "服务异常"), + FAIL(500, "失败"), + ; + + private final Integer code; + private final String message; + + ResultCodeEnum(Integer code, String message) { + this.code = code; + this.message = message; + } +} \ No newline at end of file diff --git a/model/src/main/java/cn/bunny/result/constant/ExceptionConstant.java b/model/src/main/java/cn/bunny/result/constant/ExceptionConstant.java new file mode 100644 index 0000000..7662b0e --- /dev/null +++ b/model/src/main/java/cn/bunny/result/constant/ExceptionConstant.java @@ -0,0 +1,52 @@ +package cn.bunny.result.constant; + +import lombok.Data; + + +@Data +public class ExceptionConstant { + public static final String UNKNOWN_Exception = "未知错误"; + public static final String TOKEN_IS_EMPTY = "token为空"; + public static final String DATA_IS_EMPTY = "数据为空"; + public static final String REQUEST_DATA_NOT_EMPTY_Exception = "请求参数为空"; + public static final String UPDATE_DTO_IS_NULL_Exception = "修改参数为空"; + public static final String ADD_DATA_IS_EMPTY_Exception = "添加数据为空"; + public static final String DELETE_ID_IS_NOT_EMPTY_Exception = "删除id不能为空"; + // 文章操作相关 + public static final String DO_LIKE_COMMENT_NOT_EXIST = "点赞内容不存在"; + public static final String REPLY_USER_EMPTY_EXCEPTION = "回复的用户不存在"; + public static final String REPLY_USER_ID_EMPTY_EXCEPTION = "回复的用户不能为空"; + public static final String MENU_IS_NOT_EXIST_Exception = "菜单不存在"; + public static final String POST_COMMENT_EMPTY_Exception = "评论内容不能为空"; + public static final String ARTICLE_ID_NOT_EMPTY_Exception = "文章id不能为空"; + public static final String UPDATE_ID_IS_NOT_EMPTY_Exception = "修改id不能为空"; + public static final String CANNOT_TOP_OTHER_USER = "不能操作此内容"; + public static final String ARTICLE_NOT_FOUND_EXCEPTION = "文章未找到"; + // 登录相关 + public static final String USER_TOKEN_OUT_OF_DATE_Exception = "用户登录过期"; + public static final String LOGIN_DTO_IS_EMPTY_Exception = "登录参数不能为空"; + public static final String LOGIN_FAILED_Exception = "登录失败"; + // 账号相关 + public static final String ACCOUNT_NOT_FOUND_Exception = "账号不存在"; + public static final String ACCOUNT_LOCKED_Exception = "账号被锁定"; + // 用户相关 + public static final String USER_NOT_LOGIN_Exception = "用户未登录"; + public static final String USERNAME_IS_EMPTY_Exception = "用户名不能为空"; + public static final String ALREADY_USER_Exception = "用户已存在"; + public static final String USER_NOT_FOUND_Exception = "用户不存在"; + // 密码相关 + public static final String PASSWORD_Exception = "密码错误"; + public static final String PASSWORD_NOT_EMPTY_Exception = "密码不能为空"; + public static final String OLD_PASSWORD_Exception = "旧密码不匹配"; + public static final String PASSWORD_EDIT_Exception = "密码修改失败"; + public static final String OLD_PASSWORD_SAME_NEW_PASSWORD_Exception = "旧密码与新密码相同"; + // 验证码错误 + public static final String PLEASE_SEND_EMAIL_CODE_Exception = "请先发送验证码"; + public static final String MESSAGE_CODE_NOT_PASS_Exception = "短信验证码未过期"; + public static final String MESSAGE_CODE_UNAUTHORIZED_Exception = "短信验证码未授权,请联系管理员"; + public static final String VERIFICATION_CODE_ERROR_Exception = "验证码错误"; + public static final String CAPTCHA_IS_EMPTY_Exception = "验证码不能为空"; + public static final String KEY_IS_EMPTY_Exception = "验证码key不能为空"; + public static final String VERIFICATION_CODE_DOES_NOT_MATCH_Exception = "验证码不匹配"; + public static final String VERIFICATION_CODE_IS_EMPTY_Exception = "验证码失效或不存在"; +} diff --git a/common/common-utils/src/main/java/cn/bunny/common/constant/MinioMessageConstant.java b/model/src/main/java/cn/bunny/result/constant/FileMessageConstant.java similarity index 76% rename from common/common-utils/src/main/java/cn/bunny/common/constant/MinioMessageConstant.java rename to model/src/main/java/cn/bunny/result/constant/FileMessageConstant.java index b36a35e..db799c7 100644 --- a/common/common-utils/src/main/java/cn/bunny/common/constant/MinioMessageConstant.java +++ b/model/src/main/java/cn/bunny/result/constant/FileMessageConstant.java @@ -1,11 +1,15 @@ -package cn.bunny.common.constant; +package cn.bunny.result.constant; import lombok.Data; @Data -public class MinioMessageConstant { +public class FileMessageConstant { + public static final String DOWNLOAD_BUCKET_EXCEPTION = "下载文件失败"; + public static final String FILE_UPLOAD_EXCEPTION = "文件上传失败"; public static final String BUCKET_EXISTS_EXCEPTION = "查询文化部对象失败"; public static final String DELETE_BUCKET_EXCEPTION = "删除文件对象失败"; + public static final String FILE_IS_EMPTY = "文件信息为空"; + public static final String FILE_IS_NOT_EXITS = "文件信息为空"; public static final String GET_BUCKET_EXCEPTION = "获取文件信息失败"; public static final String QUERY_BUCKET_EXCEPTION = "查询文件信息失败"; public static final String CREATE_BUCKET_EXCEPTION = "创建文件对象失败"; @@ -14,6 +18,4 @@ public class MinioMessageConstant { public static final String COPY_BUCKET_EXCEPTION = "复制文件内容失败"; public static final String DISABLE_BUCKET_EXCEPTION = "禁用文件失败"; public static final String ENABLE_BUCKET_EXCEPTION = "启用文件失败"; - public static final String DOWNLOAD_BUCKET_EXCEPTION = "下载文件失败"; - public static final String UPLOAD_BUCKET_EXCEPTION = "上传文件失败"; } diff --git a/common/common-utils/src/main/java/cn/bunny/common/constant/LocalDateTimeConstant.java b/model/src/main/java/cn/bunny/result/constant/LocalDateTimeConstant.java similarity index 91% rename from common/common-utils/src/main/java/cn/bunny/common/constant/LocalDateTimeConstant.java rename to model/src/main/java/cn/bunny/result/constant/LocalDateTimeConstant.java index 1494b3c..b0c4d40 100644 --- a/common/common-utils/src/main/java/cn/bunny/common/constant/LocalDateTimeConstant.java +++ b/model/src/main/java/cn/bunny/result/constant/LocalDateTimeConstant.java @@ -1,4 +1,4 @@ -package cn.bunny.common.constant; +package cn.bunny.result.constant; import lombok.Data; diff --git a/common/common-utils/src/main/java/cn/bunny/common/constant/MailMessageConstant.java b/model/src/main/java/cn/bunny/result/constant/MailMessageConstant.java similarity index 77% rename from common/common-utils/src/main/java/cn/bunny/common/constant/MailMessageConstant.java rename to model/src/main/java/cn/bunny/result/constant/MailMessageConstant.java index 458ef48..c2410ac 100644 --- a/common/common-utils/src/main/java/cn/bunny/common/constant/MailMessageConstant.java +++ b/model/src/main/java/cn/bunny/result/constant/MailMessageConstant.java @@ -1,4 +1,4 @@ -package cn.bunny.common.constant; +package cn.bunny.result.constant; import lombok.Data; @@ -11,4 +11,5 @@ public class MailMessageConstant { public static final String ADDRESS_NOT_NULL = "收件人不能为空"; public static final String TITLE_NOT_NULL = "标题不能为空"; public static final String SEND_MESSAGE_NOT_NULL = "发送消息不能为空"; + public static final String EMAIL_CONFIG_NOT_FOUND = "邮箱配置为空"; } diff --git a/model/src/main/java/cn/bunny/result/constant/RedisUserConstant.java b/model/src/main/java/cn/bunny/result/constant/RedisUserConstant.java new file mode 100644 index 0000000..9772191 --- /dev/null +++ b/model/src/main/java/cn/bunny/result/constant/RedisUserConstant.java @@ -0,0 +1,67 @@ +package cn.bunny.result.constant; + +import lombok.Data; + +/** + * Redis用户前缀设置 + */ +@Data +public class RedisUserConstant { + // 管理员用户 + public static final String ADMIN_LOGIN_INFO_PREFIX = "ADMIN::LOGIN_INFO::"; + public static final String ADMIN_EMAIL_CODE_PREFIX = "ADMIN::EMAIL_CODE::"; + // 普通用户 + public static final String USER_LOGIN_INFO_PREFIX = "USER::LOGIN_INFO::"; + public static final String USER_EMAIL_CODE_PREFIX = "USER::EMAIL_CODE::"; + public static final String USER_DO_LIKE_PREFIX = "USER::doLike::"; + + /** + * * 管理员用户登录信息 + * + * @param adminUser 管理员用户 + * @return 登录信息key + */ + public static String getAdminLoginInfoPrefix(String adminUser) { + return ADMIN_LOGIN_INFO_PREFIX + adminUser; + } + + /** + * * 管理员用户邮箱验证码 + * + * @param adminUser 管理员用户 + * @return 管理员用户邮箱验证码key + */ + public static String getAdminUserEmailCodePrefix(String adminUser) { + return ADMIN_EMAIL_CODE_PREFIX + adminUser; + } + + /** + * * 用户登录信息 + * + * @param user 用户名 + * @return 登录信息key + */ + public static String getUserLoginInfoPrefix(String user) { + return USER_LOGIN_INFO_PREFIX + user; + } + + /** + * * 用户邮箱验证码 + * + * @param user 用户名 + * @return 用户邮箱验证码key + */ + public static String getUserEmailCodePrefix(String user) { + return USER_EMAIL_CODE_PREFIX + user; + } + + /** + * * 用户点赞操作 + * + * @param user 用户名 + * @return 用户点赞key + */ + public static String getUserDoLikePrefix(String user) { + return USER_DO_LIKE_PREFIX + user; + } +} diff --git a/common/common-utils/src/main/java/cn/bunny/common/constant/SQLAutoFillConstant.java b/model/src/main/java/cn/bunny/result/constant/SQLAutoFillConstant.java similarity index 91% rename from common/common-utils/src/main/java/cn/bunny/common/constant/SQLAutoFillConstant.java rename to model/src/main/java/cn/bunny/result/constant/SQLAutoFillConstant.java index b9b6205..6b09482 100644 --- a/common/common-utils/src/main/java/cn/bunny/common/constant/SQLAutoFillConstant.java +++ b/model/src/main/java/cn/bunny/result/constant/SQLAutoFillConstant.java @@ -1,4 +1,4 @@ -package cn.bunny.common.constant; +package cn.bunny.result.constant; import lombok.Data; diff --git a/common/common-utils/src/main/java/cn/bunny/common/constant/SecurityConstant.java b/model/src/main/java/cn/bunny/result/constant/SecurityConstant.java similarity index 52% rename from common/common-utils/src/main/java/cn/bunny/common/constant/SecurityConstant.java rename to model/src/main/java/cn/bunny/result/constant/SecurityConstant.java index da71e65..a26c0b4 100644 --- a/common/common-utils/src/main/java/cn/bunny/common/constant/SecurityConstant.java +++ b/model/src/main/java/cn/bunny/result/constant/SecurityConstant.java @@ -1,4 +1,4 @@ -package cn.bunny.common.constant; +package cn.bunny.result.constant; import lombok.Data; @@ -7,6 +7,7 @@ import java.util.List; @Data public class SecurityConstant { - public static String[] annotations = {"/", "/test/**", "/diagram-viewer/**", "/editor-app/**", "/*.html", "/admin/system/index/login", "/favicon.ico", "/swagger-resources/**", "/webjars/**", "/v3/**", "/swagger-ui.html/**", "/doc.html"}; + public static String[] annotations = {"/", "/test/**", "/diagram-viewer/**", "/editor-app/**", "/*.html", + "/*/*/noAuth/**", "/*/noAuth/**", "/favicon.ico", "/swagger-resources/**", "/webjars/**", "/v3/**", "/swagger-ui.html/**", "/doc.html"}; public static List annotationsList = Arrays.asList(annotations); } diff --git a/common/common-utils/src/main/java/cn/bunny/common/constant/StatusConstant.java b/model/src/main/java/cn/bunny/result/constant/StatusConstant.java similarity index 87% rename from common/common-utils/src/main/java/cn/bunny/common/constant/StatusConstant.java rename to model/src/main/java/cn/bunny/result/constant/StatusConstant.java index d91412f..c530625 100644 --- a/common/common-utils/src/main/java/cn/bunny/common/constant/StatusConstant.java +++ b/model/src/main/java/cn/bunny/result/constant/StatusConstant.java @@ -1,4 +1,4 @@ -package cn.bunny.common.constant; +package cn.bunny.result.constant; import lombok.Data; diff --git a/common/common-utils/src/main/java/cn/bunny/common/constant/UserConstant.java b/model/src/main/java/cn/bunny/result/constant/UserConstant.java similarity index 87% rename from common/common-utils/src/main/java/cn/bunny/common/constant/UserConstant.java rename to model/src/main/java/cn/bunny/result/constant/UserConstant.java index 8d2ee23..d9f4832 100644 --- a/common/common-utils/src/main/java/cn/bunny/common/constant/UserConstant.java +++ b/model/src/main/java/cn/bunny/result/constant/UserConstant.java @@ -1,4 +1,4 @@ -package cn.bunny.common.constant; +package cn.bunny.result.constant; import lombok.Data; diff --git a/model/src/main/java/cn/bunny/tree/AbstractTreeNode.java b/model/src/main/java/cn/bunny/tree/AbstractTreeNode.java new file mode 100644 index 0000000..d5e7770 --- /dev/null +++ b/model/src/main/java/cn/bunny/tree/AbstractTreeNode.java @@ -0,0 +1,11 @@ +package cn.bunny.tree; + +import java.util.List; + +public interface AbstractTreeNode { + Long getId(); + + Long getParentId(); + + void setChildren(List children); +} diff --git a/model/src/main/java/cn/bunny/tree/TreeBuilder.java b/model/src/main/java/cn/bunny/tree/TreeBuilder.java new file mode 100644 index 0000000..f85d419 --- /dev/null +++ b/model/src/main/java/cn/bunny/tree/TreeBuilder.java @@ -0,0 +1,29 @@ +package cn.bunny.tree; + +import java.util.ArrayList; +import java.util.List; + +public class TreeBuilder { + + public List buildTree(List nodeList) { + List tree = new ArrayList<>(); + for (T node : nodeList) { + if (node.getParentId() == 0) { + node.setChildren(getChildren(node.getId(), nodeList)); + tree.add(node); + } + } + return tree; + } + + private List getChildren(Long nodeId, List nodeList) { + List children = new ArrayList<>(); + for (T node : nodeList) { + if (node.getParentId().equals(nodeId)) { + node.setChildren(getChildren(node.getId(), nodeList)); + children.add(node); + } + } + return children; + } +} diff --git a/model/src/main/java/cn/bunny/vo/email/EmailTemplateVo.java b/model/src/main/java/cn/bunny/vo/email/EmailTemplateVo.java new file mode 100644 index 0000000..8cc34d0 --- /dev/null +++ b/model/src/main/java/cn/bunny/vo/email/EmailTemplateVo.java @@ -0,0 +1,19 @@ +package cn.bunny.vo.email; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class EmailTemplateVo { + // 模板名称 + private String templateName; + // 主题 + private String subject; + // 邮件内容 + private String body; +} \ No newline at end of file diff --git a/model/src/main/java/cn/bunny/vo/file/FileInfoVo.java b/model/src/main/java/cn/bunny/vo/file/FileInfoVo.java new file mode 100644 index 0000000..349ccb1 --- /dev/null +++ b/model/src/main/java/cn/bunny/vo/file/FileInfoVo.java @@ -0,0 +1,32 @@ +package cn.bunny.vo.file; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 返回文件信息 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class FileInfoVo { + private Long id; + // 文章Id + private Long articleId; + // 文件的名称 + private String filename; + // 文件在服务器上的存储路径 + private String filepath; + // 文件的大小,以字节为单位 + private Long fileSize; + // 文件大小 + private String size; + // 文件的MIME类型 + private String fileType; + // 上传人昵称 + private String uploadNickname; + private Integer downloadCount; +} diff --git a/model/src/main/java/cn/bunny/vo/page/PageResult.java b/model/src/main/java/cn/bunny/vo/page/PageResult.java new file mode 100644 index 0000000..feb66b2 --- /dev/null +++ b/model/src/main/java/cn/bunny/vo/page/PageResult.java @@ -0,0 +1,27 @@ +package cn.bunny.vo.page; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 封装分页查询结果 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class PageResult implements Serializable { + // 当前页 + private Integer pageNo; + // 每页记录数 + private Integer pageSize; + // 总记录数 + private long total; + // 当前页数据集合 + private List list; +} \ No newline at end of file diff --git a/model/src/main/java/cn/bunny/vo/system/MetaVo.java b/model/src/main/java/cn/bunny/vo/system/MetaVo.java deleted file mode 100644 index 9e9b567..0000000 --- a/model/src/main/java/cn/bunny/vo/system/MetaVo.java +++ /dev/null @@ -1,29 +0,0 @@ -package cn.bunny.vo.system; - -import lombok.Data; - -/** - * 路由显示信息 - */ -@Data -public class MetaVo { - /** - * 设置该路由在侧边栏和面包屑中展示的名字 - */ - private String title; - - /** - * 设置该路由的图标,对应路径src/assets/icons/svg - */ - private String icon; - - public MetaVo() { - } - - public MetaVo(String title, String icon) { - this.title = title; - this.icon = icon; - } - -} - diff --git a/model/src/main/java/cn/bunny/vo/system/RouterVo.java b/model/src/main/java/cn/bunny/vo/system/RouterVo.java deleted file mode 100644 index 97f63dc..0000000 --- a/model/src/main/java/cn/bunny/vo/system/RouterVo.java +++ /dev/null @@ -1,48 +0,0 @@ -package cn.bunny.vo.system; - -import lombok.Data; - -import java.util.List; - -/** - * 路由配置信息 - */ -@Data -public class RouterVo { - /** - * 路由名字 - */ - // private String name; - - /** - * 路由地址 - */ - private String path; - - /** - * 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现 - */ - private boolean hidden; - - /** - * 组件地址 - */ - private String component; - - /** - * 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 - */ - private Boolean alwaysShow; - - /** - * 其他元素 - */ - private MetaVo meta; - - /** - * 子路由 - */ - private List children; - - -} diff --git a/model/src/main/java/cn/bunny/vo/system/SysOperLogQueryVo.java b/model/src/main/java/cn/bunny/vo/system/SysOperLogQueryVo.java deleted file mode 100644 index ee61375..0000000 --- a/model/src/main/java/cn/bunny/vo/system/SysOperLogQueryVo.java +++ /dev/null @@ -1,15 +0,0 @@ -package cn.bunny.vo.system; - -import lombok.Data; - -@Data -public class SysOperLogQueryVo { - - private String title; - private String operName; - - private String createTimeBegin; - private String createTimeEnd; - -} - diff --git a/model/src/main/java/cn/bunny/vo/system/SysPostQueryVo.java b/model/src/main/java/cn/bunny/vo/system/SysPostQueryVo.java deleted file mode 100644 index d57396a..0000000 --- a/model/src/main/java/cn/bunny/vo/system/SysPostQueryVo.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.bunny.vo.system; - -import lombok.Data; - -@Data -public class SysPostQueryVo { - - //@ApiModelProperty(value = "岗位编码") - private String postCode; - - //@ApiModelProperty(value = "岗位名称") - private String name; - - //@ApiModelProperty(value = "状态(1正常 0停用)") - private Boolean status; - - -} - diff --git a/model/src/main/java/cn/bunny/vo/system/article/ForumArticleVo.java b/model/src/main/java/cn/bunny/vo/system/article/ForumArticleVo.java new file mode 100644 index 0000000..6caaf01 --- /dev/null +++ b/model/src/main/java/cn/bunny/vo/system/article/ForumArticleVo.java @@ -0,0 +1,70 @@ +package cn.bunny.vo.system.article; + +import cn.bunny.vo.file.FileInfoVo; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ForumArticleVo { + // 文章ID + private Long id; + // 板块ID + private Integer boardId; + // 父级板块ID + private Integer pBoardId; + // 板块名称 + private String boardName; + // 父板块名称 + private String pBoardName; + // 用户ID + private String userId; + // 昵称 + private String nickName; + // 最后登录ip地址 + private String userIpAddress; + // 标题 + private String title; + // 封面 + private String cover; + // 内容 + private String content; + // 0:富文本编辑器 1:markdown编辑器 + private Byte editorType; + // 摘要 + private String summary; + // 发布时间 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private String createTime; + // 最后更新时间 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private String updateTime; + // 阅读数量 + private Integer readCount; + // 点赞数 + private Integer goodCount; + // 评论数 + private Integer commentCount; + // 0未置顶 1:已置顶 + private Byte topType; + // 0:没有附件 1:有附件 + private Byte attachmentType; + // -1已删除 0:待审核 1:已审核 + private Byte status; + private List fileInfo; +} diff --git a/model/src/main/java/cn/bunny/vo/system/board/ForumBoardVo.java b/model/src/main/java/cn/bunny/vo/system/board/ForumBoardVo.java new file mode 100644 index 0000000..66c79e0 --- /dev/null +++ b/model/src/main/java/cn/bunny/vo/system/board/ForumBoardVo.java @@ -0,0 +1,29 @@ +package cn.bunny.vo.system.board; + +import cn.bunny.tree.AbstractTreeNode; +import lombok.Data; + +import java.util.List; + +@Data +public class ForumBoardVo implements AbstractTreeNode { + private Long id; + // 父级板块ID + private Long parentId; + // 板块名 + private String boardName; + // 封面 + private String cover; + // 描述 + private String boardDesc; + // 排序 + private Integer sort; + // 0:只允许管理员发帖 1:任何人可以发帖 + private Boolean postType; + private List children; + + @Override + public void setChildren(List children) { + this.children = (List) children; + } +} diff --git a/model/src/main/java/cn/bunny/vo/system/comment/CommentVo.java b/model/src/main/java/cn/bunny/vo/system/comment/CommentVo.java new file mode 100644 index 0000000..46585af --- /dev/null +++ b/model/src/main/java/cn/bunny/vo/system/comment/CommentVo.java @@ -0,0 +1,53 @@ +package cn.bunny.vo.system.comment; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class CommentVo { + // 评论ID + private Long id; + // 父级评论ID + private Integer pCommentId; + // 文章ID + private String articleId; + // 回复内容 + private String content; + // 图片 + private String imgPath; + // 用户ID + private Long userId; + // 昵称 + private String nickName; + // 用户ip地址 + private String userIpAddress; + // 回复人ID + private Long replyUserId; + // 回复人昵称 + private String replyNickName; + // 0:未置顶 1:置顶 + private Byte topType; + // 发布时间 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime postTime; + // good数量 + private Integer goodCount; + // 0:待审核 1:已审核 + private Byte status; + private List children; +} diff --git a/model/src/main/java/cn/bunny/vo/system/login/LoginVo.java b/model/src/main/java/cn/bunny/vo/system/login/LoginVo.java new file mode 100644 index 0000000..9bda0ae --- /dev/null +++ b/model/src/main/java/cn/bunny/vo/system/login/LoginVo.java @@ -0,0 +1,48 @@ +package cn.bunny.vo.system.login; + +import cn.bunny.result.constant.LocalDateTimeConstant; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 用户登录返回内容 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class LoginVo { + private Long id; + private String nickName; + private String email; + private String password; + private String avatar; + private Byte sex; + private String personDescription; + @JsonFormat(pattern = LocalDateTimeConstant.DEFAULT_DATE_TIME_SECOND_FORMAT) + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime joinTime; + @JsonFormat(pattern = LocalDateTimeConstant.DEFAULT_DATE_TIME_SECOND_FORMAT) + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime lastLoginTime; + private String lastLoginIp; + private String lastLoginIpAddress; + private Integer totalIntegral; + private Integer currentIntegral; + private Byte status; + private String token; + private List roleList; + private List powerList; +} diff --git a/model/src/main/java/cn/bunny/vo/system/login/ValidateCodeVo.java b/model/src/main/java/cn/bunny/vo/system/login/ValidateCodeVo.java new file mode 100644 index 0000000..21c7ae4 --- /dev/null +++ b/model/src/main/java/cn/bunny/vo/system/login/ValidateCodeVo.java @@ -0,0 +1,20 @@ +package cn.bunny.vo.system.login; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Schema(description = "验证码响应结果实体类") +public class ValidateCodeVo { + @Schema(description = "验证码key") + private String codeKey; // 验证码的key + + @Schema(description = "验证码value") + private String codeValue; // 图片验证码对应的字符串数据 +} \ No newline at end of file diff --git a/model/src/main/java/cn/bunny/vo/system/user/UserInfoVo.java b/model/src/main/java/cn/bunny/vo/system/user/UserInfoVo.java new file mode 100644 index 0000000..fa60a87 --- /dev/null +++ b/model/src/main/java/cn/bunny/vo/system/user/UserInfoVo.java @@ -0,0 +1,43 @@ +package cn.bunny.vo.system.user; + +import cn.bunny.result.constant.LocalDateTimeConstant; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +/** + * 获取用户信息返回参数 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class UserInfoVo { + private Long userId; + private String nickName; + private String email; + private String avatar; + private Byte sex; + private String personDescription; + @JsonFormat(pattern = LocalDateTimeConstant.DEFAULT_DATE_TIME_SECOND_FORMAT) + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime joinTime; + @JsonFormat(pattern = LocalDateTimeConstant.DEFAULT_DATE_TIME_SECOND_FORMAT) + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime lastLoginTime; + private String lastLoginIp; + private String lastLoginIpAddress; + private Integer totalIntegral; + private Integer currentIntegral; + private Byte status; +} diff --git a/model/src/main/java/cn/bunny/vo/system/user/UserIntegralRecordVo.java b/model/src/main/java/cn/bunny/vo/system/user/UserIntegralRecordVo.java new file mode 100644 index 0000000..9c33f60 --- /dev/null +++ b/model/src/main/java/cn/bunny/vo/system/user/UserIntegralRecordVo.java @@ -0,0 +1,33 @@ +package cn.bunny.vo.system.user; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class UserIntegralRecordVo { + // 记录ID + private Integer recordId; + // 用户ID + private String userId; + // 操作类型 + private Byte operType; + // 积分 + private Integer integral; + // 创建时间 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime createTime; +} diff --git a/model/src/main/java/cn/bunny/vo/system/user/UserMessageCountVo.java b/model/src/main/java/cn/bunny/vo/system/user/UserMessageCountVo.java new file mode 100644 index 0000000..f0baa0c --- /dev/null +++ b/model/src/main/java/cn/bunny/vo/system/user/UserMessageCountVo.java @@ -0,0 +1,19 @@ +package cn.bunny.vo.system.user; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class UserMessageCountVo { + private Integer total; + private Integer sys; + private Integer reply; + private Integer likePost; + private Integer likeComment; +} diff --git a/model/src/main/java/cn/bunny/vo/system/user/UserMessageVo.java b/model/src/main/java/cn/bunny/vo/system/user/UserMessageVo.java new file mode 100644 index 0000000..44c5da9 --- /dev/null +++ b/model/src/main/java/cn/bunny/vo/system/user/UserMessageVo.java @@ -0,0 +1,43 @@ +package cn.bunny.vo.system.user; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class UserMessageVo { + // 自增ID + private Integer messageId; + // 接收人用户ID + private String receivedUserId; + // 文章ID + private String articleId; + // 文章标题 + private String articleTitle; + // 评论ID + private Integer commentId; + // 发送人用户ID + private String sendUserId; + // 发送人昵称 + private String sendNickName; + // sys:系统消息 reply:评论 likePost:文章点赞 likeComment:评论点赞 attachment:附件下载 + private String messageType; + // 消息内容 + private String messageContent; + // 创建时间 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime createTime; +} diff --git a/module/module-mail/pom.xml b/module/module-mail/pom.xml index d8f5634..90242e5 100644 --- a/module/module-mail/pom.xml +++ b/module/module-mail/pom.xml @@ -18,11 +18,6 @@ - - cn.bunny - service-utils - 0.0.1-SNAPSHOT - org.springframework.boot spring-boot-starter-mail diff --git a/module/module-mail/src/main/java/cn/bunny/module/mail/utils/MailSendCheckUtil.java b/module/module-mail/src/main/java/cn/bunny/module/mail/utils/MailSendCheckUtil.java index 6ac37b5..6829253 100644 --- a/module/module-mail/src/main/java/cn/bunny/module/mail/utils/MailSendCheckUtil.java +++ b/module/module-mail/src/main/java/cn/bunny/module/mail/utils/MailSendCheckUtil.java @@ -1,8 +1,8 @@ package cn.bunny.module.mail.utils; -import cn.bunny.common.constant.MailMessageConstant; import cn.bunny.common.service.utils.EmptyUtil; -import cn.bunny.entity.email.EmailSend; +import cn.bunny.entity.system.email.EmailSend; +import cn.bunny.result.constant.MailMessageConstant; public class MailSendCheckUtil { /** diff --git a/module/module-mail/src/main/java/cn/bunny/module/mail/utils/MailSenderUtil.java b/module/module-mail/src/main/java/cn/bunny/module/mail/utils/MailSenderUtil.java index 130c79e..0975c97 100644 --- a/module/module-mail/src/main/java/cn/bunny/module/mail/utils/MailSenderUtil.java +++ b/module/module-mail/src/main/java/cn/bunny/module/mail/utils/MailSenderUtil.java @@ -1,7 +1,7 @@ package cn.bunny.module.mail.utils; -import cn.bunny.entity.email.EmailSend; -import cn.bunny.entity.email.EmailSendInit; +import cn.bunny.entity.system.email.EmailSend; +import cn.bunny.entity.system.email.EmailSendInit; import jakarta.mail.MessagingException; import jakarta.mail.internet.MimeMessage; import org.springframework.mail.SimpleMailMessage; @@ -63,7 +63,7 @@ public class MailSenderUtil { // 发送邮件 javaMailSender.send(message); } - + /** * 发送邮件-简单 * diff --git a/module/module-minio/pom.xml b/module/module-minio/pom.xml index 8e812f7..cdc48fe 100644 --- a/module/module-minio/pom.xml +++ b/module/module-minio/pom.xml @@ -18,11 +18,6 @@ - - cn.bunny - service-utils - 0.0.1-SNAPSHOT - io.minio diff --git a/module/module-minio/src/main/java/cn/bunny/module/minio/utils/MinioUtil.java b/module/module-minio/src/main/java/cn/bunny/module/minio/utils/MinioUtil.java index 41eb90f..8fc332d 100644 --- a/module/module-minio/src/main/java/cn/bunny/module/minio/utils/MinioUtil.java +++ b/module/module-minio/src/main/java/cn/bunny/module/minio/utils/MinioUtil.java @@ -1,6 +1,6 @@ package cn.bunny.module.minio.utils; -import cn.bunny.common.constant.MinioMessageConstant; +import cn.bunny.result.constant.FileMessageConstant; import cn.bunny.common.service.exception.BunnyException; import io.minio.*; import io.minio.messages.*; @@ -37,7 +37,7 @@ public class MinioUtil { log.error("判断桶是否存在 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); } - throw new BunnyException(MinioMessageConstant.BUCKET_EXISTS_EXCEPTION); + throw new BunnyException(FileMessageConstant.BUCKET_EXISTS_EXCEPTION); } /** @@ -53,7 +53,7 @@ public class MinioUtil { log.error("删除桶的加密配置 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); } - throw new BunnyException(MinioMessageConstant.DELETE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); } /** @@ -68,7 +68,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("删除桶的生命周期配置 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.DELETE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); } } @@ -84,7 +84,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("删除桶的加密配置 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.DELETE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); } } @@ -100,7 +100,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("删除桶的加密配置 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.DELETE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); } } @@ -116,7 +116,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("删除桶的桶复制配置 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.DELETE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); } } @@ -132,7 +132,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("删除桶的桶复制配置 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.DELETE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); } } @@ -148,7 +148,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("删除桶中的对象锁配置 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.DELETE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); } } @@ -167,7 +167,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("获取存储桶的加密配置 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.GET_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); } return conf; @@ -187,7 +187,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("获取存储桶的生命周期配置 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.GET_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); } return lifecycle; @@ -208,7 +208,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("获取存储桶的通知配置 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.GET_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); } return configuration; @@ -229,7 +229,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("获取桶的桶策略配置 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.GET_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); } return config; @@ -250,7 +250,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("获取桶复制参数 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.GET_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); } return configuration; @@ -271,7 +271,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("获取存储桶的标签 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.GET_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); } return tags; } @@ -291,7 +291,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("获取存储桶的版本控制配置 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.GET_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); } return configuration; @@ -311,7 +311,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("获取存储桶中的对象锁配置 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.GET_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); } return configuration; @@ -331,7 +331,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("列出所有桶的桶信息 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.QUERY_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.QUERY_BUCKET_EXCEPTION); } return buckets; @@ -349,7 +349,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("创建桶 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.CREATE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.CREATE_BUCKET_EXCEPTION); } } @@ -365,7 +365,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("创建桶 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.CREATE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.CREATE_BUCKET_EXCEPTION); } } @@ -381,7 +381,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("创建桶 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.CREATE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.CREATE_BUCKET_EXCEPTION); } } @@ -397,7 +397,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("删除桶 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.DELETE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); } } @@ -414,7 +414,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("设置桶的加密配置 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.UPDATE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.UPDATE_BUCKET_EXCEPTION); } } @@ -431,7 +431,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("查看桶策略 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.UPDATE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.UPDATE_BUCKET_EXCEPTION); } } @@ -449,7 +449,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("设置桶复制参数 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.UPDATE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.UPDATE_BUCKET_EXCEPTION); } } @@ -466,7 +466,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("设置/修改桶标签 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.UPDATE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.UPDATE_BUCKET_EXCEPTION); } } @@ -484,7 +484,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("设置桶的版本配置 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.UPDATE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.UPDATE_BUCKET_EXCEPTION); } } @@ -501,7 +501,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("对象对象锁定配置 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.UPDATE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.UPDATE_BUCKET_EXCEPTION); } } @@ -519,7 +519,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("组合对象 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.COMPOSE_OBJECT_EXCEPTION); + throw new BunnyException(FileMessageConstant.COMPOSE_OBJECT_EXCEPTION); } } @@ -542,7 +542,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("组合对象 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.COMPOSE_OBJECT_EXCEPTION); + throw new BunnyException(FileMessageConstant.COMPOSE_OBJECT_EXCEPTION); } } @@ -567,7 +567,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("组合对象 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.COMPOSE_OBJECT_EXCEPTION); + throw new BunnyException(FileMessageConstant.COMPOSE_OBJECT_EXCEPTION); } } @@ -590,7 +590,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("复制另一个桶中文件 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.COPY_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.COPY_BUCKET_EXCEPTION); } } @@ -615,7 +615,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("复制另一个桶中文件 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.COPY_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.COPY_BUCKET_EXCEPTION); } } @@ -641,7 +641,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("复制另一个桶中文件 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.COPY_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.COPY_BUCKET_EXCEPTION); } } @@ -658,7 +658,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("删除对象的标记 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.DELETE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); } } @@ -675,7 +675,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("禁用对象 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.DISABLE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.DISABLE_BUCKET_EXCEPTION); } } @@ -692,7 +692,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("禁用对象 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.ENABLE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.ENABLE_BUCKET_EXCEPTION); } } @@ -710,7 +710,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("获取文件 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.GET_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); } } @@ -728,7 +728,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("下载文件 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.DOWNLOAD_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.DOWNLOAD_BUCKET_EXCEPTION); } } @@ -747,7 +747,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("下载文件 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.DOWNLOAD_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.DOWNLOAD_BUCKET_EXCEPTION); } } @@ -767,7 +767,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("获取对象保留 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.DOWNLOAD_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.DOWNLOAD_BUCKET_EXCEPTION); } } @@ -786,7 +786,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("获取对象标签 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.GET_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.GET_BUCKET_EXCEPTION); } } @@ -805,7 +805,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("上传文件 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.UPLOAD_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.FILE_UPLOAD_EXCEPTION); } } @@ -825,7 +825,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("上传文件 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.UPLOAD_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.FILE_UPLOAD_EXCEPTION); } } @@ -848,7 +848,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("上传文件 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.UPLOAD_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.FILE_UPLOAD_EXCEPTION); } } @@ -865,7 +865,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("删除文件 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.DELETE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); } } @@ -883,7 +883,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("删除文件 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.DELETE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); } } @@ -901,7 +901,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("删除文件 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.DELETE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); } } @@ -918,7 +918,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("上传多文件 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.UPLOAD_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.FILE_UPLOAD_EXCEPTION); } } @@ -937,7 +937,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("删除文件 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.UPDATE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.UPDATE_BUCKET_EXCEPTION); } } @@ -955,7 +955,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("删除文件 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.UPDATE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.UPDATE_BUCKET_EXCEPTION); } } @@ -976,7 +976,7 @@ public class MinioUtil { } catch (Exception exception) { log.error("获取对象状态 ------ 失败消息:{}", exception.getLocalizedMessage()); exception.getStackTrace(); - throw new BunnyException(MinioMessageConstant.DELETE_BUCKET_EXCEPTION); + throw new BunnyException(FileMessageConstant.DELETE_BUCKET_EXCEPTION); } } } \ No newline at end of file diff --git a/common/spring-security/pom.xml b/module/module-websocket/pom.xml similarity index 70% rename from common/spring-security/pom.xml rename to module/module-websocket/pom.xml index bcaa7a1..e3b9b40 100644 --- a/common/spring-security/pom.xml +++ b/module/module-websocket/pom.xml @@ -3,14 +3,14 @@ 4.0.0 cn.bunny - common + module 0.0.1-SNAPSHOT - spring-security + module-websocket jar - spring-security + module-websocket https://maven.apache.org @@ -18,10 +18,10 @@ + - cn.bunny - service-utils - 0.0.1-SNAPSHOT + org.springframework.boot + spring-boot-starter-websocket diff --git a/service/src/main/java/cn/bunny/service/websocket/WebSocketServer.java b/module/module-websocket/src/main/java/cn/bunny/module/websocket/WebSocketServer.java similarity index 98% rename from service/src/main/java/cn/bunny/service/websocket/WebSocketServer.java rename to module/module-websocket/src/main/java/cn/bunny/module/websocket/WebSocketServer.java index d528711..2d84cc6 100644 --- a/service/src/main/java/cn/bunny/service/websocket/WebSocketServer.java +++ b/module/module-websocket/src/main/java/cn/bunny/module/websocket/WebSocketServer.java @@ -1,4 +1,4 @@ -package cn.bunny.service.websocket; +package cn.bunny.module.websocket; import jakarta.websocket.OnClose; import jakarta.websocket.OnMessage; diff --git a/module/module-websocket/src/main/java/cn/bunny/module/websocket/config/WebSocketConfiguration.java b/module/module-websocket/src/main/java/cn/bunny/module/websocket/config/WebSocketConfiguration.java new file mode 100644 index 0000000..8df905f --- /dev/null +++ b/module/module-websocket/src/main/java/cn/bunny/module/websocket/config/WebSocketConfiguration.java @@ -0,0 +1,13 @@ +package cn.bunny.module.websocket.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +@Configuration +public class WebSocketConfiguration { + @Bean + public ServerEndpointExporter endpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/module/pom.xml b/module/pom.xml index 262572d..ed2c5db 100644 --- a/module/pom.xml +++ b/module/pom.xml @@ -16,6 +16,7 @@ module-minio module-mail module-rabbitMQ + module-websocket @@ -25,7 +26,7 @@ cn.bunny - model + service-utils 0.0.1-SNAPSHOT diff --git a/module/spring-security/pom.xml b/module/spring-security/pom.xml new file mode 100644 index 0000000..070d1de --- /dev/null +++ b/module/spring-security/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + + cn.bunny + module + 0.0.1-SNAPSHOT + + + spring-security + jar + + spring-security + https://maven.apache.org + + + UTF-8 + + + + + + org.springframework.boot + spring-boot-starter-security + + + + org.springframework.security + spring-security-test + + + diff --git a/common/spring-security/src/main/java/cn/bunny/security/config/WebSecurityConfig.java b/module/spring-security/src/main/java/cn/bunny/security/config/WebSecurityConfig.java similarity index 78% rename from common/spring-security/src/main/java/cn/bunny/security/config/WebSecurityConfig.java rename to module/spring-security/src/main/java/cn/bunny/security/config/WebSecurityConfig.java index 33bc879..5899405 100644 --- a/common/spring-security/src/main/java/cn/bunny/security/config/WebSecurityConfig.java +++ b/module/spring-security/src/main/java/cn/bunny/security/config/WebSecurityConfig.java @@ -1,9 +1,8 @@ package cn.bunny.security.config; -import cn.bunny.common.constant.SecurityConstant; import cn.bunny.security.custom.CustomPasswordEncoder; import cn.bunny.security.filter.TokenAuthenticationFilter; -import cn.bunny.security.filter.TokenLoginFilter; +import cn.bunny.security.filter.TokenLoginFilterService; import cn.bunny.security.handelr.SecurityAccessDeniedHandler; import cn.bunny.security.handelr.SecurityAuthenticationEntryPoint; import cn.bunny.security.service.CustomAuthorizationManagerService; @@ -16,6 +15,7 @@ import org.springframework.security.config.annotation.authentication.configurati 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.core.session.SessionRegistry; import org.springframework.security.core.session.SessionRegistryImpl; @@ -27,16 +27,19 @@ import org.springframework.security.web.util.matcher.RegexRequestMatcher; @EnableWebSecurity @EnableMethodSecurity public class WebSecurityConfig { - @Autowired - AuthenticationConfiguration authenticationConfiguration; @Autowired private RedisTemplate redisTemplate; + // 自定义用户接口 @Autowired private CustomUserDetailsService customUserDetailsService; + // 自定义密码加密器 @Autowired private CustomPasswordEncoder customPasswordEncoder; + // 自定义验证码 @Autowired private CustomAuthorizationManagerService customAuthorizationManager; + @Autowired + private AuthenticationConfiguration authenticationConfiguration; @Bean public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { @@ -56,8 +59,6 @@ public class WebSecurityConfig { // 前后端分离不需要---记住我,e -> e.rememberMeParameter("rememberBunny").rememberMeCookieName("rememberBunny").key("BunnyKey") .rememberMe(AbstractHttpConfigurer::disable) .authorizeHttpRequests(authorize -> { - // 如果访问路径有下面的,不需要访问权限 - authorize.requestMatchers(SecurityConstant.annotations).permitAll(); // 有样式文件,不需要访问权限 authorize.requestMatchers(RegexRequestMatcher.regexMatcher("^\\S*[css|js]$")).permitAll(); // 上面都不是需要鉴权访问 @@ -69,9 +70,10 @@ public class WebSecurityConfig { // 没有权限访问 exception.accessDeniedHandler(new SecurityAccessDeniedHandler()); }) - // 自定义过滤器 - .addFilterBefore(new TokenAuthenticationFilter(redisTemplate), UsernamePasswordAuthenticationFilter.class) - .addFilterAt(new TokenLoginFilter(authenticationConfiguration, redisTemplate), UsernamePasswordAuthenticationFilter.class) + // 登录验证过滤器 + .addFilterBefore(new TokenLoginFilterService(authenticationConfiguration, redisTemplate, customUserDetailsService), UsernamePasswordAuthenticationFilter.class) + // 其它权限鉴权过滤器 + .addFilterAt(new TokenAuthenticationFilter(redisTemplate), UsernamePasswordAuthenticationFilter.class) // 自定义密码加密器和用户登录 .passwordManagement(customPasswordEncoder).userDetailsService(customUserDetailsService); @@ -82,4 +84,12 @@ public class WebSecurityConfig { public SessionRegistry sessionRegistry() { return new SessionRegistryImpl(); } + + // 排出鉴定路径 + @Bean + public WebSecurityCustomizer webSecurityCustomizer() { + String[] annotations = {"/", "/test/**", "/diagram-viewer/**", "/editor-app/**", "/*.html", + "/*/*/noAuth/**", "/*/noAuth/**", "/favicon.ico", "/swagger-resources/**", "/webjars/**", "/v3/**", "/swagger-ui.html/**", "/doc.html"}; + return web -> web.ignoring().requestMatchers(annotations); + } } diff --git a/common/spring-security/src/main/java/cn/bunny/security/custom/CustomPasswordEncoder.java b/module/spring-security/src/main/java/cn/bunny/security/custom/CustomPasswordEncoder.java similarity index 100% rename from common/spring-security/src/main/java/cn/bunny/security/custom/CustomPasswordEncoder.java rename to module/spring-security/src/main/java/cn/bunny/security/custom/CustomPasswordEncoder.java diff --git a/common/spring-security/src/main/java/cn/bunny/security/custom/CustomUser.java b/module/spring-security/src/main/java/cn/bunny/security/custom/CustomUser.java similarity index 54% rename from common/spring-security/src/main/java/cn/bunny/security/custom/CustomUser.java rename to module/spring-security/src/main/java/cn/bunny/security/custom/CustomUser.java index 1ec748f..296d5a1 100644 --- a/common/spring-security/src/main/java/cn/bunny/security/custom/CustomUser.java +++ b/module/spring-security/src/main/java/cn/bunny/security/custom/CustomUser.java @@ -1,6 +1,5 @@ package cn.bunny.security.custom; -import cn.bunny.entity.system.SysUser; import lombok.Getter; import lombok.Setter; import org.springframework.security.core.GrantedAuthority; @@ -14,10 +13,10 @@ import java.util.Collection; @Getter @Setter public class CustomUser extends User { - private SysUser sysUser; + private cn.bunny.entity.system.user.User user; - public CustomUser(SysUser sysUser, Collection authorities) { - super(sysUser.getUsername(), sysUser.getPassword(), authorities); - this.sysUser = sysUser; + public CustomUser(cn.bunny.entity.system.user.User user, Collection authorities) { + super(user.getEmail(), user.getPassword(), authorities); + this.user = user; } } \ No newline at end of file diff --git a/module/spring-security/src/main/java/cn/bunny/security/filter/TokenAuthenticationFilter.java b/module/spring-security/src/main/java/cn/bunny/security/filter/TokenAuthenticationFilter.java new file mode 100644 index 0000000..bea057b --- /dev/null +++ b/module/spring-security/src/main/java/cn/bunny/security/filter/TokenAuthenticationFilter.java @@ -0,0 +1,91 @@ +package cn.bunny.security.filter; + +import cn.bunny.common.service.context.BaseContext; +import cn.bunny.common.service.exception.BunnyException; +import cn.bunny.common.service.utils.JwtHelper; +import cn.bunny.common.service.utils.ResponseUtil; +import cn.bunny.result.Result; +import cn.bunny.result.ResultCodeEnum; +import cn.bunny.result.constant.RedisUserConstant; +import cn.bunny.vo.system.login.LoginVo; +import com.alibaba.fastjson2.JSON; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.util.StringUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class TokenAuthenticationFilter extends OncePerRequestFilter { + private final RedisTemplate redisTemplate; + + public TokenAuthenticationFilter(RedisTemplate redisTemplate) { + this.redisTemplate = redisTemplate; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException, BunnyException { + String token = request.getHeader("token"); + + // login请求就没token,直接放行,因为后边有其他的过滤器 + if (token == null) { + doFilter(request, response, chain); + return; + } + + // 如果想让这个用户下线,清空Redis这个用户值,返回未登录,判断Redis是否有这个用户 + // 如果想让这个用户锁定,清空Redis值并在数据库中设置status值为1 + String userName = JwtHelper.getUsername(token); + Object usernameObject = redisTemplate.opsForValue().get(RedisUserConstant.getUserLoginInfoPrefix(userName)); + if (usernameObject == null) { + Result error = Result.error(ResultCodeEnum.LOGIN_AUTH); + ResponseUtil.out(response, error); + return; + } + + // 获取Redis中登录信息 + LoginVo loginVo = JSON.parseObject(JSON.toJSONString(usernameObject), LoginVo.class); + // 如果是登录接口,直接放行 + UsernamePasswordAuthenticationToken authentication = getAuthentication(request); + if (authentication != null) { + // 设置用户详细信息 + authentication.setDetails(loginVo.getPersonDescription()); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + + chain.doFilter(request, response); + } + + private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) { + // 请求头是否有token + String token = request.getHeader("token"); + String username = RedisUserConstant.getAdminLoginInfoPrefix(JwtHelper.getUsername(token)); + List authList = new ArrayList<>(); + if (!StringUtils.hasText(username)) return null; + + // 当前用户信息放到ThreadLocal里面 + BaseContext.setAdminId(JwtHelper.getUserId(token)); + BaseContext.setAdminName(username); + + // 通过username从redis获取权限数据 + Object UserObject = redisTemplate.opsForValue().get(username); + // 把redis获取字符串权限数据转换要求集合类型 List + if (UserObject != null) { + LoginVo loginVo = JSON.parseObject(JSON.toJSONString(UserObject), LoginVo.class); + List roleList = loginVo.getRoleList(); + roleList.forEach(role -> authList.add(new SimpleGrantedAuthority(role))); + + return new UsernamePasswordAuthenticationToken(username, null, authList); + } else { + return new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>()); + } + } +} diff --git a/module/spring-security/src/main/java/cn/bunny/security/filter/TokenLoginFilterService.java b/module/spring-security/src/main/java/cn/bunny/security/filter/TokenLoginFilterService.java new file mode 100644 index 0000000..9eadac3 --- /dev/null +++ b/module/spring-security/src/main/java/cn/bunny/security/filter/TokenLoginFilterService.java @@ -0,0 +1,139 @@ +package cn.bunny.security.filter; + + +import cn.bunny.common.service.utils.ResponseUtil; +import cn.bunny.dto.user.LoginDto; +import cn.bunny.result.Result; +import cn.bunny.result.ResultCodeEnum; +import cn.bunny.result.constant.RedisUserConstant; +import cn.bunny.security.handelr.SecurityAuthenticationFailureHandler; +import cn.bunny.security.handelr.SecurityAuthenticationSuccessHandler; +import cn.bunny.security.service.CustomUserDetailsService; +import cn.bunny.vo.system.login.LoginVo; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.FilterChain; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; +import org.springframework.util.StringUtils; + +import java.io.IOException; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +/** + * * UsernamePasswordAuthenticationFilter + * * 也可以在这里添加验证码、短信等的验证 + * 由于SpringSecurity的登录只能是表单形式 并且用户名密码需要时username、password,可以通过继承 UsernamePasswordAuthenticationFilter 获取登录请求的参数 + * 再去设置到 UsernamePasswordAuthenticationToken 中 来改变请求传参方式、参数名等 或者也可以在登录的时候加入其他参数等等 + */ +public class TokenLoginFilterService extends UsernamePasswordAuthenticationFilter { + private final RedisTemplate redisTemplate; + private final CustomUserDetailsService customUserDetailsService; + private LoginDto loginDto; + + // 依赖注入 + public TokenLoginFilterService(AuthenticationConfiguration authenticationConfiguration, RedisTemplate redisTemplate, CustomUserDetailsService customUserDetailsService) throws Exception { + this.setAuthenticationSuccessHandler(new SecurityAuthenticationSuccessHandler()); + this.setAuthenticationFailureHandler(new SecurityAuthenticationFailureHandler()); + this.setPostOnly(false); + // ? 指定登录接口及提交方式,可以指定任意路径 + this.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher("/*/login", HttpMethod.POST.name())); + this.setAuthenticationManager(authenticationConfiguration.getAuthenticationManager()); + // 依赖注入 + this.redisTemplate = redisTemplate; + this.customUserDetailsService = customUserDetailsService; + } + + /** + * * 登录认证,获取输入的用户名和密码,调用方法认证 + * 接受前端login登录参数 + * 在这里可以设置短信验证登录 + */ + @Override + public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { + try { + // 获取用户信息 + loginDto = new ObjectMapper().readValue(request.getInputStream(), LoginDto.class); + + // 登录验证码判断 + String username = loginDto.getUsername(); + String emailCode = loginDto.getEmailCode().toLowerCase(); + String redisEmailCode = (String) redisTemplate.opsForValue().get(RedisUserConstant.getAdminUserEmailCodePrefix(username)); + + // 如果不存在验证码 + if (!StringUtils.hasText(emailCode)) { + ResponseUtil.out(response, Result.error(ResultCodeEnum.EMAIL_CODE_NOT_EMPTY)); + return null; + } + if (!StringUtils.hasText(redisEmailCode)) { + ResponseUtil.out(response, Result.error(ResultCodeEnum.SEND_EMAIL_CODE_NOT_EMPTY)); + return null; + } + // 验证码不匹配 + if (!Objects.equals(redisEmailCode.toLowerCase(), emailCode)) { + ResponseUtil.out(response, Result.error(ResultCodeEnum.EMAIL_CODE_NOT_MATCHING)); + return null; + } + + // 封装对象,将用户名密码传入 + Authentication authenticationToken = new UsernamePasswordAuthenticationToken(loginDto.getUsername(), loginDto.getPassword()); + return this.getAuthenticationManager().authenticate(authenticationToken); + } catch (IOException e) { + throw new RuntimeException(e.getLocalizedMessage()); + } + } + + /** + * * 认证成功调用方法 + * 返回登录成功后的信息 + */ + @Override + protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication auth) { + // 封装返回对象 + LoginVo loginVo = customUserDetailsService.login(loginDto); + + // 判断用户是否被锁定 + if (loginVo.getStatus() == 1) { + ResponseUtil.out(response, Result.error(ResultCodeEnum.FAIL_NO_ACCESS_DENIED_USER_LOCKED)); + return; + } + + // 将值存入Redis中 + redisTemplate.opsForValue().set(RedisUserConstant.getAdminLoginInfoPrefix(loginVo.getEmail()), loginVo, 15, TimeUnit.DAYS); + // 将Redis中验证码删除 + redisTemplate.delete(RedisUserConstant.getAdminUserEmailCodePrefix(loginVo.getEmail())); + // 返回登录信息 + ResponseUtil.out(response, Result.success(loginVo)); + } + + /** + * * 认证失败调用方法,失败判断 + * 1. 是否包含用户名 + * 2. 是否包含密码 + */ + @Override + protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) { + // 账号和密码不能为空 + if (loginDto == null) { + ResponseUtil.out(response, Result.error(ResultCodeEnum.LOGIN_ERROR_USERNAME_PASSWORD_NOT_EMPTY)); + } + // 用户名为空 + if (!StringUtils.hasText(loginDto.getUsername())) { + ResponseUtil.out(response, Result.error(ResultCodeEnum.USERNAME_NOT_EMPTY)); + } + // 密码为空 + if (!StringUtils.hasText(loginDto.getPassword())) { + ResponseUtil.out(response, Result.error(ResultCodeEnum.PASSWORD_NOT_EMPTY)); + } + // 抛出异常,账号或密码错误 + ResponseUtil.out(response, Result.error(null, ResultCodeEnum.LOGIN_ERROR)); + } +} diff --git a/common/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAccessDeniedHandler.java b/module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAccessDeniedHandler.java similarity index 88% rename from common/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAccessDeniedHandler.java rename to module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAccessDeniedHandler.java index 9e99251..b14a8d7 100644 --- a/common/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAccessDeniedHandler.java +++ b/module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAccessDeniedHandler.java @@ -1,13 +1,16 @@ package cn.bunny.security.handelr; -import cn.bunny.common.result.Result; -import cn.bunny.enums.ResultCodeEnum; +import cn.bunny.result.Result; +import cn.bunny.result.ResultCodeEnum; import com.alibaba.fastjson2.JSON; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.SneakyThrows; import org.springframework.security.access.AccessDeniedException; +/** + * 没有权限访问 + */ public class SecurityAccessDeniedHandler implements org.springframework.security.web.access.AccessDeniedHandler { @SneakyThrows @Override diff --git a/common/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationEntryPoint.java b/module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationEntryPoint.java similarity index 71% rename from common/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationEntryPoint.java rename to module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationEntryPoint.java index 046cd3d..cd82558 100644 --- a/common/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationEntryPoint.java +++ b/module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationEntryPoint.java @@ -1,8 +1,8 @@ package cn.bunny.security.handelr; -import cn.bunny.common.result.Result; -import cn.bunny.enums.ResultCodeEnum; -import com.alibaba.fastjson2.JSON; +import cn.bunny.common.service.utils.ResponseUtil; +import cn.bunny.result.Result; +import cn.bunny.result.ResultCodeEnum; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; @@ -24,16 +24,14 @@ public class SecurityAuthenticationEntryPoint implements AuthenticationEntryPoin Result result; if (token == null) { - result = Result.error(new Object(), ResultCodeEnum.LOGIN_AUTH); + result = Result.error(ResultCodeEnum.LOGIN_AUTH); log.info("请求未登录接口:{},用户id:{}", message, null); } else { - result = Result.error(new Object(), ResultCodeEnum.LOGGED_IN_FROM_ANOTHER_DEVICE); + result = Result.error(ResultCodeEnum.LOGGED_IN_FROM_ANOTHER_DEVICE); log.info("请求未授权接口:{},用户id:{}", message, token); } - // 返回响应 - response.setContentType("application/json;charset=UTF-8"); - response.getWriter().println(JSON.toJSON(result)); + ResponseUtil.out(response, result); } } diff --git a/common/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationFailureHandler.java b/module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationFailureHandler.java similarity index 96% rename from common/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationFailureHandler.java rename to module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationFailureHandler.java index 7e12db2..e48ad49 100644 --- a/common/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationFailureHandler.java +++ b/module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationFailureHandler.java @@ -1,6 +1,6 @@ package cn.bunny.security.handelr; -import cn.bunny.common.result.Result; +import cn.bunny.result.Result; import com.alibaba.fastjson2.JSON; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; diff --git a/common/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationSuccessHandler.java b/module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationSuccessHandler.java similarity index 71% rename from common/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationSuccessHandler.java rename to module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationSuccessHandler.java index 65acd8a..e5bd0fd 100644 --- a/common/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationSuccessHandler.java +++ b/module/spring-security/src/main/java/cn/bunny/security/handelr/SecurityAuthenticationSuccessHandler.java @@ -1,8 +1,7 @@ package cn.bunny.security.handelr; -import cn.bunny.common.result.Result; +import cn.bunny.result.Result; import com.alibaba.fastjson2.JSON; -import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.security.core.Authentication; @@ -10,16 +9,14 @@ import org.springframework.security.web.authentication.AuthenticationSuccessHand import java.io.IOException; +/** + * 登录成功 + */ public class SecurityAuthenticationSuccessHandler implements AuthenticationSuccessHandler { @Override - public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { + public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException { // 获取用户身份信息 Object principal = authentication.getPrincipal(); - // 获取用户凭证信息 - // Object credentials = authentication.getCredentials(); - // 获取用户权限信息 - // Collection authorities = authentication.getAuthorities(); - Result result = Result.success(principal); // 返回 diff --git a/common/spring-security/src/main/java/cn/bunny/security/service/CustomAuthorizationManagerService.java b/module/spring-security/src/main/java/cn/bunny/security/service/CustomAuthorizationManagerService.java similarity index 100% rename from common/spring-security/src/main/java/cn/bunny/security/service/CustomAuthorizationManagerService.java rename to module/spring-security/src/main/java/cn/bunny/security/service/CustomAuthorizationManagerService.java diff --git a/module/spring-security/src/main/java/cn/bunny/security/service/CustomUserDetailsService.java b/module/spring-security/src/main/java/cn/bunny/security/service/CustomUserDetailsService.java new file mode 100644 index 0000000..7cf5b4e --- /dev/null +++ b/module/spring-security/src/main/java/cn/bunny/security/service/CustomUserDetailsService.java @@ -0,0 +1,23 @@ +package cn.bunny.security.service; + +import cn.bunny.dto.user.LoginDto; +import cn.bunny.vo.system.login.LoginVo; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +public interface CustomUserDetailsService extends UserDetailsService { + /** + * 根据用户名获取用户对象(获取不到直接抛异常) + */ + @Override + UserDetails loadUserByUsername(String username) throws UsernameNotFoundException; + + /** + * 前台用户登录接口 + * + * @param loginDto 登录参数 + * @return 登录后结果返回 + */ + LoginVo login(LoginDto loginDto); +} diff --git a/pom.xml b/pom.xml index 1a7f520..64d1f27 100644 --- a/pom.xml +++ b/pom.xml @@ -23,9 +23,10 @@ - 21 - 21 + 22 + 22 21 + 3.8.1 3.5.6 8.0.30 4.5.0 @@ -36,9 +37,16 @@ 3.3.3 2.10.1 1.9.21 + 6.1.0 + + + junit + junit + ${junit.version} + com.baomidou @@ -79,7 +87,7 @@ cn.hutool hutool-all - 5.8.25 + 5.8.27 @@ -110,6 +118,17 @@ joda-time ${jodatime.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.12.3 + + + com.github.pagehelper + pagehelper + ${pagehelper.version} + diff --git a/service/src/main/java/cn/bunny/service/controller/BaseController.java b/service/src/main/java/cn/bunny/service/controller/BaseController.java index 046b69d..7847d78 100644 --- a/service/src/main/java/cn/bunny/service/controller/BaseController.java +++ b/service/src/main/java/cn/bunny/service/controller/BaseController.java @@ -1,6 +1,6 @@ package cn.bunny.service.controller; -import cn.bunny.common.result.Result; +import cn.bunny.result.Result; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; diff --git a/service/src/main/java/cn/bunny/service/controller/IndexController.java b/service/src/main/java/cn/bunny/service/controller/IndexController.java index 5710b9a..fab2fda 100644 --- a/service/src/main/java/cn/bunny/service/controller/IndexController.java +++ b/service/src/main/java/cn/bunny/service/controller/IndexController.java @@ -1,10 +1,8 @@ package cn.bunny.service.controller; -import cn.bunny.common.result.Result; -import cn.bunny.entity.system.Login; -import cn.bunny.entity.system.SysUserinfo; +import cn.bunny.result.Result; import cn.bunny.service.service.SysUserService; -import cn.bunny.vo.system.LoginVo; +import cn.bunny.vo.system.login.LoginVo; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest;