diff --git a/.gitignore b/.gitignore index 549e00a..17710db 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,8 @@ target/ *.iws *.iml *.ipr +logs +logs/** ### NetBeans ### /nbproject/private/ @@ -30,4 +32,4 @@ build/ !**/src/test/**/build/ ### VS Code ### -.vscode/ +.vscode/ \ No newline at end of file diff --git a/common/common-generator/pom.xml b/common/common-generator/pom.xml new file mode 100644 index 0000000..0b2d1ba --- /dev/null +++ b/common/common-generator/pom.xml @@ -0,0 +1,74 @@ + + 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 + + + + org.apache.velocity + velocity-engine-core + + + org.apache.velocity.tools + velocity-tools-generic + + + + 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 + + + + + + + + + + + + + + + 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-result/src/main/java/cn/bunny/common/result/enums/ResultCodeEnum.java b/common/common-result/src/main/java/cn/bunny/common/result/enums/ResultCodeEnum.java deleted file mode 100644 index dc0c7c7..0000000 --- a/common/common-result/src/main/java/cn/bunny/common/result/enums/ResultCodeEnum.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.bunny.common.result.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/pom.xml b/common/common-utils/pom.xml index 8a8ecaf..f832c59 100644 --- a/common/common-utils/pom.xml +++ b/common/common-utils/pom.xml @@ -19,53 +19,9 @@ - org.apache.httpcomponents - httpclient - 4.5.14 + cn.bunny + model + 0.0.1-SNAPSHOT - - 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/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 709f207..19d4c57 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -3,7 +3,7 @@ 4.0.0 cn.bunny - bunny-template-mirror-server + bunny-mirror-server 0.0.1-SNAPSHOT @@ -13,16 +13,14 @@ https://maven.apache.org service-utils + common-generator common-utils - spring-security - common-result - 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 b47c877..3a326b2 100644 --- a/common/service-utils/pom.xml +++ b/common/service-utils/pom.xml @@ -19,13 +19,19 @@ cn.bunny - common-utils + model 0.0.1-SNAPSHOT + - cn.bunny - common-result - 0.0.1-SNAPSHOT + org.apache.httpcomponents + httpclient + 4.5.14 + + + + com.github.xiaoymin + knife4j-openapi3-jakarta-spring-boot-starter org.springframework.boot @@ -42,5 +48,10 @@ redisson 3.26.1 + + + com.github.pagehelper + pagehelper + 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/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 c755c16..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.common.result.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 edd996c..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.utils.Result; -import cn.bunny.common.result.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 f815119..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.utils.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 1a68dac..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.utils.Result; -import cn.bunny.common.service.utils.JwtHelper; -import cn.bunny.common.service.utils.ResponseUtil; -import cn.bunny.entity.system.Login; -import cn.bunny.common.result.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/logs/service-gateway/sentinel/service-gateway-metrics.log.2024-05-10 b/logs/service-gateway/sentinel/service-gateway-metrics.log.2024-05-10 deleted file mode 100644 index 1b52818..0000000 --- a/logs/service-gateway/sentinel/service-gateway-metrics.log.2024-05-10 +++ /dev/null @@ -1,3 +0,0 @@ -1715325213000|2024-05-10 15:13:33|/favicon.ico|1|0|1|1|14|0|0|1 -1715325213000|2024-05-10 15:13:33|/|1|0|1|0|52|0|0|1 -1715325213000|2024-05-10 15:13:33|__total_inbound_traffic__|2|0|2|1|33|0|0|0 diff --git a/logs/service-gateway/sentinel/service-gateway-metrics.log.2024-05-10.idx b/logs/service-gateway/sentinel/service-gateway-metrics.log.2024-05-10.idx deleted file mode 100644 index e69de29..0000000 diff --git a/model/pom.xml b/model/pom.xml index d08cb29..4fff05a 100644 --- a/model/pom.xml +++ b/model/pom.xml @@ -3,7 +3,7 @@ 4.0.0 cn.bunny - bunny-template-mirror-server + bunny-mirror-server 0.0.1-SNAPSHOT @@ -22,6 +22,12 @@ org.projectlombok lombok + + + cn.hutool + hutool-all + + com.alibaba.fastjson2 fastjson2 @@ -36,15 +42,12 @@ com.github.xiaoymin knife4j-openapi3-jakarta-spring-boot-starter - + - org.springframework.boot - spring-boot-starter-security - - - - org.springframework.security - spring-security-test + 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/common/common-result/src/main/java/cn/bunny/common/result/utils/Result.java b/model/src/main/java/cn/bunny/result/Result.java similarity index 96% rename from common/common-result/src/main/java/cn/bunny/common/result/utils/Result.java rename to model/src/main/java/cn/bunny/result/Result.java index 80c8119..6484684 100644 --- a/common/common-result/src/main/java/cn/bunny/common/result/utils/Result.java +++ b/model/src/main/java/cn/bunny/result/Result.java @@ -1,6 +1,5 @@ -package cn.bunny.common.result.utils; +package cn.bunny.result; -import cn.bunny.common.result.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/common-result/pom.xml b/module/module-task/pom.xml similarity index 69% rename from common/common-result/pom.xml rename to module/module-task/pom.xml index 436690b..3ab04f3 100644 --- a/common/common-result/pom.xml +++ b/module/module-task/pom.xml @@ -1,16 +1,16 @@ - 4.0.0 cn.bunny - common + module 0.0.1-SNAPSHOT - common-result + module-task jar - common-result + module-task https://maven.apache.org diff --git a/service/service-main/src/main/java/cn/bunny/service/task/TemplateTask.java b/module/module-task/src/main/java/cn/bunny/module/task/TemplateTask.java similarity index 91% rename from service/service-main/src/main/java/cn/bunny/service/task/TemplateTask.java rename to module/module-task/src/main/java/cn/bunny/module/task/TemplateTask.java index d28941b..2dbf0b7 100644 --- a/service/service-main/src/main/java/cn/bunny/service/task/TemplateTask.java +++ b/module/module-task/src/main/java/cn/bunny/module/task/TemplateTask.java @@ -1,4 +1,4 @@ -package cn.bunny.service.task; +package cn.bunny.module.task; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; 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/service-main/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/service-main/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/service-main/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 bfd01e7..2804f9c 100644 --- a/module/pom.xml +++ b/module/pom.xml @@ -3,7 +3,7 @@ 4.0.0 cn.bunny - bunny-template-mirror-server + bunny-mirror-server 0.0.1-SNAPSHOT @@ -16,6 +16,8 @@ module-minio module-mail module-rabbitMQ + module-websocket + module-task @@ -25,8 +27,8 @@ cn.bunny - model + service-utils 0.0.1-SNAPSHOT - + \ No newline at end of file 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 f7747b0..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.utils.Result; -import cn.bunny.common.result.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 70% 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 8fd92c3..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.utils.Result; -import cn.bunny.common.result.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 95% 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 34c21f6..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.utils.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 70% 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 5a8727e..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.utils.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 c6bfcbb..96c519e 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,5 @@ - 4.0.0 @@ -11,7 +11,7 @@ cn.bunny - bunny-template-mirror-server + bunny-mirror-server 0.0.1-SNAPSHOT pom bunny-mirror-server @@ -30,6 +30,7 @@ 22 22 21 + 3.8.1 3.5.6 8.0.30 4.5.0 @@ -39,10 +40,35 @@ 0.9.1 3.3.3 2.10.1 - 1.9.21 + 1.9.21 + 2023.0.1 + 2.16.0-rc1 + 2023.0.1.0 + 2023.0.0.0-RC1 + 4.1.2 + 6.1.0 + 2.3 + 3.1 + + + junit + junit + ${junit.version} + + + + org.apache.velocity + velocity-engine-core + ${velocity.version} + + + org.apache.velocity.tools + velocity-tools-generic + ${velocity-tools.version} + com.baomidou @@ -83,7 +109,7 @@ cn.hutool hutool-all - 5.8.25 + 5.8.27 @@ -101,19 +127,62 @@ org.aspectj aspectjrt - ${aspectj} + ${aspectj.version} org.aspectj aspectjweaver - ${aspectj} + ${aspectj.version} joda-time joda-time ${jodatime.version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + ${jackson-dataformat.version} + + + + org.springframework.cloud + spring-cloud-dependencies + ${cloud.version} + pom + import + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + ${alibaba.version} + pom + import + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + ${discovery.version} + + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + ${loadbalancer.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.12.3 + + + com.github.pagehelper + pagehelper + ${pagehelper.version} + diff --git a/server-gateway/pom.xml b/server-gateway/pom.xml index d60d984..8d1d521 100644 --- a/server-gateway/pom.xml +++ b/server-gateway/pom.xml @@ -1,9 +1,9 @@ - 4.0.0 cn.bunny - bunny-template-mirror-server + bunny-mirror-server 0.0.1-SNAPSHOT @@ -31,20 +31,24 @@ org.projectlombok lombok - org.springframework.cloud spring-cloud-starter-loadbalancer 4.1.2 - com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery 2023.0.0.0-RC1 + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + 2023.0.1.0 + @@ -52,11 +56,5 @@ - - - com.alibaba.cloud - spring-cloud-starter-alibaba-sentinel - 2023.0.1.0 - diff --git a/server-gateway/src/main/java/cn/bunny/service/gateway/GatewayApplication.java b/server-gateway/src/main/java/cn/bunny/service/gateway/GatewayApplication.java index a45d16e..7f27648 100644 --- a/server-gateway/src/main/java/cn/bunny/service/gateway/GatewayApplication.java +++ b/server-gateway/src/main/java/cn/bunny/service/gateway/GatewayApplication.java @@ -4,8 +4,10 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; +import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication +@EnableScheduling// 定时任务 @ComponentScan("cn.bunny") @Slf4j public class GatewayApplication { diff --git a/server-gateway/src/main/java/cn/bunny/service/gateway/controller/IndexController.java b/server-gateway/src/main/java/cn/bunny/service/gateway/controller/IndexController.java index 1f232cd..6922ee4 100644 --- a/server-gateway/src/main/java/cn/bunny/service/gateway/controller/IndexController.java +++ b/server-gateway/src/main/java/cn/bunny/service/gateway/controller/IndexController.java @@ -1,6 +1,5 @@ package cn.bunny.service.gateway.controller; -import com.alibaba.nacos.api.model.v2.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -11,7 +10,7 @@ import org.springframework.web.bind.annotation.RestController; @Slf4j public class IndexController { @GetMapping() - public Result index() { - return Result.success("欢迎访问。。。"); + public String index() { + return "欢迎访问 Bunny Template 网关服务"; } } diff --git a/server-gateway/src/main/java/cn/bunny/service/gateway/task/TemplateTask.java b/server-gateway/src/main/java/cn/bunny/service/gateway/task/TemplateTask.java new file mode 100644 index 0000000..d3232bd --- /dev/null +++ b/server-gateway/src/main/java/cn/bunny/service/gateway/task/TemplateTask.java @@ -0,0 +1,14 @@ +package cn.bunny.service.gateway.task; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class TemplateTask { + @Scheduled(cron = "0/1 5 * * * ?") + public void templateTask() { + log.info("定时任务执行..."); + } +} diff --git a/server-gateway/src/main/resources/application-dev.yml b/server-gateway/src/main/resources/application-dev.yml index e1f8308..25ba079 100644 --- a/server-gateway/src/main/resources/application-dev.yml +++ b/server-gateway/src/main/resources/application-dev.yml @@ -2,7 +2,7 @@ bunny: nacos: server-addr: z-bunny.cn:8848 discovery: - namespace: spzx + namespace: bunnyBBS redis: host: 47.120.65.66 diff --git a/server-gateway/src/main/resources/application.yml b/server-gateway/src/main/resources/application.yml index f9b812f..88a1647 100644 --- a/server-gateway/src/main/resources/application.yml +++ b/server-gateway/src/main/resources/application.yml @@ -1,14 +1,13 @@ server: - port: 8500 + port: 8800 spring: profiles: active: dev application: name: service-gateway -# main: -# web-application-type: reactive - # allow-bean-definition-overriding: true - + main: + web-application-type: reactive + allow-bean-definition-overriding: true cloud: sentinel: log: @@ -24,11 +23,16 @@ spring: locator: enabled: true # 路由 -# routes: -# - id: service-product -# uri: lb://service-product -# predicates: -# - Path=/*/product/** + routes: + - id: service-web + uri: lb://service-web + predicates: + - Path=/api/** + - id: service-admin + uri: lb://service-admin + predicates: + - Path=/admin/** + data: redis: host: ${bunny.redis.host} diff --git a/server-gateway/src/test/java/cn/bunny/AppTest.java b/server-gateway/src/test/java/cn/bunny/AppTest.java deleted file mode 100644 index 34b54ff..0000000 --- a/server-gateway/src/test/java/cn/bunny/AppTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package cn.bunny; - -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -/** - * Unit test for simple App. - */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } - - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); - } -} diff --git a/service-client/pom.xml b/service-client/pom.xml index cc8e314..1552d44 100644 --- a/service-client/pom.xml +++ b/service-client/pom.xml @@ -1,9 +1,9 @@ - 4.0.0 cn.bunny - bunny-template-mirror-server + bunny-mirror-server 0.0.1-SNAPSHOT @@ -18,6 +18,21 @@ + + cn.bunny + model + 0.0.1-SNAPSHOT + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + org.springframework.cloud + spring-cloud-loadbalancer + diff --git a/service/pom.xml b/service/pom.xml index e96729f..45d8e0e 100644 --- a/service/pom.xml +++ b/service/pom.xml @@ -3,7 +3,7 @@ 4.0.0 cn.bunny - bunny-template-mirror-server + bunny-mirror-server 0.0.1-SNAPSHOT @@ -12,24 +12,59 @@ service https://maven.apache.org - service-main + service-web + service-admin UTF-8 - + - + junit junit - 3.8.1 org.springframework.boot spring-boot-starter-test + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + org.aspectj + aspectjrt + + + + mysql + mysql-connector-java + + + + com.zaxxer + HikariCP + 5.1.0 + + + + com.baomidou + mybatis-plus-spring-boot3-starter + + + org.aspectj + aspectjweaver + diff --git a/service/service-main/Dockerfile b/service/service-admin/Dockerfile similarity index 100% rename from service/service-main/Dockerfile rename to service/service-admin/Dockerfile diff --git a/service/service-main/pom.xml b/service/service-admin/pom.xml similarity index 77% rename from service/service-main/pom.xml rename to service/service-admin/pom.xml index 61996d4..b894921 100644 --- a/service/service-main/pom.xml +++ b/service/service-admin/pom.xml @@ -1,4 +1,4 @@ - 4.0.0 @@ -7,31 +7,24 @@ 0.0.1-SNAPSHOT - service-main + service-admin jar - service-main + service-admin https://maven.apache.org UTF-8 192.168.3.98:1100 192.168.3.98:2375 - bunny-service + bunny-admin - cn.bunny spring-security 0.0.1-SNAPSHOT - - - cn.bunny - service-utils - 0.0.1-SNAPSHOT - cn.bunny module-mail @@ -42,20 +35,6 @@ module-minio 0.0.1-SNAPSHOT - - - org.springframework.boot - spring-boot-starter-websocket - - - - org.aspectj - aspectjrt - - - org.aspectj - aspectjweaver - diff --git a/service/service-main/src/main/java/cn/bunny/service/ServiceApplication.java b/service/service-admin/src/main/java/cn/bunny/service/admin/ServiceAdminApplication.java similarity index 72% rename from service/service-main/src/main/java/cn/bunny/service/ServiceApplication.java rename to service/service-admin/src/main/java/cn/bunny/service/admin/ServiceAdminApplication.java index 9ad3a84..d90a836 100644 --- a/service/service-main/src/main/java/cn/bunny/service/ServiceApplication.java +++ b/service/service-admin/src/main/java/cn/bunny/service/admin/ServiceAdminApplication.java @@ -1,4 +1,4 @@ -package cn.bunny.service; +package cn.bunny.service.admin; import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; @@ -7,16 +7,18 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.ComponentScan; import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.stereotype.Indexed; @ComponentScan(basePackages = {"cn.bunny"}) -@MapperScan("cn.bunny.service.mapper") +@MapperScan("cn.bunny.service.admin.mapper") @EnableScheduling// 定时任务 @EnableCaching// 开启缓存注解 @SpringBootApplication @Slf4j -public class ServiceApplication { +@Indexed +public class ServiceAdminApplication { public static void main(String[] args) { log.info("ServiceApplication启动..."); - SpringApplication.run(ServiceApplication.class, args); + SpringApplication.run(ServiceAdminApplication.class, args); } -} +} \ No newline at end of file diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/config/Knife4jConfig.java b/service/service-admin/src/main/java/cn/bunny/service/admin/config/Knife4jConfig.java similarity index 94% rename from common/service-utils/src/main/java/cn/bunny/common/service/config/Knife4jConfig.java rename to service/service-admin/src/main/java/cn/bunny/service/admin/config/Knife4jConfig.java index 00ccf95..d1b84ea 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/config/Knife4jConfig.java +++ b/service/service-admin/src/main/java/cn/bunny/service/admin/config/Knife4jConfig.java @@ -1,4 +1,4 @@ -package cn.bunny.common.service.config; +package cn.bunny.service.admin.config; import io.swagger.v3.oas.models.ExternalDocumentation; import io.swagger.v3.oas.models.OpenAPI; @@ -28,7 +28,7 @@ public class Knife4jConfig { // 管理员相关分类接口 @Bean - public GroupedOpenApi groupedOpenApi() { + public GroupedOpenApi groupedOpenAdminApi() { return GroupedOpenApi.builder().group("管理员接口请求").pathsToMatch("/admin/**").build(); } diff --git a/service/service-admin/src/main/java/cn/bunny/service/admin/controller/IndexController.java b/service/service-admin/src/main/java/cn/bunny/service/admin/controller/IndexController.java new file mode 100644 index 0000000..1245ba5 --- /dev/null +++ b/service/service-admin/src/main/java/cn/bunny/service/admin/controller/IndexController.java @@ -0,0 +1,13 @@ +package cn.bunny.service.admin.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/") +public class IndexController { + @RequestMapping("") + public String index() { + return "欢迎访问BunnyBBS"; + } +} diff --git a/service/service-admin/src/main/java/cn/bunny/service/admin/controller/LoginController.java b/service/service-admin/src/main/java/cn/bunny/service/admin/controller/LoginController.java new file mode 100644 index 0000000..ad7468c --- /dev/null +++ b/service/service-admin/src/main/java/cn/bunny/service/admin/controller/LoginController.java @@ -0,0 +1,36 @@ +package cn.bunny.service.admin.controller; + + +import cn.bunny.dto.user.LoginDto; +import cn.bunny.result.Result; +import cn.bunny.service.admin.service.UserService; +import cn.bunny.vo.system.login.LoginVo; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Tag(name = "登录相关接口") +@RestController +@RequestMapping("/admin") +public class LoginController { + @Autowired + private UserService userService; + + @Operation(summary = "登录接口", description = "后台用户登录接口") + @PostMapping("login") + public Result login(@RequestBody LoginDto loginDto) { + LoginVo vo = userService.login(loginDto); + return Result.success(vo); + } + + @Operation(summary = "发送邮箱验证码", description = "发送邮箱验证码") + @PostMapping("noAuth/sendEmail") + public Result sendEmail(String email) { + userService.sendEmail(email); + return Result.success(); + } +} diff --git a/service/service-admin/src/main/java/cn/bunny/service/admin/mapper/AdminPowerMapper.java b/service/service-admin/src/main/java/cn/bunny/service/admin/mapper/AdminPowerMapper.java new file mode 100644 index 0000000..00b666b --- /dev/null +++ b/service/service-admin/src/main/java/cn/bunny/service/admin/mapper/AdminPowerMapper.java @@ -0,0 +1,34 @@ +package cn.bunny.service.admin.mapper; + +import cn.bunny.entity.system.admin.AdminPower; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Bunny + * @since 2024-05-18 + */ +@Mapper +public interface AdminPowerMapper extends BaseMapper { + /** + * 查询用户权限信息 + * + * @param roleIdList 角色id 列表 + * @return 用户对应的权限 + */ + AdminPower[] selectByPowerWithRoleIdList(List roleIdList); + + /** + * 查询用户权限 + * + * @param userId 用户id + * @return 用户权限列表 + */ + List queryByUserIdWithPower(Long userId); +} diff --git a/service/service-admin/src/main/java/cn/bunny/service/admin/mapper/AdminRoleMapper.java b/service/service-admin/src/main/java/cn/bunny/service/admin/mapper/AdminRoleMapper.java new file mode 100644 index 0000000..2e0ae1b --- /dev/null +++ b/service/service-admin/src/main/java/cn/bunny/service/admin/mapper/AdminRoleMapper.java @@ -0,0 +1,26 @@ +package cn.bunny.service.admin.mapper; + +import cn.bunny.entity.system.admin.AdminRole; +import cn.bunny.entity.system.admin.auth.AuthUserRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Bunny + * @since 2024-05-18 + */ +@Mapper +public interface AdminRoleMapper extends BaseMapper { + + /** + * 查询用户所有的角色信息 + * + * @param userId 用户id + * @return 用户对应的角色 + */ + AuthUserRole[] selectByRoleWithUserId(Long userId); +} diff --git a/service/service-admin/src/main/java/cn/bunny/service/admin/mapper/EmailUsersMapper.java b/service/service-admin/src/main/java/cn/bunny/service/admin/mapper/EmailUsersMapper.java new file mode 100644 index 0000000..e694eec --- /dev/null +++ b/service/service-admin/src/main/java/cn/bunny/service/admin/mapper/EmailUsersMapper.java @@ -0,0 +1,24 @@ +package cn.bunny.service.admin.mapper; + +import cn.bunny.entity.system.email.EmailUsers; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Bunny + * @since 2024-05-14 + */ +@Mapper +public interface EmailUsersMapper extends BaseMapper { + + /** + * 彻底删除邮箱用户 + * + * @param id 用户ID + */ + void thoroughDeleteById(Long id); +} diff --git a/service/service-admin/src/main/java/cn/bunny/service/admin/mapper/UserMapper.java b/service/service-admin/src/main/java/cn/bunny/service/admin/mapper/UserMapper.java new file mode 100644 index 0000000..89f31db --- /dev/null +++ b/service/service-admin/src/main/java/cn/bunny/service/admin/mapper/UserMapper.java @@ -0,0 +1,25 @@ +package cn.bunny.service.admin.mapper; + +import cn.bunny.entity.system.user.User; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 用户信息 Mapper 接口 + *

+ * + * @author Bunny + * @since 2024-05-18 + */ +@Mapper +public interface UserMapper extends BaseMapper { + /** + * 前台用户登录接口 + * + * @param username 邮箱/昵称 + * @param password 吗,Image + * @return 登录参数 + */ + User login(String username, String password); +} diff --git a/service/service-admin/src/main/java/cn/bunny/service/admin/security/CustomAuthorizationManagerServiceImpl.java b/service/service-admin/src/main/java/cn/bunny/service/admin/security/CustomAuthorizationManagerServiceImpl.java new file mode 100644 index 0000000..7a00f59 --- /dev/null +++ b/service/service-admin/src/main/java/cn/bunny/service/admin/security/CustomAuthorizationManagerServiceImpl.java @@ -0,0 +1,72 @@ +package cn.bunny.service.admin.security; + +import cn.bunny.common.service.utils.JwtHelper; +import cn.bunny.entity.system.admin.AdminPower; +import cn.bunny.security.service.CustomAuthorizationManagerService; +import cn.bunny.service.admin.mapper.AdminPowerMapper; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.authorization.AuthorizationDecision; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.web.access.intercept.RequestAuthorizationContext; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.function.Supplier; + + +/** + * 自定义权限判断 + * 判断用户有哪些权限 + */ +@Component +@Slf4j +public class CustomAuthorizationManagerServiceImpl implements CustomAuthorizationManagerService { + @Autowired + private AdminPowerMapper adminPowerMapper; + + @Override + public void verify(Supplier authentication, RequestAuthorizationContext requestAuthorizationContext) { + CustomAuthorizationManagerService.super.verify(authentication, requestAuthorizationContext); + } + + @Override + public AuthorizationDecision check(Supplier authentication, RequestAuthorizationContext context) { + // 用户的token和用户id、请求Url + HttpServletRequest request = context.getRequest(); + String token = request.getHeader("token"); + Long userId = JwtHelper.getUserId(token);// 用户id + String requestURI = request.getRequestURI();// 请求地址 + String method = request.getMethod();// 请求方式 + List roleCodeList = authentication.get().getAuthorities().stream().map(GrantedAuthority::getAuthority).toList();// 角色代码列表 + if (token == null) { + throw new AccessDeniedException(""); + } + + return new AuthorizationDecision(hasRoleList(requestURI, method, userId)); + } + + /** + * 查询用户所属的角色信息 + * + * @param requestURI 请求url地址 + * @param method 请求方式 + * @param userId 用户id + */ + private Boolean hasRoleList(String requestURI, String method, Long userId) { + // 查询用户权限 + List powerList = adminPowerMapper.queryByUserIdWithPower(userId); + // 如果查询到当前地址符合这个地址 + for (AdminPower adminPower : powerList) { + String description = adminPower.getDescription(); + if (description.equals(requestURI) || requestURI.matches(description)) { + return true; + } + } + + return false; + } +} diff --git a/service/service-admin/src/main/java/cn/bunny/service/admin/security/CustomUserDetailsService.java b/service/service-admin/src/main/java/cn/bunny/service/admin/security/CustomUserDetailsService.java new file mode 100644 index 0000000..79aa939 --- /dev/null +++ b/service/service-admin/src/main/java/cn/bunny/service/admin/security/CustomUserDetailsService.java @@ -0,0 +1,54 @@ +package cn.bunny.service.admin.security; + +import cn.bunny.dto.user.LoginDto; +import cn.bunny.entity.system.admin.AdminRole; +import cn.bunny.entity.system.user.User; +import cn.bunny.security.custom.CustomUser; +import cn.bunny.service.admin.mapper.AdminRoleMapper; +import cn.bunny.service.admin.mapper.UserMapper; +import cn.bunny.service.admin.service.UserService; +import cn.bunny.vo.system.login.LoginVo; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +import java.util.List; + +@Configuration +public class CustomUserDetailsService implements cn.bunny.security.service.CustomUserDetailsService { + @Autowired + private UserMapper userMapper; + @Autowired + private UserService userService; + @Autowired + private AdminRoleMapper adminRoleMapper; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + // 根据邮箱查询用户名 + User user = userMapper.selectOne(Wrappers.lambdaQuery().eq(User::getEmail, username)); + List sysRoleList = adminRoleMapper.selectList(null); + // 都为空抛出异常,用户不存在 + if (user == null) { + throw new UsernameNotFoundException(""); + } + + // 查询所有的角色 + List roleAuthoritieList = sysRoleList.stream().map(AdminRole::getRoleCode).toList(); + return new CustomUser(user, AuthorityUtils.createAuthorityList(roleAuthoritieList)); + } + + /** + * 前台用户登录接口 + * + * @param loginDto 登录参数 + * @return 登录后结果返回 + */ + @Override + public LoginVo login(LoginDto loginDto) { + return userService.login(loginDto); + } +} diff --git a/service/service-admin/src/main/java/cn/bunny/service/admin/service/UserService.java b/service/service-admin/src/main/java/cn/bunny/service/admin/service/UserService.java new file mode 100644 index 0000000..3311455 --- /dev/null +++ b/service/service-admin/src/main/java/cn/bunny/service/admin/service/UserService.java @@ -0,0 +1,31 @@ +package cn.bunny.service.admin.service; + +import cn.bunny.dto.user.LoginDto; +import cn.bunny.entity.system.user.User; +import cn.bunny.vo.system.login.LoginVo; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 用户信息 服务类 + *

+ * + * @author Bunny + * @since 2024-05-18 + */ +public interface UserService extends IService { + /** + * 前台用户登录接口 + * + * @param loginDto 登录参数 + * @return 登录后结果返回 + */ + LoginVo login(LoginDto loginDto); + + /** + * 发送邮箱验证码 + * + * @param email 邮箱 + */ + void sendEmail(String email); +} diff --git a/service/service-admin/src/main/java/cn/bunny/service/admin/service/impl/UserServiceImpl.java b/service/service-admin/src/main/java/cn/bunny/service/admin/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..158725f --- /dev/null +++ b/service/service-admin/src/main/java/cn/bunny/service/admin/service/impl/UserServiceImpl.java @@ -0,0 +1,122 @@ +package cn.bunny.service.admin.service.impl; + +import cn.bunny.common.service.utils.EmptyUtil; +import cn.bunny.common.service.utils.JwtHelper; +import cn.bunny.dto.user.LoginDto; +import cn.bunny.entity.system.admin.AdminPower; +import cn.bunny.entity.system.admin.auth.AuthUserRole; +import cn.bunny.entity.system.email.EmailSend; +import cn.bunny.entity.system.email.EmailSendInit; +import cn.bunny.entity.system.email.EmailUsers; +import cn.bunny.entity.system.user.User; +import cn.bunny.module.mail.utils.MailSenderUtil; +import cn.bunny.result.constant.ExceptionConstant; +import cn.bunny.result.constant.MailMessageConstant; +import cn.bunny.result.constant.RedisUserConstant; +import cn.bunny.service.admin.mapper.AdminPowerMapper; +import cn.bunny.service.admin.mapper.AdminRoleMapper; +import cn.bunny.service.admin.mapper.EmailUsersMapper; +import cn.bunny.service.admin.mapper.UserMapper; +import cn.bunny.service.admin.service.UserService; +import cn.bunny.vo.system.login.LoginVo; +import cn.hutool.captcha.CaptchaUtil; +import cn.hutool.captcha.CircleCaptcha; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.util.DigestUtils; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + *

+ * 用户信息 服务实现类 + *

+ * + * @author Bunny + * @since 2024-05-18 + */ +@Service +public class UserServiceImpl extends ServiceImpl implements UserService { + @Autowired + private AdminRoleMapper roleMapper; + @Autowired + private AdminPowerMapper powerMapper; + @Autowired + private EmailUsersMapper emailUsersMapper; + @Autowired + private RedisTemplate redisTemplate; + + /** + * 前台用户登录接口 + * + * @param loginDto 登录参数 + * @return 登录后结果返回 + */ + @Override + public LoginVo login(LoginDto loginDto) { + // 判断用户和密码是否为空 + String username = loginDto.getUsername(); + EmptyUtil.isEmpty(username, ExceptionConstant.USERNAME_IS_EMPTY_Exception); + // 密码不能为空 + EmptyUtil.isEmpty(loginDto.getPassword(), ExceptionConstant.PASSWORD_NOT_EMPTY_Exception); + String password = DigestUtils.md5DigestAsHex(loginDto.getPassword().getBytes()); + // 查询数据库,用户对应的角色、权限 + User user = baseMapper.login(username, password); + Long userId = user.getId(); + + // 查询用户所有的角色信息 + AuthUserRole[] roleList = roleMapper.selectByRoleWithUserId(userId); + List roleCodeList = Arrays.stream(roleList).map(AuthUserRole::getRoleCode).toList(); + List roleIdList = Arrays.stream(roleList).map(AuthUserRole::getRoleId).toList(); + // 查询用户权限信息 + AdminPower[] adminPowerList = powerMapper.selectByPowerWithRoleIdList(roleIdList); + List powerCodeList = Arrays.stream(adminPowerList).map(AdminPower::getPowerCode).toList(); + + // 设置返回类型 + LoginVo loginVo = new LoginVo(); + BeanUtils.copyProperties(user, loginVo); + String token = JwtHelper.createToken(loginVo.getId(), loginVo.getEmail(), 7); + loginVo.setToken(token); + loginVo.setRoleList(roleCodeList); + loginVo.setPowerList(powerCodeList); + + return loginVo; + } + + /** + * 发送邮箱验证码 + * + * @param email 邮箱 + */ + @Override + public void sendEmail(String email) { + // 从数据库中获取发送邮箱参数 + EmailUsers emailUsers = emailUsersMapper.selectOne(Wrappers.lambdaQuery().eq(EmailUsers::getIsDefault, 1)); + EmailSendInit emailSendInit = new EmailSendInit(); + // 判断发送邮箱邮件是否为空 + EmptyUtil.isEmpty(emailUsers, MailMessageConstant.EMAIL_CONFIG_NOT_FOUND); + BeanUtils.copyProperties(emailUsers, emailSendInit); + emailSendInit.setUsername(emailUsers.getEmail()); + // 生成验证码 + MailSenderUtil mailSenderUtil = new MailSenderUtil(emailSendInit); + CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(150, 48, 4, 2); + // 生成验证码和可以 + String code = captcha.getCode(); + // 发送验证码 + EmailSend emailSend = new EmailSend(); + emailSend.setSubject("邮箱验证码"); + emailSend.setMessage(code); + emailSend.setSendTo(email); + emailSend.setIsRichText(false); + mailSenderUtil.sendSimpleEmail(emailSend); + + // 将验证码保存到Redis中,并设置15分钟过期 + redisTemplate.opsForValue().set(RedisUserConstant.ADMIN_EMAIL_CODE_PREFIX + email, code, 15, TimeUnit.MINUTES); + } +} diff --git a/service/service-main/src/main/resources/application-dev.yml b/service/service-admin/src/main/resources/application-dev.yml similarity index 64% rename from service/service-main/src/main/resources/application-dev.yml rename to service/service-admin/src/main/resources/application-dev.yml index 511b357..0cbfec1 100644 --- a/service/service-main/src/main/resources/application-dev.yml +++ b/service/service-admin/src/main/resources/application-dev.yml @@ -2,18 +2,23 @@ bunny: datasource: host: 106.15.251.123 port: 3305 - sqlData: guigu-oa + sqlData: bunny_docs username: root password: "02120212" redis: host: 47.120.65.66 port: 6379 - database: 3 + database: 0 password: "02120212" minio: endpointUrl: "http://129.211.31.58:9000" bucket-name: ssyx accessKey: bunny - secretKey: "02120212" \ No newline at end of file + secretKey: "02120212" + + nacos: + server-addr: z-bunny.cn:8848 + discovery: + namespace: bunnyBBS \ No newline at end of file diff --git a/service/service-main/src/main/resources/application.yml b/service/service-admin/src/main/resources/application.yml similarity index 82% rename from service/service-main/src/main/resources/application.yml rename to service/service-admin/src/main/resources/application.yml index 41452c0..be219c3 100644 --- a/service/service-main/src/main/resources/application.yml +++ b/service/service-admin/src/main/resources/application.yml @@ -1,12 +1,15 @@ server: - port: 8801 + port: 8802 spring: profiles: active: dev application: - name: bunny-mirror-server - + name: service-admin + main: + lazy-initialization: true + jmx: + enabled: false datasource: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver @@ -31,8 +34,20 @@ spring: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 + cloud: + sentinel: + log: + dir: logs/${spring.application.name}/sentinel + nacos: + discovery: + namespace: ${bunny.nacos.discovery.namespace} + server-addr: ${bunny.nacos.server-addr} + mybatis-plus: mapper-locations: classpath:mapper/*.xml + global-config: + db-config: + logic-delete-field: isDelete configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 查看日志 diff --git a/service/service-main/src/main/resources/banner.txt b/service/service-admin/src/main/resources/banner.txt similarity index 100% rename from service/service-main/src/main/resources/banner.txt rename to service/service-admin/src/main/resources/banner.txt diff --git a/service/service-main/src/main/resources/favicon.ico b/service/service-admin/src/main/resources/favicon.ico similarity index 100% rename from service/service-main/src/main/resources/favicon.ico rename to service/service-admin/src/main/resources/favicon.ico diff --git a/service/service-main/src/main/resources/logback.xml b/service/service-admin/src/main/resources/logback.xml similarity index 100% rename from service/service-main/src/main/resources/logback.xml rename to service/service-admin/src/main/resources/logback.xml diff --git a/service/service-admin/src/main/resources/mapper/AdminPowerMapper.xml b/service/service-admin/src/main/resources/mapper/AdminPowerMapper.xml new file mode 100644 index 0000000..b57bbf3 --- /dev/null +++ b/service/service-admin/src/main/resources/mapper/AdminPowerMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + id, power_name, power_code, description, create_time, update_time, update_user, is_delete + + + + + + + + diff --git a/service/service-admin/src/main/resources/mapper/AdminRoleMapper.xml b/service/service-admin/src/main/resources/mapper/AdminRoleMapper.xml new file mode 100644 index 0000000..006a91b --- /dev/null +++ b/service/service-admin/src/main/resources/mapper/AdminRoleMapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + id, role_name, description, role_code, create_time, update_time, update_user, is_deleted + + + + + diff --git a/service/service-admin/src/main/resources/mapper/EmailUsersMapper.xml b/service/service-admin/src/main/resources/mapper/EmailUsersMapper.xml new file mode 100644 index 0000000..6c2bfe9 --- /dev/null +++ b/service/service-admin/src/main/resources/mapper/EmailUsersMapper.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + id, email, password, host, port, create_time, update_time, update_user, is_delete + + + + + delete + from email_users + where id = #{id} + + + diff --git a/service/service-admin/src/main/resources/mapper/UserMapper.xml b/service/service-admin/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..2b190fc --- /dev/null +++ b/service/service-admin/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, nick_name, email, password, avatar, sex, person_description, join_time, last_login_time, last_login_ip, last_login_ip_address, total_integral, current_integral, status, create_time, update_time, update_user, is_deleted + + + + + diff --git a/service/service-main/src/main/java/cn/bunny/service/controller/BaseController.java b/service/service-main/src/main/java/cn/bunny/service/controller/BaseController.java deleted file mode 100644 index c383e52..0000000 --- a/service/service-main/src/main/java/cn/bunny/service/controller/BaseController.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.bunny.service.controller; - -import cn.bunny.common.result.utils.Result; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.session.SessionInformation; -import org.springframework.security.core.session.SessionRegistry; -import org.springframework.security.core.userdetails.User; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -@Tag(name = "后台登录管理") -@RestController -@RequestMapping("/") -public class BaseController { - @Autowired - private SessionRegistry sessionRegistry; - - @GetMapping() - public String index() { - return "欢迎访问"; - } - - @Operation(summary = "Security上下文对象", description = "Security上下文对象") - @GetMapping("/test/getSecurityHolder") - public Result getSecurityHolder() { - SecurityContext context = SecurityContextHolder.getContext(); - return Result.success(context); - } - - @Operation(summary = "当前所有登录的用户", description = "当前所有登录的用户") - @GetMapping("/test/getAllUserLogin") - public Result getAllUserLogin() { - return Result.success(sessionRegistry.getAllPrincipals()); - } - - @Operation(summary = "剔除下线", description = "剔除下线") - @GetMapping("/test/killOut") - public Result killOut(String userId) { - List allPrincipals = sessionRegistry.getAllPrincipals(); - for (Object allPrincipal : allPrincipals) { - // 获取当前所有已经登录session会话:未失效的session - List allSessions = sessionRegistry.getAllSessions(allPrincipal, false); - User user = (User) allPrincipals; - - // 如果用户名匹配将这个用户下线 - if (user.getUsername().equals(userId)) { - allSessions.forEach(SessionInformation::expireNow); - } - } - return Result.success(); - } -} diff --git a/service/service-main/src/main/java/cn/bunny/service/controller/IndexController.java b/service/service-main/src/main/java/cn/bunny/service/controller/IndexController.java deleted file mode 100644 index dfaa2dc..0000000 --- a/service/service-main/src/main/java/cn/bunny/service/controller/IndexController.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.bunny.service.controller; - -import cn.bunny.common.result.utils.Result; -import cn.bunny.entity.system.Login; -import cn.bunny.entity.system.SysUserinfo; -import cn.bunny.service.service.SysUserService; -import cn.bunny.vo.system.LoginVo; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.servlet.http.HttpServletRequest; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.Map; - -/** - *

- * 后台登录登出 - *

- */ -@Tag(name = "后台登录管理") -@RestController -@RequestMapping("/admin/system/index") -public class IndexController { - @Autowired - private SysUserService sysUserService; - - @Operation(summary = "登录", description = "登录") - @PostMapping("login") - public Result login(@RequestBody LoginVo loginVo) { - Login login = sysUserService.login(loginVo); - return Result.success(login); - } - - @Operation(summary = "获取用户信息", description = "获取用户信息") - @GetMapping("info") - public Result info(HttpServletRequest request) { - SysUserinfo userinfo = sysUserService.getUserinfo(request); - return Result.success(userinfo); - } - - @Operation(summary = "退出", description = "退出") - @GetMapping("logout") - public Result> logout() { - return Result.success(); - } -} \ No newline at end of file diff --git a/service/service-main/src/main/java/cn/bunny/service/controller/MailController.java b/service/service-main/src/main/java/cn/bunny/service/controller/MailController.java deleted file mode 100644 index 58f363f..0000000 --- a/service/service-main/src/main/java/cn/bunny/service/controller/MailController.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.bunny.service.controller; - -import cn.bunny.common.result.utils.Result; -import cn.bunny.entity.email.EmailSend; -import cn.bunny.service.service.EmailService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@Tag(name = "发送邮件") -@RequestMapping("/test/mail") -@Slf4j -public class MailController { - @Autowired - private EmailService emailService; - - @Operation(summary = "发送简单邮件", description = "发送简单邮件") - @PostMapping("/send-text") - public Result sendText(@RequestBody EmailSend emailSend) { - log.info("发送简单邮件"); - emailService.sendSimpleEmail(emailSend); - return Result.success(); - } - - @Operation(summary = "发送带附件邮件", description = "发送带附件邮件") - @PostMapping("send-attachment") - public Result sendAttachment(@RequestBody EmailSend emailSend) { - log.info("发送带附件邮件"); - boolean isSuccess = emailService.sendAttachmentEmail(emailSend); - return isSuccess ? Result.success() : Result.error(); - } - - @Operation(summary = "发送富文本邮件", description = "发送富文本邮件") - @PostMapping("send-rich") - public Result sendRich(@RequestBody EmailSend emailSend) { - log.info("发送富文本邮件"); - - boolean isSuccess = emailService.sendRich(emailSend); - return isSuccess ? Result.success() : Result.error(); - } - - @Operation(summary = "发送带抄送的邮件", description = "发送带抄送的邮件") - @PostMapping("send-cc") - public Result sendCC(@RequestBody EmailSend emailSend) { - log.info("发送带抄送的邮件"); - boolean isSuccess = emailService.sendCC(emailSend); - return isSuccess ? Result.success() : Result.error(); - } -} diff --git a/service/service-main/src/main/java/cn/bunny/service/controller/SysMenuController.java b/service/service-main/src/main/java/cn/bunny/service/controller/SysMenuController.java deleted file mode 100644 index a596845..0000000 --- a/service/service-main/src/main/java/cn/bunny/service/controller/SysMenuController.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.bunny.service.controller; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - *

- * 菜单表 前端控制器 - *

- * - * @author Bunny - * @since 2024-05-06 - */ -@RestController -@RequestMapping("/sysMenu") -public class SysMenuController { - -} diff --git a/service/service-main/src/main/java/cn/bunny/service/mapper/SysMenuMapper.java b/service/service-main/src/main/java/cn/bunny/service/mapper/SysMenuMapper.java deleted file mode 100644 index 505d0f9..0000000 --- a/service/service-main/src/main/java/cn/bunny/service/mapper/SysMenuMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bunny.service.mapper; - -import cn.bunny.entity.system.SysMenu; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 菜单表 Mapper 接口 - *

- * - * @author Bunny - * @since 2024-05-06 - */ -public interface SysMenuMapper extends BaseMapper { - -} diff --git a/service/service-main/src/main/java/cn/bunny/service/mapper/SysRoleMapper.java b/service/service-main/src/main/java/cn/bunny/service/mapper/SysRoleMapper.java deleted file mode 100644 index c80954c..0000000 --- a/service/service-main/src/main/java/cn/bunny/service/mapper/SysRoleMapper.java +++ /dev/null @@ -1,7 +0,0 @@ -package cn.bunny.service.mapper; - -import cn.bunny.entity.system.SysRole; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -public interface SysRoleMapper extends BaseMapper { -} diff --git a/service/service-main/src/main/java/cn/bunny/service/mapper/SysUserMapper.java b/service/service-main/src/main/java/cn/bunny/service/mapper/SysUserMapper.java deleted file mode 100644 index 345d10f..0000000 --- a/service/service-main/src/main/java/cn/bunny/service/mapper/SysUserMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.bunny.service.mapper; - - -import cn.bunny.entity.system.SysUser; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - *

- * 用户表 Mapper 接口 - *

- * - * @author bunny - * @since 2024-04-22 - */ -@Mapper -public interface SysUserMapper extends BaseMapper { - -} diff --git a/service/service-main/src/main/java/cn/bunny/service/security/CustomAuthorizationManagerServiceImpl.java b/service/service-main/src/main/java/cn/bunny/service/security/CustomAuthorizationManagerServiceImpl.java deleted file mode 100644 index 6c3fccb..0000000 --- a/service/service-main/src/main/java/cn/bunny/service/security/CustomAuthorizationManagerServiceImpl.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.bunny.service.security; - -import cn.bunny.security.service.CustomAuthorizationManagerService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.authorization.AuthorizationDecision; -import org.springframework.security.core.Authentication; -import org.springframework.security.web.access.intercept.RequestAuthorizationContext; -import org.springframework.stereotype.Service; - -import java.util.function.Supplier; - - -/** - * 自定义权限判断 - * 判断用户有哪些权限 - */ -@Service -@Slf4j -public class CustomAuthorizationManagerServiceImpl implements CustomAuthorizationManagerService { - @Override - public void verify(Supplier authentication, RequestAuthorizationContext requestAuthorizationContext) { - CustomAuthorizationManagerService.super.verify(authentication, requestAuthorizationContext); - } - - @Override - public AuthorizationDecision check(Supplier authentication, RequestAuthorizationContext object) { - String token = object.getRequest().getHeader("token"); - - if (token == null) { - throw new AccessDeniedException(""); - } - - return new AuthorizationDecision(true); - } -} diff --git a/service/service-main/src/main/java/cn/bunny/service/security/CustomUserDetailsService.java b/service/service-main/src/main/java/cn/bunny/service/security/CustomUserDetailsService.java deleted file mode 100644 index b4d248b..0000000 --- a/service/service-main/src/main/java/cn/bunny/service/security/CustomUserDetailsService.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.bunny.service.security; - -import cn.bunny.common.constant.CommonMessageConstant; -import cn.bunny.common.service.exception.BunnyException; -import cn.bunny.entity.system.SysRole; -import cn.bunny.entity.system.SysUser; -import cn.bunny.security.custom.CustomUser; -import cn.bunny.service.mapper.SysRoleMapper; -import cn.bunny.service.mapper.SysUserMapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.core.authority.AuthorityUtils; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UsernameNotFoundException; - -import java.util.List; - -@Configuration -public class CustomUserDetailsService implements cn.bunny.security.service.CustomUserDetailsService { - @Autowired - private SysUserMapper sysUserMapper; - @Autowired - private SysRoleMapper sysRoleMapper; - - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - SysUser sysUser = sysUserMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username)); - List sysRoleList = sysRoleMapper.selectList(null); - if (sysUser == null) { - throw new UsernameNotFoundException(CommonMessageConstant.USER_DOES_NOT_EXIST); - } - - if (sysUser.getStatus() == 0) { - throw new BunnyException(CommonMessageConstant.ACCOUNT_LOCKED); - } - - List roleAuthoritieList = sysRoleList.stream().map(SysRole::getRoleCode).toList(); - return new CustomUser(sysUser, AuthorityUtils.createAuthorityList(roleAuthoritieList)); - } -} diff --git a/service/service-main/src/main/java/cn/bunny/service/service/EmailService.java b/service/service-main/src/main/java/cn/bunny/service/service/EmailService.java deleted file mode 100644 index afdcd89..0000000 --- a/service/service-main/src/main/java/cn/bunny/service/service/EmailService.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.bunny.service.service; - - -import cn.bunny.entity.email.EmailSend; - -public interface EmailService { - /** - * 发送邮件-简单 - * - * @param emailSend 邮件消息 - */ - void sendSimpleEmail(EmailSend emailSend); - - /** - * 发送带附件邮件 - * - * @param emailSend 邮件消息 - * @return 是否成功 - */ - boolean sendAttachmentEmail(EmailSend emailSend); - - /** - * 发送富文本邮件 - * - * @param emailSend 邮件消息 - * @return 是否成功 - */ - boolean sendRich(EmailSend emailSend); - - /** - * 发送带抄送的邮件 - * - * @param emailSend 邮件消息 - * @return 是否成功 - */ - boolean sendCC(EmailSend emailSend); -} diff --git a/service/service-main/src/main/java/cn/bunny/service/service/SysMenuService.java b/service/service-main/src/main/java/cn/bunny/service/service/SysMenuService.java deleted file mode 100644 index 8e484f8..0000000 --- a/service/service-main/src/main/java/cn/bunny/service/service/SysMenuService.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bunny.service.service; - -import cn.bunny.entity.system.SysMenu; -import com.baomidou.mybatisplus.extension.service.IService; - -/** - *

- * 菜单表 服务类 - *

- * - * @author Bunny - * @since 2024-05-06 - */ -public interface SysMenuService extends IService { - -} diff --git a/service/service-main/src/main/java/cn/bunny/service/service/SysRoleService.java b/service/service-main/src/main/java/cn/bunny/service/service/SysRoleService.java deleted file mode 100644 index 8e5a33c..0000000 --- a/service/service-main/src/main/java/cn/bunny/service/service/SysRoleService.java +++ /dev/null @@ -1,8 +0,0 @@ -package cn.bunny.service.service; - -import cn.bunny.entity.system.SysRole; -import com.baomidou.mybatisplus.extension.service.IService; - -public interface SysRoleService extends IService { - -} diff --git a/service/service-main/src/main/java/cn/bunny/service/service/SysUserService.java b/service/service-main/src/main/java/cn/bunny/service/service/SysUserService.java deleted file mode 100644 index c486a78..0000000 --- a/service/service-main/src/main/java/cn/bunny/service/service/SysUserService.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.bunny.service.service; - - -import cn.bunny.entity.system.Login; -import cn.bunny.entity.system.SysUser; -import cn.bunny.entity.system.SysUserinfo; -import cn.bunny.vo.system.LoginVo; -import com.baomidou.mybatisplus.extension.service.IService; -import jakarta.servlet.http.HttpServletRequest; - -/** - *

- * 用户表 服务类 - *

- * - * @author bunny - * @since 2024-04-22 - */ -public interface SysUserService extends IService { - /** - * 登录 - * - * @param vo 登录条件 - * @return 返回token - */ - Login login(LoginVo vo); - - /** - * 获取用户信息 - * - * @param request 请求头 - * @return 用户信息 - */ - SysUserinfo getUserinfo(HttpServletRequest request); - - /** - * 根据用户名查询用户信息 - * - * @param username 用户名 - * @return 用户信息 - */ - SysUser getByUsername(String username); -} diff --git a/service/service-main/src/main/java/cn/bunny/service/service/impl/EmailServiceImpl.java b/service/service-main/src/main/java/cn/bunny/service/service/impl/EmailServiceImpl.java deleted file mode 100644 index 1c90bec..0000000 --- a/service/service-main/src/main/java/cn/bunny/service/service/impl/EmailServiceImpl.java +++ /dev/null @@ -1,98 +0,0 @@ -package cn.bunny.service.service.impl; - -import cn.bunny.entity.email.EmailSend; -import cn.bunny.entity.email.EmailSendInit; -import cn.bunny.module.mail.utils.MailSenderUtil; -import cn.bunny.service.service.EmailService; -import jakarta.mail.MessagingException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -@Service -@Slf4j -public class EmailServiceImpl implements EmailService { - - /** - * 发送邮件-简单 - * - * @param emailSend 邮件消息 - */ - @Override - public void sendSimpleEmail(EmailSend emailSend) { - EmailSendInit emailSendInit = new EmailSendInit(); - emailSendInit.setHost("smtp.qq.com"); - emailSendInit.setPort(465); - emailSendInit.setUsername("3324855376@qq.com"); - emailSendInit.setPassword("axyqbvfuxkdqdaai"); - MailSenderUtil mailSenderUtil = new MailSenderUtil(emailSendInit); - mailSenderUtil.sendSimpleEmail(emailSend); - } - - /** - * 发送带附件邮件 - * - * @param emailSend 邮件消息 - * @return 是否成功 - */ - @Override - public boolean sendAttachmentEmail(EmailSend emailSend) { - try { - EmailSendInit emailSendInit = new EmailSendInit(); - emailSendInit.setHost("smtp.qq.com"); - emailSendInit.setPort(465); - emailSendInit.setUsername("3324855376@qq.com"); - emailSendInit.setPassword("axyqbvfuxkdqdaai"); - - MailSenderUtil mailSenderUtil = new MailSenderUtil(emailSendInit); - mailSenderUtil.sendEmail(emailSend); - return true; - } catch (MessagingException e) { - return false; - } - } - - /** - * 发送富文本邮件 - * - * @param emailSend 邮件消息 - * @return 是否成功 - */ - @Override - public boolean sendRich(EmailSend emailSend) { - try { - EmailSendInit emailSendInit = new EmailSendInit(); - emailSendInit.setHost("smtp.qq.com"); - emailSendInit.setPort(465); - emailSendInit.setUsername("3324855376@qq.com"); - emailSendInit.setPassword("axyqbvfuxkdqdaai"); - - MailSenderUtil mailSenderUtil = new MailSenderUtil(emailSendInit); - mailSenderUtil.sendRichText(emailSend, true); - return true; - } catch (MessagingException e) { - return false; - } - } - - /** - * 发送带抄送的邮件 - * - * @param emailSend 邮件消息 - */ - @Override - public boolean sendCC(EmailSend emailSend) { - try { - EmailSendInit emailSendInit = new EmailSendInit(); - emailSendInit.setHost("smtp.qq.com"); - emailSendInit.setPort(465); - emailSendInit.setUsername("3324855376@qq.com"); - emailSendInit.setPassword("axyqbvfuxkdqdaai"); - - MailSenderUtil mailSenderUtil = new MailSenderUtil(emailSendInit); - mailSenderUtil.sendCC(emailSend, true); - return true; - } catch (MessagingException e) { - return false; - } - } -} diff --git a/service/service-main/src/main/java/cn/bunny/service/service/impl/SysMenuServiceImpl.java b/service/service-main/src/main/java/cn/bunny/service/service/impl/SysMenuServiceImpl.java deleted file mode 100644 index f58f687..0000000 --- a/service/service-main/src/main/java/cn/bunny/service/service/impl/SysMenuServiceImpl.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.bunny.service.service.impl; - -import cn.bunny.entity.system.SysMenu; -import cn.bunny.service.mapper.SysMenuMapper; -import cn.bunny.service.service.SysMenuService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; - -/** - *

- * 菜单表 服务实现类 - *

- * - * @author Bunny - * @since 2024-05-06 - */ -@Service -public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService { - -} diff --git a/service/service-main/src/main/java/cn/bunny/service/service/impl/SysRoleServiceImpl.java b/service/service-main/src/main/java/cn/bunny/service/service/impl/SysRoleServiceImpl.java deleted file mode 100644 index 5dbbb4a..0000000 --- a/service/service-main/src/main/java/cn/bunny/service/service/impl/SysRoleServiceImpl.java +++ /dev/null @@ -1,11 +0,0 @@ -package cn.bunny.service.service.impl; - -import cn.bunny.entity.system.SysRole; -import cn.bunny.service.mapper.SysRoleMapper; -import cn.bunny.service.service.SysRoleService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; - -@Service -public class SysRoleServiceImpl extends ServiceImpl implements SysRoleService { -} diff --git a/service/service-main/src/main/java/cn/bunny/service/service/impl/SysUserServiceImpl.java b/service/service-main/src/main/java/cn/bunny/service/service/impl/SysUserServiceImpl.java deleted file mode 100644 index 73897ae..0000000 --- a/service/service-main/src/main/java/cn/bunny/service/service/impl/SysUserServiceImpl.java +++ /dev/null @@ -1,91 +0,0 @@ -package cn.bunny.service.service.impl; - -import cn.bunny.common.constant.CommonMessageConstant; -import cn.bunny.common.service.exception.BunnyException; -import cn.bunny.common.service.utils.JwtHelper; -import cn.bunny.entity.system.Login; -import cn.bunny.entity.system.SysUser; -import cn.bunny.entity.system.SysUserinfo; -import cn.bunny.service.mapper.SysUserMapper; -import cn.bunny.service.service.SysUserService; -import cn.bunny.vo.system.LoginVo; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import jakarta.servlet.http.HttpServletRequest; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.stereotype.Service; -import org.springframework.util.DigestUtils; - -/** - *

- * 用户表 服务实现类 - *

- * - * @author bunny - * @since 2024-04-22 - */ -@Service -public class SysUserServiceImpl extends ServiceImpl implements SysUserService { - @Autowired - private RedisTemplate redisTemplate; - - /** - * 登录 - * - * @param vo 登录条件 - * @return 返回token - */ - @Override - public Login login(LoginVo vo) { - String username = vo.getUsername(); - String password = vo.getPassword(); - // 查询用户信息 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SysUser::getUsername, username); - SysUser sysUser = getOne(wrapper); - - // 用户是否存在 - if (sysUser == null) { - throw new BunnyException(CommonMessageConstant.ACCOUNT_NOT_FOUND); - } - - // 判断是否被禁用 - if (sysUser.getStatus() == 0) { - throw new BunnyException(CommonMessageConstant.ACCOUNT_LOCKED); - } - - // 判断密码 - String md5DigestAsHexPassword = DigestUtils.md5DigestAsHex(password.getBytes()); - if (!md5DigestAsHexPassword.equals(sysUser.getPassword())) { - throw new BunnyException(CommonMessageConstant.PASSWORD_ERROR); - } - // 添加token - String token = JwtHelper.createToken(sysUser.getId(), sysUser.getUsername()); - return Login.builder().token(token).build(); - } - - /** - * 获取用户信息 - * - * @param request 请求头 - * @return 用户信息 - */ - @Override - public SysUserinfo getUserinfo(HttpServletRequest request) { - redisTemplate.opsForValue().set("test", "测试"); - return null; - } - - /** - * 根据用户名查询用户信息 - * - * @param username 用户名 - * @return 用户信息 - */ - @Override - public SysUser getByUsername(String username) { - return getOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username)); - } -} diff --git a/service/service-main/src/main/resources/mapper/SysMenuMapper.xml b/service/service-main/src/main/resources/mapper/SysMenuMapper.xml deleted file mode 100644 index 9464822..0000000 --- a/service/service-main/src/main/resources/mapper/SysMenuMapper.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - id, parent_id, name, type, path, component, perms, icon, sort_value, status, create_time, update_time, is_deleted - - - diff --git a/service/service-main/src/main/resources/mapper/SysRoleMapper.xml b/service/service-main/src/main/resources/mapper/SysRoleMapper.xml deleted file mode 100644 index 3d5b7e5..0000000 --- a/service/service-main/src/main/resources/mapper/SysRoleMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/service/service-main/src/main/resources/mapper/SysUserMapper.xml b/service/service-main/src/main/resources/mapper/SysUserMapper.xml deleted file mode 100644 index 7134a56..0000000 --- a/service/service-main/src/main/resources/mapper/SysUserMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/service/service-main/src/test/java/cn/bunny/CustomPasswordEncoderTest.java b/service/service-main/src/test/java/cn/bunny/CustomPasswordEncoderTest.java deleted file mode 100644 index f952f74..0000000 --- a/service/service-main/src/test/java/cn/bunny/CustomPasswordEncoderTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package cn.bunny; - -import cn.bunny.security.custom.CustomPasswordEncoder; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.security.crypto.password.PasswordEncoder; - -@SpringBootTest(classes = CustomPasswordEncoder.class) -class CustomPasswordEncoderTest { - @Autowired - private CustomPasswordEncoder customPasswordEncoder; - @Autowired - private PasswordEncoder passwordEncoder; - - @Test - void testCustomPasswordEncoder() { - String encode = customPasswordEncoder.encode("111111"); - System.out.println(encode); - } - - @Test - void testPasswordEncoder() { - String encode = passwordEncoder.encode("111111"); - System.out.println(encode); - } -} \ No newline at end of file diff --git a/service/service-web/Dockerfile b/service/service-web/Dockerfile new file mode 100644 index 0000000..447a2bc --- /dev/null +++ b/service/service-web/Dockerfile @@ -0,0 +1,21 @@ +FROM openjdk:21 +MAINTAINER bunny + +#系统编码 +ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 + +# 设置时区,构建镜像时执行的命令 +RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +RUN echo "Asia/Shanghai" > /etc/timezone + +# 设定工作目录 +WORKDIR /home/bunny + +# 复制jar包 +COPY target/*.jar /home/bunny/app.jar + +#启动容器时的进程 +ENTRYPOINT ["java","-jar","/home/bunny/app.jar"] + +#暴露 8800 端口 +EXPOSE 8800 \ No newline at end of file diff --git a/service/service-web/pom.xml b/service/service-web/pom.xml new file mode 100644 index 0000000..7459383 --- /dev/null +++ b/service/service-web/pom.xml @@ -0,0 +1,92 @@ + + 4.0.0 + + cn.bunny + service + 0.0.1-SNAPSHOT + + + service-web + jar + + service-web + https://maven.apache.org + + + UTF-8 + 192.168.3.98:1100 + 192.168.3.98:2375 + bunny-web + + + + + cn.bunny + module-mail + 0.0.1-SNAPSHOT + + + cn.bunny + common-utils + 0.0.1-SNAPSHOT + + + cn.bunny + module-minio + 0.0.1-SNAPSHOT + + + + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + com.spotify + docker-maven-plugin + 1.2.2 + + + + build-image + + package + + build + push + + + + + harbor + http://${docker.repostory} + + http://${docker.host} + + + ${docker.repostory}/${docker.registry.name}/${project.artifactId}:${project.version} + + + ${project.basedir} + + false + + + + + diff --git a/service/service-web/src/main/java/cn/bunny/service/web/ServiceWebApplication.java b/service/service-web/src/main/java/cn/bunny/service/web/ServiceWebApplication.java new file mode 100644 index 0000000..0a19e1b --- /dev/null +++ b/service/service-web/src/main/java/cn/bunny/service/web/ServiceWebApplication.java @@ -0,0 +1,25 @@ +package cn.bunny.service.web; + +import lombok.extern.slf4j.Slf4j; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@SpringBootApplication +@Slf4j +@ComponentScan(basePackages = {"cn.bunny"}) +@MapperScan("cn.bunny.service.web.mapper") +@EnableCaching// 开启缓存注解 +@EnableScheduling// 开启task +// @EnableFeignClients(basePackages = {"cn.bunny.feign.admin"}) +@EnableTransactionManagement // 开启注解方式的事务管理 +public class ServiceWebApplication { + public static void main(String[] args) { + log.info("ServiceApplication启动..."); + SpringApplication.run(ServiceWebApplication.class, args); + } +} diff --git a/service/service-main/src/main/java/cn/bunny/service/aop/annotation/AutoFill.java b/service/service-web/src/main/java/cn/bunny/service/web/aop/annotation/AutoFill.java similarity index 100% rename from service/service-main/src/main/java/cn/bunny/service/aop/annotation/AutoFill.java rename to service/service-web/src/main/java/cn/bunny/service/web/aop/annotation/AutoFill.java diff --git a/service/service-main/src/main/java/cn/bunny/service/aop/aspect/AutoFillAspect.java b/service/service-web/src/main/java/cn/bunny/service/web/aop/aspect/AutoFillAspect.java similarity index 100% rename from service/service-main/src/main/java/cn/bunny/service/aop/aspect/AutoFillAspect.java rename to service/service-web/src/main/java/cn/bunny/service/web/aop/aspect/AutoFillAspect.java diff --git a/service/service-web/src/main/java/cn/bunny/service/web/config/Knife4jConfig.java b/service/service-web/src/main/java/cn/bunny/service/web/config/Knife4jConfig.java new file mode 100644 index 0000000..5d354de --- /dev/null +++ b/service/service-web/src/main/java/cn/bunny/service/web/config/Knife4jConfig.java @@ -0,0 +1,40 @@ +package cn.bunny.service.web.config; + +import io.swagger.v3.oas.models.ExternalDocumentation; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; +import lombok.extern.slf4j.Slf4j; +import org.springdoc.core.models.GroupedOpenApi; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@Slf4j +public class Knife4jConfig { + @Bean + public OpenAPI openAPI() { + log.info("Knife4jConfig===>配置knife4j"); + // 作者等信息 + Contact contact = new Contact().name("Bunny").email("1319900154@qq.com").url("http://z-bunny.com"); + // 使用协议 + License license = new License().name("MIT").url("http://MUT.com"); + // 相关信息 + Info info = new Info().title("Bunny-Java-Template").description("Bunny的Java模板").version("v1.0.0").contact(contact).license(license); + + return new OpenAPI().info(info).externalDocs(new ExternalDocumentation()); + } + + // 管理员相关分类接口 + @Bean + public GroupedOpenApi groupedOpenApi() { + return GroupedOpenApi.builder().group("前台接口管理").pathsToMatch("/api/**").build(); + } + + // 测试相关分类接口 + @Bean + public GroupedOpenApi testGroupedOpenApi() { + return GroupedOpenApi.builder().group("测试相关分类接口").pathsToMatch("/test/**").build(); + } +} diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/config/WebMvcConfiguration.java b/service/service-web/src/main/java/cn/bunny/service/web/config/WebMvcConfiguration.java similarity index 52% rename from common/service-utils/src/main/java/cn/bunny/common/service/config/WebMvcConfiguration.java rename to service/service-web/src/main/java/cn/bunny/service/web/config/WebMvcConfiguration.java index 7624b83..197bcfe 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/config/WebMvcConfiguration.java +++ b/service/service-web/src/main/java/cn/bunny/service/web/config/WebMvcConfiguration.java @@ -1,22 +1,18 @@ -package cn.bunny.common.service.config; +package cn.bunny.service.web.config; +import cn.bunny.service.web.interceptor.UserTokenInterceptor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; 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.InterceptorRegistry; 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/"); - } + @Autowired + private UserTokenInterceptor userTokenInterceptor; /** * 跨域配置 @@ -31,4 +27,12 @@ public class WebMvcConfiguration implements WebMvcConfigurer { // 放行哪些原始域 .allowedOriginPatterns("*").allowedMethods("GET", "POST", "PUT", "DELETE").allowedHeaders("*").exposedHeaders("*"); } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + String[] excludeList = {"/api/checkCode", "/api/sendEmailCode", "/api/register", "/api/login", "/api/article/loadArticle/**"}; + log.info("WebMvcConfiguration===>开始注册自定义拦截器..."); + registry.addInterceptor(userTokenInterceptor).addPathPatterns("/api/**") + .excludePathPatterns(excludeList); + } } diff --git a/service/service-web/src/main/java/cn/bunny/service/web/controller/IndexController.java b/service/service-web/src/main/java/cn/bunny/service/web/controller/IndexController.java new file mode 100644 index 0000000..7588cd8 --- /dev/null +++ b/service/service-web/src/main/java/cn/bunny/service/web/controller/IndexController.java @@ -0,0 +1,16 @@ +package cn.bunny.service.web.controller; + +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Tag(name = "访问索引页") +@RestController +@RequestMapping("/") +public class IndexController { + @GetMapping("") + public String index() { + return "欢迎访问 Bunny Template 微服务模板"; + } +} diff --git a/service/service-web/src/main/java/cn/bunny/service/web/controller/LoginController.java b/service/service-web/src/main/java/cn/bunny/service/web/controller/LoginController.java new file mode 100644 index 0000000..c44781d --- /dev/null +++ b/service/service-web/src/main/java/cn/bunny/service/web/controller/LoginController.java @@ -0,0 +1,55 @@ +package cn.bunny.service.web.controller; + +import cn.bunny.dto.user.LoginDto; +import cn.bunny.dto.user.RegisterDto; +import cn.bunny.result.Result; +import cn.bunny.service.web.service.LoginService; +import cn.bunny.vo.system.login.LoginVo; +import cn.bunny.vo.system.login.ValidateCodeVo; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@Tag(name = "登录和注册相关接口") +@RequestMapping("/api") +@RestController +public class LoginController { + @Autowired + private LoginService loginService; + + @Operation(summary = "登录接口", description = "前台用户登录接口") + @PostMapping("login") + public Result login(@RequestBody LoginDto loginDto) { + LoginVo vo = loginService.login(loginDto); + return Result.success(vo); + } + + @Operation(summary = "生成验证码", description = "生成验证码") + @GetMapping("checkCode") + public Result checkCode() { + ValidateCodeVo vo = loginService.checkCode(); + return Result.success(vo); + } + + @Operation(summary = "发送邮箱验证码", description = "发送邮箱验证码") + @PostMapping("sendEmailCode") + public Result sendEmailCode(String email) { + loginService.sendEmailCode(email); + return Result.success(); + } + + @Operation(summary = "注册用户", description = "注册用户") + @PostMapping("register") + public Result register(@RequestBody RegisterDto registerDto) { + loginService.register(registerDto); + return Result.success(); + } + + @Operation(summary = "退出登录", description = "退出登录") + @PostMapping("logout") + public Result logout() { + loginService.logout(); + return Result.success(); + } +} diff --git a/service/service-web/src/main/java/cn/bunny/service/web/interceptor/UserTokenInterceptor.java b/service/service-web/src/main/java/cn/bunny/service/web/interceptor/UserTokenInterceptor.java new file mode 100644 index 0000000..3dbf895 --- /dev/null +++ b/service/service-web/src/main/java/cn/bunny/service/web/interceptor/UserTokenInterceptor.java @@ -0,0 +1,54 @@ +package cn.bunny.service.web.interceptor; + +import cn.bunny.result.constant.RedisUserConstant; +import cn.bunny.result.ResultCodeEnum; +import cn.bunny.result.Result; +import cn.bunny.common.service.context.BaseContext; +import cn.bunny.common.service.utils.JwtHelper; +import cn.bunny.common.service.utils.ResponseUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.lang.Nullable; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +@Component +@Slf4j +public class UserTokenInterceptor implements HandlerInterceptor { + @Autowired + private RedisTemplate redisTemplate; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + log.info("UserTokenInterceptor===>设置拦截器"); + String token = request.getHeader("token"); + Long userId = JwtHelper.getUserId(token); + String username = JwtHelper.getUsername(token); + Object redisUserinfo = redisTemplate.opsForValue().get(RedisUserConstant.getUserLoginInfoPrefix(username)); + + // 不是动态方法直接返回 + if (!(handler instanceof HandlerMethod)) return true; + // 解析不到userId + if (userId == null) { + ResponseUtil.out(response, Result.error(ResultCodeEnum.LOGIN_AUTH)); + return false; + } + if (redisUserinfo == null) { + ResponseUtil.out(response, Result.error(ResultCodeEnum.LOGIN_AUTH)); + return false; + } + + BaseContext.setUserId(userId); + BaseContext.setUsername(username); + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { + BaseContext.removeUser(); + } +} diff --git a/service/service-web/src/main/java/cn/bunny/service/web/mapper/EmailTemplateMapper.java b/service/service-web/src/main/java/cn/bunny/service/web/mapper/EmailTemplateMapper.java new file mode 100644 index 0000000..bb7521d --- /dev/null +++ b/service/service-web/src/main/java/cn/bunny/service/web/mapper/EmailTemplateMapper.java @@ -0,0 +1,18 @@ +package cn.bunny.service.web.mapper; + +import cn.bunny.entity.system.email.EmailTemplate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Bunny + * @since 2024-05-19 + */ +@Mapper +public interface EmailTemplateMapper extends BaseMapper { + +} diff --git a/service/service-web/src/main/java/cn/bunny/service/web/mapper/EmailUsersMapper.java b/service/service-web/src/main/java/cn/bunny/service/web/mapper/EmailUsersMapper.java new file mode 100644 index 0000000..b087ba0 --- /dev/null +++ b/service/service-web/src/main/java/cn/bunny/service/web/mapper/EmailUsersMapper.java @@ -0,0 +1,18 @@ +package cn.bunny.service.web.mapper; + +import cn.bunny.entity.system.email.EmailUsers; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Bunny + * @since 2024-05-14 + */ +@Mapper +public interface EmailUsersMapper extends BaseMapper { + +} diff --git a/service/service-web/src/main/java/cn/bunny/service/web/mapper/UserMapper.java b/service/service-web/src/main/java/cn/bunny/service/web/mapper/UserMapper.java new file mode 100644 index 0000000..51361d8 --- /dev/null +++ b/service/service-web/src/main/java/cn/bunny/service/web/mapper/UserMapper.java @@ -0,0 +1,27 @@ +package cn.bunny.service.web.mapper; + +import cn.bunny.entity.system.user.User; +import cn.bunny.vo.system.login.LoginVo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 用户信息 Mapper 接口 + *

+ * + * @author Bunny + * @since 2024-05-13 + */ +@Mapper +public interface UserMapper extends BaseMapper { + + /** + * 前台用户登录接口 + * + * @param username 邮箱/昵称 + * @param password 吗,Image + * @return 登录参数 + */ + LoginVo login(String username, String password); +} diff --git a/service/service-web/src/main/java/cn/bunny/service/web/service/LoginService.java b/service/service-web/src/main/java/cn/bunny/service/web/service/LoginService.java new file mode 100644 index 0000000..4c58e1f --- /dev/null +++ b/service/service-web/src/main/java/cn/bunny/service/web/service/LoginService.java @@ -0,0 +1,44 @@ +package cn.bunny.service.web.service; + +import cn.bunny.dto.user.LoginDto; +import cn.bunny.dto.user.RegisterDto; +import cn.bunny.entity.system.user.User; +import cn.bunny.vo.system.login.LoginVo; +import cn.bunny.vo.system.login.ValidateCodeVo; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface LoginService extends IService { + /** + * 前台用户登录接口 + * + * @param loginDto 登录参数 + * @return 登录后结果返回 + */ + LoginVo login(LoginDto loginDto); + + /** + * 生成验证码 + * + * @return 验证码生成信息 + */ + ValidateCodeVo checkCode(); + + /** + * 发送邮箱验证码 + * + * @param email 邮箱 + */ + void sendEmailCode(String email); + + /** + * 注册用户 + * + * @param registerDto 注册表单 + */ + void register(RegisterDto registerDto); + + /** + * 退出登录 + */ + void logout(); +} diff --git a/service/service-web/src/main/java/cn/bunny/service/web/service/UserService.java b/service/service-web/src/main/java/cn/bunny/service/web/service/UserService.java new file mode 100644 index 0000000..2267eb4 --- /dev/null +++ b/service/service-web/src/main/java/cn/bunny/service/web/service/UserService.java @@ -0,0 +1,38 @@ +package cn.bunny.service.web.service; + +import cn.bunny.dto.user.ResetPwdDto; +import cn.bunny.entity.system.user.User; +import cn.bunny.vo.system.user.UserInfoVo; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 用户信息 服务类 + *

+ * + * @author Bunny + * @since 2024-05-13 + */ +public interface UserService extends IService { + + /** + * 重置密码 + * + * @param dto 重置密码参数 + */ + void resetPwd(ResetPwdDto dto); + + /** + * 获取当前登录用户信息 + * + * @return 获取用户信息返回参数 + */ + UserInfoVo getCurrentUserInfo(); + + /** + * 获取登录用户信息 + * + * @return 获取用户信息返回参数 + */ + UserInfoVo getUserInfo(Long userId); +} diff --git a/service/service-web/src/main/java/cn/bunny/service/web/service/impl/LoginServiceImpl.java b/service/service-web/src/main/java/cn/bunny/service/web/service/impl/LoginServiceImpl.java new file mode 100644 index 0000000..057b182 --- /dev/null +++ b/service/service-web/src/main/java/cn/bunny/service/web/service/impl/LoginServiceImpl.java @@ -0,0 +1,174 @@ +package cn.bunny.service.web.service.impl; + +import cn.bunny.common.service.context.BaseContext; +import cn.bunny.common.service.exception.BunnyException; +import cn.bunny.common.service.utils.EmptyUtil; +import cn.bunny.common.service.utils.JwtHelper; +import cn.bunny.dto.user.LoginDto; +import cn.bunny.dto.user.RegisterDto; +import cn.bunny.entity.system.email.EmailSend; +import cn.bunny.entity.system.email.EmailSendInit; +import cn.bunny.entity.system.email.EmailTemplate; +import cn.bunny.entity.system.email.EmailUsers; +import cn.bunny.entity.system.user.User; +import cn.bunny.module.mail.utils.MailSenderUtil; +import cn.bunny.result.constant.ExceptionConstant; +import cn.bunny.result.constant.MailMessageConstant; +import cn.bunny.result.constant.RedisUserConstant; +import cn.bunny.result.constant.UserConstant; +import cn.bunny.service.web.mapper.EmailTemplateMapper; +import cn.bunny.service.web.mapper.EmailUsersMapper; +import cn.bunny.service.web.mapper.UserMapper; +import cn.bunny.service.web.service.LoginService; +import cn.bunny.vo.system.login.LoginVo; +import cn.bunny.vo.system.login.ValidateCodeVo; +import cn.hutool.captcha.CaptchaUtil; +import cn.hutool.captcha.CircleCaptcha; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.util.DigestUtils; + +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +@Service +public class LoginServiceImpl extends ServiceImpl implements LoginService { + @Autowired + private UserMapper userMapper; + @Autowired + private RedisTemplate redisTemplate; + @Autowired + private EmailUsersMapper emailUsersMapper; + @Autowired + private EmailTemplateMapper emailTemplateMapper; + + /** + * 前台用户登录接口 + * + * @param loginDto 登录参数 + * @return 登录后结果返回 + */ + @Override + public LoginVo login(LoginDto loginDto) { + // 判断用户和密码是否为空 + String username = loginDto.getUsername(); + EmptyUtil.isEmpty(username, ExceptionConstant.USERNAME_IS_EMPTY_Exception); + // 密码不能为空 + EmptyUtil.isEmpty(loginDto.getPassword(), ExceptionConstant.PASSWORD_NOT_EMPTY_Exception); + String password = DigestUtils.md5DigestAsHex(loginDto.getPassword().getBytes()); + + // 设置返回类型 + LoginVo loginVo = userMapper.login(username, password); + String token = JwtHelper.createToken(loginVo.getId(), loginVo.getEmail(), 7); + loginVo.setToken(token); + + // 用户是否被锁定 + if (loginVo.getStatus() == 1) { + throw new BunnyException(ExceptionConstant.ACCOUNT_LOCKED_Exception); + } + + // 将信息存入Redis中 + redisTemplate.opsForValue().set(RedisUserConstant.getUserLoginInfoPrefix(loginVo.getEmail()), loginVo, 15, TimeUnit.DAYS); + return loginVo; + } + + /** + * 生成验证码 + * + * @return 验证码生成信息 + */ + @Override + public ValidateCodeVo checkCode() { + // 生成验证码 + CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(150, 48, 4, 2); + String code = captcha.getCode(); + String base64Image = "data:image/png;base64," + captcha.getImageBase64(); + // 存储到Redis中 + String uuid = UUID.randomUUID().toString().replaceAll("-", ""); + redisTemplate.opsForValue().set(uuid, code, 10, TimeUnit.MINUTES); + return ValidateCodeVo.builder().codeKey(uuid).codeValue(base64Image).build(); + } + + /** + * 发送邮箱验证码 + * + * @param email 邮箱 + */ + @Override + public void sendEmailCode(String email) { + // 从数据库中获取,发送邮箱参数,发送邮件模板 + EmailUsers emailUsers = emailUsersMapper.selectOne(Wrappers.lambdaQuery().eq(EmailUsers::getIsDefault, 1)); + EmailTemplate emailSendTemplate = emailTemplateMapper.selectOne(Wrappers.lambdaQuery().eq(EmailTemplate::getId, 1791870020197625858L)); + EmailSendInit emailSendInit = new EmailSendInit(); + // 判断发送邮箱邮件是否为空 + EmptyUtil.isEmpty(emailUsers, MailMessageConstant.EMAIL_CONFIG_NOT_FOUND); + BeanUtils.copyProperties(emailUsers, emailSendInit); + emailSendInit.setUsername(emailUsers.getEmail()); + // 生成验证码 + MailSenderUtil mailSenderUtil = new MailSenderUtil(emailSendInit); + CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(150, 48, 4, 2); + // 生成验证码和可以 + String code = captcha.getCode(); + String htmlContent = emailSendTemplate.getBody().replace("${verifyCode}", code); + // 发送验证码 + EmailSend emailSend = new EmailSend(); + emailSend.setSubject("邮箱验证码"); + emailSend.setMessage(htmlContent); + emailSend.setSendTo(email); + emailSend.setIsRichText(true); + mailSenderUtil.sendSimpleEmail(emailSend); + + // 将验证码保存到Redis中,并设置15分钟过期 + redisTemplate.opsForValue().set(RedisUserConstant.USER_EMAIL_CODE_PREFIX + email, code, 15, TimeUnit.MINUTES); + } + + /** + * 注册用户 + * + * @param registerDto 注册表单 + */ + @Override + public void register(RegisterDto registerDto) { + String nickName = registerDto.getNickName(); + String email = registerDto.getEmail(); + // 查询用户是否已经注册 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(User::getEmail, email).or().eq(User::getNickName, nickName); + User user = userMapper.selectOne(lambdaQueryWrapper); + + // 用户存在保存 + if (user != null) throw new BunnyException(ExceptionConstant.ALREADY_USER_Exception); + // 判断验证码是否正确 + Object emailCode = redisTemplate.opsForValue().get(RedisUserConstant.getUserEmailCodePrefix(email)); + if (!registerDto.getCode().equalsIgnoreCase(String.valueOf(emailCode))) { + throw new BunnyException(ExceptionConstant.VERIFICATION_CODE_ERROR_Exception); + } + + // 用户没有注册时才去注册 + user = new User(); + BeanUtils.copyProperties(registerDto, user); + user.setPassword(DigestUtils.md5DigestAsHex(registerDto.getPassword().getBytes())); + user.setAvatar(UserConstant.USER_AVATAR); + save(user); + + // 删除邮箱验证码 + redisTemplate.delete(RedisUserConstant.getUserEmailCodePrefix(registerDto.getEmail())); + } + + /** + * 退出登录 + */ + @Override + public void logout() { + Long userId = BaseContext.getUserId(); + // 查询当前用户信息 + User user = getById(userId); + // 删除Redis中用户信息 + redisTemplate.delete(RedisUserConstant.getUserLoginInfoPrefix(user.getEmail())); + } +} diff --git a/service/service-web/src/main/java/cn/bunny/service/web/service/impl/UserServiceImpl.java b/service/service-web/src/main/java/cn/bunny/service/web/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..038df86 --- /dev/null +++ b/service/service-web/src/main/java/cn/bunny/service/web/service/impl/UserServiceImpl.java @@ -0,0 +1,105 @@ +package cn.bunny.service.web.service.impl; + +import cn.bunny.common.service.context.BaseContext; +import cn.bunny.common.service.exception.BunnyException; +import cn.bunny.common.service.utils.EmptyUtil; +import cn.bunny.dto.user.ResetPwdDto; +import cn.bunny.entity.system.user.User; +import cn.bunny.result.constant.ExceptionConstant; +import cn.bunny.result.constant.RedisUserConstant; +import cn.bunny.service.web.mapper.UserMapper; +import cn.bunny.service.web.service.UserService; +import cn.bunny.vo.system.user.UserInfoVo; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.util.DigestUtils; + +/** + *

+ * 用户信息 服务实现类 + *

+ * + * @author Bunny + * @since 2024-05-13 + */ +@Service +public class UserServiceImpl extends ServiceImpl implements UserService { + @Autowired + private RedisTemplate redisTemplate; + @Autowired + private UserMapper userMapper; + + /** + * 重置密码 + * + * @param dto 重置密码参数 + */ + @Override + public void resetPwd(ResetPwdDto dto) { + String username = dto.getEmail(); + String password = dto.getPassword(); + String emailCode = dto.getEmailCode().toLowerCase(); + Long userId = BaseContext.getUserId(); + String redisEmailCode = (String) redisTemplate.opsForValue().get(RedisUserConstant.getUserEmailCodePrefix(dto.getEmail())); + + // 判断邮箱验证码是否正确 + EmptyUtil.isEmpty(redisEmailCode, ExceptionConstant.PLEASE_SEND_EMAIL_CODE_Exception); + if (!emailCode.equals(redisEmailCode.toLowerCase())) + throw new BunnyException(ExceptionConstant.VERIFICATION_CODE_ERROR_Exception); + + // 查询用户信息 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(User::getEmail, username).or().eq(User::getNickName, username); + User user = getOne(lambdaQueryWrapper); + + // 用户不存在 + if (user == null) throw new BunnyException(ExceptionConstant.USER_NOT_FOUND_Exception); + + user = new User(); + user.setPassword(DigestUtils.md5DigestAsHex(password.getBytes())); + user.setId(userId); + + // 更新用户 + updateById(user); + + // 删除邮箱验证码 + redisTemplate.delete(RedisUserConstant.getUserEmailCodePrefix(dto.getEmail())); + } + + + /** + * 获取当前登录用户信息 + * + * @return 获取用户信息返回参数 + */ + @Override + public UserInfoVo getCurrentUserInfo() { + UserInfoVo userInfo = new UserInfoVo(); + User user = getById(BaseContext.getUserId()); + BeanUtils.copyProperties(user, userInfo); + + return userInfo; + } + + + /** + * 获取登录用户信息 + * + * @param userId 用户id + * @return 获取用户信息返回参数 + */ + @Override + public UserInfoVo getUserInfo(Long userId) { + UserInfoVo userInfoVo = new UserInfoVo(); + User user = userMapper.selectById(userId); + + if (user == null) throw new BunnyException(ExceptionConstant.USER_NOT_FOUND_Exception); + BeanUtils.copyProperties(user, userInfoVo); + + return userInfoVo; + } +} diff --git a/service/service-web/src/main/resources/application-dev.yml b/service/service-web/src/main/resources/application-dev.yml new file mode 100644 index 0000000..668d3b3 --- /dev/null +++ b/service/service-web/src/main/resources/application-dev.yml @@ -0,0 +1,24 @@ +bunny: + datasource: + host: 106.15.251.123 + port: 3305 + sqlData: bunny_docs + username: root + password: "02120212" + + redis: + host: 47.120.65.66 + port: 6379 + database: 1 + password: "02120212" + + minio: + endpointUrl: "http://129.211.31.58:9000" + bucket-name: bunny-bbs + accessKey: bunny + secretKey: "02120212" + + nacos: + server-addr: z-bunny.cn:8848 + discovery: + namespace: bunnyBBS \ No newline at end of file diff --git a/service/service-web/src/main/resources/application.yml b/service/service-web/src/main/resources/application.yml new file mode 100644 index 0000000..2ce2552 --- /dev/null +++ b/service/service-web/src/main/resources/application.yml @@ -0,0 +1,84 @@ +server: + port: 8801 + +spring: + profiles: + active: dev + application: + name: service-web + main: + lazy-initialization: true + jmx: + enabled: false + + datasource: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://${bunny.datasource.host}:${bunny.datasource.port}/${bunny.datasource.sqlData}?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=utf-8&allowPublicKeyRetrieval=true + username: ${bunny.datasource.username} + password: ${bunny.datasource.password} + + data: + redis: + host: ${bunny.redis.host} + port: ${bunny.redis.port} + database: ${bunny.redis.database} + password: ${bunny.redis.password} + lettuce: + pool: + max-active: 20 #最大连接数 + max-wait: -1 #最大阻塞等待时间(负数表示没限制) + max-idle: 5 #最大空闲 + min-idle: 0 #最小空闲 + + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + + cloud: + sentinel: + log: + dir: logs/${spring.application.name}/sentinel + nacos: + discovery: + namespace: ${bunny.nacos.discovery.namespace} + server-addr: ${bunny.nacos.server-addr} + + +mybatis-plus: + mapper-locations: classpath:mapper/*.xml + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 查看日志 + # cache-enabled: false + global-config: + db-config: + id-type: assign_id # 设置为雪花算法 + logic-delete-value: 1 + logic-not-delete-value: 0 + logic-delete-field: id + +logging: + level: + cn.bunny.service.mapper: debug + cn.bunny.service.controller: info + cn.bunny.service.service: info + pattern: + dateformat: HH:mm:ss:SSS + file: + path: "logs/${spring.application.name}" + +bunny: + minio: + endpointUrl: ${bunny.minio.endpointUrl} + accessKey: ${bunny.minio.accessKey} + secretKey: ${bunny.minio.secretKey} + bucket-name: ${bunny.minio.bucket-name} + + snowflake: + datacenterBits: 5 # 数据中心id位数 + workerBits: 5 # 机器id位数 + sequenceBits: 12 # 序列id所占位数 + datacenterId: 1 # 数据中心id,范围0-2^5-1 + workerId: 1 # 机器id,范围0-2^5-1 + twepoch: 1704038400000 # 时间戳起始点(2024-01-01 00::00:00 的毫秒数) + maxBatchCount: 100000 #单次批量生成id的最大数量 默认10万 \ No newline at end of file diff --git a/service/service-web/src/main/resources/banner.txt b/service/service-web/src/main/resources/banner.txt new file mode 100644 index 0000000..cc77fc2 --- /dev/null +++ b/service/service-web/src/main/resources/banner.txt @@ -0,0 +1,16 @@ +-----------------▄██-█▄--------- +-----------------███▄██▄-------- +-----------------███████-------- +-----------------▀███████------- +-------------------██████▄▄----- +-------------------█████████▄--- +-------------------██████▄████-- +-------▄███████████████████████- +-----▄███████████████████████▀-- +---▄██████████████████████------ +---███████████████████████------ +---███████████████████████------ +-▄▄██████████████████████▀------ +-█████████████████▀█████-------- +-▀██████████████▀▀-▀█████▄------ +-------▀▀▀▀▀▀▀▀▀------▀▀▀▀------ \ No newline at end of file diff --git a/service/service-web/src/main/resources/favicon.ico b/service/service-web/src/main/resources/favicon.ico new file mode 100644 index 0000000..385f8a6 Binary files /dev/null and b/service/service-web/src/main/resources/favicon.ico differ diff --git a/service/service-web/src/main/resources/logback.xml b/service/service-web/src/main/resources/logback.xml new file mode 100644 index 0000000..04ecbe3 --- /dev/null +++ b/service/service-web/src/main/resources/logback.xml @@ -0,0 +1,61 @@ + + + + + + + %cyan([%thread]) %yellow(%-5level) %green(%logger{100}).%boldRed(%method)-%boldMagenta(%line) - %blue(%msg%n) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/service/service-web/src/main/resources/mapper/EmailTemplateMapper.xml b/service/service-web/src/main/resources/mapper/EmailTemplateMapper.xml new file mode 100644 index 0000000..a14de6b --- /dev/null +++ b/service/service-web/src/main/resources/mapper/EmailTemplateMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + id, template_name, subject, body, type, create_time, update_time, update_user, is_deleted + + + diff --git a/service/service-web/src/main/resources/mapper/EmailUsersMapper.xml b/service/service-web/src/main/resources/mapper/EmailUsersMapper.xml new file mode 100644 index 0000000..f16ab7d --- /dev/null +++ b/service/service-web/src/main/resources/mapper/EmailUsersMapper.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + id, email, password, host, port, create_time, update_time, update_user, is_delete + + + + + delete + from email_users + where id = #{id} + + + diff --git a/service/service-web/src/main/resources/mapper/UserMapper.xml b/service/service-web/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..3723891 --- /dev/null +++ b/service/service-web/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/service/service-web/src/main/resources/templates/email-template.html b/service/service-web/src/main/resources/templates/email-template.html new file mode 100644 index 0000000..7c4b0b6 --- /dev/null +++ b/service/service-web/src/main/resources/templates/email-template.html @@ -0,0 +1,54 @@ + + + + + + + Email Verification Code + + +
+ + + + + + + + + + +
+

BunnyBBS邮箱验证码

+
+
+

+ 尊敬的用户, +

+

+ 感谢您注册我们的产品. 您的账号正在进行电子邮件验证. +

+

+ 验证码为: ${verifyCode} +

+

+ 验证码的有效期只有一分钟,请抓紧时间进行验证吧! +

+

+ 如果非本人操作,请忽略此邮件 +

+
+
+

+ XXXXX
+ Contact us: XXXXXXX@qq.com +

+

+ This is an automated email, please do not reply.
+ © Company Name +

+
+
+ + \ No newline at end of file diff --git a/service/service-web/src/test/java/cn/bunny/service/web/service/impl/CommentServiceImplTest.java b/service/service-web/src/test/java/cn/bunny/service/web/service/impl/CommentServiceImplTest.java new file mode 100644 index 0000000..acaf5d0 --- /dev/null +++ b/service/service-web/src/test/java/cn/bunny/service/web/service/impl/CommentServiceImplTest.java @@ -0,0 +1,45 @@ +package cn.bunny.service.web.service.impl; + +import cn.bunny.common.utils.CommentUtil; +import cn.bunny.dto.common.CommentQueryDto; +import cn.bunny.entity.system.article.ForumComment; +import cn.bunny.vo.system.comment.CommentVo; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.junit.jupiter.api.Test; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.ArrayList; +import java.util.List; + +@SpringBootTest +class CommentServiceImplTest { + @Autowired + private CommentMapper commentMapper; + + /** + * 获取文章评论 + */ + @Test + public void loadComment() { + CommentQueryDto dto = new CommentQueryDto(); + dto.setArticleId("RtiXj832TFL4nhW"); + // 返回参数 + ArrayList list = new ArrayList<>(); + // 查询 + Page page = new Page<>(1, 6); + IPage commentList = commentMapper.loadComment(page, dto); + + // 准备返回值 + commentList.getRecords().forEach(forumComments -> { + CommentVo commentVo = new CommentVo(); + BeanUtils.copyProperties(forumComments, commentVo); + list.add(commentVo); + }); + + List buildTree = CommentUtil.buildTree(list); + System.out.println(buildTree); + } +} \ No newline at end of file