From 8c936791c34963c410831202ad4ff7861746fff7 Mon Sep 17 00:00:00 2001 From: yovinchen Date: Wed, 14 Jun 2023 20:12:48 +0800 Subject: [PATCH] Changes --- .idea/.gitignore | 10 + .idea/compiler.xml | 25 + .idea/dataSources.xml | 12 + .idea/dictionaries/yovinchen.xml | 7 + .idea/encodings.xml | 7 + .idea/intellij-javadocs-4.0.1.xml | 204 ++++++++ .idea/jarRepositories.xml | 25 + .idea/jpa-buddy.xml | 6 + .idea/misc.xml | 24 + .idea/qaplug_profiles.xml | 465 ++++++++++++++++++ .idea/sqldialects.xml | 6 + .idea/vcs.xml | 6 + pom.xml | 133 +++++ .../yovinchen/forum/DoubaoApplication.java | 31 ++ .../forum/common/api/ApiErrorCode.java | 52 ++ .../yovinchen/forum/common/api/ApiResult.java | 152 ++++++ .../forum/common/api/IErrorCode.java | 18 + .../forum/common/exception/ApiAsserts.java | 24 + .../forum/common/exception/ApiException.java | 21 + .../exception/GlobalExceptionHandler.java | 23 + .../common/mybatisplus/MybatisPlusConfig.java | 31 ++ .../forum/config/GlobalWebMvcConfigurer.java | 43 ++ .../yovinchen/forum/config/Knife4jConfig.java | 49 ++ .../forum/controller/BaseController.java | 4 + .../controller/BmsBillboardController.java | 32 ++ .../controller/BmsCommentController.java | 44 ++ .../forum/controller/BmsPostController.java | 91 ++++ .../controller/BmsPromotionController.java | 33 ++ .../controller/BmsRelationshipController.java | 77 +++ .../forum/controller/BmsSearchController.java | 31 ++ .../forum/controller/BmsTagController.java | 46 ++ .../forum/controller/BmsTipController.java | 34 ++ .../forum/controller/GiteeLogin.java | 11 + .../forum/controller/UmsUserController.java | 91 ++++ .../forum/jwt/JwtAuthenticationFilter.java | 57 +++ .../java/com/yovinchen/forum/jwt/JwtUtil.java | 75 +++ .../forum/mapper/BmsBillboardMapper.java | 9 + .../forum/mapper/BmsCommentMapper.java | 22 + .../forum/mapper/BmsFollowMapper.java | 9 + .../forum/mapper/BmsPromotionMapper.java | 10 + .../yovinchen/forum/mapper/BmsTagMapper.java | 11 + .../yovinchen/forum/mapper/BmsTipMapper.java | 10 + .../forum/mapper/BmsTopicMapper.java | 39 ++ .../forum/mapper/BmsTopicTagMapper.java | 20 + .../yovinchen/forum/mapper/UmsUserMapper.java | 15 + .../yovinchen/forum/model/dto/CommentDTO.java | 25 + .../forum/model/dto/CreateTopicDTO.java | 33 ++ .../yovinchen/forum/model/dto/LoginDTO.java | 30 ++ .../forum/model/dto/RegisterDTO.java | 38 ++ .../forum/model/entity/BmsBillboard.java | 56 +++ .../forum/model/entity/BmsComment.java | 68 +++ .../forum/model/entity/BmsFollow.java | 44 ++ .../yovinchen/forum/model/entity/BmsPost.java | 115 +++++ .../forum/model/entity/BmsPromotion.java | 54 ++ .../yovinchen/forum/model/entity/BmsTag.java | 38 ++ .../yovinchen/forum/model/entity/BmsTip.java | 46 ++ .../forum/model/entity/BmsTopicTag.java | 33 ++ .../yovinchen/forum/model/entity/UmsUser.java | 99 ++++ .../yovinchen/forum/model/vo/CommentVO.java | 49 ++ .../com/yovinchen/forum/model/vo/PostVO.java | 105 ++++ .../yovinchen/forum/model/vo/ProfileVO.java | 65 +++ .../forum/service/IBmsBillboardService.java | 7 + .../forum/service/IBmsCommentService.java | 22 + .../forum/service/IBmsFollowService.java | 8 + .../forum/service/IBmsPostService.java | 55 +++ .../forum/service/IBmsPromotionService.java | 8 + .../forum/service/IBmsTagService.java | 27 + .../forum/service/IBmsTipService.java | 8 + .../forum/service/IBmsTopicTagService.java | 35 ++ .../forum/service/IUmsUserService.java | 40 ++ .../impl/IBmsBillboardServiceImpl.java | 13 + .../service/impl/IBmsCommentServiceImpl.java | 43 ++ .../service/impl/IBmsFollowServiceImpl.java | 12 + .../service/impl/IBmsPostServiceImpl.java | 140 ++++++ .../impl/IBmsPromotionServiceImpl.java | 13 + .../service/impl/IBmsTagServiceImpl.java | 60 +++ .../service/impl/IBmsTipServiceImpl.java | 25 + .../service/impl/IBmsTopicTagServiceImpl.java | 45 ++ .../service/impl/IUmsUserServiceImpl.java | 94 ++++ .../com/yovinchen/forum/utils/MD5Utils.java | 56 +++ src/main/resources/application-dev.yaml | 18 + src/main/resources/application-prod.yaml | 18 + src/main/resources/application.yaml | 3 + .../resources/mapper/BmsCommentMapper.xml | 20 + src/main/resources/mapper/BmsPostMapper.xml | 78 +++ .../resources/mapper/BmsPostTagMapper.xml | 9 + src/main/resources/mapper/BmsTipMapper.xml | 10 + .../forum/DoubaoApplicationTests.java | 13 + target/classes/application-dev.yaml | 18 + target/classes/application-prod.yaml | 18 + target/classes/application.yaml | 3 + .../yovinchen/forum/DoubaoApplication.class | Bin 0 -> 2246 bytes .../forum/common/api/ApiErrorCode.class | Bin 0 -> 2388 bytes .../forum/common/api/ApiResult.class | Bin 0 -> 6416 bytes .../forum/common/api/IErrorCode.class | Bin 0 -> 218 bytes .../forum/common/exception/ApiAsserts.class | Bin 0 -> 744 bytes .../forum/common/exception/ApiException.class | Bin 0 -> 882 bytes .../exception/GlobalExceptionHandler.class | Bin 0 -> 1510 bytes .../mybatisplus/MybatisPlusConfig.class | Bin 0 -> 2314 bytes .../forum/config/GlobalWebMvcConfigurer.class | Bin 0 -> 2623 bytes .../forum/config/Knife4jConfig.class | Bin 0 -> 2572 bytes .../forum/controller/BaseController.class | Bin 0 -> 329 bytes .../controller/BmsBillboardController.class | Bin 0 -> 3692 bytes .../controller/BmsCommentController.class | Bin 0 -> 3245 bytes .../forum/controller/BmsPostController.class | Bin 0 -> 7594 bytes .../controller/BmsPromotionController.class | Bin 0 -> 1602 bytes .../BmsRelationshipController.class | Bin 0 -> 7048 bytes .../controller/BmsSearchController.class | Bin 0 -> 2576 bytes .../forum/controller/BmsTagController.class | Bin 0 -> 6208 bytes .../forum/controller/BmsTipController.class | Bin 0 -> 1473 bytes .../forum/controller/UmsUserController.class | Bin 0 -> 8603 bytes .../forum/jwt/JwtAuthenticationFilter.class | Bin 0 -> 2942 bytes .../JwtUtil$CustomHttpServletRequest.class | Bin 0 -> 2673 bytes .../JwtUtil$TokenValidationException.class | Bin 0 -> 539 bytes .../com/yovinchen/forum/jwt/JwtUtil.class | Bin 0 -> 3375 bytes .../forum/mapper/BmsBillboardMapper.class | Bin 0 -> 424 bytes .../forum/mapper/BmsCommentMapper.class | Bin 0 -> 720 bytes .../forum/mapper/BmsFollowMapper.class | Bin 0 -> 415 bytes .../forum/mapper/BmsPromotionMapper.class | Bin 0 -> 424 bytes .../yovinchen/forum/mapper/BmsTagMapper.class | Bin 0 -> 406 bytes .../yovinchen/forum/mapper/BmsTipMapper.class | Bin 0 -> 475 bytes .../forum/mapper/BmsTopicMapper.class | Bin 0 -> 1246 bytes .../forum/mapper/BmsTopicTagMapper.class | Bin 0 -> 692 bytes .../forum/mapper/UmsUserMapper.class | Bin 0 -> 409 bytes .../forum/model/dto/CommentDTO.class | Bin 0 -> 2264 bytes .../forum/model/dto/CreateTopicDTO.class | Bin 0 -> 3040 bytes .../yovinchen/forum/model/dto/LoginDTO.class | Bin 0 -> 3281 bytes .../forum/model/dto/RegisterDTO.class | Bin 0 -> 3744 bytes .../BmsBillboard$BmsBillboardBuilder.class | Bin 0 -> 2145 bytes .../forum/model/entity/BmsBillboard.class | Bin 0 -> 4423 bytes .../entity/BmsComment$BmsCommentBuilder.class | Bin 0 -> 2101 bytes .../forum/model/entity/BmsComment.class | Bin 0 -> 5321 bytes .../forum/model/entity/BmsFollow.class | Bin 0 -> 3094 bytes .../model/entity/BmsPost$BmsPostBuilder.class | Bin 0 -> 4024 bytes .../forum/model/entity/BmsPost.class | Bin 0 -> 9658 bytes .../forum/model/entity/BmsPromotion.class | Bin 0 -> 3633 bytes .../model/entity/BmsTag$BmsTagBuilder.class | Bin 0 -> 1752 bytes .../yovinchen/forum/model/entity/BmsTag.class | Bin 0 -> 3678 bytes .../yovinchen/forum/model/entity/BmsTip.class | Bin 0 -> 3270 bytes .../forum/model/entity/BmsTopicTag.class | Bin 0 -> 3142 bytes .../model/entity/UmsUser$UmsUserBuilder.class | Bin 0 -> 4486 bytes .../forum/model/entity/UmsUser.class | Bin 0 -> 11269 bytes .../yovinchen/forum/model/vo/CommentVO.class | Bin 0 -> 4103 bytes .../com/yovinchen/forum/model/vo/PostVO.class | Bin 0 -> 9531 bytes .../yovinchen/forum/model/vo/ProfileVO.class | Bin 0 -> 5647 bytes .../forum/service/IBmsBillboardService.class | Bin 0 -> 351 bytes .../forum/service/IBmsCommentService.class | Bin 0 -> 728 bytes .../forum/service/IBmsFollowService.class | Bin 0 -> 342 bytes .../forum/service/IBmsPostService.class | Bin 0 -> 1699 bytes .../forum/service/IBmsPromotionService.class | Bin 0 -> 351 bytes .../forum/service/IBmsTagService.class | Bin 0 -> 980 bytes .../forum/service/IBmsTipService.class | Bin 0 -> 402 bytes .../forum/service/IBmsTopicTagService.class | Bin 0 -> 878 bytes .../forum/service/IUmsUserService.class | Bin 0 -> 804 bytes .../impl/IBmsBillboardServiceImpl.class | Bin 0 -> 775 bytes .../service/impl/IBmsCommentServiceImpl.class | Bin 0 -> 3165 bytes .../service/impl/IBmsFollowServiceImpl.class | Bin 0 -> 754 bytes .../service/impl/IBmsPostServiceImpl.class | Bin 0 -> 11958 bytes .../impl/IBmsPromotionServiceImpl.class | Bin 0 -> 775 bytes .../service/impl/IBmsTagServiceImpl.class | Bin 0 -> 6454 bytes .../service/impl/IBmsTipServiceImpl.class | Bin 0 -> 1537 bytes .../impl/IBmsTopicTagServiceImpl.class | Bin 0 -> 5581 bytes .../service/impl/IUmsUserServiceImpl.class | Bin 0 -> 8092 bytes .../com/yovinchen/forum/utils/MD5Utils.class | Bin 0 -> 1414 bytes target/classes/mapper/BmsCommentMapper.xml | 20 + target/classes/mapper/BmsPostMapper.xml | 78 +++ target/classes/mapper/BmsPostTagMapper.xml | 9 + target/classes/mapper/BmsTipMapper.xml | 10 + .../forum/DoubaoApplicationTests.class | Bin 0 -> 543 bytes 169 files changed, 4079 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/dataSources.xml create mode 100644 .idea/dictionaries/yovinchen.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/intellij-javadocs-4.0.1.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/jpa-buddy.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/qaplug_profiles.xml create mode 100644 .idea/sqldialects.xml create mode 100644 .idea/vcs.xml create mode 100644 pom.xml create mode 100644 src/main/java/com/yovinchen/forum/DoubaoApplication.java create mode 100644 src/main/java/com/yovinchen/forum/common/api/ApiErrorCode.java create mode 100644 src/main/java/com/yovinchen/forum/common/api/ApiResult.java create mode 100644 src/main/java/com/yovinchen/forum/common/api/IErrorCode.java create mode 100644 src/main/java/com/yovinchen/forum/common/exception/ApiAsserts.java create mode 100644 src/main/java/com/yovinchen/forum/common/exception/ApiException.java create mode 100644 src/main/java/com/yovinchen/forum/common/exception/GlobalExceptionHandler.java create mode 100644 src/main/java/com/yovinchen/forum/common/mybatisplus/MybatisPlusConfig.java create mode 100644 src/main/java/com/yovinchen/forum/config/GlobalWebMvcConfigurer.java create mode 100644 src/main/java/com/yovinchen/forum/config/Knife4jConfig.java create mode 100644 src/main/java/com/yovinchen/forum/controller/BaseController.java create mode 100644 src/main/java/com/yovinchen/forum/controller/BmsBillboardController.java create mode 100644 src/main/java/com/yovinchen/forum/controller/BmsCommentController.java create mode 100644 src/main/java/com/yovinchen/forum/controller/BmsPostController.java create mode 100644 src/main/java/com/yovinchen/forum/controller/BmsPromotionController.java create mode 100644 src/main/java/com/yovinchen/forum/controller/BmsRelationshipController.java create mode 100644 src/main/java/com/yovinchen/forum/controller/BmsSearchController.java create mode 100644 src/main/java/com/yovinchen/forum/controller/BmsTagController.java create mode 100644 src/main/java/com/yovinchen/forum/controller/BmsTipController.java create mode 100644 src/main/java/com/yovinchen/forum/controller/GiteeLogin.java create mode 100644 src/main/java/com/yovinchen/forum/controller/UmsUserController.java create mode 100644 src/main/java/com/yovinchen/forum/jwt/JwtAuthenticationFilter.java create mode 100644 src/main/java/com/yovinchen/forum/jwt/JwtUtil.java create mode 100644 src/main/java/com/yovinchen/forum/mapper/BmsBillboardMapper.java create mode 100644 src/main/java/com/yovinchen/forum/mapper/BmsCommentMapper.java create mode 100644 src/main/java/com/yovinchen/forum/mapper/BmsFollowMapper.java create mode 100644 src/main/java/com/yovinchen/forum/mapper/BmsPromotionMapper.java create mode 100644 src/main/java/com/yovinchen/forum/mapper/BmsTagMapper.java create mode 100644 src/main/java/com/yovinchen/forum/mapper/BmsTipMapper.java create mode 100644 src/main/java/com/yovinchen/forum/mapper/BmsTopicMapper.java create mode 100644 src/main/java/com/yovinchen/forum/mapper/BmsTopicTagMapper.java create mode 100644 src/main/java/com/yovinchen/forum/mapper/UmsUserMapper.java create mode 100644 src/main/java/com/yovinchen/forum/model/dto/CommentDTO.java create mode 100644 src/main/java/com/yovinchen/forum/model/dto/CreateTopicDTO.java create mode 100644 src/main/java/com/yovinchen/forum/model/dto/LoginDTO.java create mode 100644 src/main/java/com/yovinchen/forum/model/dto/RegisterDTO.java create mode 100644 src/main/java/com/yovinchen/forum/model/entity/BmsBillboard.java create mode 100644 src/main/java/com/yovinchen/forum/model/entity/BmsComment.java create mode 100644 src/main/java/com/yovinchen/forum/model/entity/BmsFollow.java create mode 100644 src/main/java/com/yovinchen/forum/model/entity/BmsPost.java create mode 100644 src/main/java/com/yovinchen/forum/model/entity/BmsPromotion.java create mode 100644 src/main/java/com/yovinchen/forum/model/entity/BmsTag.java create mode 100644 src/main/java/com/yovinchen/forum/model/entity/BmsTip.java create mode 100644 src/main/java/com/yovinchen/forum/model/entity/BmsTopicTag.java create mode 100644 src/main/java/com/yovinchen/forum/model/entity/UmsUser.java create mode 100644 src/main/java/com/yovinchen/forum/model/vo/CommentVO.java create mode 100644 src/main/java/com/yovinchen/forum/model/vo/PostVO.java create mode 100644 src/main/java/com/yovinchen/forum/model/vo/ProfileVO.java create mode 100644 src/main/java/com/yovinchen/forum/service/IBmsBillboardService.java create mode 100644 src/main/java/com/yovinchen/forum/service/IBmsCommentService.java create mode 100644 src/main/java/com/yovinchen/forum/service/IBmsFollowService.java create mode 100644 src/main/java/com/yovinchen/forum/service/IBmsPostService.java create mode 100644 src/main/java/com/yovinchen/forum/service/IBmsPromotionService.java create mode 100644 src/main/java/com/yovinchen/forum/service/IBmsTagService.java create mode 100644 src/main/java/com/yovinchen/forum/service/IBmsTipService.java create mode 100644 src/main/java/com/yovinchen/forum/service/IBmsTopicTagService.java create mode 100644 src/main/java/com/yovinchen/forum/service/IUmsUserService.java create mode 100644 src/main/java/com/yovinchen/forum/service/impl/IBmsBillboardServiceImpl.java create mode 100644 src/main/java/com/yovinchen/forum/service/impl/IBmsCommentServiceImpl.java create mode 100644 src/main/java/com/yovinchen/forum/service/impl/IBmsFollowServiceImpl.java create mode 100644 src/main/java/com/yovinchen/forum/service/impl/IBmsPostServiceImpl.java create mode 100644 src/main/java/com/yovinchen/forum/service/impl/IBmsPromotionServiceImpl.java create mode 100644 src/main/java/com/yovinchen/forum/service/impl/IBmsTagServiceImpl.java create mode 100644 src/main/java/com/yovinchen/forum/service/impl/IBmsTipServiceImpl.java create mode 100644 src/main/java/com/yovinchen/forum/service/impl/IBmsTopicTagServiceImpl.java create mode 100644 src/main/java/com/yovinchen/forum/service/impl/IUmsUserServiceImpl.java create mode 100644 src/main/java/com/yovinchen/forum/utils/MD5Utils.java create mode 100644 src/main/resources/application-dev.yaml create mode 100644 src/main/resources/application-prod.yaml create mode 100644 src/main/resources/application.yaml create mode 100644 src/main/resources/mapper/BmsCommentMapper.xml create mode 100644 src/main/resources/mapper/BmsPostMapper.xml create mode 100644 src/main/resources/mapper/BmsPostTagMapper.xml create mode 100644 src/main/resources/mapper/BmsTipMapper.xml create mode 100644 src/test/java/com/yovinchen/forum/DoubaoApplicationTests.java create mode 100644 target/classes/application-dev.yaml create mode 100644 target/classes/application-prod.yaml create mode 100644 target/classes/application.yaml create mode 100644 target/classes/com/yovinchen/forum/DoubaoApplication.class create mode 100644 target/classes/com/yovinchen/forum/common/api/ApiErrorCode.class create mode 100644 target/classes/com/yovinchen/forum/common/api/ApiResult.class create mode 100644 target/classes/com/yovinchen/forum/common/api/IErrorCode.class create mode 100644 target/classes/com/yovinchen/forum/common/exception/ApiAsserts.class create mode 100644 target/classes/com/yovinchen/forum/common/exception/ApiException.class create mode 100644 target/classes/com/yovinchen/forum/common/exception/GlobalExceptionHandler.class create mode 100644 target/classes/com/yovinchen/forum/common/mybatisplus/MybatisPlusConfig.class create mode 100644 target/classes/com/yovinchen/forum/config/GlobalWebMvcConfigurer.class create mode 100644 target/classes/com/yovinchen/forum/config/Knife4jConfig.class create mode 100644 target/classes/com/yovinchen/forum/controller/BaseController.class create mode 100644 target/classes/com/yovinchen/forum/controller/BmsBillboardController.class create mode 100644 target/classes/com/yovinchen/forum/controller/BmsCommentController.class create mode 100644 target/classes/com/yovinchen/forum/controller/BmsPostController.class create mode 100644 target/classes/com/yovinchen/forum/controller/BmsPromotionController.class create mode 100644 target/classes/com/yovinchen/forum/controller/BmsRelationshipController.class create mode 100644 target/classes/com/yovinchen/forum/controller/BmsSearchController.class create mode 100644 target/classes/com/yovinchen/forum/controller/BmsTagController.class create mode 100644 target/classes/com/yovinchen/forum/controller/BmsTipController.class create mode 100644 target/classes/com/yovinchen/forum/controller/UmsUserController.class create mode 100644 target/classes/com/yovinchen/forum/jwt/JwtAuthenticationFilter.class create mode 100644 target/classes/com/yovinchen/forum/jwt/JwtUtil$CustomHttpServletRequest.class create mode 100644 target/classes/com/yovinchen/forum/jwt/JwtUtil$TokenValidationException.class create mode 100644 target/classes/com/yovinchen/forum/jwt/JwtUtil.class create mode 100644 target/classes/com/yovinchen/forum/mapper/BmsBillboardMapper.class create mode 100644 target/classes/com/yovinchen/forum/mapper/BmsCommentMapper.class create mode 100644 target/classes/com/yovinchen/forum/mapper/BmsFollowMapper.class create mode 100644 target/classes/com/yovinchen/forum/mapper/BmsPromotionMapper.class create mode 100644 target/classes/com/yovinchen/forum/mapper/BmsTagMapper.class create mode 100644 target/classes/com/yovinchen/forum/mapper/BmsTipMapper.class create mode 100644 target/classes/com/yovinchen/forum/mapper/BmsTopicMapper.class create mode 100644 target/classes/com/yovinchen/forum/mapper/BmsTopicTagMapper.class create mode 100644 target/classes/com/yovinchen/forum/mapper/UmsUserMapper.class create mode 100644 target/classes/com/yovinchen/forum/model/dto/CommentDTO.class create mode 100644 target/classes/com/yovinchen/forum/model/dto/CreateTopicDTO.class create mode 100644 target/classes/com/yovinchen/forum/model/dto/LoginDTO.class create mode 100644 target/classes/com/yovinchen/forum/model/dto/RegisterDTO.class create mode 100644 target/classes/com/yovinchen/forum/model/entity/BmsBillboard$BmsBillboardBuilder.class create mode 100644 target/classes/com/yovinchen/forum/model/entity/BmsBillboard.class create mode 100644 target/classes/com/yovinchen/forum/model/entity/BmsComment$BmsCommentBuilder.class create mode 100644 target/classes/com/yovinchen/forum/model/entity/BmsComment.class create mode 100644 target/classes/com/yovinchen/forum/model/entity/BmsFollow.class create mode 100644 target/classes/com/yovinchen/forum/model/entity/BmsPost$BmsPostBuilder.class create mode 100644 target/classes/com/yovinchen/forum/model/entity/BmsPost.class create mode 100644 target/classes/com/yovinchen/forum/model/entity/BmsPromotion.class create mode 100644 target/classes/com/yovinchen/forum/model/entity/BmsTag$BmsTagBuilder.class create mode 100644 target/classes/com/yovinchen/forum/model/entity/BmsTag.class create mode 100644 target/classes/com/yovinchen/forum/model/entity/BmsTip.class create mode 100644 target/classes/com/yovinchen/forum/model/entity/BmsTopicTag.class create mode 100644 target/classes/com/yovinchen/forum/model/entity/UmsUser$UmsUserBuilder.class create mode 100644 target/classes/com/yovinchen/forum/model/entity/UmsUser.class create mode 100644 target/classes/com/yovinchen/forum/model/vo/CommentVO.class create mode 100644 target/classes/com/yovinchen/forum/model/vo/PostVO.class create mode 100644 target/classes/com/yovinchen/forum/model/vo/ProfileVO.class create mode 100644 target/classes/com/yovinchen/forum/service/IBmsBillboardService.class create mode 100644 target/classes/com/yovinchen/forum/service/IBmsCommentService.class create mode 100644 target/classes/com/yovinchen/forum/service/IBmsFollowService.class create mode 100644 target/classes/com/yovinchen/forum/service/IBmsPostService.class create mode 100644 target/classes/com/yovinchen/forum/service/IBmsPromotionService.class create mode 100644 target/classes/com/yovinchen/forum/service/IBmsTagService.class create mode 100644 target/classes/com/yovinchen/forum/service/IBmsTipService.class create mode 100644 target/classes/com/yovinchen/forum/service/IBmsTopicTagService.class create mode 100644 target/classes/com/yovinchen/forum/service/IUmsUserService.class create mode 100644 target/classes/com/yovinchen/forum/service/impl/IBmsBillboardServiceImpl.class create mode 100644 target/classes/com/yovinchen/forum/service/impl/IBmsCommentServiceImpl.class create mode 100644 target/classes/com/yovinchen/forum/service/impl/IBmsFollowServiceImpl.class create mode 100644 target/classes/com/yovinchen/forum/service/impl/IBmsPostServiceImpl.class create mode 100644 target/classes/com/yovinchen/forum/service/impl/IBmsPromotionServiceImpl.class create mode 100644 target/classes/com/yovinchen/forum/service/impl/IBmsTagServiceImpl.class create mode 100644 target/classes/com/yovinchen/forum/service/impl/IBmsTipServiceImpl.class create mode 100644 target/classes/com/yovinchen/forum/service/impl/IBmsTopicTagServiceImpl.class create mode 100644 target/classes/com/yovinchen/forum/service/impl/IUmsUserServiceImpl.class create mode 100644 target/classes/com/yovinchen/forum/utils/MD5Utils.class create mode 100644 target/classes/mapper/BmsCommentMapper.xml create mode 100644 target/classes/mapper/BmsPostMapper.xml create mode 100644 target/classes/mapper/BmsPostTagMapper.xml create mode 100644 target/classes/mapper/BmsTipMapper.xml create mode 100644 target/test-classes/com/yovinchen/forum/DoubaoApplicationTests.class diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..afa4cd3 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Zeppelin 忽略的文件 +/ZeppelinRemoteNotebooks/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..deb76fb --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..3c9668d --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,12 @@ + + + + + mysql.8 + true + com.mysql.cj.jdbc.Driver + jdbc:mysql://localhost:3306/ + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/dictionaries/yovinchen.xml b/.idea/dictionaries/yovinchen.xml new file mode 100644 index 0000000..c29a336 --- /dev/null +++ b/.idea/dictionaries/yovinchen.xml @@ -0,0 +1,7 @@ + + + + doubao + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/intellij-javadocs-4.0.1.xml b/.idea/intellij-javadocs-4.0.1.xml new file mode 100644 index 0000000..7e79ed1 --- /dev/null +++ b/.idea/intellij-javadocs-4.0.1.xml @@ -0,0 +1,204 @@ + + + + + UPDATE + false + true + + TYPE + METHOD + FIELD + + + PUBLIC + DEFAULT + PROTECTED + + + + + + ^.*(public|protected|private)*.+interface\s+\w+.* + /**\n + * The interface ${name}.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> + */ + + + ^.*(public|protected|private)*.+enum\s+\w+.* + /**\n + * The enum ${name}.\n + */ + + + ^.*(public|protected|private)*.+class\s+\w+.* + /**\n + * The type ${name}.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> + */ + + + .+ + /**\n + * The type ${name}.\n + */ + + + + + .+ + /**\n + * Instantiates a new ${name}.\n +<#if element.parameterList.parameters?has_content> + *\n +</#if> +<#list element.parameterList.parameters as parameter> + * @param ${parameter.name} the ${paramNames[parameter.name]}\n +</#list> +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + + + ^.*(public|protected|private)*\s*.*(\w(\s*<.+>)*)+\s+get\w+\s*\(.*\).+ + /**\n + * Gets ${partName}.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> +<#if element.parameterList.parameters?has_content> + *\n +</#if> +<#list element.parameterList.parameters as parameter> + * @param ${parameter.name} the ${paramNames[parameter.name]}\n +</#list> +<#if isNotVoid> + *\n + * @return the ${partName}\n +</#if> +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + ^.*(public|protected|private)*\s*.*(void|\w(\s*<.+>)*)+\s+set\w+\s*\(.*\).+ + /**\n + * Sets ${partName}.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> +<#if element.parameterList.parameters?has_content> + *\n +</#if> +<#list element.parameterList.parameters as parameter> + * @param ${parameter.name} the ${paramNames[parameter.name]}\n +</#list> +<#if isNotVoid> + *\n + * @return the ${partName}\n +</#if> +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + ^.*((public\s+static)|(static\s+public))\s+void\s+main\s*\(\s*String\s*(\[\s*\]|\.\.\.)\s+\w+\s*\).+ + /**\n + * The entry point of application.\n + + <#if element.parameterList.parameters?has_content> + *\n +</#if> + * @param ${element.parameterList.parameters[0].name} the input arguments\n +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + .+ + /**\n + * ${name}<#if isNotVoid> ${return}</#if>.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> +<#if element.parameterList.parameters?has_content> + *\n +</#if> +<#list element.parameterList.parameters as parameter> + * @param ${parameter.name} the ${paramNames[parameter.name]}\n +</#list> +<#if isNotVoid> + *\n + * @return the ${return}\n +</#if> +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + + + ^.*(public|protected|private)*.+static.*(\w\s\w)+.+ + /**\n + * The constant ${element.getName()}.\n + */ + + + ^.*(public|protected|private)*.*(\w\s\w)+.+ + /**\n + <#if element.parent.isInterface()> + * The constant ${element.getName()}.\n +<#else> + * The ${name}.\n +</#if> */ + + + .+ + /**\n + <#if element.parent.isEnum()> + *${name} ${typeName}.\n +<#else> + * The ${name}.\n +</#if>*/ + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..22e83c6 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/jpa-buddy.xml b/.idea/jpa-buddy.xml new file mode 100644 index 0000000..966d5f5 --- /dev/null +++ b/.idea/jpa-buddy.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..47988e6 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/qaplug_profiles.xml b/.idea/qaplug_profiles.xml new file mode 100644 index 0000000..3dfd21f --- /dev/null +++ b/.idea/qaplug_profiles.xml @@ -0,0 +1,465 @@ + + + + + \ No newline at end of file diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml new file mode 100644 index 0000000..56782ca --- /dev/null +++ b/.idea/sqldialects.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..f9516a6 --- /dev/null +++ b/pom.xml @@ -0,0 +1,133 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.3.8.RELEASE + + + com.yovinchen + forum + 0.0.1-SNAPSHOT + doubao + Demo project for Spring Boot + + 1.8 + UTF-8 + UTF-8 + 3.4.2 + 1.2.75 + 5.5.7 + 0.9.1 + 5.1.1 + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + true + + + + + io.jsonwebtoken + jjwt + ${jwt.version} + + + + com.vdurmont + emoji-java + ${emoji-java.version} + + + + org.apache.commons + commons-pool2 + + + + cn.hutool + hutool-all + ${hutool.version} + + + + mysql + mysql-connector-java + runtime + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + + com.alibaba + fastjson + ${fastjson.version} + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + + org.hibernate.validator + hibernate-validator + + + + com.github.xiaoymin + knife4j-spring-boot-starter + 3.0.3 + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/src/main/java/com/yovinchen/forum/DoubaoApplication.java b/src/main/java/com/yovinchen/forum/DoubaoApplication.java new file mode 100644 index 0000000..bfd2df0 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/DoubaoApplication.java @@ -0,0 +1,31 @@ +package com.yovinchen.forum; + +import com.yovinchen.forum.jwt.JwtAuthenticationFilter; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Bean; + +@MapperScan("com.yovinchen.forum.mapper") +@SpringBootApplication +public class DoubaoApplication extends SpringBootServletInitializer { + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + return builder.sources(DoubaoApplication.class); + } + @Bean + public FilterRegistrationBean jwtFilter() { + final FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + JwtAuthenticationFilter filter = new JwtAuthenticationFilter(); + registrationBean.setFilter(filter); + return registrationBean; + } + + public static void main(String[] args) { + SpringApplication.run(DoubaoApplication.class, args); + } +} + diff --git a/src/main/java/com/yovinchen/forum/common/api/ApiErrorCode.java b/src/main/java/com/yovinchen/forum/common/api/ApiErrorCode.java new file mode 100644 index 0000000..7fd6f58 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/common/api/ApiErrorCode.java @@ -0,0 +1,52 @@ +package com.yovinchen.forum.common.api; + + +public enum ApiErrorCode implements IErrorCode { + + /** + * 成功 + */ + SUCCESS(200, "操作成功"), + /** + * 失败 + */ + FAILED(-1, "操作失败"), + /** + * 未登录,Token过期 + */ + UNAUTHORIZED(401, "暂未登录或token已经过期"), + /** + * 权限不足 + */ + FORBIDDEN(403, "权限不足"), + /** + * 参数校验错误 + */ + VALIDATE_FAILED(404, "参数检验失败"); + + private final Integer code; + private final String message; + + ApiErrorCode(int code, String message) { + this.code = code; + this.message = message; + } + + @Override + public Integer getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } + + @Override + public String toString() { + return "ApiErrorCode{" + + "code=" + code + + ", message='" + message + '\'' + + '}'; + } +} diff --git a/src/main/java/com/yovinchen/forum/common/api/ApiResult.java b/src/main/java/com/yovinchen/forum/common/api/ApiResult.java new file mode 100644 index 0000000..ed31a49 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/common/api/ApiResult.java @@ -0,0 +1,152 @@ +package com.yovinchen.forum.common.api; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Optional; + + +@Data +@NoArgsConstructor +@ApiModel(value = "API 接口返回结果", description = "用于封装 API 接口返回的结果") +public class ApiResult implements Serializable { + + private static final long serialVersionUID = -4153430394359594346L; + /** + * 业务状态码 + */ + @ApiModelProperty(value = "业务状态码") + private long code; + /** + * 结果集 + */ + @ApiModelProperty(value = "结果集") + private T data; + /** + * 接口描述 + */ + @ApiModelProperty(value = "接口描述") + private String message; + + /** + * 全参 + * + * @param code 业务状态码 + * @param message 描述 + * @param data 结果集 + */ + public ApiResult(long code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + public ApiResult(IErrorCode errorCode) { + errorCode = Optional.ofNullable(errorCode).orElse(ApiErrorCode.FAILED); + this.code = errorCode.getCode(); + this.message = errorCode.getMessage(); + } + + /** + * 成功 + * + * @param data 结果集 + * @return {code:200,message:操作成功,data:自定义} + */ + public static ApiResult success() { + return new ApiResult(ApiErrorCode.SUCCESS.getCode(), ApiErrorCode.SUCCESS.getMessage(), null); + } + + /** + * 成功 + * + * @param data 结果集 + * @return {code:200,message:操作成功,data:自定义} + */ + public static ApiResult success(T data) { + return new ApiResult(ApiErrorCode.SUCCESS.getCode(), ApiErrorCode.SUCCESS.getMessage(), data); + } + + /** + * 成功 + * + * @param data 结果集 + * @param message 自定义提示信息 + * @return {code:200,message:自定义,data:自定义} + */ + public static ApiResult success(T data, String message) { + return new ApiResult(ApiErrorCode.SUCCESS.getCode(), message, data); + } + + /** + * 失败返回结果 + */ + public static ApiResult failed() { + return failed(ApiErrorCode.FAILED); + } + + /** + * 失败返回结果 + * + * @param message 提示信息 + * @return {code:枚举ApiErrorCode取,message:自定义,data:null} + */ + public static ApiResult failed(String message) { + return new ApiResult(ApiErrorCode.FAILED.getCode(), message, null); + } + + /** + * 失败 + * + * @param errorCode 错误码 + * @return {code:封装接口取,message:封装接口取,data:null} + */ + public static ApiResult failed(IErrorCode errorCode) { + return new ApiResult(errorCode.getCode(), errorCode.getMessage(), null); + } + + /** + * 失败返回结果 + * + * @param errorCode 错误码 + * @param message 错误信息 + * @return {code:枚举ApiErrorCode取,message:自定义,data:null} + */ + public static ApiResult failed(IErrorCode errorCode, String message) { + return new ApiResult(errorCode.getCode(), message, null); + } + + /** + * 参数验证失败返回结果 + */ + public static ApiResult validateFailed() { + return failed(ApiErrorCode.VALIDATE_FAILED); + } + + /** + * 参数验证失败返回结果 + * + * @param message 提示信息 + */ + public static ApiResult validateFailed(String message) { + return new ApiResult(ApiErrorCode.VALIDATE_FAILED.getCode(), message, null); + } + + /** + * 未登录返回结果 + */ + public static ApiResult unauthorized(T data) { + return new ApiResult(ApiErrorCode.UNAUTHORIZED.getCode(), ApiErrorCode.UNAUTHORIZED.getMessage(), data); + } + + /** + * 未授权返回结果 + */ + public static ApiResult forbidden(T data) { + return new ApiResult(ApiErrorCode.FORBIDDEN.getCode(), ApiErrorCode.FORBIDDEN.getMessage(), data); + } +} diff --git a/src/main/java/com/yovinchen/forum/common/api/IErrorCode.java b/src/main/java/com/yovinchen/forum/common/api/IErrorCode.java new file mode 100644 index 0000000..d602d66 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/common/api/IErrorCode.java @@ -0,0 +1,18 @@ +package com.yovinchen.forum.common.api; + + +public interface IErrorCode { + /** + * 错误编码: -1失败;200成功 + * + * @return 错误编码 + */ + Integer getCode(); + + /** + * 错误描述 + * + * @return 错误描述 + */ + String getMessage(); +} diff --git a/src/main/java/com/yovinchen/forum/common/exception/ApiAsserts.java b/src/main/java/com/yovinchen/forum/common/exception/ApiAsserts.java new file mode 100644 index 0000000..87c2357 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/common/exception/ApiAsserts.java @@ -0,0 +1,24 @@ +package com.yovinchen.forum.common.exception; + +import com.yovinchen.forum.common.api.IErrorCode; + + +public class ApiAsserts { + /** + * 抛失败异常 + * + * @param message 说明 + */ + public static void fail(String message) { + throw new ApiException(message); + } + + /** + * 抛失败异常 + * + * @param errorCode 状态码 + */ + public static void fail(IErrorCode errorCode) { + throw new ApiException(errorCode); + } +} diff --git a/src/main/java/com/yovinchen/forum/common/exception/ApiException.java b/src/main/java/com/yovinchen/forum/common/exception/ApiException.java new file mode 100644 index 0000000..1acc58e --- /dev/null +++ b/src/main/java/com/yovinchen/forum/common/exception/ApiException.java @@ -0,0 +1,21 @@ +package com.yovinchen.forum.common.exception; + +import com.yovinchen.forum.common.api.IErrorCode; + + +public class ApiException extends RuntimeException { + private IErrorCode errorCode; + + public ApiException(IErrorCode errorCode) { + super(errorCode.getMessage()); + this.errorCode = errorCode; + } + + public ApiException(String message) { + super(message); + } + + public IErrorCode getErrorCode() { + return errorCode; + } +} diff --git a/src/main/java/com/yovinchen/forum/common/exception/GlobalExceptionHandler.java b/src/main/java/com/yovinchen/forum/common/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..2681f11 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/common/exception/GlobalExceptionHandler.java @@ -0,0 +1,23 @@ +package com.yovinchen.forum.common.exception;//package com.knox.aurora.common.exception; + +import com.yovinchen.forum.common.api.ApiResult; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Map; + +@ControllerAdvice +public class GlobalExceptionHandler { + /** + * 捕获自定义异常 + */ + @ResponseBody + @ExceptionHandler(value = ApiException.class) + public ApiResult> handle(ApiException e) { + if (e.getErrorCode() != null) { + return ApiResult.failed(e.getErrorCode()); + } + return ApiResult.failed(e.getMessage()); + } +} diff --git a/src/main/java/com/yovinchen/forum/common/mybatisplus/MybatisPlusConfig.java b/src/main/java/com/yovinchen/forum/common/mybatisplus/MybatisPlusConfig.java new file mode 100644 index 0000000..52d433d --- /dev/null +++ b/src/main/java/com/yovinchen/forum/common/mybatisplus/MybatisPlusConfig.java @@ -0,0 +1,31 @@ +package com.yovinchen.forum.common.mybatisplus; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +@Configuration +@MapperScan("com.yovinchen.forum.mapper") +public class MybatisPlusConfig { + + /** + * 新的分页插件,一缓和二缓遵循mybatis的规则, + * 需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除) + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } + + @Bean + public ConfigurationCustomizer configurationCustomizer() { + return configuration -> configuration.setUseDeprecatedExecutor(false); + } +} diff --git a/src/main/java/com/yovinchen/forum/config/GlobalWebMvcConfigurer.java b/src/main/java/com/yovinchen/forum/config/GlobalWebMvcConfigurer.java new file mode 100644 index 0000000..b284b83 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/config/GlobalWebMvcConfigurer.java @@ -0,0 +1,43 @@ +package com.yovinchen.forum.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + + +@Configuration +public class GlobalWebMvcConfigurer implements WebMvcConfigurer { + + /** + * 跨域 + */ + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("*") + .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS") + .allowCredentials(true) + .maxAge(3600) + .allowedHeaders("*"); + } + + @Bean + public CorsFilter corsFilter() { + CorsConfiguration config = new CorsConfiguration(); + //允许所有域名进行跨域调用 + config.addAllowedOrigin("*"); + //允许跨越发送cookie + config.setAllowCredentials(true); + //放行全部原始头信息 + config.addAllowedHeader("*"); + //允许所有请求方法跨域调用 + config.addAllowedMethod("*"); + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", config); + return new CorsFilter(source); + } +} diff --git a/src/main/java/com/yovinchen/forum/config/Knife4jConfig.java b/src/main/java/com/yovinchen/forum/config/Knife4jConfig.java new file mode 100644 index 0000000..5486a42 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/config/Knife4jConfig.java @@ -0,0 +1,49 @@ +package com.yovinchen.forum.config; + +/** + * ClassName: config + * Package: com.yovinchen.forum.config + * + * @author yovinchen + * @Create 2023/6/14 16:51 + */ + +import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@Configuration +@EnableSwagger2 +@EnableKnife4j +public class Knife4jConfig { + + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + .useDefaultResponseMessages(false) + .apiInfo(apiInfo()) + .select() + .apis(RequestHandlerSelectors.basePackage("com.yovinchen.forum.controller")) + .paths(PathSelectors.any()) + .build(); + + } + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .description("论坛接口测试文档") + .contact(new Contact("测试", "https://github.com", "123@qq.com")) + .version("v1.0.1") + .title("API测试文档") + .build(); + } + +} diff --git a/src/main/java/com/yovinchen/forum/controller/BaseController.java b/src/main/java/com/yovinchen/forum/controller/BaseController.java new file mode 100644 index 0000000..4092f05 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/BaseController.java @@ -0,0 +1,4 @@ +package com.yovinchen.forum.controller; + +public class BaseController { +} diff --git a/src/main/java/com/yovinchen/forum/controller/BmsBillboardController.java b/src/main/java/com/yovinchen/forum/controller/BmsBillboardController.java new file mode 100644 index 0000000..9cc5108 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/BmsBillboardController.java @@ -0,0 +1,32 @@ +package com.yovinchen.forum.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yovinchen.forum.common.api.ApiResult; +import com.yovinchen.forum.model.entity.BmsBillboard; +import com.yovinchen.forum.service.IBmsBillboardService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +@Api(tags = "公告牌管理接口") +@RestController +@RequestMapping("/billboard") +public class BmsBillboardController extends BaseController { + + @Resource + private IBmsBillboardService bmsBillboardService; + + @ApiOperation(value = "展示公告牌", notes = "获取最近一条展示中的公告牌信息") + @GetMapping("/show") + public ApiResult getNotices(){ + List list = bmsBillboardService.list(new + LambdaQueryWrapper().eq(BmsBillboard::isShow,true)); + return ApiResult.success(list.get(list.size()- 1)); + } +} diff --git a/src/main/java/com/yovinchen/forum/controller/BmsCommentController.java b/src/main/java/com/yovinchen/forum/controller/BmsCommentController.java new file mode 100644 index 0000000..c114e0e --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/BmsCommentController.java @@ -0,0 +1,44 @@ +package com.yovinchen.forum.controller; + +import com.yovinchen.forum.common.api.ApiResult; +import com.yovinchen.forum.jwt.JwtUtil; +import com.yovinchen.forum.model.dto.CommentDTO; +import com.yovinchen.forum.model.entity.BmsComment; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.model.vo.CommentVO; +import com.yovinchen.forum.service.IBmsCommentService; +import com.yovinchen.forum.service.IUmsUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +@Api(tags = "评论管理接口") +@RestController +@RequestMapping("/comment") +public class BmsCommentController extends BaseController { + + @Resource + private IBmsCommentService bmsCommentService; + @Resource + private IUmsUserService umsUserService; + + @ApiOperation(value = "根据话题ID获取评论列表", notes = "根据话题ID获取评论列表") + @GetMapping("/get_comments") + public ApiResult> getCommentsByTopicID(@ApiParam(value = "话题ID", required = true) @RequestParam(value = "topicid", defaultValue = "1") String topicid) { + List lstBmsComment = bmsCommentService.getCommentsByTopicID(topicid); + return ApiResult.success(lstBmsComment); + } + + @ApiOperation(value = "添加评论", notes = "添加评论") + @PostMapping("/add_comment") + public ApiResult create(@ApiParam(value = "当前用户名称", required = true) @RequestHeader(value = JwtUtil.USER_NAME) String userName, @ApiParam(value = "评论内容相关信息", required = true) @RequestBody CommentDTO dto) { + UmsUser user = umsUserService.getUserByUsername(userName); + BmsComment comment = bmsCommentService.create(dto, user); + return ApiResult.success(comment); + } + +} diff --git a/src/main/java/com/yovinchen/forum/controller/BmsPostController.java b/src/main/java/com/yovinchen/forum/controller/BmsPostController.java new file mode 100644 index 0000000..c628b17 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/BmsPostController.java @@ -0,0 +1,91 @@ +package com.yovinchen.forum.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.vdurmont.emoji.EmojiParser; +import com.yovinchen.forum.common.api.ApiResult; +import com.yovinchen.forum.jwt.JwtUtil; +import com.yovinchen.forum.model.dto.CreateTopicDTO; +import com.yovinchen.forum.model.entity.BmsPost; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.model.vo.PostVO; +import com.yovinchen.forum.service.IBmsPostService; +import com.yovinchen.forum.service.IUmsUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Api(tags = "帖子管理接口") +@RestController +@RequestMapping("/post") +public class BmsPostController extends BaseController { + + @Resource + private IBmsPostService iBmsPostService; + @Resource + private IUmsUserService umsUserService; + + @ApiOperation(value = "获取帖子列表", notes = "根据标签类型获取帖子列表") + @GetMapping("/list") + public ApiResult> list(@ApiParam(name = "tab", value = "标签类型", defaultValue = "latest") @RequestParam(value = "tab", defaultValue = "latest") String tab, @ApiParam(name = "pageNo", value = "页码", defaultValue = "1") @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo, @ApiParam(name = "pageSize", value = "每页显示数量", defaultValue = "10") @RequestParam(value = "size", defaultValue = "10") Integer pageSize) { + Page list = iBmsPostService.getList(new Page<>(pageNo, pageSize), tab); + return ApiResult.success(list); + } + + + @ApiOperation(value = "创建帖子", notes = "通过传入参数来创建一个新的帖子") + @RequestMapping(value = "/create", method = RequestMethod.POST) + public ApiResult create(@RequestHeader(value = JwtUtil.USER_NAME) String userName, @ApiParam(name = "dto", value = "帖子内容", required = true) @RequestBody CreateTopicDTO dto) { + UmsUser user = umsUserService.getUserByUsername(userName); + BmsPost topic = iBmsPostService.create(dto, user); + return ApiResult.success(topic); + } + + + @ApiOperation(value = "查看帖子详情", notes = "通过ID查看帖子详情") + @GetMapping() + public ApiResult> view(@ApiParam(name = "id", value = "帖子ID", required = true) @RequestParam("id") String id) { + Map map = iBmsPostService.viewTopic(id); + return ApiResult.success(map); + } + + + @ApiOperation(value = "获取帖子推荐列表", notes = "通过当前帖子 ID 获取相关的推荐帖子列表") + @GetMapping("/recommend") + public ApiResult> getRecommend(@ApiParam(name = "id", value = "当前帖子ID", required = true) @RequestParam("topicId") String id) { + List topics = iBmsPostService.getRecommend(id); + return ApiResult.success(topics); + } + + + @ApiOperation(value = "更新帖子信息", notes = "用户可以通过该接口修改自己的帖子信息") + @PostMapping("/update") + public ApiResult update(@ApiParam(name = "userName", value = "用户名", required = true) @RequestHeader(value = JwtUtil.USER_NAME) String userName, @Valid @RequestBody BmsPost post) { + UmsUser umsUser = umsUserService.getUserByUsername(userName); + Assert.isTrue(umsUser.getId().equals(post.getUserId()), "非本人无权修改"); + post.setModifyTime(new Date()); + post.setContent(EmojiParser.parseToAliases(post.getContent())); + iBmsPostService.updateById(post); + return ApiResult.success(post); + } + + + @ApiOperation(value = "删除帖子", notes = "用户可以通过该接口删除自己的帖子") + @DeleteMapping("/delete/{id}") + public ApiResult delete(@ApiParam(name = "userName", value = "用户名", required = true) @RequestHeader(value = JwtUtil.USER_NAME) String userName, @ApiParam(name = "id", value = "帖子ID", required = true) @PathVariable("id") String id) { + UmsUser umsUser = umsUserService.getUserByUsername(userName); + BmsPost byId = iBmsPostService.getById(id); + Assert.notNull(byId, "来晚一步,话题已不存在"); + Assert.isTrue(byId.getUserId().equals(umsUser.getId()), "你为什么可以删除别人的话题???"); + iBmsPostService.removeById(id); + return ApiResult.success(null, "删除成功"); + } + +} diff --git a/src/main/java/com/yovinchen/forum/controller/BmsPromotionController.java b/src/main/java/com/yovinchen/forum/controller/BmsPromotionController.java new file mode 100644 index 0000000..3743770 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/BmsPromotionController.java @@ -0,0 +1,33 @@ +package com.yovinchen.forum.controller; + +import com.yovinchen.forum.common.api.ApiResult; +import com.yovinchen.forum.model.entity.BmsPromotion; +import com.yovinchen.forum.service.IBmsPromotionService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + + +@Api(tags = "推广管理接口") +@RestController +@RequestMapping("/promotion") +public class BmsPromotionController extends BaseController { + + @Resource + private IBmsPromotionService bmsPromotionService; + + @ApiOperation(value = "获取所有推广信息", notes = "获取所有推广信息列表") + @GetMapping("/all") + public ApiResult> list() { + List list = bmsPromotionService.list(); + return ApiResult.success(list); + } + +} + + diff --git a/src/main/java/com/yovinchen/forum/controller/BmsRelationshipController.java b/src/main/java/com/yovinchen/forum/controller/BmsRelationshipController.java new file mode 100644 index 0000000..0dbd7eb --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/BmsRelationshipController.java @@ -0,0 +1,77 @@ +package com.yovinchen.forum.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yovinchen.forum.common.api.ApiResult; +import com.yovinchen.forum.common.exception.ApiAsserts; +import com.yovinchen.forum.jwt.JwtUtil; +import com.yovinchen.forum.model.entity.BmsFollow; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.service.IBmsFollowService; +import com.yovinchen.forum.service.IUmsUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + +@Api(tags = "关注管理接口") +@RestController +@RequestMapping("/relationship") +public class BmsRelationshipController extends BaseController { + + @Resource + private IBmsFollowService bmsFollowService; + + @Resource + private IUmsUserService umsUserService; + + @GetMapping("/subscribe/{userId}") + @ApiOperation(value = "关注用户", notes = "通过传入用户ID,让当前用户关注该用户") + public ApiResult handleFollow(@RequestHeader(value = JwtUtil.USER_NAME) String userName, @PathVariable("userId") @ApiParam(name = "userId", value = "用户ID", required = true, example = "12345") String parentId) { + UmsUser umsUser = umsUserService.getUserByUsername(userName); + if (parentId.equals(umsUser.getId())) { + ApiAsserts.fail("您脸皮太厚了,怎么可以关注自己呢 😮"); + } + BmsFollow one = bmsFollowService.getOne(new LambdaQueryWrapper().eq(BmsFollow::getParentId, parentId).eq(BmsFollow::getFollowerId, umsUser.getId())); + if (!ObjectUtils.isEmpty(one)) { + ApiAsserts.fail("已关注"); + } + + BmsFollow follow = new BmsFollow(); + follow.setParentId(parentId); + follow.setFollowerId(umsUser.getId()); + bmsFollowService.save(follow); + return ApiResult.success(null, "关注成功"); + } + + @GetMapping("/unsubscribe/{userId}") + @ApiOperation(value = "取消关注用户", notes = "通过传入用户ID,让当前用户取消关注该用户") + public ApiResult handleUnFollow(@RequestHeader(value = JwtUtil.USER_NAME) String userName, @PathVariable("userId") @ApiParam(name = "userId", value = "用户ID", required = true, example = "12345") String parentId) { + UmsUser umsUser = umsUserService.getUserByUsername(userName); + BmsFollow one = bmsFollowService.getOne(new LambdaQueryWrapper().eq(BmsFollow::getParentId, parentId).eq(BmsFollow::getFollowerId, umsUser.getId())); + if (ObjectUtils.isEmpty(one)) { + ApiAsserts.fail("未关注!"); + } + bmsFollowService.remove(new LambdaQueryWrapper().eq(BmsFollow::getParentId, parentId).eq(BmsFollow::getFollowerId, umsUser.getId())); + return ApiResult.success(null, "取关成功"); + } + + @GetMapping("/validate/{topicUserId}") + @ApiOperation(value = "查询是否关注该用户", notes = "通过传入用户ID,查询当前用户是否已经关注该用户,返回结果为布尔类型") + public ApiResult> isFollow(@RequestHeader(value = JwtUtil.USER_NAME) String userName, @PathVariable("topicUserId") @ApiParam(name = "topicUserId", value = "用户ID", required = true, example = "12345") String topicUserId) { + UmsUser umsUser = umsUserService.getUserByUsername(userName); + Map map = new HashMap<>(16); + map.put("hasFollow", false); + if (!ObjectUtils.isEmpty(umsUser)) { + BmsFollow one = bmsFollowService.getOne(new LambdaQueryWrapper().eq(BmsFollow::getParentId, topicUserId).eq(BmsFollow::getFollowerId, umsUser.getId())); + if (!ObjectUtils.isEmpty(one)) { + map.put("hasFollow", true); + } + } + return ApiResult.success(map); + } +} diff --git a/src/main/java/com/yovinchen/forum/controller/BmsSearchController.java b/src/main/java/com/yovinchen/forum/controller/BmsSearchController.java new file mode 100644 index 0000000..ae9897d --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/BmsSearchController.java @@ -0,0 +1,31 @@ +package com.yovinchen.forum.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yovinchen.forum.common.api.ApiResult; +import com.yovinchen.forum.model.vo.PostVO; +import com.yovinchen.forum.service.IBmsPostService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@Api(tags = "搜索管理接口") +@RestController +@RequestMapping("/search") +public class BmsSearchController extends BaseController { + + @Resource + private IBmsPostService postService; + + @GetMapping + @ApiOperation(value = "根据关键字搜索帖子列表", notes = "根据指定关键字,分页查询帖子列表") + public ApiResult> searchList(@ApiParam(name = "keyword", value = "搜索关键字", required = true) @RequestParam("keyword") String keyword, @ApiParam(name = "pageNum", value = "页码", defaultValue = "1") @RequestParam("pageNum") Integer pageNum, @ApiParam(name = "pageSize", value = "每页显示条数", defaultValue = "10") @RequestParam("pageSize") Integer pageSize) { + Page results = postService.searchByKey(keyword, new Page<>(pageNum, pageSize)); + return ApiResult.success(results); + } +} diff --git a/src/main/java/com/yovinchen/forum/controller/BmsTagController.java b/src/main/java/com/yovinchen/forum/controller/BmsTagController.java new file mode 100644 index 0000000..892ffb5 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/BmsTagController.java @@ -0,0 +1,46 @@ +package com.yovinchen.forum.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yovinchen.forum.common.api.ApiResult; +import com.yovinchen.forum.model.entity.BmsPost; +import com.yovinchen.forum.model.entity.BmsTag; +import com.yovinchen.forum.service.IBmsTagService; +import io.swagger.annotations.*; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + +@Api(tags = "标签管理接口") +@RestController +@RequestMapping("/tag") +public class BmsTagController extends BaseController { + + @Resource + private IBmsTagService bmsTagService; + + @ApiOperation(value = "根据标签名获取帖子列表", notes = "通过标签名获取帖子列表") + @ApiImplicitParams({@ApiImplicitParam(name = "name", value = "标签名", required = true, dataType = "String", paramType = "path"), @ApiImplicitParam(name = "page", value = "页码", defaultValue = "1", dataType = "Integer", paramType = "query"), @ApiImplicitParam(name = "size", value = "每页大小", defaultValue = "10", dataType = "Integer", paramType = "query")}) + @GetMapping("/{name}") + public ApiResult> getTopicsByTag(@ApiParam(name = "name", value = "标签名", required = true) @PathVariable("name") String tagName, @ApiParam(name = "page", value = "页码", defaultValue = "1") @RequestParam(value = "page", defaultValue = "1") Integer page, @ApiParam(name = "size", value = "每页大小", defaultValue = "10") @RequestParam(value = "size", defaultValue = "10") Integer size) { + + Map map = new HashMap<>(16); + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(BmsTag::getName, tagName); + BmsTag one = bmsTagService.getOne(wrapper); + Assert.notNull(one, "话题不存在,或已被管理员删除"); + Page topics = bmsTagService.selectTopicsByTagId(new Page<>(page, size), one.getId()); + // 其他热门标签 + Page hotTags = bmsTagService.page(new Page<>(1, 10), new LambdaQueryWrapper().notIn(BmsTag::getName, tagName).orderByDesc(BmsTag::getTopicCount)); + + map.put("topics", topics); + map.put("hotTags", hotTags); + + return ApiResult.success(map); + } + +} diff --git a/src/main/java/com/yovinchen/forum/controller/BmsTipController.java b/src/main/java/com/yovinchen/forum/controller/BmsTipController.java new file mode 100644 index 0000000..ed11444 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/BmsTipController.java @@ -0,0 +1,34 @@ +package com.yovinchen.forum.controller; + +import com.yovinchen.forum.common.api.ApiResult; +import com.yovinchen.forum.model.entity.BmsTip; +import com.yovinchen.forum.service.IBmsTipService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@Api(tags = "每日一言管理接口") +@RestController +@RequestMapping("/tip") +public class BmsTipController extends BaseController { + + @Resource + private IBmsTipService bmsTipService; + + /** + * 获取一条随机的每日一言 + * + * @return 随机获取到的每日一言信息 + */ + @ApiOperation(value = "获取一条随机的每日一言", notes = "获取一条随机的每日一言") + @GetMapping("/today") + public ApiResult getRandomTip() { + BmsTip tip = bmsTipService.getRandomTip(); + return ApiResult.success(tip); + } +} + diff --git a/src/main/java/com/yovinchen/forum/controller/GiteeLogin.java b/src/main/java/com/yovinchen/forum/controller/GiteeLogin.java new file mode 100644 index 0000000..52d1c61 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/GiteeLogin.java @@ -0,0 +1,11 @@ +package com.yovinchen.forum.controller; + +/** + * ClassName: GiteeLogin + * Package: com.yovinchen.forum.controller + * /oauth/callback + * @author yovinchen + * @Create 2023/6/14 20:11 + */ +public class GiteeLogin { +} diff --git a/src/main/java/com/yovinchen/forum/controller/UmsUserController.java b/src/main/java/com/yovinchen/forum/controller/UmsUserController.java new file mode 100644 index 0000000..458b34f --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/UmsUserController.java @@ -0,0 +1,91 @@ +package com.yovinchen.forum.controller; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yovinchen.forum.common.api.ApiResult; +import com.yovinchen.forum.jwt.JwtUtil; +import com.yovinchen.forum.model.dto.LoginDTO; +import com.yovinchen.forum.model.dto.RegisterDTO; +import com.yovinchen.forum.model.entity.BmsPost; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.service.IBmsPostService; +import com.yovinchen.forum.service.IUmsUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.util.Assert; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.Map; + +@Api(tags = "用户管理接口") +@RestController +@RequestMapping("/ums/user") +public class UmsUserController extends BaseController { + @Resource + private IUmsUserService iUmsUserService; + @Resource + private IBmsPostService iBmsPostService; + + @ApiOperation(value = "用户注册", notes = "用户注册接口") + @PostMapping("/register") + public ApiResult> register(@ApiParam(name = "dto", value = "注册信息", required = true) @Valid @RequestBody RegisterDTO dto) { + UmsUser user = iUmsUserService.executeRegister(dto); + if (ObjectUtils.isEmpty(user)) { + return ApiResult.failed("账号注册失败"); + } + Map map = new HashMap<>(16); + map.put("user", user); + return ApiResult.success(map); + } + + @ApiOperation(value = "用户登陆", notes = "用户登陆接口") + @RequestMapping(value = "/login", method = RequestMethod.POST) + public ApiResult> login(@ApiParam(name = "dto", value = "登陆信息", required = true) @Valid @RequestBody LoginDTO dto) { + String token = iUmsUserService.executeLogin(dto); + if (ObjectUtils.isEmpty(token)) { + return ApiResult.failed("账号密码错误"); + } + Map map = new HashMap<>(16); + map.put("token", token); + return ApiResult.success(map, "登录成功"); + } + + @ApiOperation(value = "获取当前用户登陆信息", notes = "获取当前用户登陆信息接口") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public ApiResult getUser(@ApiParam(name = "userName", value = "用户名", required = true) @RequestHeader(value = JwtUtil.USER_NAME) String userName) { + UmsUser user = iUmsUserService.getUserByUsername(userName); + return ApiResult.success(user); + } + + @ApiOperation(value = "登出", notes = "用户登出接口") + @RequestMapping(value = "/logout", method = RequestMethod.GET) + public ApiResult logOut() { + return ApiResult.success(null, "注销成功"); + } + + @ApiOperation(value = "根据用户名获取该用户发布的帖子列表", notes = "通过用户名获取帖子列表") + @GetMapping("/{username}") + public ApiResult> getUserByName(@ApiParam(name = "username", value = "用户名", required = true) @PathVariable("username") String username, @ApiParam(name = "pageNo", value = "页码", defaultValue = "1") @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo, @ApiParam(name = "size", value = "每页大小", defaultValue = "10") @RequestParam(value = "size", defaultValue = "10") Integer size) { + Map map = new HashMap<>(16); + UmsUser user = iUmsUserService.getUserByUsername(username); + Assert.notNull(user, "用户不存在"); + Page page = iBmsPostService.page(new Page<>(pageNo, size), new LambdaQueryWrapper().eq(BmsPost::getUserId, user.getId())); + map.put("user", user); + map.put("topics", page); + return ApiResult.success(map); + } + + @ApiOperation(value = "修改用户信息", notes = "修改用户信息接口") + @PostMapping("/update") + public ApiResult updateUser(@ApiParam(name = "umsUser", value = "用户信息", required = true) @RequestBody UmsUser umsUser) { + iUmsUserService.updateById(umsUser); + return ApiResult.success(umsUser); + } +} + diff --git a/src/main/java/com/yovinchen/forum/jwt/JwtAuthenticationFilter.java b/src/main/java/com/yovinchen/forum/jwt/JwtAuthenticationFilter.java new file mode 100644 index 0000000..7927fc2 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/jwt/JwtAuthenticationFilter.java @@ -0,0 +1,57 @@ +package com.yovinchen.forum.jwt; + +import org.springframework.util.AntPathMatcher; +import org.springframework.util.PathMatcher; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + + +public class JwtAuthenticationFilter extends OncePerRequestFilter { + private static final PathMatcher pathMatcher = new AntPathMatcher(); + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + + try { + if(isProtectedUrl(request)) { +// System.out.println(request.getMethod()); + if(!request.getMethod().equals("OPTIONS")) + request = JwtUtil.validateTokenAndAddUserIdToHeader(request); + } + } catch (Exception e) { + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, e.getMessage()); + return; + } + filterChain.doFilter(request, response); + } + + private boolean isProtectedUrl(HttpServletRequest request) { + List protectedPaths = new ArrayList(); + protectedPaths.add("/ums/user/info"); + protectedPaths.add("/ums/user/update"); + protectedPaths.add("/post/create"); + protectedPaths.add("/post/update"); + protectedPaths.add("/post/delete/*"); + protectedPaths.add("/comment/add_comment"); + protectedPaths.add("/relationship/subscribe/*"); + protectedPaths.add("/relationship/unsubscribe/*"); + protectedPaths.add("/relationship/validate/*"); + + boolean bFind = false; + for( String passedPath : protectedPaths ) { + bFind = pathMatcher.match(passedPath, request.getServletPath()); + if( bFind ) { + break; + } + } + return bFind; + } + +} diff --git a/src/main/java/com/yovinchen/forum/jwt/JwtUtil.java b/src/main/java/com/yovinchen/forum/jwt/JwtUtil.java new file mode 100644 index 0000000..01f13a1 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/jwt/JwtUtil.java @@ -0,0 +1,75 @@ +package com.yovinchen.forum.jwt; + +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.util.*; + +public class JwtUtil { + private static final Logger logger = LoggerFactory.getLogger(JwtUtil.class); + public static final long EXPIRATION_TIME = 3600_000_000L; // 1000 hour + public static final String SECRET = "ThisIsASecret";//please change to your own encryption secret. + public static final String TOKEN_PREFIX = "Bearer "; + public static final String HEADER_STRING = "Authorization"; + public static final String USER_NAME = "userName"; + + public static String generateToken(String userId) { + HashMap map = new HashMap<>(); + //you can put any data in the map + map.put(USER_NAME, userId); + String jwt = Jwts.builder() + .setClaims(map) + .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) + .signWith(SignatureAlgorithm.HS512, SECRET) + .compact(); + return jwt; //jwt前面一般都会加Bearer + } + + public static HttpServletRequest validateTokenAndAddUserIdToHeader(HttpServletRequest request) { + String token = request.getHeader(HEADER_STRING); + if (token != null) { + // parse the token. + try { + Map body = Jwts.parser() + .setSigningKey(SECRET) + .parseClaimsJws(token.replace(TOKEN_PREFIX, "")) + .getBody(); + return new CustomHttpServletRequest(request, body); + } catch (Exception e) { + logger.info(e.getMessage()); + throw new TokenValidationException(e.getMessage()); + } + } else { + throw new TokenValidationException("Missing token"); + } + } + + public static class CustomHttpServletRequest extends HttpServletRequestWrapper { + private Map claims; + + public CustomHttpServletRequest(HttpServletRequest request, Map claims) { + super(request); + this.claims = new HashMap<>(); + claims.forEach((k, v) -> this.claims.put(k, String.valueOf(v))); + } + + @Override + public Enumeration getHeaders(String name) { + if (claims != null && claims.containsKey(name)) { + return Collections.enumeration(Arrays.asList(claims.get(name))); + } + return super.getHeaders(name); + } + + } + + static class TokenValidationException extends RuntimeException { + public TokenValidationException(String msg) { + super(msg); + } + } +} diff --git a/src/main/java/com/yovinchen/forum/mapper/BmsBillboardMapper.java b/src/main/java/com/yovinchen/forum/mapper/BmsBillboardMapper.java new file mode 100644 index 0000000..0550557 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/mapper/BmsBillboardMapper.java @@ -0,0 +1,9 @@ +package com.yovinchen.forum.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yovinchen.forum.model.entity.BmsBillboard; +import org.springframework.stereotype.Repository; + +@Repository +public interface BmsBillboardMapper extends BaseMapper { +} diff --git a/src/main/java/com/yovinchen/forum/mapper/BmsCommentMapper.java b/src/main/java/com/yovinchen/forum/mapper/BmsCommentMapper.java new file mode 100644 index 0000000..0ac24ea --- /dev/null +++ b/src/main/java/com/yovinchen/forum/mapper/BmsCommentMapper.java @@ -0,0 +1,22 @@ +package com.yovinchen.forum.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yovinchen.forum.model.entity.BmsComment; +import com.yovinchen.forum.model.vo.CommentVO; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + + +@Repository +public interface BmsCommentMapper extends BaseMapper { + + /** + * getCommentsByTopicID + * + * @param topicid + * @return + */ + List getCommentsByTopicID(@Param("topicid") String topicid); +} diff --git a/src/main/java/com/yovinchen/forum/mapper/BmsFollowMapper.java b/src/main/java/com/yovinchen/forum/mapper/BmsFollowMapper.java new file mode 100644 index 0000000..b01e03d --- /dev/null +++ b/src/main/java/com/yovinchen/forum/mapper/BmsFollowMapper.java @@ -0,0 +1,9 @@ +package com.yovinchen.forum.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yovinchen.forum.model.entity.BmsFollow; +import org.springframework.stereotype.Repository; + +@Repository +public interface BmsFollowMapper extends BaseMapper { +} diff --git a/src/main/java/com/yovinchen/forum/mapper/BmsPromotionMapper.java b/src/main/java/com/yovinchen/forum/mapper/BmsPromotionMapper.java new file mode 100644 index 0000000..ffe4349 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/mapper/BmsPromotionMapper.java @@ -0,0 +1,10 @@ +package com.yovinchen.forum.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yovinchen.forum.model.entity.BmsPromotion; +import org.springframework.stereotype.Repository; + + +@Repository +public interface BmsPromotionMapper extends BaseMapper { +} diff --git a/src/main/java/com/yovinchen/forum/mapper/BmsTagMapper.java b/src/main/java/com/yovinchen/forum/mapper/BmsTagMapper.java new file mode 100644 index 0000000..a4dacca --- /dev/null +++ b/src/main/java/com/yovinchen/forum/mapper/BmsTagMapper.java @@ -0,0 +1,11 @@ +package com.yovinchen.forum.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yovinchen.forum.model.entity.BmsTag; +import org.springframework.stereotype.Repository; + + +@Repository +public interface BmsTagMapper extends BaseMapper { + +} diff --git a/src/main/java/com/yovinchen/forum/mapper/BmsTipMapper.java b/src/main/java/com/yovinchen/forum/mapper/BmsTipMapper.java new file mode 100644 index 0000000..c6026ce --- /dev/null +++ b/src/main/java/com/yovinchen/forum/mapper/BmsTipMapper.java @@ -0,0 +1,10 @@ +package com.yovinchen.forum.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yovinchen.forum.model.entity.BmsTip; +import org.springframework.stereotype.Repository; + +@Repository +public interface BmsTipMapper extends BaseMapper { + BmsTip getRandomTip(); +} diff --git a/src/main/java/com/yovinchen/forum/mapper/BmsTopicMapper.java b/src/main/java/com/yovinchen/forum/mapper/BmsTopicMapper.java new file mode 100644 index 0000000..149315d --- /dev/null +++ b/src/main/java/com/yovinchen/forum/mapper/BmsTopicMapper.java @@ -0,0 +1,39 @@ +package com.yovinchen.forum.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yovinchen.forum.model.entity.BmsPost; +import com.yovinchen.forum.model.vo.PostVO; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface BmsTopicMapper extends BaseMapper { + /** + * 分页查询首页话题列表 + *

+ * + * @param page + * @param tab + * @return + */ + Page selectListAndPage(@Param("page") Page page, @Param("tab") String tab); + + /** + * 获取详情页推荐 + * + * @param id + * @return + */ + List selectRecommend(@Param("id") String id); + /** + * 全文检索 + * + * @param page + * @param keyword + * @return + */ + Page searchByKey(@Param("page") Page page, @Param("keyword") String keyword); +} diff --git a/src/main/java/com/yovinchen/forum/mapper/BmsTopicTagMapper.java b/src/main/java/com/yovinchen/forum/mapper/BmsTopicTagMapper.java new file mode 100644 index 0000000..518169e --- /dev/null +++ b/src/main/java/com/yovinchen/forum/mapper/BmsTopicTagMapper.java @@ -0,0 +1,20 @@ +package com.yovinchen.forum.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yovinchen.forum.model.entity.BmsTopicTag; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.Set; + + +@Repository +public interface BmsTopicTagMapper extends BaseMapper { + /** + * 根据标签获取话题ID集合 + * + * @param id + * @return + */ + Set getTopicIdsByTagId(@Param("id") String id); +} diff --git a/src/main/java/com/yovinchen/forum/mapper/UmsUserMapper.java b/src/main/java/com/yovinchen/forum/mapper/UmsUserMapper.java new file mode 100644 index 0000000..cefe498 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/mapper/UmsUserMapper.java @@ -0,0 +1,15 @@ +package com.yovinchen.forum.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yovinchen.forum.model.entity.UmsUser; +import org.springframework.stereotype.Repository; + +/** + * 用户 + * + * @author Knox 2020/11/7 + */ +@Repository +public interface UmsUserMapper extends BaseMapper { + +} diff --git a/src/main/java/com/yovinchen/forum/model/dto/CommentDTO.java b/src/main/java/com/yovinchen/forum/model/dto/CommentDTO.java new file mode 100644 index 0000000..44e9c43 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/dto/CommentDTO.java @@ -0,0 +1,25 @@ +package com.yovinchen.forum.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + + +@Data +@ApiModel(description = "评论DTO") +public class CommentDTO implements Serializable { + + private static final long serialVersionUID = -5957433707110390852L; + + @ApiModelProperty(value = "话题id", required = true) + private String topic_id; + + /** + * 内容 + */ + @ApiModelProperty(value = "评论内容", required = true) + private String content; + +} diff --git a/src/main/java/com/yovinchen/forum/model/dto/CreateTopicDTO.java b/src/main/java/com/yovinchen/forum/model/dto/CreateTopicDTO.java new file mode 100644 index 0000000..e230f80 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/dto/CreateTopicDTO.java @@ -0,0 +1,33 @@ +package com.yovinchen.forum.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel(description = "创建话题DTO") +public class CreateTopicDTO implements Serializable { + private static final long serialVersionUID = -5957433707110390852L; + + /** + * 标题 + */ + @ApiModelProperty(value = "话题标题", required = true) + private String title; + + /** + * 内容 + */ + @ApiModelProperty(value = "话题内容", required = true) + private String content; + + /** + * 标签 + */ + @ApiModelProperty(value = "话题标签列表", required = true) + private List tags; + +} diff --git a/src/main/java/com/yovinchen/forum/model/dto/LoginDTO.java b/src/main/java/com/yovinchen/forum/model/dto/LoginDTO.java new file mode 100644 index 0000000..7dc3719 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/dto/LoginDTO.java @@ -0,0 +1,30 @@ +package com.yovinchen.forum.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serializable; + + +@Data +@ApiModel(description = "登录DTO") +public class LoginDTO implements Serializable { + + private static final long serialVersionUID = 602891322506543807L; + + @NotBlank(message = "用户名不能为空") + @Size(min = 2, max = 15, message = "登录用户名长度在2-15") + @ApiModelProperty(value = "用户名", required = true) + private String username; + + @NotBlank(message = "密码不能为空") + @Size(min = 6, max = 20, message = "登录密码长度在6-20") + @ApiModelProperty(value = "密码", required = true) + private String password; + + @ApiModelProperty(value = "记住我", example = "true") + private Boolean rememberMe; +} diff --git a/src/main/java/com/yovinchen/forum/model/dto/RegisterDTO.java b/src/main/java/com/yovinchen/forum/model/dto/RegisterDTO.java new file mode 100644 index 0000000..464fe50 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/dto/RegisterDTO.java @@ -0,0 +1,38 @@ +package com.yovinchen.forum.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotEmpty; +import java.io.Serializable; + + +@Data +@ApiModel(description = "注册DTO") +public class RegisterDTO implements Serializable { + + private static final long serialVersionUID = 602891322506543807L; + + @NotEmpty(message = "请输入账号") + @Length(min = 2, max = 15, message = "长度在2-15") + @ApiModelProperty(value = "用户名", required = true) + private String name; + + @NotEmpty(message = "请输入密码") + @Length(min = 6, max = 20, message = "长度在6-20") + @ApiModelProperty(value = "密码", required = true) + private String pass; + + @NotEmpty(message = "请再次输入密码") + @Length(min = 6, max = 20, message = "长度在6-20") + @ApiModelProperty(value = "确认密码", required = true) + private String checkPass; + + @NotEmpty(message = "请输入电子邮箱") + @Email(message = "邮箱格式不正确") + @ApiModelProperty(value = "电子邮箱", required = true) + private String email; +} diff --git a/src/main/java/com/yovinchen/forum/model/entity/BmsBillboard.java b/src/main/java/com/yovinchen/forum/model/entity/BmsBillboard.java new file mode 100644 index 0000000..45f8dc1 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/entity/BmsBillboard.java @@ -0,0 +1,56 @@ +package com.yovinchen.forum.model.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + + +@Data +@Builder +@ApiModel("公告牌") +@Accessors(chain = true) +@TableName("bms_billboard") +@NoArgsConstructor +@AllArgsConstructor +public class BmsBillboard implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ApiModelProperty("主键") + @TableId(type = IdType.AUTO) + private Integer id; + + /** + * 公告牌 + */ + @ApiModelProperty("公告内容") + @TableField("content") + private String content; + + /** + * 公告时间 + */ + @ApiModelProperty("公告时间") + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + /** + * 1:展示中,0:过期 + */ + @ApiModelProperty("展示状态,false:过期,true:展示中") + @Builder.Default + @TableField("`show`") + private boolean show = false; + +} diff --git a/src/main/java/com/yovinchen/forum/model/entity/BmsComment.java b/src/main/java/com/yovinchen/forum/model/entity/BmsComment.java new file mode 100644 index 0000000..cf4c084 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/entity/BmsComment.java @@ -0,0 +1,68 @@ +package com.yovinchen.forum.model.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Date; + + +@Data +@Builder +@ApiModel("帖子评论") +@TableName("bms_comment") +@AllArgsConstructor +@NoArgsConstructor +public class BmsComment implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ApiModelProperty("主键") + @TableId(value = "id", type = IdType.ASSIGN_ID) + private String id; + /** + * 内容 + */ + @ApiModelProperty("内容") + @NotBlank(message = "内容不可以为空") + @TableField(value = "content") + private String content; + + + /** + * 作者ID + */ + @ApiModelProperty("作者ID") + @TableField("user_id") + private String userId; + + /** + * topicID + */ + @ApiModelProperty("话题ID") + @TableField("topic_id") + private String topicId; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改时间 + */ + @ApiModelProperty("修改时间") + @TableField(value = "modify_time", fill = FieldFill.UPDATE) + private Date modifyTime; +} diff --git a/src/main/java/com/yovinchen/forum/model/entity/BmsFollow.java b/src/main/java/com/yovinchen/forum/model/entity/BmsFollow.java new file mode 100644 index 0000000..263094e --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/entity/BmsFollow.java @@ -0,0 +1,44 @@ +package com.yovinchen.forum.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("用户关注") +@TableName("bms_follow") +public class BmsFollow implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ApiModelProperty("主键") + @TableId(type = IdType.AUTO) + private Integer id; + + /** + * 被关注人id + */ + @ApiModelProperty("被关注人ID") + @TableField("parent_id") + private String parentId; + + /** + * 关注人id + */ + @ApiModelProperty("关注人ID") + @TableField("follower_id") + private String followerId; + + public BmsFollow() { + } + +} diff --git a/src/main/java/com/yovinchen/forum/model/entity/BmsPost.java b/src/main/java/com/yovinchen/forum/model/entity/BmsPost.java new file mode 100644 index 0000000..ae63a6d --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/entity/BmsPost.java @@ -0,0 +1,115 @@ +package com.yovinchen.forum.model.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Date; + + +@Data +@Builder +@ApiModel("帖子") +@TableName("bms_post") +@AllArgsConstructor +@NoArgsConstructor +public class BmsPost implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ApiModelProperty("主键") + @TableId(value = "id", type = IdType.ASSIGN_ID) + private String id; + /** + * 标题 + */ + @ApiModelProperty("标题") + @NotBlank(message = "标题不可以为空") + @TableField(value = "title") + private String title; + /** + * markdown + */ + @ApiModelProperty("内容") + @NotBlank(message = "内容不可以为空") + @TableField("`content`") + private String content; + + /** + * 作者ID + */ + @ApiModelProperty("作者ID") + @TableField("user_id") + private String userId; + + /** + * 评论数 + */ + @ApiModelProperty("评论数") + @TableField("comments") + @Builder.Default + private Integer comments = 0; + + /** + * 收藏数 + */ + @ApiModelProperty("收藏数") + @TableField("collects") + @Builder.Default + private Integer collects = 0; + + /** + * 浏览数 + */ + @ApiModelProperty("浏览数") + @TableField("view") + @Builder.Default + private Integer view = 0; + + /** + * 专栏ID,默认不分栏 + */ + @ApiModelProperty("专栏ID,默认不分栏") + @TableField("section_id") + @Builder.Default + private Integer sectionId = 0; + + /** + * 置顶 + */ + @ApiModelProperty("置顶") + @TableField("top") + @Builder.Default + private Boolean top = false; + + /** + * 加精 + */ + @ApiModelProperty("加精") + @TableField("essence") + @Builder.Default + private Boolean essence = false; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改时间 + */ + @ApiModelProperty("修改时间") + @TableField(value = "modify_time", fill = FieldFill.UPDATE) + private Date modifyTime; +} diff --git a/src/main/java/com/yovinchen/forum/model/entity/BmsPromotion.java b/src/main/java/com/yovinchen/forum/model/entity/BmsPromotion.java new file mode 100644 index 0000000..61894f1 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/entity/BmsPromotion.java @@ -0,0 +1,54 @@ +package com.yovinchen.forum.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + + +@Data +@ApiModel("广告活动") +@TableName("bms_promotion") +@Accessors(chain = true) +public class BmsPromotion implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ApiModelProperty("主键") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 广告标题 + */ + @ApiModelProperty("广告标题") + @TableField("title") + private String title; + + /** + * 广告链接 + */ + @ApiModelProperty("广告链接") + @TableField("link") + private String link; + + /** + * 说明 + */ + @ApiModelProperty("说明") + @TableField("`description`") + private String description; + + public BmsPromotion() { + } + +} diff --git a/src/main/java/com/yovinchen/forum/model/entity/BmsTag.java b/src/main/java/com/yovinchen/forum/model/entity/BmsTag.java new file mode 100644 index 0000000..ff90af9 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/entity/BmsTag.java @@ -0,0 +1,38 @@ +package com.yovinchen.forum.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + + +@Data +@Builder +@ApiModel("标签") +@TableName("bms_tag") +@Accessors(chain = true) +public class BmsTag implements Serializable { + private static final long serialVersionUID = 3257790983905872243L; + + @ApiModelProperty("主键") + @TableId(type = IdType.ASSIGN_ID) + private String id; + + @ApiModelProperty("名称") + @TableField("name") + private String name; + /** + * 当前标签下的话题个数 + */ + @ApiModelProperty("当前标签下的话题个数") + @TableField("topic_count") + @Builder.Default + private Integer topicCount = 1; +} diff --git a/src/main/java/com/yovinchen/forum/model/entity/BmsTip.java b/src/main/java/com/yovinchen/forum/model/entity/BmsTip.java new file mode 100644 index 0000000..385b0aa --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/entity/BmsTip.java @@ -0,0 +1,46 @@ +package com.yovinchen.forum.model.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + + +@Data +@ApiModel("小贴士") +@NoArgsConstructor +@TableName("bms_tip") +public class BmsTip implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ApiModelProperty("主键") + private Integer id; + + /** + * 内容 + */ + @ApiModelProperty("内容") + @TableField("`content`") + private String content; + + /** + * 作者 + */ + @ApiModelProperty("作者") + private String author; + + /** + * 1:使用,0:过期 + */ + @ApiModelProperty("状态(1-使用,0-过期)") + private boolean type; + +} diff --git a/src/main/java/com/yovinchen/forum/model/entity/BmsTopicTag.java b/src/main/java/com/yovinchen/forum/model/entity/BmsTopicTag.java new file mode 100644 index 0000000..7a88d2c --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/entity/BmsTopicTag.java @@ -0,0 +1,33 @@ +package com.yovinchen.forum.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + + +@Data +@ApiModel("话题标签关联") +@TableName("bms_post_tag") +@Accessors(chain = true) +public class BmsTopicTag implements Serializable { + private static final long serialVersionUID = -5028599844989220715L; + + @ApiModelProperty("主键") + @TableId(type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("标签id") + @TableField("tag_id") + private String tagId; + + @ApiModelProperty("话题id") + @TableField("topic_id") + private String topicId; +} diff --git a/src/main/java/com/yovinchen/forum/model/entity/UmsUser.java b/src/main/java/com/yovinchen/forum/model/entity/UmsUser.java new file mode 100644 index 0000000..a262d68 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/entity/UmsUser.java @@ -0,0 +1,99 @@ +package com.yovinchen.forum.model.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + + +@Data +@Builder +@ApiModel("用户") +@TableName("ums_user") +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class UmsUser implements Serializable { + private static final long serialVersionUID = -5051120337175047163L; + + @ApiModelProperty("主键") + @TableId(value = "id", type = IdType.ASSIGN_ID) + private String id; + + @ApiModelProperty("用户名") + @TableField("username") + private String username; + + @ApiModelProperty("昵称") + @TableField("alias") + private String alias; + + @ApiModelProperty(hidden = true) + @JsonIgnore() + @TableField("password") + private String password; + + @ApiModelProperty("头像url") + @Builder.Default + @TableField("avatar") + private String avatar = "https://s3.ax1x.com/2020/12/01/DfHNo4.jpg"; + + @ApiModelProperty("邮箱") + @TableField("email") + private String email; + + @ApiModelProperty("手机号") + @TableField("mobile") + private String mobile; + + @ApiModelProperty("个人简介") + @Builder.Default + @TableField("bio") + private String bio = "自由职业者"; + + @ApiModelProperty("积分") + @Builder.Default + @TableField("score") + private Integer score = 0; + + @ApiModelProperty(hidden = true) + @JsonIgnore + @TableField("token") + private String token; + + @ApiModelProperty("是否激活") + @Builder.Default + @TableField("active") + private Boolean active = true; + + /** + * 状态。1:使用,0:已停用 + */ + @ApiModelProperty("状态,1:使用,0:已停用") + @Builder.Default + @TableField("`status`") + private Boolean status = true; + + /** + * 用户角色 + */ + @ApiModelProperty("用户角色") + @TableField("role_id") + private Integer roleId; + + @ApiModelProperty(hidden = true) + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(hidden = true) + @TableField(value = "modify_time", fill = FieldFill.INSERT_UPDATE) + private Date modifyTime; +} diff --git a/src/main/java/com/yovinchen/forum/model/vo/CommentVO.java b/src/main/java/com/yovinchen/forum/model/vo/CommentVO.java new file mode 100644 index 0000000..08b032d --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/vo/CommentVO.java @@ -0,0 +1,49 @@ +package com.yovinchen.forum.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + + +@Data +@ApiModel("评论") +public class CommentVO { + + /** + * 主键 + */ + @ApiModelProperty("主键") + private String id; + + /** + * 评论内容 + */ + @ApiModelProperty("评论内容") + private String content; + + /** + * 所属话题id + */ + @ApiModelProperty("所属话题id") + private String topicId; + + /** + * 评论用户id + */ + @ApiModelProperty("评论用户id") + private String userId; + + /** + * 评论用户名 + */ + @ApiModelProperty("评论用户名") + private String username; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + private Date createTime; +} diff --git a/src/main/java/com/yovinchen/forum/model/vo/PostVO.java b/src/main/java/com/yovinchen/forum/model/vo/PostVO.java new file mode 100644 index 0000000..de6dd21 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/vo/PostVO.java @@ -0,0 +1,105 @@ +package com.yovinchen.forum.model.vo; + +import com.yovinchen.forum.model.entity.BmsTag; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +@Data +@ApiModel("文章") +@NoArgsConstructor +@AllArgsConstructor +public class PostVO implements Serializable { + private static final long serialVersionUID = -261082150965211545L; + + /** + * 文章ID + */ + @ApiModelProperty("文章ID") + private String id; + + /** + * 用户ID + */ + @ApiModelProperty("用户ID") + private String userId; + + /** + * 头像 + */ + @ApiModelProperty("头像") + private String avatar; + + /** + * 用户昵称 + */ + @ApiModelProperty("用户昵称") + private String alias; + + /** + * 账号 + */ + @ApiModelProperty("账号") + private String username; + + /** + * 标题 + */ + @ApiModelProperty("标题") + private String title; + + /** + * 评论统计 + */ + @ApiModelProperty("评论统计") + private Integer comments; + + /** + * 是否置顶 + */ + @ApiModelProperty("是否置顶") + private Boolean top; + + /** + * 是否加精 + */ + @ApiModelProperty("是否加精") + private Boolean essence; + + /** + * 收藏次数 + */ + @ApiModelProperty("收藏次数") + private Integer collects; + + /** + * 文章关联标签 + */ + @ApiModelProperty("文章关联标签") + private List tags; + + /** + * 浏览量 + */ + @ApiModelProperty("浏览量") + private Integer view; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + private Date createTime; + + /** + * 修改时间 + */ + @ApiModelProperty("修改时间") + private Date modifyTime; +} diff --git a/src/main/java/com/yovinchen/forum/model/vo/ProfileVO.java b/src/main/java/com/yovinchen/forum/model/vo/ProfileVO.java new file mode 100644 index 0000000..5b55a91 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/vo/ProfileVO.java @@ -0,0 +1,65 @@ +package com.yovinchen.forum.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +@Data +@ApiModel("用户信息") +public class ProfileVO { + + /** + * 用户ID + */ + @ApiModelProperty("用户ID") + private String id; + + /** + * 用户名 + */ + @ApiModelProperty("用户名") + private String username; + + /** + * 别称 + */ + @ApiModelProperty("别称") + private String alias; + + /** + * 头像 + */ + @ApiModelProperty("头像") + private String avatar; + + /** + * 关注数 + */ + @ApiModelProperty("关注数") + private Integer followCount; + + /** + * 关注者数 + */ + @ApiModelProperty("关注者数") + private Integer followerCount; + + /** + * 文章数 + */ + @ApiModelProperty("文章数") + private Integer topicCount; + + /** + * 专栏数 + */ + @ApiModelProperty("专栏数") + private Integer columns; + + /** + * 评论数 + */ + @ApiModelProperty("评论数") + private Integer commentCount; +} diff --git a/src/main/java/com/yovinchen/forum/service/IBmsBillboardService.java b/src/main/java/com/yovinchen/forum/service/IBmsBillboardService.java new file mode 100644 index 0000000..69a993a --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/IBmsBillboardService.java @@ -0,0 +1,7 @@ +package com.yovinchen.forum.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yovinchen.forum.model.entity.BmsBillboard; + +public interface IBmsBillboardService extends IService { +} diff --git a/src/main/java/com/yovinchen/forum/service/IBmsCommentService.java b/src/main/java/com/yovinchen/forum/service/IBmsCommentService.java new file mode 100644 index 0000000..e25e541 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/IBmsCommentService.java @@ -0,0 +1,22 @@ +package com.yovinchen.forum.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yovinchen.forum.model.dto.CommentDTO; +import com.yovinchen.forum.model.entity.BmsComment; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.model.vo.CommentVO; + +import java.util.List; + + +public interface IBmsCommentService extends IService { + /** + * + * + * @param topicid + * @return {@link BmsComment} + */ + List getCommentsByTopicID(String topicid); + + BmsComment create(CommentDTO dto, UmsUser principal); +} diff --git a/src/main/java/com/yovinchen/forum/service/IBmsFollowService.java b/src/main/java/com/yovinchen/forum/service/IBmsFollowService.java new file mode 100644 index 0000000..d72938d --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/IBmsFollowService.java @@ -0,0 +1,8 @@ +package com.yovinchen.forum.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yovinchen.forum.model.entity.BmsFollow; + + +public interface IBmsFollowService extends IService { +} diff --git a/src/main/java/com/yovinchen/forum/service/IBmsPostService.java b/src/main/java/com/yovinchen/forum/service/IBmsPostService.java new file mode 100644 index 0000000..0aa5c28 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/IBmsPostService.java @@ -0,0 +1,55 @@ +package com.yovinchen.forum.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yovinchen.forum.model.dto.CreateTopicDTO; +import com.yovinchen.forum.model.entity.BmsPost; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.model.vo.PostVO; + +import java.util.List; +import java.util.Map; + + +public interface IBmsPostService extends IService { + + /** + * 获取首页话题列表 + * + * @param page + * @param tab + * @return + */ + Page getList(Page page, String tab); + /** + * 发布 + * + * @param dto + * @param principal + * @return + */ + BmsPost create(CreateTopicDTO dto, UmsUser principal); + + /** + * 查看话题详情 + * + * @param id + * @return + */ + Map viewTopic(String id); + /** + * 获取随机推荐10篇 + * + * @param id + * @return + */ + List getRecommend(String id); + /** + * 关键字检索 + * + * @param keyword + * @param page + * @return + */ + Page searchByKey(String keyword, Page page); +} diff --git a/src/main/java/com/yovinchen/forum/service/IBmsPromotionService.java b/src/main/java/com/yovinchen/forum/service/IBmsPromotionService.java new file mode 100644 index 0000000..2cff979 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/IBmsPromotionService.java @@ -0,0 +1,8 @@ +package com.yovinchen.forum.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yovinchen.forum.model.entity.BmsPromotion; + + +public interface IBmsPromotionService extends IService { +} diff --git a/src/main/java/com/yovinchen/forum/service/IBmsTagService.java b/src/main/java/com/yovinchen/forum/service/IBmsTagService.java new file mode 100644 index 0000000..0a131f1 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/IBmsTagService.java @@ -0,0 +1,27 @@ +package com.yovinchen.forum.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yovinchen.forum.model.entity.BmsPost; +import com.yovinchen.forum.model.entity.BmsTag; + +import java.util.List; + + +public interface IBmsTagService extends IService { + /** + * 插入标签 + * + * @param tags + * @return + */ + List insertTags(List tags); + /** + * 获取标签关联话题 + * + * @param topicPage + * @param id + * @return + */ + Page selectTopicsByTagId(Page topicPage, String id); +} diff --git a/src/main/java/com/yovinchen/forum/service/IBmsTipService.java b/src/main/java/com/yovinchen/forum/service/IBmsTipService.java new file mode 100644 index 0000000..023d5a2 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/IBmsTipService.java @@ -0,0 +1,8 @@ +package com.yovinchen.forum.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yovinchen.forum.model.entity.BmsTip; + +public interface IBmsTipService extends IService { + BmsTip getRandomTip(); +} diff --git a/src/main/java/com/yovinchen/forum/service/IBmsTopicTagService.java b/src/main/java/com/yovinchen/forum/service/IBmsTopicTagService.java new file mode 100644 index 0000000..715d0ef --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/IBmsTopicTagService.java @@ -0,0 +1,35 @@ +package com.yovinchen.forum.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yovinchen.forum.model.entity.BmsTag; +import com.yovinchen.forum.model.entity.BmsTopicTag; + +import java.util.List; +import java.util.Set; + +public interface IBmsTopicTagService extends IService { + + /** + * 获取Topic Tag 关联记录 + * + * @param topicId TopicId + * @return + */ + List selectByTopicId(String topicId); + /** + * 创建中间关系 + * + * @param id + * @param tags + * @return + */ + void createTopicTag(String id, List tags); + /** + * 获取标签换脸话题ID集合 + * + * @param id + * @return + */ + Set selectTopicIdsByTagId(String id); + +} diff --git a/src/main/java/com/yovinchen/forum/service/IUmsUserService.java b/src/main/java/com/yovinchen/forum/service/IUmsUserService.java new file mode 100644 index 0000000..1c6a6ab --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/IUmsUserService.java @@ -0,0 +1,40 @@ +package com.yovinchen.forum.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yovinchen.forum.model.dto.LoginDTO; +import com.yovinchen.forum.model.dto.RegisterDTO; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.model.vo.ProfileVO; + + +public interface IUmsUserService extends IService { + + /** + * 注册功能 + * + * @param dto + * @return 注册对象 + */ + UmsUser executeRegister(RegisterDTO dto); + /** + * 获取用户信息 + * + * @param username + * @return dbUser + */ + UmsUser getUserByUsername(String username); + /** + * 用户登录 + * + * @param dto + * @return 生成的JWT的token + */ + String executeLogin(LoginDTO dto); + /** + * 获取用户信息 + * + * @param id 用户ID + * @return + */ + ProfileVO getUserProfile(String id); +} diff --git a/src/main/java/com/yovinchen/forum/service/impl/IBmsBillboardServiceImpl.java b/src/main/java/com/yovinchen/forum/service/impl/IBmsBillboardServiceImpl.java new file mode 100644 index 0000000..3ea9876 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/impl/IBmsBillboardServiceImpl.java @@ -0,0 +1,13 @@ +package com.yovinchen.forum.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yovinchen.forum.mapper.BmsBillboardMapper; +import com.yovinchen.forum.model.entity.BmsBillboard; +import com.yovinchen.forum.service.IBmsBillboardService; +import org.springframework.stereotype.Service; + +@Service +public class IBmsBillboardServiceImpl extends ServiceImpl implements IBmsBillboardService { + +} diff --git a/src/main/java/com/yovinchen/forum/service/impl/IBmsCommentServiceImpl.java b/src/main/java/com/yovinchen/forum/service/impl/IBmsCommentServiceImpl.java new file mode 100644 index 0000000..ff68e9e --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/impl/IBmsCommentServiceImpl.java @@ -0,0 +1,43 @@ +package com.yovinchen.forum.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yovinchen.forum.mapper.BmsCommentMapper; +import com.yovinchen.forum.model.dto.CommentDTO; +import com.yovinchen.forum.model.entity.BmsComment; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.model.vo.CommentVO; +import com.yovinchen.forum.service.IBmsCommentService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +@Slf4j +@Service +public class IBmsCommentServiceImpl extends ServiceImpl implements IBmsCommentService { + @Override + public List getCommentsByTopicID(String topicid) { + List lstBmsComment = new ArrayList(); + try { + lstBmsComment = this.baseMapper.getCommentsByTopicID(topicid); + } catch (Exception e) { + log.info("lstBmsComment失败"); + } + return lstBmsComment; + } + + @Override + public BmsComment create(CommentDTO dto, UmsUser user) { + BmsComment comment = BmsComment.builder() + .userId(user.getId()) + .content(dto.getContent()) + .topicId(dto.getTopic_id()) + .createTime(new Date()) + .build(); + this.baseMapper.insert(comment); + return comment; + } +} diff --git a/src/main/java/com/yovinchen/forum/service/impl/IBmsFollowServiceImpl.java b/src/main/java/com/yovinchen/forum/service/impl/IBmsFollowServiceImpl.java new file mode 100644 index 0000000..e08f1e3 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/impl/IBmsFollowServiceImpl.java @@ -0,0 +1,12 @@ +package com.yovinchen.forum.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yovinchen.forum.mapper.BmsFollowMapper; +import com.yovinchen.forum.model.entity.BmsFollow; +import com.yovinchen.forum.service.IBmsFollowService; +import org.springframework.stereotype.Service; + + +@Service +public class IBmsFollowServiceImpl extends ServiceImpl implements IBmsFollowService { +} diff --git a/src/main/java/com/yovinchen/forum/service/impl/IBmsPostServiceImpl.java b/src/main/java/com/yovinchen/forum/service/impl/IBmsPostServiceImpl.java new file mode 100644 index 0000000..84fea8c --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/impl/IBmsPostServiceImpl.java @@ -0,0 +1,140 @@ +package com.yovinchen.forum.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yovinchen.forum.mapper.BmsTagMapper; +import com.yovinchen.forum.mapper.BmsTopicMapper; +import com.yovinchen.forum.mapper.UmsUserMapper; +import com.yovinchen.forum.model.dto.CreateTopicDTO; +import com.yovinchen.forum.model.entity.BmsPost; +import com.yovinchen.forum.model.entity.BmsTag; +import com.yovinchen.forum.model.entity.BmsTopicTag; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.model.vo.PostVO; +import com.yovinchen.forum.model.vo.ProfileVO; +import com.yovinchen.forum.service.IBmsPostService; +import com.yovinchen.forum.service.IBmsTagService; +import com.yovinchen.forum.service.IUmsUserService; +import com.vdurmont.emoji.EmojiParser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; +import org.springframework.util.ObjectUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + + +@Service +public class IBmsPostServiceImpl extends ServiceImpl implements IBmsPostService { + @Resource + private BmsTagMapper bmsTagMapper; + @Resource + private UmsUserMapper umsUserMapper; + + @Autowired + @Lazy + private IBmsTagService iBmsTagService; + + @Autowired + private IUmsUserService iUmsUserService; + + @Autowired + private com.yovinchen.forum.service.IBmsTopicTagService IBmsTopicTagService; + @Override + public Page getList(Page page, String tab) { + // 查询话题 + Page iPage = this.baseMapper.selectListAndPage(page, tab); + // 查询话题的标签 + setTopicTags(iPage); + return iPage; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public BmsPost create(CreateTopicDTO dto, UmsUser user) { + BmsPost topic1 = this.baseMapper.selectOne(new LambdaQueryWrapper().eq(BmsPost::getTitle, dto.getTitle())); + Assert.isNull(topic1, "话题已存在,请修改"); + + // 封装 + BmsPost topic = BmsPost.builder() + .userId(user.getId()) + .title(dto.getTitle()) + .content(EmojiParser.parseToAliases(dto.getContent())) + .createTime(new Date()) + .build(); + this.baseMapper.insert(topic); + + // 用户积分增加 + int newScore = user.getScore() + 1; + umsUserMapper.updateById(user.setScore(newScore)); + + // 标签 + if (!ObjectUtils.isEmpty(dto.getTags())) { + // 保存标签 + List tags = iBmsTagService.insertTags(dto.getTags()); + // 处理标签与话题的关联 + IBmsTopicTagService.createTopicTag(topic.getId(), tags); + } + + return topic; + } + + @Override + public Map viewTopic(String id) { + Map map = new HashMap<>(16); + BmsPost topic = this.baseMapper.selectById(id); + Assert.notNull(topic, "当前话题不存在,或已被作者删除"); + // 查询话题详情 + topic.setView(topic.getView() + 1); + this.baseMapper.updateById(topic); + // emoji转码 + topic.setContent(EmojiParser.parseToUnicode(topic.getContent())); + map.put("topic", topic); + // 标签 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.lambda().eq(BmsTopicTag::getTopicId, topic.getId()); + Set set = new HashSet<>(); + for (BmsTopicTag articleTag : IBmsTopicTagService.list(wrapper)) { + set.add(articleTag.getTagId()); + } + List tags = iBmsTagService.listByIds(set); + map.put("tags", tags); + + // 作者 + + ProfileVO user = iUmsUserService.getUserProfile(topic.getUserId()); + map.put("user", user); + + return map; + } + + @Override + public List getRecommend(String id) { + return this.baseMapper.selectRecommend(id); + } + @Override + public Page searchByKey(String keyword, Page page) { + // 查询话题 + Page iPage = this.baseMapper.searchByKey(page, keyword); + // 查询话题的标签 + setTopicTags(iPage); + return iPage; + } + + private void setTopicTags(Page iPage) { + iPage.getRecords().forEach(topic -> { + List topicTags = IBmsTopicTagService.selectByTopicId(topic.getId()); + if (!topicTags.isEmpty()) { + List tagIds = topicTags.stream().map(BmsTopicTag::getTagId).collect(Collectors.toList()); + List tags = bmsTagMapper.selectBatchIds(tagIds); + topic.setTags(tags); + } + }); + } +} diff --git a/src/main/java/com/yovinchen/forum/service/impl/IBmsPromotionServiceImpl.java b/src/main/java/com/yovinchen/forum/service/impl/IBmsPromotionServiceImpl.java new file mode 100644 index 0000000..0bcac8a --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/impl/IBmsPromotionServiceImpl.java @@ -0,0 +1,13 @@ +package com.yovinchen.forum.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yovinchen.forum.mapper.BmsPromotionMapper; +import com.yovinchen.forum.model.entity.BmsPromotion; +import com.yovinchen.forum.service.IBmsPromotionService; +import org.springframework.stereotype.Service; + + +@Service +public class IBmsPromotionServiceImpl extends ServiceImpl implements IBmsPromotionService { + +} diff --git a/src/main/java/com/yovinchen/forum/service/impl/IBmsTagServiceImpl.java b/src/main/java/com/yovinchen/forum/service/impl/IBmsTagServiceImpl.java new file mode 100644 index 0000000..7d3ba54 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/impl/IBmsTagServiceImpl.java @@ -0,0 +1,60 @@ +package com.yovinchen.forum.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yovinchen.forum.mapper.BmsTagMapper; +import com.yovinchen.forum.model.entity.BmsPost; +import com.yovinchen.forum.model.entity.BmsTag; +import com.yovinchen.forum.service.IBmsTagService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +/** + * Tag 实现类 + * + * @author Knox 2020/11/7 + */ +@Service +public class IBmsTagServiceImpl extends ServiceImpl implements IBmsTagService { + + @Autowired + private com.yovinchen.forum.service.IBmsTopicTagService IBmsTopicTagService; + + @Autowired + private com.yovinchen.forum.service.IBmsPostService IBmsPostService; + + + @Override + public List insertTags(List tagNames) { + List tagList = new ArrayList<>(); + for (String tagName : tagNames) { + BmsTag tag = this.baseMapper.selectOne(new LambdaQueryWrapper().eq(BmsTag::getName, tagName)); + if (tag == null) { + tag = BmsTag.builder().name(tagName).build(); + this.baseMapper.insert(tag); + } else { + tag.setTopicCount(tag.getTopicCount() + 1); + this.baseMapper.updateById(tag); + } + tagList.add(tag); + } + return tagList; + } + + @Override + public Page selectTopicsByTagId(Page topicPage, String id) { + + // 获取关联的话题ID + Set ids = IBmsTopicTagService.selectTopicIdsByTagId(id); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(BmsPost::getId, ids); + + return IBmsPostService.page(topicPage, wrapper); + } + +} diff --git a/src/main/java/com/yovinchen/forum/service/impl/IBmsTipServiceImpl.java b/src/main/java/com/yovinchen/forum/service/impl/IBmsTipServiceImpl.java new file mode 100644 index 0000000..647c3d8 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/impl/IBmsTipServiceImpl.java @@ -0,0 +1,25 @@ +package com.yovinchen.forum.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yovinchen.forum.mapper.BmsTipMapper; +import com.yovinchen.forum.model.entity.BmsTip; +import com.yovinchen.forum.service.IBmsTipService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class IBmsTipServiceImpl extends ServiceImpl implements IBmsTipService { + + @Override + public BmsTip getRandomTip() { + BmsTip todayTip = null; + try { + todayTip = this.baseMapper.getRandomTip(); + } catch (Exception e) { + log.info("tip转化失败"); + } + return todayTip; + } +} diff --git a/src/main/java/com/yovinchen/forum/service/impl/IBmsTopicTagServiceImpl.java b/src/main/java/com/yovinchen/forum/service/impl/IBmsTopicTagServiceImpl.java new file mode 100644 index 0000000..5c11f16 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/impl/IBmsTopicTagServiceImpl.java @@ -0,0 +1,45 @@ +package com.yovinchen.forum.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yovinchen.forum.mapper.BmsTopicTagMapper; +import com.yovinchen.forum.model.entity.BmsTag; +import com.yovinchen.forum.model.entity.BmsTopicTag; +import com.yovinchen.forum.service.IBmsTopicTagService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Set; + + +@Service +@Transactional(rollbackFor = Exception.class) +public class IBmsTopicTagServiceImpl extends ServiceImpl implements IBmsTopicTagService { + + @Override + public List selectByTopicId(String topicId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.lambda().eq(BmsTopicTag::getTopicId, topicId); + return this.baseMapper.selectList(wrapper); + } + @Override + public void createTopicTag(String id, List tags) { + // 先删除topicId对应的所有记录 + this.baseMapper.delete(new LambdaQueryWrapper().eq(BmsTopicTag::getTopicId, id)); + + // 循环保存对应关联 + tags.forEach(tag -> { + BmsTopicTag topicTag = new BmsTopicTag(); + topicTag.setTopicId(id); + topicTag.setTagId(tag.getId()); + this.baseMapper.insert(topicTag); + }); + } + @Override + public Set selectTopicIdsByTagId(String id) { + return this.baseMapper.getTopicIdsByTagId(id); + } + +} diff --git a/src/main/java/com/yovinchen/forum/service/impl/IUmsUserServiceImpl.java b/src/main/java/com/yovinchen/forum/service/impl/IUmsUserServiceImpl.java new file mode 100644 index 0000000..1608ef0 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/impl/IUmsUserServiceImpl.java @@ -0,0 +1,94 @@ +package com.yovinchen.forum.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yovinchen.forum.common.exception.ApiAsserts; +import com.yovinchen.forum.jwt.JwtUtil; +import com.yovinchen.forum.mapper.BmsFollowMapper; +import com.yovinchen.forum.mapper.BmsTopicMapper; +import com.yovinchen.forum.mapper.UmsUserMapper; +import com.yovinchen.forum.model.dto.LoginDTO; +import com.yovinchen.forum.model.dto.RegisterDTO; +import com.yovinchen.forum.model.entity.BmsFollow; +import com.yovinchen.forum.model.entity.BmsPost; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.model.vo.ProfileVO; +import com.yovinchen.forum.service.IUmsUserService; +import com.yovinchen.forum.utils.MD5Utils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ObjectUtils; +import java.util.Date; + + + +@Slf4j +@Service +@Transactional(rollbackFor = Exception.class) +public class IUmsUserServiceImpl extends ServiceImpl implements IUmsUserService { + + @Autowired + private BmsTopicMapper bmsTopicMapper; + @Autowired + private BmsFollowMapper bmsFollowMapper; + + @Override + public UmsUser executeRegister(RegisterDTO dto) { + //查询是否有相同用户名的用户 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(UmsUser::getUsername, dto.getName()).or().eq(UmsUser::getEmail, dto.getEmail()); + UmsUser umsUser = baseMapper.selectOne(wrapper); + if (!ObjectUtils.isEmpty(umsUser)) { + ApiAsserts.fail("账号或邮箱已存在!"); + } + UmsUser addUser = UmsUser.builder() + .username(dto.getName()) + .alias(dto.getName()) + .password(MD5Utils.getPwd(dto.getPass())) + .email(dto.getEmail()) + .createTime(new Date()) + .status(true) + .build(); + baseMapper.insert(addUser); + + return addUser; + } + @Override + public UmsUser getUserByUsername(String username) { + return baseMapper.selectOne(new LambdaQueryWrapper().eq(UmsUser::getUsername, username)); + } + @Override + public String executeLogin(LoginDTO dto) { + String token = null; + try { + UmsUser user = getUserByUsername(dto.getUsername()); + String encodePwd = MD5Utils.getPwd(dto.getPassword()); + if(!encodePwd.equals(user.getPassword())) + { + throw new Exception("密码错误"); + } + token = JwtUtil.generateToken(String.valueOf(user.getUsername())); + } catch (Exception e) { + log.warn("用户不存在or密码验证失败=======>{}", dto.getUsername()); + } + return token; + } + @Override + public ProfileVO getUserProfile(String id) { + ProfileVO profile = new ProfileVO(); + UmsUser user = baseMapper.selectById(id); + BeanUtils.copyProperties(user, profile); + // 用户文章数 + int count = bmsTopicMapper.selectCount(new LambdaQueryWrapper().eq(BmsPost::getUserId, id)); + profile.setTopicCount(count); + + // 粉丝数 + int followers = bmsFollowMapper.selectCount((new LambdaQueryWrapper().eq(BmsFollow::getParentId, id))); + profile.setFollowerCount(followers); + + return profile; + } +} diff --git a/src/main/java/com/yovinchen/forum/utils/MD5Utils.java b/src/main/java/com/yovinchen/forum/utils/MD5Utils.java new file mode 100644 index 0000000..6f7d4e4 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/utils/MD5Utils.java @@ -0,0 +1,56 @@ +package com.yovinchen.forum.utils; + + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + + +public class MD5Utils { + + public static String getPwd(String pwd) { + try { + // 创建加密对象 + MessageDigest digest = MessageDigest.getInstance("md5"); + + // 调用加密对象的方法,加密的动作已经完成 + byte[] bs = digest.digest(pwd.getBytes()); + // 接下来,我们要对加密后的结果,进行优化,按照mysql的优化思路走 + // mysql的优化思路: + // 第一步,将数据全部转换成正数: + String hexString = ""; + for (byte b : bs) { + // 第一步,将数据全部转换成正数: + // 解释:为什么采用b&255 + /* + * b:它本来是一个byte类型的数据(1个字节) 255:是一个int类型的数据(4个字节) + * byte类型的数据与int类型的数据进行运算,会自动类型提升为int类型 eg: b: 1001 1100(原始数据) + * 运算时: b: 0000 0000 0000 0000 0000 0000 1001 1100 255: 0000 + * 0000 0000 0000 0000 0000 1111 1111 结果:0000 0000 0000 0000 + * 0000 0000 1001 1100 此时的temp是一个int类型的整数 + */ + int temp = b & 255; + // 第二步,将所有的数据转换成16进制的形式 + // 注意:转换的时候注意if正数>=0&&<16,那么如果使用Integer.toHexString(),可能会造成缺少位数 + // 因此,需要对temp进行判断 + if (temp < 16 && temp >= 0) { + // 手动补上一个“0” + hexString = hexString + "0" + Integer.toHexString(temp); + } else { + hexString = hexString + Integer.toHexString(temp); + } + } + return hexString; + } catch (NoSuchAlgorithmException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return ""; + } + + +// public static void main(String[] args) { +// String pwd = MD5Utils.getPwd("234"); +// System.out.println(pwd); +// } + +} diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml new file mode 100644 index 0000000..6c70b3d --- /dev/null +++ b/src/main/resources/application-dev.yaml @@ -0,0 +1,18 @@ +server: + port: 8080 + +web: + domain: http://localhost + +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + username: root + password: root + url: jdbc:mysql://localhost:3306/doubao?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=GMT%2B8 + type: com.zaxxer.hikari.HikariDataSource + +logging: + level: + root: info + com.yovinchen.forum: debug diff --git a/src/main/resources/application-prod.yaml b/src/main/resources/application-prod.yaml new file mode 100644 index 0000000..8ed3284 --- /dev/null +++ b/src/main/resources/application-prod.yaml @@ -0,0 +1,18 @@ +server: + port: 8088 + +web: + domain: http://localhost + +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + username: root + password: 123456 + url: jdbc:mysql://localhost:3306/ssm_db?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=GMT%2B8 + type: com.zaxxer.hikari.HikariDataSource + +logging: + level: + root: info + com.yovinchen.forum: info diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml new file mode 100644 index 0000000..caf4dfc --- /dev/null +++ b/src/main/resources/application.yaml @@ -0,0 +1,3 @@ +spring: + profiles: + active: dev \ No newline at end of file diff --git a/src/main/resources/mapper/BmsCommentMapper.xml b/src/main/resources/mapper/BmsCommentMapper.xml new file mode 100644 index 0000000..b15db9d --- /dev/null +++ b/src/main/resources/mapper/BmsCommentMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/BmsPostMapper.xml b/src/main/resources/mapper/BmsPostMapper.xml new file mode 100644 index 0000000..a1538d9 --- /dev/null +++ b/src/main/resources/mapper/BmsPostMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/BmsPostTagMapper.xml b/src/main/resources/mapper/BmsPostTagMapper.xml new file mode 100644 index 0000000..c2662c5 --- /dev/null +++ b/src/main/resources/mapper/BmsPostTagMapper.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/src/main/resources/mapper/BmsTipMapper.xml b/src/main/resources/mapper/BmsTipMapper.xml new file mode 100644 index 0000000..75af804 --- /dev/null +++ b/src/main/resources/mapper/BmsTipMapper.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/src/test/java/com/yovinchen/forum/DoubaoApplicationTests.java b/src/test/java/com/yovinchen/forum/DoubaoApplicationTests.java new file mode 100644 index 0000000..ff04d51 --- /dev/null +++ b/src/test/java/com/yovinchen/forum/DoubaoApplicationTests.java @@ -0,0 +1,13 @@ +package com.yovinchen.forum; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DoubaoApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/target/classes/application-dev.yaml b/target/classes/application-dev.yaml new file mode 100644 index 0000000..6c70b3d --- /dev/null +++ b/target/classes/application-dev.yaml @@ -0,0 +1,18 @@ +server: + port: 8080 + +web: + domain: http://localhost + +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + username: root + password: root + url: jdbc:mysql://localhost:3306/doubao?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=GMT%2B8 + type: com.zaxxer.hikari.HikariDataSource + +logging: + level: + root: info + com.yovinchen.forum: debug diff --git a/target/classes/application-prod.yaml b/target/classes/application-prod.yaml new file mode 100644 index 0000000..8ed3284 --- /dev/null +++ b/target/classes/application-prod.yaml @@ -0,0 +1,18 @@ +server: + port: 8088 + +web: + domain: http://localhost + +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + username: root + password: 123456 + url: jdbc:mysql://localhost:3306/ssm_db?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=GMT%2B8 + type: com.zaxxer.hikari.HikariDataSource + +logging: + level: + root: info + com.yovinchen.forum: info diff --git a/target/classes/application.yaml b/target/classes/application.yaml new file mode 100644 index 0000000..caf4dfc --- /dev/null +++ b/target/classes/application.yaml @@ -0,0 +1,3 @@ +spring: + profiles: + active: dev \ No newline at end of file diff --git a/target/classes/com/yovinchen/forum/DoubaoApplication.class b/target/classes/com/yovinchen/forum/DoubaoApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..e5a4f3ce5838bb13b55053257d16f115d9785ef8 GIT binary patch literal 2246 zcmbtWYjYDf6g~1IYrAeRri6yRpylB>;4Lksr4FG<7-r}=rGq=^Fnp4ojU&3=^=NnV z=&x$OK&MRm1Nx&nJ<=|T0S8j-4=d^F>ged|o-6+y-a*TO>)`VWuHg#@ zUsg~wrt1|rXqmxR72Lqr4!#kXSyF+Dmj&{Tg$;qiTDa*6oam^)`ymhxMFN*Q{cz~+hdV0hZ+n5e73yT@-U*YQ3|B@YU-f0I!k{fs?uWsa z8YG&CdyP)02W~XdDi~~OIrMfz{fpZR!`SU5%HQ;~+qIKp7^~?-dtr*T0#1f6(4GpX zw(iB-;pUIhu#Y{>Sd<^{#&?y^fxzv?YiRCzJvZ|7j_<{8y5NB~P*JRHtX4f~;#Jcx z*#vGK&G=Z5Gg}$EYZGsc^xf}wHrToZe?!_$FA3e{6(KM`<{x_3llS^GS z2xM$?NlzE)w<9qBAYp`t-iC@4HL(%|VQeptX>fI7Jed8lw->wez}3wzx-gU~V0;^o zI*;X!bbT2N+-_{7(YCsjdO+Ay6Q%_!-7wL8kGDiw&Ap<#mO&I~T1vzH9yvyt?8cd_ z%hAZw-M&q{;*RtaqMfC(TL;Q+S!K6|)>B}4;vuboWfF%6TF+#>N@b5pxm`sS@3Ph$ z9(c`{5l?yXSmngQ%__bHGogKC9eJ}N1l&oxy+#IAEa8@e@$CSZ^wbtZ9)=0*3GY3rS>SI%T~qN8UkEn{U_*-FvBc*(_}y z$^Vr?&Id;)%=lgkmnMA5bwZ9$uA|T8w3a<8=4Bd7Fq)0p+BlCqA4T&kK$xWCca|fU ztzcVhK85(5og7Z^J7bNrsIgy79dHtLjtV%1_vmF7ukszuv7KEk{Ds`Zd_CWNg2HdK zjH8^iD08W2hQc*CjX5Hpp?6Vm01n>AJb4=Ei0*l|XP%+>@F`|G&)~2vtuJ1Ag7Tu- zBX613$p~CtB3g}TrwL+MpG%i#`<3W>79Vhn8vg)%h>r;WF}=*$(z#FAJ4Z{7q571q ziNI%U%ea7xv>H-3*qUIK>iOm$sQi2wuL@^CT!+YqF)QH`F4LZ!@e;c^H0*c5Zc^vC ONyx=V5D~86D)1i!_m(;U literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/common/api/ApiErrorCode.class b/target/classes/com/yovinchen/forum/common/api/ApiErrorCode.class new file mode 100644 index 0000000000000000000000000000000000000000..5fa1425438fd9acaebada9b0e9a33c154337c618 GIT binary patch literal 2388 zcmb7F-E$LF6#w0Hlih>`nuP-8vtXe~pac{|ZNY{%g=lDzw1t3*+jL2{B)fH+FylBn z3_i#>GTiJrkB)x_4e(Dmp0inKibbZGx%b?AzRx|sv-$g<-~Rxx z52YX^ydOdu$7IB1^o6hu{k$Cy;RBptafY`68G|8&Fr?rl(^I@<6`W>zhPMwDv?};0 zM9Lqt#aRVA6nw%*T|t|IVLs**L==qh(NGXoaE_088KW{x0XZ|+-JQ&21lrR%yBPn> zzF=CpQNxO#vz>A=PQ0RR#r1JBo)|Zij$=FB_K49T5a>;$(#akHb+9inIB>N8MCvqO zgT4JH4ySs0l6?XzhZ5;jPhuc>_L;JjBWrA?AyB9*T^dd!SJZ6+e?UCcUL)VhwP$7X%(=tnk1fq+? zPNf#fXGlOQjhbXDQUak?!zveBYyOwlF19mbT6%$cm@)H~UMf2jdrjme&g8sNsy$6p zBw815zMmn|IQFcis~0FeZ>mzVYi9waGgt76YKTNB-LX2aNy@f!Nl$vH<5lXZdOU|R zcG<}py(YIdTo3l$j8zr8d0yix#&BL>=MsiRrMWMtcpF6-7GG=?G3->a3+)1H=O>}| z5QocVVZ?CQ;0R4ZeI}pt^c++%j!$`W1eWb;@rLGL8?z=aE+4Z_ds=xKX|QL&-jGSaZ{r$FoU_cjC8+T+_jfJ*rn`(F_Fyl0d!26Vm4BfM#1woF(Qt=u0&mbBaAgwd z@56rhT>X7S*&?J#u^IRuLSlX20{u6Mqt>)=fMeq=T7H287g?1MiU!x&S)zUtHN|#r zoJJtFX$JCrD6wYgK7w~iQ1h!%^}uGzXA4%K1*@?Y9HWKI$rv4Oy?lzH)8lc?k{dTH z;b0?hh*pf$chP#6mJeN&VgiS0=ZA@=2X>J*l97E@TEt*o7cL>k+s(Af9|ZBq!p7$ja7q}|I#tx#CL5?=b0#ZSur)IY!9A^EYrUIKkWjju ZFc>C;HBq+BI7MCac?~*>6zTi$-oM67K&Aiy literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/common/api/ApiResult.class b/target/classes/com/yovinchen/forum/common/api/ApiResult.class new file mode 100644 index 0000000000000000000000000000000000000000..6f1c860e514b382322f68b0bbbaede3d92d9c13b GIT binary patch literal 6416 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 Oam1JSe*7Sdm;VR;cXzn} literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/common/api/IErrorCode.class b/target/classes/com/yovinchen/forum/common/api/IErrorCode.class new file mode 100644 index 0000000000000000000000000000000000000000..ea9d35de9af8052c12b315e844eb59cf44e5cced GIT binary patch literal 218 zcmY+9F$%&k7=>T7wps@r^bU40i<_e;6cmS^AjTL|+Cb6$~&`sZ>_PRbsY)`GHz=6G@a7?E;PLv+t$>x+GxriiuM75dB5R&DFt^i0l~np U1_lwq5E0<-2(c&rfxt2T0UC2SrvLx| literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/common/exception/ApiAsserts.class b/target/classes/com/yovinchen/forum/common/exception/ApiAsserts.class new file mode 100644 index 0000000000000000000000000000000000000000..3ed2acc507c1b449263d8c9e12757de72ef643fc GIT binary patch literal 744 zcmb7B+e*Vg5Ivh-V(O)}+Ikm!s|pRGZ;DW)f>1A@2tID(+O8zovPp}6mQR9$zWY() zY_zm0iZ1M2PG-)`p1iz1JOS9kat>L{+L+71!n`pHHWqCxF=TgSDC1p*RAu#?A-$(A z1w+0eLvhp%nnIuPrcX$*p*-%Nb1hB&0jA@&j2Jc=o(kMs)svyu7NL8kbT@Db3smTe z8&7m%Nl~pMYf&V09BtE}D=vM8Ql)Xtd))PT*m6%}EyLEf*~1P*6!BIv_*(%(;ZVeF zb$P-y4@4|9Em5ufwgvA<_n@w|(&mB52uJi&hV_5+GUQHGS9@Y#8e#H-XI0InW3Vwo zn*3FgdS4&Ym^WsM!HD-CK}nH;O2^G>;l)@%hW@%aDUhHTA?r})l4s;IYxiJx6j;cS z%_d+LqZE(57my#P%)tcmRArhs6EeacVOY2b{g7F~&2L(*h_afa4tw_#rP5r=? V{>oMU#5Il5fNPpUhB8?TGjFD+sfhpp literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/common/exception/ApiException.class b/target/classes/com/yovinchen/forum/common/exception/ApiException.class new file mode 100644 index 0000000000000000000000000000000000000000..0b8137fe0d72713a9e45a315879377ef5741d6b1 GIT binary patch literal 882 zcmb7?Yira%6o%i~OVUlFn{8{=djGZ;+93L^QV^*iq#{=OeVUHDQ#P4pHe2*xDJY^J z`~m(b@ty3gQduy8oH=LCJm)OR)9KgH&DZlk2^l@3N)0p#=bCT zN}!jdCW}9s3!SF}mB;Umon$d%naN{0(($XqdGfx1_e|%yI1t!t|Hrw`i9l^yu9@gu zy`E&J%D$7QLkiePOe%*b(rV|=g0*6x#{y4Q6;U5jH7Yb^J|F4BxkHiBktzn}?2WWC zQ-!hw-DoH0@V&8Us3(cSOx3+Ugrrg zH=x%<$QRh2p20Qlx+f~xg8M+7w~odYiJ0b!9MHNVUbjd75*?J$CIv>9u-*dep@j{S oX4qDV-NY6{4ja=7+Isg3s-L)+3iit2W=RaE2{R(^RhhN@2Vm#R!~g&Q literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/common/exception/GlobalExceptionHandler.class b/target/classes/com/yovinchen/forum/common/exception/GlobalExceptionHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..c21fe4292b919a2b59ca8845e49487076ac7412c GIT binary patch literal 1510 zcmcIkTTc@~6#k~PRLXJ@5kX4q05x;Sw(Aa0OQ#cg=Cvv$&DP zO@{sj6)C&O(3hWHV@NOSKr)OJRU}`;^@=pFMI|K7SW){TToXn)xuZkSlg*G73ysT_U-xe0>Wtd!zBdh9iO*Iuw zaw&?m6>dIMz=NVTRo-kk2kWk`Ep0aWmaOoKiUKaWSWXRXkcoV(gKcv9@W_VUx$TWV z(-L7!Ez6a4Y<&4dxqX}Z`?k!xvX2vQSx46BkQQwzXenP7Jemkiklj&y>D3?qf&EhV%Q{gO64#wj26ZHQsO2 zzO3ZF(_CSg?kMQPEg1;U7VSWJ3>$@Fgj?sTuD&ddA~!`;GQ zQf%dkZrysEtmt+b??Gi)ej6Z$d{qPoszjb9iLp8>}+i)1jOt{04JPUUY#hm&>O0ef^oR1LAyOVu_(xukW0+iR(;tul7TQ z;pX6u>a(KctRb!3udiG9ecouCr;TBA2u}aq6PMvU3QdTCHIxk)SZ5fuyQ9r;dmt49 z=Z#^;7r{@ySQl+i*gO!8jbmZcEkHL#y6|&xH-`-qoA}PeN4U&z?NtRFd87`7Rf%o_ zsyg52Hrbuf0699ff3qI;{q*m10LiCD88%mh;2(EWCXl!}oSMxJBzeAc~4bGSl2Kc*+cFh_i(ag~G= pF{jXIe3z&}^*do~=`CB}}V@lu_$(qCxkzip7)_;j&sXPDx literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/config/GlobalWebMvcConfigurer.class b/target/classes/com/yovinchen/forum/config/GlobalWebMvcConfigurer.class new file mode 100644 index 0000000000000000000000000000000000000000..ec441243514916aace67568e2523bb0b7b18f884 GIT binary patch literal 2623 zcmcIm+j`SR5dJqlNOeUp3Na)=nx-e`C@6x9>g$!Ss}79tYS^fazf;V z_(sBd48y`;7`lXw7_MMb!j^<>2@e^fbEa*2^9-Tn_!dJr?UXsg*{o^vwMMPT-3_B? z(TbXNN`|#%xTersi(zlatTSBCmYkaQ+}Stn(hj$^isLqFTFJ31W>s6ZoT6cE^Wy4$ zDeW&cT<)eQhEXo39k;$}?CqI$m2lF@tm9U-`kqUA#WiaDz;T~y2fV1&xw~(1uMKM0 zw&NL|>DZcpSm#x{9pRp4m0_4Tf9)6#4|~ zl!7sQL^o8Mn2=CV@Cc9TU<9OQ8Fp3EJ#k?e82$aNg75HzjF&STbe&f+3rjTQb2@3E z{3glhQYM?($S_E`{Kmc9ny%n`JW=oi3C@K zR20-uVVHX(*x#I&0vis)crT3Cu9?W!9>cY_uF4Zx%@ucf$zxdT6}NXyp00Mfv2PF3 zS=e;Ts9Ur;1;fK+_VnqedY55uo*g0DHTExddm4qI->@v_fR}TwSv75{sY3Gc|Hil- zEND~|Ebd27yS&V)$PJ5@mXnX(QGTK|?KFQQ0NLwqLWLo;6VCo*&^vmJ*#oT5$f8(m^O7DUy85 zF-SZ$)!^abuDB2~;t=dtn)Klll2L#03_hi~5*Xk!BuS%YgbA_|&OakUGax^y_B9a- z|ABBJq(<~6qVZ^;NO~cx%6cK9zNZ(WYD_Ok>ic>@Ru!^36K!Z2A}TAfn+CY!i?ge!%qLyY`F-a(qiAk%z= zW5hOml_wH4YTYHJgetVE?MN(~p08kG`?#aiiR^Co#=^KRG+mtW8i zooPR{UpoEJar(8lnFdE^`UCnuWc(GKo_Dhls073hc`s-8ob#OLTsHsw`}A)B7hy+n z0x1<2+UasBiY5%o<)bKia9N(N$mMDTLs4AA^(cn%aTGU@mZuT9jH(!mq7$hI#^ruf z#Y65n!mAP!KHX2<5nCliUoUB&)cS7X2LT(ZVSC8*H>6huULMO z3s)br%|+&sovvwLc)ZMJxyuPrS_r$QMS%J=7>N2JLGW7$wJ_^L>1{P<1~IGMiQ zn3NTxSY%FWTO6)FE@WD=;Um%?4sufDUdhkttK6{H%3SD+wPb7(TW4a^LKwr4hF+Xh zFmT|^sF>048D^z{`x-vSoQAVFCzl5rzQ98TJyb2pt!haI)smFSacs+Cj*2feJi@$+ zuQV9QsW3Is+gS5tvqww%_NP~?h1~-`1R@YpMKo<_Lt}1J>K~1 zn-{-*zwyJ@8$UnRPy&_VhYceQvrY-}4AY~IscBP7lsvEEUe)y)%M?PHN@5^&;l|RE zyhsWbG%Ug*rR9O-`Q(6xvUJv&o|@c=L4eE9&MAn$YA-1`B5O>y3{lkYl)3?YnG@6%60)Y3J(B?8Lpg6tPhzJJRj)6tfA{%JhPFRdY+~r1T+N$4a zw&c@@yk&?y^~9zHVyGi$xNOQW7m2VS1N9=vdUA{oB{G4?_qe4Od|?Kobjo3QZqneD zv!#*untUJl^pT)(Nl517dpkN1&%4r;Yy@cyC+QE!3HplyG=s>byMj}6(`i>|Z|z%$@&_H7aGKV(K-i7<>8#aW zzy~-(H=3%5(_2!x5*P#eo}p>(Pc*NirMViIYO6x6A`)wVf@l>TPoPzCsEWhClUB{c zDMaYpgARh#Nq~+Kq;9g>Oa9N0-vm9Yd+!UqCrC$P>kI7AH;B#>i4`IyB%O2XI1+oK zir6z8or}F0I~IFu9dB20Jl0i3ckG=i-mT)jI+7l!WFdievf4$Tv>vj08vTSKNz%kF WD4OW0j6*&L4igJH?dRz?0Q?8;W(g+% literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/controller/BaseController.class b/target/classes/com/yovinchen/forum/controller/BaseController.class new file mode 100644 index 0000000000000000000000000000000000000000..6d1fcc0e5d7134f8064c95b6b8888cc12092d957 GIT binary patch literal 329 zcmb7 zW!bqby^?k%gX#F!jGMLD5=5zdE#CajIJMSJy!g=8LV4E&Z>#xswHAB!tnwf(e7}R#@p?#iH71)!-TtzuOgYb0}-dBn}KD!#(JojR+ZQ V$~O4mgta)#2~LqS5zbg66hEf7Pi_DJ literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/controller/BmsBillboardController.class b/target/classes/com/yovinchen/forum/controller/BmsBillboardController.class new file mode 100644 index 0000000000000000000000000000000000000000..57bbefb09fdf9bf52c527dac712db111ed91dc3a GIT binary patch literal 3692 zcmbVP`;!#a75;i(Jv1%sjtdF0l0`vxS+NcAnFY+Uf{qRl8L|e5nmaRhXPfQm9{RDc z<{=s&(I}53nqV}M_^4DR@llo91*{7BIX~pDU|IhKe@H6d?H+b|!whjVRo(Y>&bjBF z^PTVZ{Nvx3{|4ZGd}v@jo?M20Jf$OVpdC+Uxv<~BcQB@g&*=E>avZ?H5C13KY*0eWeyQK-~TH~G{RjnXdwsJde)EU;WW?$rn zc2$nqfn9Xui0gWx2yM>|G_1`Z7E|JwB^D;FeKPPOza**Iwbgd*aJz=~fx$5i9iv{E zPOQw^uG|wysVfgv}iuYU*;yb3@;A9O+wWr$-m2xw}!3 z;T|vK!D;56fx#Ars#VXmM9sEFYBqh3oRGR5jva&=y5r+nQD{3>o-PS%4=L95L9e8e|~y)?#!Fl-ah{Mm2+1w z9>4a^g+%u1#lOtIbz(u|>Xi%EUiw(W{dv!?SV7IV-O9Kxs`9AkPg+N1(JI<*IpvG> zxD0oTT8(nb5i6MRjuP4%%94<^g=4=U^P*ZTiw(rdKoWmPxE0HGr@TpN5%-ByIT0Hk zOv&sm9+oAQ(Jm*pq2bQdYAXvGZYhMKG)cE&oa&%QMj=N0E?a?lZF4~0s|rO!-%X-U zUphijVMJFg#BBbf3-f1BT|523+?n?@Jp832MObQ%tI}tI?eM%X z2szv>!wIh(tn9+EZd6xxV!9hIw39+R)e9yj@dF({H1Q++*u;xCuHn8f?Ld7$9WR-% z@Uo7dm^guxCQjj}I(}y26}+nB=O$jm>&&Q$(>O_B*g=7aGjRrIO`KEmzrgE++RgV3 zJ>`1{7>M>*P9p_~+a4@}RU4m+D@(8QBN#au!)EWwP=r83S*YH>pt=7j(6>Pm; zuJdL3{#y|rcwvT=6_AEwh~@a^olE)}$fb|Hz_bI+QFG%B%oqkyi5EAyaC?&|E$J>_ z-$+plR%aUNcdlA<5*FISJ4r(?fzeP+;K$TuCPXlie93glBav_vUpMoS6}Q;zQ@q`H zKX9w-j3Atx8%lp%l;o%*)M-G%Z>~-B#Of~W+pYWNO3PQec4u#OKjY-}Wd zk-^2DkTGvA$NvTWd;nIxx;WWx;HZo3Mz-y2d8hI{z>&pPW81lD7TTxmv|*5MB@Fap z6W?YcfFaz&5h)e-(uh(%fey+8TQ>a_ZJ(k2z$`j0qZ8=3h^`sve@EsLmbD>2G;|3D zE4O?J%iC}f<|ou@k9W$_2GEBd{+YOqZ9mqz0STXaR=14Q$0Wj+O8KV36 zB?wJWrnL?+2WPbvpzu^o?c z{abuipyOZY(=nnMy6t0Yn;K`Tzg` literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/controller/BmsCommentController.class b/target/classes/com/yovinchen/forum/controller/BmsCommentController.class new file mode 100644 index 0000000000000000000000000000000000000000..f2c00d402b7652c6ed6ecd513e43e4be114b857a GIT binary patch literal 3245 zcmcgu>2DiF6o2ER&f%tMT1rAon)IN~xhYK#k`Ty2+kkVB!$8ZSwLNjR*t=$Toz#3o z(5gjBTM0yw5K;p|^ixs8jKDG zugLTARY}e*N|W5sQhJ0#vnG`=W`LbLy`%i;GX>%R*wv?~irLS|9cT$L@(gKFaM%-6 zR6dqUgtdKQevuXrgXUY!~ev)@84S{Y&#xQG|5%UKGqE3*zqLSt#E{# zcV3RCU~E(N-dc8Xd1K}4Kfn2MWO(D&YUcJA8!Mk|EI-QJxVy1*AEJn24vyVHO^-=N zQe5P$puV8#?@J3jEQJ*{`q*L81#XVY$)vb&T$6$~#e!^UEt!j z_Qq=F&f@y_4;Y=@HntOR7r7keI*hD$lI{An%<|g$R}VASe*ELNrR+y5J2BV+9n_*} zKvqpzZRNZo3VuWWvhqc{Q3wxz4cw@_P31A?SQa> z?y%WI0J{@aD>?JEq(XAS)K9gv*H2Yc?V}k#Jxw7Wz2T=f=`BCi&>kOM^3!E{+fQBe z4x>}h+S19N(ASU%PtuYNo+rkrvy?nCQ9LI~ycZZ9E0H-ZMdcs<3Y5ad+Lo4yEH+Y+ z2sdzP1Go6 zMzW~Zm41R0n2=AIUTVgRu@YUyg+GKFp{!uG3*X(=Dx$4u&5b#t6Js4DBzzgZ-quxO zKUgaJFbV*o1GFEb-xi>!Fh~1BG}n{YQjX$K(b8&LesezsWW;GBG(jiDc3wd#(z0!!4!&vd6QdmHOX|u&q2p_@!QG<@r zaWOmxwWF7b8FYdIkUq??-C~QhQrjhJrw)78K%Is~y^BsdT&}`0FO(X=#S1RGTr?(V zwRfzM&rLm^29LwcWihL*3?G zbdEe0ze*QG2|~hIg5wLt9D4-E9_r0;?6Wv_ii>wRzG!po7a|7mavLw%8!ubP1J*cb X;WxsNA&3uKUVDYkWA8%lgo}Rz@b=xh literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/controller/BmsPostController.class b/target/classes/com/yovinchen/forum/controller/BmsPostController.class new file mode 100644 index 0000000000000000000000000000000000000000..de64639b5f9d3e285fcf5da32284ce81dc14a1be GIT binary patch literal 7594 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/controller/BmsPromotionController.class b/target/classes/com/yovinchen/forum/controller/BmsPromotionController.class new file mode 100644 index 0000000000000000000000000000000000000000..62c36667e0294b316b98b3f20e426f53315e85f3 GIT binary patch literal 1602 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/controller/BmsTagController.class b/target/classes/com/yovinchen/forum/controller/BmsTagController.class new file mode 100644 index 0000000000000000000000000000000000000000..92788313017ba376c923a26ec92df5128f735723 GIT binary patch literal 6208 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 C*0{C+ literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/controller/UmsUserController.class b/target/classes/com/yovinchen/forum/controller/UmsUserController.class new file mode 100644 index 0000000000000000000000000000000000000000..0190396170862bb85f0e52aa62cd6b30e1d6d015 GIT binary patch literal 8603 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/jwt/JwtAuthenticationFilter.class b/target/classes/com/yovinchen/forum/jwt/JwtAuthenticationFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..acdf17b6290dd53a879291c1a6bd4eacd574a7bb GIT binary patch literal 2942 zcmb7GYf}?v6ntryp#ecQ*lo7g~ndocFw!bI$XebKdvQN5B68;3#g! z@Ep#^uouZVMllw}cnqyb#qc^VD40+%8H0kUIHI^1$0fX>;BpKq&PQ=2j;nYxinpS8 zJBn*jyc2~UMLLR16j?cG#4(K-`N=6T>u6!J? zoZ$#`CT(X%bBm5?%}hIb!C0`JIj!WGc`dcNu3w;bz_d(nP$1OReNiBM%FY@Bo0Fzx zjFk#$!!^ zCByalH(cfxZOb**uM6y*%IT)nFJl!9Yny+Tme;Kr?et>CC`u>kp5g?y1P*LyEpSR8 z>KK7xfsG?6yGY)qeMo$_1X|ZwTkEsHrU_5a%#G?rAAjbTKy1ZpSHX1!d^K^bx!eMuri@U&9F)k@5I&9tUj&8~{iutX47CrZVv z?lCk~E84E7WgKJeurga8%w`Q%kD(<5wrZ@*0?SX+v)OB9S)fI8jJ#iuZq6)fZYk|% z95d~2X|0|sSyi(;s%Pi*yeS>i5-L8&7i2}nm-tG>*Z7A1ui_VEii&;cP;mnb3cgkG z9lmFMJ+)B{S>BpnB_Lz@KV3%P$dk@qFw$C3bK1C-F;a$8?khp93GAvSxZHf!WI&J? zrmc;PuhG`~(XM1XD`izN!ZOr7o5i`m`tYZ;IDxtu!wc$|EOvE2UIuL4Y*Bii#kMUd z=Ab6W)3Yq|ep$D>p8?nuuL6O+6#^&iIl~&VvP0SI6cceIJ87Ra^sKx}QvbPC_)c!z zzS&Ux;9OUqVM^DzhLt_-I1-)au93$hmA$&98n!iUk!_%Il?a?z@9VQ~j+NPRHsbn#p3D;v;F zSq&B-fgX;+=*2;V{LK&f8=>xaqUSzp?x4A686l>6_*X=JM6~BO)F$s@YhSpxQQT^w zwr&}*5bho9>0L&gf`4)=cJWmd^6hq_j^}OX1E~egbh(v}nq6qa9<<{SC5_TCh9vzu zO51y|nR<<0(TlQ&QhFYT{j-nb1sq{aQg;+D(#lJeqX@O0RB)_;S{Z8%UPd4KDQ^mK zE4WD>FTvo=z%P*!DQ>Q%?)C$ym+xcKXm3;fGB(%XQg2g3MQE%DO%-8FMc7&qwpE1Y zim*KpLW6{5hd^JrCA^FlfjdY@X{W$LwDv`QMq5jS5Vs2~V^;`+?RQXnm;e9#)&3Jb z3;Pfbqmgn4gWON4lOP@-^IfE^n*by*NE**@lp>9n3EfpjyhONeFzTBG>lRo2K$t2J zFJTAwyy_Eudj;a#Wr(BPa{@!e=qdp`iBm-BHQJX+6U?3FoCLiAp-0Fl7#0f79Q>PF r33x>KfJbq5B_;Q9O8&(kU^ju@^9$N!V)7luZ;+Uc9F1^PgLD4^g=-QN literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/jwt/JwtUtil$CustomHttpServletRequest.class b/target/classes/com/yovinchen/forum/jwt/JwtUtil$CustomHttpServletRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..d9a717896681f5c59d3b79ae4392df4f6963266a GIT binary patch literal 2673 zcmbVOYg5}s6g{#X3ycT^3QZp&P3k0IlPGON1DHa=B_)Z0BqmToUyHn8fh@Vw%9Q?- z{)=>`oj^M6^iw}{`kOkvD+w%u6Bs^NYwh00Ip^NH_CNo<{1d<(*co)=BNZQKkiaMH z=)#>IIvDRj0Tc4^nTkodPG#^prZbp9QM!DQK^tb}!95joD()*t8x}Kbo`SB@7Hcrw z7pA4pvwA^6d)eHynebh%VC3lOMEGhkds8n9*R(ea$9E9zJA4b>X^&X00owfZMcbPC9o8YBvf+dR+G*sM2L1$SoW1IRbD%RBL zBe%dR#n3EPTd%OJ&3Cf5sR}Iu#(*rYZ*fBuBtvDJK8>R|qhq39c6`_1_e|MlTGR)( zBq0rbc%a}yb6Vz@S0zUB;Gu>K=%EVDIF9gy%j#jNysk7#-I(uEvCxgYhDAJ5@mRwX zlr=2jDY?9=mWE}lsQ605DxRrW)9^LE(U8S84d3EB4c~*QSXVH5*7j8}ER&u%lPkod z&Rqq$({`EEH#s=8oPmMLD@BPkZdH^F-DIS9ni&SK3k7R~XCKXYe{T4;A)8a5F^i7v z$!4X_>1>ve%15J2gFnlRs)DOg69t3V%31R3FdSPj)Ak!>Y1d`DG}>wAl}wLad&4^cDlULEPEb4cnPJudjb4(TJagI&9 zLOkHnxmFv@^7-P%$#kNh1Y%$J3HWFW_OE3U+!u#)c=?3hR%p=FC7yBMD% zj!SgA$IVZF7^Zx)Z&a*6vnX zwU^!!cneAT-iLl#-=>{iT9dS1%H>}`$^DMR>I)=)Luxqp66b(@q!ajs43fA=&mN@c zd6!N`Df}4T$2i`hoe#nwco&!Gjly97mno6_CetU#0?-b3uF%d^+G$UaA;<&~z7NTS zZcGX%(fve;610xwenskUAUqb6sP`~oFNTAJGW<>4B9BOrVXE6r`XmXf40M}RmdYonq+jAa Ww4;h`m=tt`_NAtulI>lp$k_jDBjViv literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/jwt/JwtUtil$TokenValidationException.class b/target/classes/com/yovinchen/forum/jwt/JwtUtil$TokenValidationException.class new file mode 100644 index 0000000000000000000000000000000000000000..5d4c73946a59f1355d402635c3267efc763dcb0a GIT binary patch literal 539 zcmbVJO-lnY5Pj*_)^)YD+A3c3;K2`YFCN57FGaDkirCtFx{Yn>ZX&zcR)3Z!!Gk}* zA0^J#f`W)(0`ulg-b`M|+xyEafCH@B$f9Cl#X^;#a4eNH4TkErH{xUN23!r?wuz(~ z)OWfJxu)(5hLR_hxJ<&Hh&sF%P^IE&p9ftY$&}BEIWv?o!&*n*3DxC+>~kZvI(hKL zeVQ;hEu}=%40s$1QXYA}4&6sRmdYOr<=*Nj3Ek1exaSjdV`Q-P+o(E2HjD?Uksrnx z$``^6b^nS-JQPMmbd}xKN#u)DnYwpoxNg5QJ!Z+ S(#G;ME@7U~ro#-D35y>)8jAw} literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/jwt/JwtUtil.class b/target/classes/com/yovinchen/forum/jwt/JwtUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..8739464f995d939a3bc24132c0905cd3e06b25a0 GIT binary patch literal 3375 zcma)9XNcU5mlej65>}<1Xov zbYJ6iOOrNfv$W1q*LfZT@$P(U&NPGTnppN(Ca9Gf8Tie(MoI4G0QC2alVlIqU+)^3r0?N4a-d2%8HU4DA1CoDeV4&?l{8X$^NqA zTE#)vEv1D$TM+KJxLFpCtDwGM<@3T;5FNJce9S3aKRy#1_SSk8Y)xDpOOD4g$9sI<(B_rNqd!vGK$} z@+yS~6Y&d)@oVYKcyi>Tg3#qOXCrZ`yuQyc4fmXan)Z$f1-1QFj_S7#8>Sd37pH`s z(WeSrA=a#3n9yxQ&MS+x?zBN)_YP;RVr<@;HO%a^Fk{y(yIhRT%(=0lIrp+_6bLDj z7YvW?3NL~R4z+It-m!6s0LzZBlQ{w`>LmqD{+Tkh#s+m~I;EGWy@tjVJhK+#d}$fy znT@llo@MK=sB6& zG2g#iF|Nz($EL}I*hV_^`c7|tj=7n#a`Q4bUdFu$_}(kb&-NB$_6D(eG*R)AikDen3W9yvLWOSOv{kmVV!)8((keXZk)CNd zfs+cht$JC>vx4U~;TbJRwu~@S8oqSLf zL&fhj{2p&I@aKhY3%gAL=)Q)x@COZl#M>&~(eN(bqncGLjFp1Zn|OENaVOgn;1*FRAxz^u5J^Rs;pvqWu>}tRF)Jp8&+(_vCKI!3_s$`d4Hd^v+MD@Y@&{E+3k%YbsnjpT&c-T6jwzmJ@2@pNV;dswk=FIV-!Wo zC=_I0WlLu3uWcWaojF2#iCZOuJ=D8zda7+oF0+$79xuJww|+NmWijtls6`Gl@RfetHb)md) zmz!>VNw-=53R)kXS~hWR6Zg*bu^>16O+V1mSu*^RVAG0KQ}9WkSG2R|mI`{7jqO6U zZ2z=wr)4)bv!b`kl{M>+^l^*lm(RALIWnW8TJIAuIrOz@qpz|I7`F4?eX=&LE9G;> zH?e8)Ry?YtnwA|_;YV)n)9CyIeC-GT)jwt(xE6%k5&U0Pj z_V@ZZy1g(A|01O_TD{D<+7F1*kgZCXNe0K;AX#K0o9ON`G1&=qZo?s$NmOV|}4 z;N1%Tfjy~*Xr1irUcj^WQuoo;{Q!HHuupose^O2saNzH996cyUG#(+uQ~Xx1_1x@X z7Qsx1=x_uF5yc@ocNhoI&Rlo!WGByc5pp-im?4>jPRbtPzle(%B=XY?P7*^L5jiel znC}ptN6O3evh)7=5uO_5eiH)!qw0W)F_lLZ72`XWqjHJ+L8Mn$v6q%}&EG49A@TEgK+lLp%clU$_+^(F3OCJMbfG#cWA8~otX6U@QA^w5bG@P_7FELrYsp5n z+@l$48C7t)57@9LG}1ZpSjs?8V|q6>47^shc_oWW_Ps&FEomehRUEK1p;TJeEPY$t z7XoGr?tMd#N+*Vk{qlC^&4x5D? literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/mapper/BmsCommentMapper.class b/target/classes/com/yovinchen/forum/mapper/BmsCommentMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..958d84e3335e0f748c043756e1a8ca1c2446e56d GIT binary patch literal 720 zcmb7C!A=`75FH1SG-=w>k{o(PRH8!aTzU&aB2<+sB@H4KcV{y!rfbj2_6F^*ao_{` zQK++q9#!R~uXVDv%4nME1ifA$%n-GTzb|w_BcyXq^wiL++1?^a2n1zDQ%%o1o!jpoZ z|ABWjPS|3}OXHF&a(KzUuxNQf87>*uEH9?RV|jV+yl~N2x-h}aGkRcf;v7dE4LjlT zY0N%Foom5EGneatdeeaQUjo)#>Z}l!{*mbE{F;(DtU1j!TeIK-ZCQilSrIT{PiS?X zlgE(`G^vmO5+O4-vBZ%LYb~{s?u-kc(07vwgTbb_!uwL$py13f`-JFET7s| tunkQ)x8$oS>muouL<2g|mE5bkUrY3Y)V9{OH}JOZc?Ua^TT*@x@E2|X-(Ua$ literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/mapper/BmsFollowMapper.class b/target/classes/com/yovinchen/forum/mapper/BmsFollowMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..2f9ccc478a40fc61746149923e6632a28514d883 GIT binary patch literal 415 zcmb7=J5B>Z42C@cvLt{+LBkb5!VTRbBvPbWgp^41vm0lbFf$(Jk!Y_*!2viFVzL1W zs3`o9EZg7zzkj^G0l+n!6fiE}sDNVuqq%CWjLDOLmue-~61B7~KGZ8}Vp%n8u$FAp zf)kpqmQe+#Q^1Bjp^?s!$B7Jd-?umYLdR=mn*#0~q$T MfWusec|HR81V`k9u>b%7 literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/mapper/BmsPromotionMapper.class b/target/classes/com/yovinchen/forum/mapper/BmsPromotionMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..abdaff174ae194d5f50ae6a2a5ae207e779c24b1 GIT binary patch literal 424 zcmb7>y-veG499&15?VlFLp%clFKj_bbYKbswG#U!b;Fh1`Q*D4<<%H?03Hf)O&Kbf z82lkwwts*7^XvTs0IuOAhe-}cIUFk(&rRcW?1U7=a;4WATkRTrtX5RVqO93srP-PV zcWC=cM-zP81*};Jt@fS-r#jHXklqXpJ+F&k_h>ir9dLy?Iducj+Y&O(}s%}|hBU!5z zN7Sj2L3!Ipk1abwEv+SobLr_}Xm5sv#9L+B7c#hJ7d2{LQIBMT3JK@hKgq7Ttpv=L z99>KIs?X|Y<6yjVwIdO5zKD5A)3frb>FLfG4w-(E=LOt*GY(;K^2^no04 zNS1Ixmc0t>QkJ^dJ@SX^2Y(}9_p=lz@~Z~(J5B>Z42C^P$dV9VB_{xcgd4gbBvPabLP`+*?8aFp?2Jb61i{r>U#1^`!Zn87H6{R|Eij7my#?UrmGj8|}Rc0McEV#6EbiYIco;!s<( zyrc@rC6gMQ*eJte1%rhtolbQi1#Y(18;zBACEn+2D$=;!lxwzT$u-(0*U3a*)e#F0 zgjRb`0Vg`rUE5y&S^7rAhYPMlK~qzS`tg=&yXW$YM8V0t7G6t_CYrpWTjw|l0lO%7 z&N!49eK4+E1#Rht!!yQ2fjBjua8911NgNuHI{np>Z~WGbt+0ZlpC%}fV=ex}g}wp> f9f__yOZ61=U`M(x^d)y7gWa|cU?{aOb9(@vXj+u} literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/mapper/BmsTopicMapper.class b/target/classes/com/yovinchen/forum/mapper/BmsTopicMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..82e0f8e844d4c16e0797d3d6637211226a0ed052 GIT binary patch literal 1246 zcmb_c&2AGh5FRH@(m!ZRfKuRusMHDxU$_M!H3u%FYLuYfoy~OPcGq6n-oU;CPsD)- z;1PHj#J8I$CD2wypm zEa=NYFS4l|DVyrC&1G7QRM0+4axeLFVB@tl6318@FEa&$@3<<%JH2x?RWeZ~mc!t* zi93gPc}~#wF^7o-Hm6b!?7W~ABn8lVP$NNWLmdM^?r`(tF3{grI14+~CYrF3XV&GZ zOzoHxIkmEHeKe2xkfyR!Y##ALa7~7gPzNB>tJ1h zvJcCV`>Xfn6)dI3L|l&8j0r*V+KIiIil!h)h*ifgp}vBVq6YR&oYrd8f>|xMST$Ow z4cOh%dlT!P$M?l{6|wheYaZJGxJBGf6}MStn#XO!`N5xw+KYf26Sa|IhUXzYs&GA~ LUDzg`e?s&Nw90sQ literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/mapper/BmsTopicTagMapper.class b/target/classes/com/yovinchen/forum/mapper/BmsTopicTagMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..d8834c5aa92bb500e6b452fe89579c1ff3a075cd GIT binary patch literal 692 zcmb7CO-~y!5FGR~jt=i|+L`yJTpz{d`JQm~g%9CKlk>og3ivCghj1;?ku zCq31eYnS0DdgHSG+3cx|CdU!QzJlHj#YawWwbzy+`JiCMNcG0ZWKPG@lY+1R?sWMc z>zi~xx+`5YmhMe3lbrsde0Pqcj)tA!oebG$s0*Du5}JuT2h@uMY^tPLYpU~7#tBPU zKPFF<#Qrd0ixbV(q+Ft{nkGeF229u!T3r<6ai9a;G{?)PpyH`<0_yOAeQD8hN;#5D z94j2y&`2t3_G>EL5tlxpE0fCz2TRde$Mafi1&415zv210;Tej06A!iAzu5o8Afgk; zsvx|hf`f_dE5Z9xQ+hYyoXBFf8M^FovFn*83WWQAiPBae%NJXf52n@>tU*i8ZMn4+ kbi}QTt-uC!#c$Qwn_^o*VypAmHhgGucAzJ|E#X~&KLK^qxBvhE literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/mapper/UmsUserMapper.class b/target/classes/com/yovinchen/forum/mapper/UmsUserMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..644cbe39d64f5a88cca89cdaf5e291d5776d1ce8 GIT binary patch literal 409 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 IJ#SI!9|sJ!bN~PV literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/model/dto/RegisterDTO.class b/target/classes/com/yovinchen/forum/model/dto/RegisterDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..c63945143c8950e8d8a350b28d198cf90d5f8422 GIT binary patch literal 3744 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 Fe*x4(?n3|o literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/model/entity/BmsBillboard.class b/target/classes/com/yovinchen/forum/model/entity/BmsBillboard.class new file mode 100644 index 0000000000000000000000000000000000000000..44ed5de7b1ed92940d56a7a6b4ec8b3b72e6863d GIT binary patch literal 4423 zcmb7GZF3XX6@FIQmDchKWP>3BH+5RK@hc*Pl44_GUR$R&P;A^nlEO+_+e;*^qg_EA z+9qjB(om8%X;NCIGx^dfUudS82@VaJzI;h%`a1$NpYjKqrq9`3No!E2wno}L=iYOk zd+s^UJy-wy&j)`2uoJ&YLB~=O&!rHrMzDk`wL0Dk;JbQY}j9R_uHjX z-Z87i{WZH(w5ke>iAu$)9w?cvYq<(Cu2r?o(yUc=ZKrZ#;-CWM2?gl`PQ~@iiZ^SP zYL>?R$VX8Svx`KYJZqjab0xDfpPQ(7*1T06RggVit9W+Vnzda!U$XX9DvoD*MCCI5 zleUv{&zti!&6&-a+`dJ7$|+iMMC8h&VpZL1{Fr3zKc^sE_Xis=v5sCjlNcaWpa z74BSF{^ZJg3fcqn(~?;RImd!3$gOHwf5pReAZlXb$n>G(GemF~obxR5DF%Q0-M8-k z{)4-hmhZgq;-?>8o-<3X_34LK|Ml0G@BHp<4tUj?=z-bCH~&bOGva=R1nDhWb7rmN z^#*wHzJ4OA2Utr5>nH7sb);6#TUCGS%xb>Qze9cfe(+1qIlEF=uqwGZr&=rL%EE#i z6K{JYltN#xP|S*zfU3MUn3 z4t(Y zK*JXFP*?CJ{^^L}%lxrI)E}n4iCQ1!eis86q%dS*7~43?0){pln>LSNM_`=e7^@pv zY;9V6jTSM1+l9w0d>y-~kpcHZ?WseJp#v$QAZ^AO(iXnu6N_Kxlf2|J;g5Bo4f}B* zwCf?VeDqt0oqQkhKT%$3tq6HS>m1*Ls|~ydRZL?M;2s?2h!Ggz8~COVMZUFg*6wwF zxTQ0B+QK<;uk*H+&Ln;d=cME#8uqT1&PQ;RR^zlCQB$GrqepfF|Lt zMGDw)jH8-DCBsm@jpMB_wN+yVYzi@RKISxLT45$ujT!JS#C+7pJb~H!Ft^@d0#>{C zfT|(ph>ywM6JRQb`EFxct_}|T0h)S!@bA#CLW^G?{2TPCp@C(z`6`9f5PxsW9F_JX z)Y?bX;eVh#tA2!zYcPhh>N1SFd3r>nNqQua)x;+85jw9Soz=35h|#){B#qXM=-H$g z>7h|FtJjTGVMshe?4ZO?1yMIjd=)2gidF5xMLbEe$M6VjJjJm%9zy|7Q&L%-!}uO0 zjlXf6<}-mMHj*=xl6W3lVN%kO=bA%EC-r}0T@nT3Gi*wt$gi$^h6e(%Eh-{R?@6Xt zl};a)Y&Sy^E^3n3d$}GZtJc_w#`t9?A>xyM!FW4xXq?^PY2qb_XlF+EsAJuk(FG~Z zZ=q+7UW1k~&y4xikqOpD&kSBea(Ef*{qgjODic{XoYAFX!PL4D&7Weid?!7t`BUAk z^S?I;B8)oD>uZ7e<{uOkah6gH5At4nhC7k`??8!?$`iL4WlEZ#;Wwav&Vt36VTGMc z`JDct5)*9$RDX*3_GjY}-8blhRyU~Is4Is;vqZ$KX?gD`jTr$i#~{_*M~o6MehV3P zf98_>tuX$Ag7k`KxdZnGPblns6lHU4>PF9|BP_mUE#XM z!28%ba1#no`@4)I+9$grebR_vJWDImg!zs!%e;Af48KXCLeKU z;1wdu%@wpxk)+`XnYZ}YWZajexu`x@J5;~1N+XoU#YU6SQEha6xw++|az8?;=(V<) kByl+wgXiDiay!>(!7KM1&IiKx@kLsssKj_cA4J=K0qb1L1^@s6 literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/model/entity/BmsComment$BmsCommentBuilder.class b/target/classes/com/yovinchen/forum/model/entity/BmsComment$BmsCommentBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..4b790a510a54d7db090ed47164badc6b7372c794 GIT binary patch literal 2101 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/model/entity/BmsPost$BmsPostBuilder.class b/target/classes/com/yovinchen/forum/model/entity/BmsPost$BmsPostBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..a189d4ef8754cb82b1dc0bac4695bed743dc065e GIT binary patch literal 4024 zcmbtXYgZFj6g?A?%p?vFf{$Wt8(Xx1(IB8!P-~H*R6r^S#Xg5*gu!HnCKD|7{ci2U zz901EPiWVwk5$*|5AZ+qpSZfZ&%KjmBB?7aAF|KBXYSc^@45FJhFgFC@h1`W(UmBr zC=;PQWHOv%m}gjEuoxB@&NE~gattO>A zS5$hH?Q1H%9;I!R(dZ4fZ))_GMsI8Mjz;gY<2{Yu*XRR{KGf)vMjvVPu|}V0^eI2Q ztkP#HeXdZz$|w{cT{M=BRMxQPQH5F3Rj_sPZt5CRDF!Ljrucw_{ z4z5Cb!GvEqt58$fwQOXI2y69ejzD1E%tI8B*{qo^MIy=@dQsZ4WnPe~Q9(U_V*x>y zV~=Fy!{*A^o1wbSl6)3nR$~=|j*~SF8>`r077C`FHs$=r(#VU6rt_xZnp0K|+la|+ z6kRKu8iE(m(VUa9&aKGj;X{^fxknUg=;)kQD0s}tAgX!Pvd!^gZqCe48FQS)_^6XM zveQQ1;<4upx(ikTxf{$CCY*vhShTVkGmk8d*tVHJmNl?UJU=*!UwZ zTj|u-^EznD3xd@0eNZS;K6&IECw<3DONYFkm#W@{Q0Sz$pUUyCM>jOb2dq%Cqka_} zVdJE0q|c8TOXAk3^o2@aBI~Xrk5i$I(5q3v(MhM6Pn*LQ-#^{E8GCr5PRHqlPTjOu zryho0hCYS^^oUOTXunSV%nmX;#B6}s5oU*(9i_)~dX(8QW`oRz=y9Ef8NQ;gb^3+}=-j5H+^qK_R$-6j)W zE5jg?Ovr8q-og*Oh9-J|2>!);;BQcv+?Y&M8WYCxWTJc{W!HgI$6HHH2*X%1QPpFl zOr_1paiy(btaR%10vQS&s5e=6)IQ!?N!zKpMf6W>sN(Xfv&!cc4^m~M(^zqPcXzi! zo2sr?sj4fJ_VT1sM2~;a>mT&3)hZQhC43)G`pe%%yq>l8g8xTPY2CiC|LrQR+ox6S zs`Lvvr84F}5@BO$$+Xc3cGuYG+EVszJ32wte0in=|306#<6|O)FP1n3xYoe}T<*f6 z;)O-g3yYE$7WFSI3SU@s0bx=8!lD-lizXl}I)boh1;U~)2#bawEV_fR=ncZ6J-{~O zhZaN%jewel2l zFKhM*&C@iA6mdR}!g4-!&S$tQcomtwTT=CMQgu3w%TN|RErh3P3u`PKsatr;FFYlL z&(s!uH`XmY?H8UF!ZY+#tsFP8aC6sg^H<%3lPP#SRJ0;o6$5b!&15DJNi9Xg*EPz=hkZ zY^Np^H__#;-zhu_P*+L4K^vKBV}OVlZ(UWV@TUF{Jk7#$ zkKnQXFgz{7)7BrpNn2+z4&c{-AIFDwC3m+4+d^$TF^*sBb-I@es9{Z0J0X|qkFyhL5uwLh1mTx%U@pYvyp?$p{2J}9-GJmDg)3hE0yKx6 S1Sn18uu<%55B^OaqsTw3Sx~$H literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/model/entity/BmsPost.class b/target/classes/com/yovinchen/forum/model/entity/BmsPost.class new file mode 100644 index 0000000000000000000000000000000000000000..8f52a57d6ee023940b5b4eca113747e74c46f2d5 GIT binary patch literal 9658 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 QuEizlG;?K1*but@0Q@h3mjD0& literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/model/entity/BmsTag.class b/target/classes/com/yovinchen/forum/model/entity/BmsTag.class new file mode 100644 index 0000000000000000000000000000000000000000..b0820b3c6abdb5006d3639871b93a222886c8b6d GIT binary patch literal 3678 zcmbVP{cjvs6+O>8vopJ1I~zAnx@{U#>QZ}cXG2LSS;rxXo0Ls$C&Z4SrI3zyC-%6z zGuxfnq%I%jqaQ*j5)vSxN|h>*h*YIeB;rOyRPalY_&bt@{tuLJ?#!&c>#SgfWzXFA z-nsYPckX$2`@5%f727X}RHHCqbHGk1sIoWio6}zF3DY>rQ zn5kO6Z~F>a-)=Zob;)k{j^|z|J*}Y5&}+tX{lIdAC9B%B^~uBcetZ2uiugXKqA)bO zW?i-lRm)u|ECdb5U71qIoo~8ikkV4ZRF%d(|H^7hSJpZ@aq3X`*CuU1&LyqZ(-nuXf>GQ;}yYSV8E zRamsRX{o{hTCiTH|3pu2rOG1F^h%vrSSUR+e^D6FT&pG--1+&{yVpKYIM`FDFoV;M zU6mx#fme6RGaflnc%Y51k{j4$fslQ7{_=}EKfU_NyKmin|D)SCe|Gon*Z=v4cRu~i zuW#Rc?~`9~+x{@d#c~{Eq+(yPn$=*WJ@oMCSl8g%3~5!^G3&VYe6zM}H^TIIsH2YS z1jiJLqiv3H760o@EAz1>QGi#bYAkApw8x>fVATnWE%jRWE<0{{)piS)yhgKDs7aX% zHYF0Q7a~oPgY29gta_DmR)dTO6rqB#+>+`Mo~_4FBONMdV1307N|frZ4t_SpYH)cz zEb;)Y#kN}Me&jgag`S?%VFCu@#5>Sx-{Dw$@N_W|xDh zvFCY%z0NxtFOd~5Sd}KQLn_swqind+F=d1xx$kDQC}t|0jP6G|nvMno3xQRBY0j#L zVqgbj1EOcya!*ONG*>NuHBx0_bgaZ=&YdsKonp4MlMUOaw5j=y6cQt{r#=#GVFq4Q zKwdAaT(*6GNC^j|Ln%D^zZ#Fw8QnmILhsjHDl0`^uK5=O zYbAp(;gEqJX7D5YID@C~lMFtO$1<3ZM*&Ro@c*S`g(rIS%U}tm3{K)u2455Ft2my) z33+@2-&EMMy=8BH5z-N3qfTWygV*r}k2SGh7@y{MU}FDPw+WZuWWmNVxQOGty<0IO ziSfRLQ|$H&;djM(Rr-U%&MjoDci5c8`|2cQFcu%_eEp>$XcFOt$MizRT^7 z(NugemZt;Xx*zxTxE3Cd^81>D!b8yb_XzgU{v5yCeb~=G)|2BAj(2nPIPEX^cmks| z#%$y<&RLc_#_Za{OyWQUp5Pp{a6jUUEyR-;L|U{&%wg{I2;cIfYd6vN0S$#O^O+2% zchY(aUtv&zzQDJ}_pbbhNaV+FK+8|ufS#Ycf#e@K-`C-JgfsaFk0PcxqGx`>K;?i_Zl!dipiWV znB>P8x`u(Ao=diY28#wkgGDoE2*`{B~Xl63vDs zVsGaZ<*5!ZM3R9nWT%d5(_ta@W~WwJ1~WT;4aVdKcDyL_14T_1a$3A%N^zp4!J-~6 zu`Z#LnbX6iz1^uk7Ht@3m>@;Z;d!Q`lfZA$>SHr|mYqqcehg3I+q5(`jXn4dEj=Xj z3X=CYp^;3bNFbEDNBGvbPbP+;w*W1S);Sf!l5Map>k=fdjk)4zq3&TI}}lqHSywR584~<1hAzm@ojJE j!#ueaieWkY(#Th&Oa#9)71)t+344i1b6`;E4bwn< literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/model/entity/BmsTip.class b/target/classes/com/yovinchen/forum/model/entity/BmsTip.class new file mode 100644 index 0000000000000000000000000000000000000000..46d888445be76f4844c094c6fe4e18facf645d8e GIT binary patch literal 3270 zcma)8Yi|@)7=F&~%+7Q>l~O3UfTk#7uPopVw-mVuQfL8bse&L(w?jL)JG1Q0qVcyj3*C?wH@<0gu7F3BMh{SG+t>8m{OS6g(_jDj5@lfa^KC%K1^J7^08|^0Q>$W(|lc+SGyxH{?tnXVO36 zdf5rbOCR-%<$O9X*-DcQH<(Os&X6ES2j!{PG*Fd96PJ^;asQ3)VWkYo)C$>>X1EiIR=7FcGfhe}y>1NEm0DX$ zTUj;@1$Oq0LAwx^f>)3Cgu%16w^d@LIAND2R5eLmKcVc|+dsIKSScrpPN|$@pT-rY z71K$L6_pHT;46M;zTWlRU<1wDB^}8jzg*0+HFIp0MpfEX@}dbW|G(=aTlvP5d$H9*2E7(mV~vFu z5eXYFoN zd{Q>L+vGJ3jZd-;9Tr~0I=1Xg8r3%f3&SnGL_^`D=e{j39qV8h3XaDn>Z#YoRX1W5 zT#`1+zS6hqgFx^S7deC#Ybl zBE>?kB1Jnoltm}^SjWhs%C(yc*7iX~n%@Y%rC7spEz_kr3(k7yWr#~5o~Jk_!p#)F zT7abt@C=^iO2~q9taXmnI=9tzW~0<`j@LS`tn19qtK+O)sDa&G*LgkqNQ#7=;T+?f z=uu(4jq*jz)Z;zl7?h9NiA4;i0pNYxEd z$gVKtW^8!?<tddbg2YO+K?x#hxc5*{ZtawYJZzJ5`@PiBA0TBvHieVZrz`bBoO{4l!PW z5#8qA^;+Mu=H3ZenlE5B?>-N`**?-2R!1sW8?(9VJdBIeDXpg=^Z<2Z_a7$HRdg^X7y$!BpVUgb$7|7)?Ik|bs^nV0-a zhChdSp9PDPVZm2S+^2uEh{@FgXrYRHhuV16Iy7j7UNNZHXtTE>vqY8IjAiXEjfsGt zCq*@m@f7lH-FOX6`>*1mmU&ZXmh4VpeoKpzlbl)>D7jI}3zck4p|xcZNY w)w8@YVo=D>Ym|59O}~nVYj63yI*(%vuM=hrhr=(B{Lma>D1L!#j4C1f58JeJO8@`> literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/model/entity/BmsTopicTag.class b/target/classes/com/yovinchen/forum/model/entity/BmsTopicTag.class new file mode 100644 index 0000000000000000000000000000000000000000..56f47e83e2af315efbd1e1adfdfab396d04a076a GIT binary patch literal 3142 zcmb7GU2_vv7=AX{&2H1J4TS>Hsvs5GrfpCWAqBK8U%|Fi`k^3Fw#m{gB)cKIDb_nL z9Iv>;8OIrC953VszeX(%%rJU`Gu}G>13%zDi1?h{O_P?)SZ3htd*1WB?|IJizUQRB z{(I{VfIV1@qZ8*^pkPi6=fz;Cn2+by~k4|42f_ z%1hWdcF|Zg(nZ5wNM~)&Trev`5|XE?wr7>hS*%yQE16=Q+W zv{7G450|ZRCvO%fD^A(0cuUNqEQ&oP#Qym4_Wf&LNf;Q*Ii>Wx;gqbrQ%#qa=9$(l z7prbVs`RwMO|y9>kiDfcWuM(j}pF z+GL%)rSwS2ofbr<4RJPQ!Sn>B&Ys?equ0x;ah*s3*|Z9>qE1{OY9~|NAl+zBlWe_@ zOD-{PdIcvxX;h4o>9JX<7dHs`j5O{M(s}GH;v!#-eayUEHHzG&voZC_`HN=G8|pp7 zOX93I96 z1>gmy206n%BAC)F7;YhG6n0IPL?%yV$B&RH?O4Tht3{6u<;@V5t{(qO5-P92@c5q+*{NTHL?_ZOUUjLn$V4ayppD(#{ zWykgA$XLf9(mJ~Ew2qzFr6Yx1yyoI@SZ|-}n82`(m$6sJYr=X3`*iFV!%0j^*iwJk z0yRdeRxvN?+1{W-kCi{D!-Xe?Dz)q1<_mg|+R+SZ#);Ic<4x?Ni1oBVqwo&-F20IW z{sU~iC$2CnWt7XN&3X(pHr`54*Ym8RN2ONbYmM4)^;YAtoj(?xkgyptp2QYxrJdwY zPK2|FkeKslIN!|Kv$VIl40(>m4invYo?ccU#B8c#de9qy`{-kN9!2!m5CdrCDl5uy zH+K?WiC?AfCZunDDlc%1`ObE{NLvp8c!|G^pv^LJTpj#9BHyeD-r6*nm2VOpT^roh zG?*RJBv@V>ysc?)218Uw&=%haziMCV2SobTh6kq>B_Jd`wXlNn9H3W`I7yJoK^$t9 zGrI1aK{>;mJN=xmHqR-qJ7>@UVa}AFlb0^wDedF8g-5uW>iYtUd?WQUluw{UZ=`;L zGTz^}jF>;Ap-%L3$jAe~pfxGq#fIz92a@tKv>Ku%qY%=Pi6s?*iQPrVb+jdwWUK)c z&!_~&Gg?v=AT0!`Nv#HwZ;((FYy0kOKy;-7S22Q7ir$HLahSar;gzs(guW>Hki$`0 zGLG?kjFy6NzBR{b#Zcre%F^QBUU&*8XlZzzd#0eP+CO+g#n=OERx!?hn)Co$1GA;k zL@4M81(n5n78ZU#8Hr9&gp%SQkw*>^w34!N5QX%`LBfoO{SxsZq>Jq-4KhWHiDnW* z2jqi(A-WPn1(rceq^?69SVrr4;cv;vVj(GqE1D=yuoTZI{u1lr2Wd&gU+QWu^`T(H zkYN<3@CN@&6mb$$v?7R8uxYZ6Vh3;63@w>`x&^be6kp6Mh&`l3rkIjM0U=2b39rv1 z!qEw(2B=}=)vgd0Yk<{}YrO=MCSUtNJDej`@tp0s4gK^@v~@hOjCLX6G7=pd0=tEu tj*h^N3wtAnWo&Bx4g{~?o=}FGhuzM94C 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 In2xjf1{zCnp#T5? literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/service/IBmsCommentService.class b/target/classes/com/yovinchen/forum/service/IBmsCommentService.class new file mode 100644 index 0000000000000000000000000000000000000000..c41c74667922f070d0b76cd46176d89e1f7e4364 GIT binary patch literal 728 zcmb7C%TB{E5M1{aT3!Vz@dF&nr9Qx|h(oE6Diw;9mb;sn)F`&2*onxQzv93L@KK0O z6SYW%3J#I8-rd=m@qT>1y#v4{bR0Nx;Mjo^0-b={8!aVQ)(o<#j)XTF5;*IQpIORi z$W%aG8w(Zm&x@hX(@c2P?^n{6($N3L-~v4 z$_T9}4o`*0>Bud9wwba?BzLCe>Lm8~tq9Sb)6tq{iP*~@mO$?(fvf2oUHI1Pg(&n8 zxX3a7DX2k!Kn1@l?qa1zpayk}8yMAbd+^xF6VSv|3wE(EPci&CVB6e$wLy};)z!IAAnXZzs3M!^Gk6ykEA6j!F$ z-H}!^JG0+EpI-o;a8uyAz^uSrVOH6F&?z^pkhcfjYH~X4>A60zN#)jvr&^1*JIUm` zS|=OdT#m#ai9@s!D00(U!?daXz+xbE(%N8NInawV*^`$YJK~UR>S*QTTAY*ja#P`K#pvi}`=G#UC8ro$|L E0l(>OPyhe` literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/service/IBmsPostService.class b/target/classes/com/yovinchen/forum/service/IBmsPostService.class new file mode 100644 index 0000000000000000000000000000000000000000..589627205934e7bb4edbc271da9ac3c591493ab4 GIT binary patch literal 1699 zcmb_cOK;Oa5S~q&m_C34<^3oU9Eyb&BsC`9&P~ z0sI7h4B~TQrJ;?|Na?}y?##}7^ZMrZ-=DvT=nXyf=&?snJlYZDh3wkeIzc~n+rEiq zUzu13CYN#1S5DhB%B|#YjuWd*B5@6MVr8oEgC3%;3c1-nRzoEtm4veAGM$9Y7t6R4 zv~|F4V1lm7RLqVuD`*vtH5~|QUHo+K zyt64ur+>`8Lu&+WVvIjA<~Qa9uAg7vx}11ebr*OxuTf`eQwFkOS!MoUzxc?-h*Rfy zu?#Jis488K`+YN+!Ap`;nbAp~unRJ-$lKvSoS99S3Je1fOMI^X# zQB@C$SA4JDKVIJe+~B;zS%qnZnZmTOYp+udtgu^db+4(@eoc?4d@m`Y*(k6050g`-l(<%uZjWbCJy HjI;U#j=^zN literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/service/IBmsTagService.class b/target/classes/com/yovinchen/forum/service/IBmsTagService.class new file mode 100644 index 0000000000000000000000000000000000000000..18596bd1495cad5f18e620e99c1858e84a93ee6d GIT binary patch literal 980 zcmb_bO-{l<6n=w1E&ieC1zdp(XQ8_i7A#CiFp|^@4DDEkv@>L8O6(mxkqZytIXs8) zwMC*}A_f=D^u0IV_kQMkukX(<0B{Xw4xBj9a^RFeLrBB5y=RdjaNZtH*__eTikJ?C zv0i7@L7;id?L>tmrdh%**NCgy0`B@ElFX)>6JV=U-I6J0GNQiKLPlP1jlMe!R6;W~ z7c!V|NgtF>6Pl=y$COJeY)1Qu!D10hpk;W>1ADJ#A~5|7-Gh+8Q@bD;GnI%?r8LRL z%nCD$Q$zWq<o){yy;z4rvt0w7F%Oqmo7Gb2xouA`BweGARPbBK)BrS ccMLHi5C*aK;=gG~7-B!70Y-gKaL~{3Cpgf4mH+?% literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/service/IBmsTopicTagService.class b/target/classes/com/yovinchen/forum/service/IBmsTopicTagService.class new file mode 100644 index 0000000000000000000000000000000000000000..44d97952533834675e69af7d9366c3fc728518c6 GIT binary patch literal 878 zcmb7CO;5r=5S`^i1QqZD<*p`jaSxh!fOz0wLV}T`#QV~YWl7s5-7VU`=D{D}k1|dv zUl9`Uu<7nh=grJ}@B8QT3jpq+UVvHw&I@qCprX-3+qC1p8cVz5Fu1zuj>JT8PXsQv zOeh1l*+@f?ksj|#ZJG?K&uE6q>4{MIXfV_a3TBQ`w4@sd6NSj2zXM*YYb&3}Y9a%B zhyj07VdQgPIp}c=j5INC`+7QJU%1Uj>R+})6b9!p2G<+<{2jaT${-_Y$(#``P2AgF zv*T#fsS@~FO6ZJEO~eW}q4jb@t5sSpOjv!`{#R>Vo`jG0mGH}8M4C3Iqz;7grK2M5 z#{*%c9($4I_+c>6QUzRNIFUB;j+I_^TsIMVu0+XFQE20n^hoV`XGN$P=569927Hso zi~j3n;GU aXpt^cx&qZ@Ws*)Sk13emPT+Kkb@mGsNC%t% literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/service/IUmsUserService.class b/target/classes/com/yovinchen/forum/service/IUmsUserService.class new file mode 100644 index 0000000000000000000000000000000000000000..c34c7bd06093ccbace0150472fea054ffc585694 GIT binary patch literal 804 zcmb7C+fKqj5S`@?A{Ryd1&oRNpl=W!j4>g>K&O?=WcGqn;^yWcsFuR4ZVRB|-*G2lWbb z6RlQBw+wpi!Q5P!+%=`c4ebl*>{qQ6Zn&z6$boW%WYGOfVT@bL+v7YSBTXIp#20*{8&2kE=}v6(#8jTJRmi<)Vrmh*xM9F? zsZj<(NltPX!b09R)|>ACXVarLDuxPu3-4k{t$s4LgzIu8kio@oFJn{pX9~?bb!9Ds z!PSajPaOpYWDENil{j<&)ikt59YQS))hRy%jd*Rs IQT#vt1a=Yh-T(jq literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/service/impl/IBmsBillboardServiceImpl.class b/target/classes/com/yovinchen/forum/service/impl/IBmsBillboardServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..87fce00db1ac679672606f5d637e9548fc34fd36 GIT binary patch literal 775 zcmbVKO-~y!5Pc?ulmMmWOX9$R8*r#Oa6yS86(pocfdfIgdp9NwtnHQUP07#VRH=vl zfL{8Ks?IJT5oyH%SsMGzr{~T5`S$d$N;TuZ;fT{DTZpd+p*Z*Ybsl&MKN% z5;*<6bHaQt57ItH+h1zt?8lJh5T{pIDY=pp9jg atJS;7XoXROap|>&&(*z-FMOB&UxEK2X75x0 literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/service/impl/IBmsCommentServiceImpl.class b/target/classes/com/yovinchen/forum/service/impl/IBmsCommentServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..781f23a35bef8cb48136e0bba3dbdfb0d3f3a1d0 GIT binary patch literal 3165 zcmbVPTXz#x6#gc?OgbH)gi>r#C|DqEDI;1zNI`o6t)?xIQp6ihCew7vT;j~65N~+- z7e4Fq6_gb~)^ho(|HHNX73y~;X+thV>Or6H3|&Hp?d2sT(w?8!0(*6GT}ylUyy>STbWd5X6`tpvG#+vDBtDawU zw7~Q?EW^|+r(kRIGfpt;IgaUunF@WLWa{tFn_=}Jm?!`-Qt4shs7Tifuos(mX}&>Igz1~k(FUE`UJ6HhHGB# zlJ4t{8Ja$w+mo^Kt{xVBn!5N5UfC9wZo@bAkdnVmwlN_WZrL!myp(Elli{_(l6KVz zt}^_LSgXXS_@#Qa76Q7agPJ6awc%=j!h|hSQG1>SP|OUX5}7DrqK&Fn0OM1JU9Fej zBi5|$IabaqYECJuhgMLqi-Bg|4ox>;7S`9m6N&$nAnApI>1#EYFiA*w28Y*Jm|`t$ zqL-p-Y%WClUCDSw-!Ly)qSE&_UlFx>Le!9i!7D|^*fCeEz+xkqc3m%|;hxJ>O;#FA zK~(Fi$lzO^e^U#X$EFvudbFwsQYv1+0SSAevW)6^+V}O6C~6fs5X5-P#A)px6(cyZ zDJ^OkTWvtaemu{kx?2D9`+I-g|3Sv8iage2SSr@x$Z%D7D9HFkg^xf6u@q5Iv4KFv zEwQ@|TDh}^dXBZDqJ&RXe1^|ee1R_|oNfhu)BSClp^Q5!zQWfMQbNN2%q$5f+UakO zEt^hbcdWBf1ce!r)dRDVjuK8jJ@pOGH#Mgkr!5wySYPApVd+}#D$9LutER?L)H(&C zp4wEJtm$mgvU8#p?5-8V%qC5pcU{w;we=t{8N%u0wmQ>DlSCSnY~|*<)>iF;61q6! z<~fJ@skYJAlyvStCDrsdL*WP)El|kMwDM%jZcvA_o%HsG)^}rONi@t|c0Z;JyKHsW zOL8>XZ-{AJnacvNQkg!>Y$p;fSHVZ^Kor*Yrbn}52)!#x3JKcw;!VzO%cWCkMO}6- zW!Ft3OpS6b~RBpi7%B2oI$sz%Nf4)L>Z5E6!>A6phb6+5|S zm*n#x-!!fg*RHV#knV94!!V!S5wV{F0JU-fhw&oc_z8t0=!lpf@^&X_M;{}0{Q)`_ z#_pr@H*}3ZLU#-cKVs+NPlzXa9zluW_+9eGF+e~vxrWI%L_HwHIB5d}H%Q75JL?Dm z3e97@Hv|Poaf}+Nr;0)Bk{FHT9pJ5T;yBK8fizCj#xOz32~q|S`-fsXWN0#8l5rA} zjF%O>!m}>c8kb4_VtAFTr*N7(;g#>GP8fFTA$pIOp_Z{@yo{Y??Bdc_#_q>R(BM5~ z^p~-Bv1<0jBMiiFZQ^buahT7;gd?7vbX_maO3-x&BQuUgCQQ23*Zr`;QUrF4@E3IPV9S#=YB?91XPM#T?uG{NGkTejyHG~ X!!%~Niql!HHh&8DSNIR%CVKt_T?~m+ literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/service/impl/IBmsFollowServiceImpl.class b/target/classes/com/yovinchen/forum/service/impl/IBmsFollowServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..a98109856e57bd2957162880576238fb97b1336b GIT binary patch literal 754 zcmbVKO>Yx15Pi-^L(@PZrATn=t*r#UR8^&|DnX@6kA*}|^C#wl5fX9D&8gP}m< z+}&t_?LJw3RhW_XAJr&hrrUR^%7)5Qi5FxePALeS^iyZ#+|9_QQ*Gtg`NGJc{ftsA z$>f>reK6s|WtqDj{H1%$CIXuSnphPJ&n13VX-3K!x^aax^O1@a@~j9_e~H=#a`s`? z|8kwKe1lPWuD!f3ep%sUwJ$5rq_&ab{9ixAZj2==TZtHt%U1ZVDa##2J&QD~>J=w|FE2D3n|13k)Ub{HYwOpuAI%r}; z;CQ`H5J<|vHQO%m_OY@{+OdZkPaqE(kE7tlPiNa=Br6Ow55GZtWuk^BY|Cq43!7{^ a)wzi_V{n=d+ZvwYS+#HDIq#+a3*ZmWALp0= literal 0 HcmV?d00001 diff --git a/target/classes/com/yovinchen/forum/service/impl/IBmsPostServiceImpl.class b/target/classes/com/yovinchen/forum/service/impl/IBmsPostServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..5e124510fdc0002570bb3d002a5750a9740d65c7 GIT binary patch literal 11958 zcmcIq34B!LwLfRF+{xsU#6i%Al`ZUvBQA)Epa}$tgn$HM5x1L}OLEC9aTXxfr`8o) zskN?HZ7H?Y)&;aSBp@zb-MY8h+G-cUVmIIFdv?+O&v)<4++ij|9=yko+~r%&cfPay z&-u=smp<6@3=y5qfALX2y;?yrdQGFBS5gW6!iSgFHTtEG%IQ@$Lf64268vVDAj-yxQ<$vVz zz7YAVO!}LT{!agp^*@lO57EX{$;=+m;1VB~av6HLyplEc%2S0b_--ZpxKd-?N3(bg zsBx8-tHBS~pqr18i(i^SW{hHm$4c9=UV5OC$MJZLkMq$yVQC&8?$$;C z9zInlo#x}y`3xV=<1@WHU+!mlxltOM+= z*s5#XV==kPviayV;~TA@$y8r(HpokNpe<)K=Fe}B#d`vY{9 zu^;QVf>2V1%G}~qWXHKvK&kv}D{3VdGL_7n)x}i0C>Db3s@tuo*^!ELoAK2Kl*r_7 zj|Gizml3z*-DxaM_FB;DyrSz`k^Zm}_sUoz>G0ZyHY~37n8|i4kz~4crlQep#3EKG zmI_1$x?wYk{%|T0fDp}S0tOVoYmWte^c%P-n+mKnddwzeRe`V(?Fn=yMS)GW!5$$w zhyg2L(`O$IQxIv==oZO|&F65(RAvd|OyhIKI?$gMZSW|Tw%N|}R%kXH*cc0l9=cXE zErbGUmYd1mSZJjo2A?$JP-aD^)dSh4;^6M}qtVJ}xyTpK(I{`UtHSbwannd*mp9nE zEG(~3G8R~*1}fiKyn01bL2HjF>6$>kJUkD{B2r+k5v$Cw0saZ_ksJW>#7!%V$JR!#~ zGg~R9o2)p1Xv#LnbS8~pA7X(58)OztjRk==83#rKp#>pafn{~J*$}X)jK{*^Zjf9O zgH*=3%&v8F(CnA#7*(;+GB+tzGfkc88k7MR<;`kO;0-f;Mm%W+1rvLUE6KG*2Zk}* zV}+n#L{b6WLrH6!;!XfwFfts7yaNa}Axj0>z!fPIq3Qy;UT9CpG9?KUDC=IK(-hMx zX8HmZ@z{DRYyvHq&d6o&?0ng{T2^##FoQ{@$H>vJK1!2G%Tq9Is*6u-vH+h8n^dNA ziN=>A-_!UqjW1_vJG{0F&?>xV9f56?iJU27Mxo!j!;p6TeB~&HjZPp6QbZV)3DbxN zds_yUnFA`y=Eb6swR8Bmdo(}|=CnR@09h6Ugh2Cu$yhNVxdY(Q@ITr$kW0h&6runj z0PyD=O;Bx;ByIiCP#7)Wve4MNkck*#8DZ;6v)zbvhm1O=Gu_Ivq8npRd=7E?U6-#mCOg8&>eJ(t&+p;jw8ZyDmC$y#EuWCCeM zznv~8s>?Z4!!6ZiY}WAl64XM<fFe!I$OMf>6B43;6!Vk`#20472NJ2 zMkM0Lsrul~2j1Cn?}6P<9(e5D1NT4t?$fs(+_`)IvyZ=h=di{RoueGnxt|jnCv{G7 ztHv93-o%@A9+1nG((*B#ui}5v`D)&b!?bcY#MrSokv=F@z;#-Gvo4!%>T%`~9#T{_>*_vmyrU8C{6 zI&b6qn2yOVwbV%T!bqWX{;baT^8-wC4(z+*z%5(t4elS>YHzUq?Jaj>w+DATvVY(G z2d};Hz?SXrYNzuJcabg+jz=G?@+%IzJ)WxJ>6KAvgXSKc&-EgnfKn zng?~>%|kj5(>|S^r7aro(RnZ54ugEUhWAx#{7enKtn;({oX*elH#GjH&fk)mm+1U$ zz6CCd%tWo#7Sj1Ud?%82X|a-FX!*NPC%?e0!1&^VO2%U0J}VhWr26|~@noQLNh+!m zaE)Ko`6Z!H2G0x+==`$0Om~M2Cma-r5IVmie)Bz-t2)2NKiBye{CbXGNI=jjPH?JU>ijF{iQnKinNBaH?KEU6+%ABN#Vj+M zhUHLkAW~2jZc=Q~L)HVHWo2l~6{WYV7s3N`-eKA(Vr2W<0MiD_VX&ocBVpQ6g~={H zjf}Jr2dOht5HF5Nm|+|fM3l`@R3UmyAOD(vBemHBObd&J`Rrjz<+^TL$)p=iFrg!~ zV=!05ZS#-YILMh-pomz&&hrzYg3MOfvRDx{nU)ku@D2@I=`&tIq7w_nSq1CO30M;p zTW%#fQel|TjN+`PkH5&NwCR)ZX*SRy2ryXBDHwKAh4po?9Up&}&dkO1!@DG5g*^^?Rb zH-=L22wDPWB(}i{w8|BgIPd|<_RGWSSaaBd!$6cd2%2H*P)EjknyNd?B0jsowHmc} zre)5yGBN#sQJl(GO_?$Q_=w|SqY({wD@XBGS=~6dkkj!16(fm7P626L4*s`6a6M)m zH0*pqogAD-OtYfNE+d@6K2gR79S!iGGFPlefpun^+cUCsyf{@jOW{P86=ZsZ4IM={ zmM-&+WU4meIiu1z=}Yy8kW#e_h_Oil+&*jg)7w=FatZ=wW{+inzFjyTsTaeo_(kdN4D#oTt9$tmO$z)sI1|OaH|pQWt!yHPX17F-pN_C9ijLGn8yYsx3y2)9r!#2 zn1>DZ+8-#(%_~xdU|;UIWtNm%Ctz;+Kw^Z&i{to$YpS#)C;PSS4Llc~;9h%Lu_3Nc zW>WbTzMaL!JFhk=*SM*LAk+SclqpA{V4sFL=g0<4CX)CX6~QKRJk4&Eub=3IK8^+@ z9OGu1n6pGimub;rnd7pKn8QIf6IM8pKh^E4IWs|YLLO1a$z$?;5?`n!3?YZg;m#qF z87Vdyw6Os-7`IL4jdbS+83dY9P(RsfQ}(wJRgR8~WUyD^lSC6cc#d_iYX{FRjrZ$( zfDh_CU(UMk@E>$~iC)e***acf2LYIl;rsvrVaNz4T@4!l2@+|K#rje>wB6)}D2Ik^ zcuS3FC~PL`?2!e&m%9?6oQbPZjcZ!x>U9LD%z z=aD*XNw_7DKeyQCH2yP^l{^3|Bxaas@o_X6zi;ZtkBqLMGV(|*0nbU)5zBE;;qH;z zT3#D!X-=CDBd)}_kEyXJ6S>ApyGKfGhqP7T9Ys}KufvD{?u>ic?A^pqs43UuDhv=! zp&M}3?E!Qn-Gn!$n`sMvr6rTE!@U&u@w1;I&vR5Vr+%19OQ>UZ!)_{T*oB@F5^7br z<40vwjbBzBOJ^#ov+bDAurLKL8=%e-*Z$sOuC1j zqcI%~{;DCW9-^B1K{{rT{PvKsxE(u0;|6K`UOEo*j~}GkK{}za)S+5iI!qHhbRlM) zI7lBUy?kC7dQPezS2jcw2WiqUO-3)MOc|o7_t6w|*2&v2P4iG=IbNsNmJZU4+VWwV zSwgj?BEM24zlGQ@(E^%I3#p!(=@e>#6c^!bF?CQYT|i5yi_RmH&WAZI!<-ICZYAAM ztLRZ$qvX95BDkMw=q|b&+J!JOlHW=9(7j6XJ82u;2k}jZI6sTgC7`;N9>7y6=$=EL zqtC-oMH^xhHnr`b_657;1A0`W9r({_t=xl-ZTJ(LuELZr;_tzAg!25C@bqPR$kEXI zxI-DVe=p5iTT`=}W-oW7I%k;Xq}5VCL=6oMgLJYIuaauO8P+gNr$D;WJ9mgq9i-Fh z{imbxj1szVFU^Cx&TK3d@y_2vXAxo83}_u)jp%A>6iq?;!*sTXhG_wQXizR{z^|gV z(L{MVhhZA$HfptHwb~#x4^svSEK($Hj z--d{)%&x1PT?<6yEb$DMcoqsRjAHdz?-);)j+XpMnJLWm7vpjRt&|`eJ&Jx z9-Io2*(ml6>=ECv95ydmLDf>f%3gklf2JZduXs8Mjr z83!i7!B!GDbtJSkv-G#|bJ_3EchMyPIv*?ug1aDDF!HF^jh9;`B|DAxF#F-H2c6ztdZMd)Y zuNkDSZFD`JFZ6#@J#WJETK`4rxew3l{1>a|%kX@O|5EkbsT_M3T7*(7?rBPA;W#+4$o;y6)G_7+Dn(O^&7jX`&n>k$1yu9PFBLTqvCsT!WYpm2Y+hWWerRJfL2+2aXQK z_IhZDtYO+9;MdoIDPh1_1YlA+M{q1EYPX}q2@20|0KndeA5-5%r@^7mL5yyN=ZP7d zj#WZ;lQBn0|sG9{On}ulX5t9!DE~1&v>Pk3n><;J5jY{CldUU!na} nEbs>Aze&G_$bJiSQ*T_$C&(M0jGrI+1|kZEKW#0 z@B_H?A61>*QVFD050Ry@=iBeiJpBH758x1Q2Ux*&53hQ7-NPG!wFy~@#{w(6dozL6 zPwq?$j1sc?YiUyLf2cHP%XZ>2mCux?T7NXI#tRAp<0NxNR&GHyyUQfd#uSu2f82bAa2>v!8*&@4ZJ{~ b<*<2oF<>2BX2`OGm)L0T5jOd*MYR;|_hx1{v&n7<3csCs$Nzr+>rEbc z=JFr|U?SjWU1lf1i;azxl9Fj-yePV52 z9o~-*$haehJMqC7WPB)!{o;LB6nBfo4~xe~qWEYGAH!W@av+L(#QWn>+$-MqMTJCn z;uBFEjN*`tPeyS#h9$UP#;0U_TE-Cx;}dH$`7L(VNN&;6U3zY}k<=wz(2=w=YM;H^ zu#!ExrS7nEg^Zf_w$%zKZ4w$UFIbL|(YG3TqubQiSeET*j$vDQ3ClX{Tw2X%bB2}P zk<&8z9y`~ocI%pzS9fSh$IkVsS_wg2Q*i7(Mov$WY`x&N+0Hv9;TE1%xBxgQ)UGrv z!&xn%re)q%3E_4-MHTBi3`^fw$aL$uEgI#O5bv;)nz>cW8Dj1)hMgXR3M?Iwr;*8; zo>fXVOmK<3V}?bmIkYW_%xdY_sqNO(f@7F!hmm*M<_%q-kdBs?Fs~xN3?(;Joo06W zRB>)vnmlA;Y@|(v1}=S5v(jppBaF@MsJ~4C8iunI$U+nelgica%N9-0Gz4qqa4xIK zr)?NmB_FD!g1{czc&1!tP5ut9@(zw)1A^T6XR_j5z_0aPUWmt z9NjUBgwQ6=adx>f6+K0QU0tBjs&$TXJ^6e*>6~~C58mhFb?3yIVbqk;nGX%kG_KP< zUucqWi66jjC>YjmyH{74?LDZJ2Ubj#F3hIxoeV}EXRYb_Q|Vksq#)se>gPJ>Xp~PB zLDfy_6hllzHm{p>@Q4g4b6&%GereOsGIIiFX zKFd@*w7@8M01rx-TQS!Uw~d4~0_+9#C)(KCj>l_@acxqh{=9CIw%@m#e8Zyb>#T7>~&Knu4$68w$ROZz=dTzN6r~ z_@0dKEBFB(Rq#XnNWqWs69tcny`SQ71uM`d<7Wzfj$crNUpC-Z3ZB4|3RdGqGJdV# zH~6iD6;cqLN;sX9JOnG!AgoOFXJx?{wgR$c=TqUg1?E$oM3$WvFn%PU^pxIyAbgo z0%bx=5TMk{vRBPKgy{)uH*-;HhL=ZX z3}z>{PK)^Xr-X|taV-X^nbBKx7LMjSk^G9rFdia?eye?E8w7{FdH7av?m zFzhup*lYxi(r{AIylyL61Yw4ed$jyU%I7xASFl;O+)4Ryl+tgkTg&TS(ktE>sz-Ll z&juxwwiy0}e~SyzDG95*0(iEwW#d)360}jHss;%j%BH&dX~L zH(AWf>qjW%LsML_2MRiS$+~iP!7x*z%^K_V`fH1GC1F{5uHDq~d7T~Fa$omR7_X^} z5;b31$d3_`?nF*tyZ`#2NQ%j;Uow50H zeyf9W71@p2N)#+s$fh($U)v`x9W`2t&x*P-VA*mH&ydA5xsS}TbV z)I9K2fd0$d7|-Q@CS}pI~%1o0K(p-VsQcQ5hk~ zyLlv#z*SxG<@T9P@~0lD09=`O7kzK5jHea+7iSdg$3Yo~6x=O(g+QhE4dz`LNLBMc zF0n*vrW06@@hlTZhi&&3vJ!3%dY(_ilj%~;N|}1T$%CwLWe*gHGQ=(Hv)ir=>=yG; zV97^l*G#jEwYg1}_zkdm*zs4AgsscSaG1%jh|5TCIlpIyM2pGsO18wce6Qj=B)ZEX zYhliLBj9r_AymF4z9aLGLb~5YY3EZA04C!ld@3FQ)?qzo5?+c+Q6rG0%?J|`xZ?yu z+mE8AvvmMr2^$vcmFcCCV?nn>Y$#GxsO)?d@Gw+Pj=wq z&)_N<^!jZxpQ3!P;4V$q$=7!NLKIHImAJ|?IF9fg;re1~JaxeUriHN4x9Ey+WB52; z04(gsbYYPfwl;6VmQjH~fV@)m2? zP~{LYnsF^O(wTs1=th#1grYOJBA~8DitrwkUV_>|D52Dt5CK3^Ma9w$G4#M7itwam zL=a?7&F{yoj?k*se$2j)^9%V4oxb4-AxLB7v8m(up4%F4>PPcFjIUXB0Oz&F=eV;- zc-1t4f$HctA}FonyGUs{$3;pDIWAI~$*~&0$i<$>agov(_n;1+z>@9prAKk` zLzK`v9xv`D1>)`$cA}U2!f)cJJ%c8?i!?SiSBfX phl&P#g@2GZjc4#bG~!iUpHApk6aO`MEq(uWc)dS+4XnWRns)RU5V97H(GxwhRaqhi;|MUDMfCVgYby^n~ zT{5w8%ap0jZU~I5*i9`k(J-<8u@kj)x~^IwZ>Suoa6_dgKMyWP+&z;CEH(lg$*$cs zad1z^a?7TjNM<_SHG!5UNQrM}?J60nxGitr4|L*;jrlg_?567WK;H-QSktLsXH_M=@R&p&i%c!? zmV$7Qref2yW92$2&A;fm+fp_%o3eFan`9b$(t9CU;q5@^)FA}JpI+j^)hbYrogpfHuf@cL`nLfn@jj!pq^`gAh7~- z@3MU`%||8UFuSCyr83>G34yCe*Ir;#E%(y-zY6(2@pk{S-%Y$_*+{j0oz!$WoArDg zOunsgM+MHNU4bHdw?9M#X7+2ZgeuGGvxjF5ra7XmtiW#;2G^53N$!IC zM{|EdJmH6j3fIxzWf@g|=gJho$2i4Zg(e0mR-Nn)n<29^%gk&b zZLNxxQty{~!E3!&tG3k|4ABz2AGj znV0{4^+f=0!r#-_jR%u>R~iXCC?D_6a-ft(8e^-_1tW?j?PoSZ5*N8ylLA$66 ztQj;c{b;p3syoBlsL7t}pk2_+5zR4VJM3)q#tc_r-(bNmtCRMGVHL)7OFeBn)w1g9 z&V*6WRij)n)%-x&9kwe*VOT2-1p|5Z_i`&&H}!%yFzFBHivqdM!86)~rka{nQinXp zuu8qVg08A(nChV6dR&gEBUrKw!9KIB2enPAwXh?LzjruN)le%W44OoaY&bNynXpu z`xoL=x^-Qys54j$%`_g;2etBOQOnJfXIK;VxUMpCf?362S}iR6NV#wH4C9FMnoVB@ z6_4zenhMIL7l{t0viJfxw)Rt?G@;YIpxZLOutDZHxLg3yH>nLAmzt7 zeId}ZvSlI9&=lAG1+k&8pZ9djWz^3lst7qPf*+q%qOnQSk!N~uOt-%H`NV-wnlXII zNW&8^|jp)=|rIw1Ru_S#r#PZF??Ns{}mhu4%^SGI(rF6F#587aDjg zH^~PST)<@oU&NObd>LO6*b{eul^1ceg0JFh0{u6ra1gQ4t3_b%ie-eik%Fi2bsp;* z8GLh165q<;+X}ve?mRodm*hUcn;4i_%WVU z@Dp4j&n&HjXWQnu;i+!5Qn4LR9XedKe7`60f`Xq)2~9MVIjLYuHaemN5mHh}mQj{c za7E6JH~b=Zpn{*tHS0U0^1}Q;U|T(B$eX5K(#(FRR4wx=oyD5Kmb^7Vnk}{m1lL|C zUOzM>7N-?l#Y_@ESMUp5Qt%>X6ug9M0(Zorq!zGCWjRZsdwCiXV1}}IdKJS0428Ne z0s{#gqS=;q^@2QTA!K{g_$7WN6Uko-40PTYrQB;+%p^Bca*aPVGjH+2J*^e=gQn)n9J#JrfLR_h zenC{T9ZOA#yd5avslv@#!)72VGH=d#YHwdOCy`#eL;TRMD_fg%V{9O>Gmh34ya36( zuSqIP`=z7~K~mmqSVSEmIY-}Gtml*Xor2%vPYNEEBz_%#R&XDV&ABE*00b;YJ81NU zXFHPwo@RQHjwJp{hY#BJc(o#+- z5=_7w@J6--zyI8Z27mD*EM<0?n?d5_6*L^#Glj;hXaaUmq4`AD3rJo=YR@!QC76PN zbEWJSf6YdIl(`wL*yQig9>@vzphUbGw{x!)+HeQ%q*nX5Qfdn-Vy&r)&3BDurpRNkEz)s^%87(|X<5 z8Bw!mR?Qyt`)Y#r9KgYdnnBN9p_)8@KLro)7pQuOsvgGOp{fI%mf%=RsOs)%WCDvt zz0u{X&>GB~RiPzRA+(0vCfMShOd5H-jT_M#Vl%gru6m_w3Tp=w2k4;eGi z1&`(0-Pv_hSbv$X3^E46gzQVVqLG~T- z`<^!k4y|0?pdHF=VDm9Tk~Wh2Xu8RUqU9Y?!qs*V%gg!axUbk;!KJ&j$& zPCa5;CG4?{_}oq~<**Su_}}3x(G^IX^;yR(Y&vip_jAV-wqOXuJb?70gi9ua;~4@x z^yb?!!U67xcd*Q|c9P`-Jn5-Z5CyywFSDIy`w#dF{>ZR;58JnJo<1(fF_!5BiVkK}0XEZ#NKm=!!9Q$MfzlBe!?x)q`Gf9X)_GlHl z@mURzRihf8)9~8~d>)U-aW;V`@MHotcq)OX@r-(WK`|Lh;2efk_q=*s&~Pz!8;7h9Yta@BhJfG9>y9xXrem}v5{y??9thn;=6?|30AI9;u1XkheYLGNv!8a24 zCjLl?^~Z7iNj3fyf2QHj6IhEgir-%(@R#^2_4%)p)Z~-Z_*;BCfxpAwtH(bmx_?w( z|0#(I_4QxX*R}Xg0wZ`{@xL6$l{j9AkQa=tCwtNQ>yJwI_(UEVl}>rSf$itP}yu}ZFdV*udO>Qh_*Ss7TI>%S!+)* z(_`finiSW=BxR-#n|WLHgTbhK%%=Ps$}U;3@~7;SW!RZq+UPixDIDTRw?EjyF(tiq z+Da8&>wwj77hDDEk=nAnGL$N9^tz4_l5RV=x2bL#T8n7AgGR6{*Q(&`DUDW^y+9kt z2gYvmmg+H`jNR)Ljm%&VjaSH}iv=U)711@bw^xBDSkUQ|T4693TEcnz@-@#~q%G8?rrR}BC+KyaFEC#*{|M%ES?)2X zcb}=;m=>jXT-9&6O8VA8^~`cyu%)*1xOvJn(q^{b=ysLkzcp*di=(`flUWJ$z_S>> zc2>~*W^U!t`93vCFh+%1O;BZJQ}mR51HA&F7V}G1Za@Y+&5Rcl#9ZfumDT7P zcvTZ&PGzPE0Na;$`fL?@lzx&>)A{}>#|Y*g-b-;JHs#fFA-CzIn=mt$a+tNKYzLL^ z^U{oG(zz>pEh1u@Y5QH4@98TA8%xEsv!|$;(H&Ct`ed~7m@0dFj$0|05>}?YXc4R^ z`8pK`LA*JY4zgBNx80vL-C~|FU79)utkbTQEzmj!#U9H_lumV2Hk!iw{cIj&5kJK? zy_GmAOB>2CAt@4wM7LASr>yOs*{_-KU5U9?p{G2|t56dvhDxE9<1#BK+?8fzxv4Cv zn`d!hX;F}rl$L{I!=_5m)p;7dhjG5$$?Lcq_Xt{4)q7iskXfSDaohrB$oc7_FuPJB zbMVsa7;5K8MFlrKG4+6s7bU7mOqWW$tcxabU8*E8J0{gSuBahhY6!LH_jOHpwuvv==dJtK@q2PS*v7#E{0NM?pXYd<}7|3IeY)* zhwppg!82FRo~5OgGOOiAP1fmh6Gg`n{Dff5q{(*Df8UB#3yOR&5J@&yXXYU*N z)RR}9`SfQ0XUo0s*5qbg*2^t|)n)DD;a!?>blD&qHMv!n+hmiDqqu{HZki*_nrzl( zi)_{8c3oPeRms+-%Qk7(@lM=Ds_k=RhbB99W~z2gcImQPIY+0oGFvd6wr5N`%^VhF z)($4bYPMOXXz#EWmM2}h)DnB}GIQGW(7TS4K4H5?p_t1#dDrOPUd(zyrO94h_9+fA zrjYcYF8ftyb!mzW(qEa3sLKH*ez%%3ueOvRsFgEuVQxY9IR$3#`l-#k}G8txSmazq#u+{=_((BHBK0EgSqQd5przb0CE zN`<}M<&<@6a6y5p=opq^{OgZY3>g8W?9*{`w-8l>V&)PvQV!qS2n#Y>`Q-$37K0~ z%`UWOa_%6vcx51}yF3T5@(vfo|`TXSB~tLE{*PJ72oI)>E|8 zy=s>^D{z+9a6s?KX03c%+9WG73f*PW$+JxTS~;Eg+HRr@EzYru+d5dND zAP?k%-GO4BAE;{l7LFp5)w*g-0`79sJj7E)X3L_rw~q(7+B-@eGoYZ5l?7f06bZtf zQkcW<)9v=hrWSAfjH&@M&o4KWf)=b$CX+GF5`J1~9aL4n zKA2`ZqX!jryHWm-vZ7q>@GogvY30B@XQiCnAWvVsB64jNuH!@t@F*u*LXHX(%S@_C zP}$3iS-u_w33lAA6iw)Z(dM7>cD&6j+mUrG|E{bg27*CGp`CRPt1$4cn&>|ZYCB3p zVQh9y!E(Kuwm_~0rN#}(>JBI5PI-sm_8FAl(fv(%$jWb!Mjfz zo6^IlVgOu^6rZ|JfL>Va3Hs2_#W-2Ea`_m?K5`L}qvuf3)p!9>pkWBHAyi&MWC$9c z7ZCRbt2lV1{uv}Lp}O%r^aw7YX3v^o%z6m%EgZtN(P1na!r~!Zw<#JhT^K!&B@rB17=40LMWHm=g4ul5QG|Ll@Lw|;(S|kH zN!2@XBY|8;*lwbBH{&GM^Voa~?!^YY7aQ?m+~y&$-q$iffcoMXY$6fI2XGuGh(V7&ovy+OPySnrjgkT%yp&d)HgGT8fT_-7b5$xR@>GCw#LKm#&*Lyus=h5ST zk{U!wGYjv=d&m`>>AR$A9m7v~Ywn-{PIDCn^>S3aj(QFE5o$i);PIqF!}~P+G<)EU z>(9&z5%DeXv$#J%dP?hoMSsh>@NKgd=r1mXR_oCH3E zUm%hU@5p|lOq?Up`XMxTMmE#Fn?J{e?&5Fsxsh*toA36UTlY8fy)j+!sM&al?SK<5Utq>SzzN^tmw*$#$#%dA&#@hH z`U2a#l6yT)pJhAb^oa{}>rqba{1S4yjqQ-r8n#1D%h(RI!+f?wPE}rt2xa}ZUo>v+oQ6@@dGZk~!q53tfXM9ObO-*9StLPa0{|du2j$gt( zzI!pGg%g0PWcM%*K8*%dexxLqEv9RJgkur>G9L8azv5Ll^#|mSvj3~3{@9(66y77( zu&>6SMvYvJD!E&F9DIEOjCId9_Y3`TLm#6=U|2pH#sFi;l+lKH7y z0;$VULkeUoK`3kePF=<~y?UFHTqW|o_AM_C^nOE_QmvpTaHQf#9d|XlAB28OhVGpx z?swe23feulIzRiJUd+)|Q>vv04S{3%%3bfi=eE7D=`O1{2%B?LZ;Kd>lAW%ASma;l zUnWQ+Xv&@vIIwQelYT!A)T&#Ry`I;U^FuYgCF+bUu|kuPmVCJGMW^wWXW}xyjga2J z)uQFT-@4RpMnrFQt~~T*R|Qc>qsSIMv_^M`mrys2Aa&#O;%3oXl#rlN7zndmKZiJW1es}uHdST&+x4P1or+v?s7k9 zH)L#M0h*puCa&4Ij*5*cYUFr${)6e*xS@Sdez<_lYAb{r^}Et%5w?jo8Q#Cs@s6?x z>|zfrhCStlK6yC({ziBc`3?ZGZxNxqsw6p0<)?Igjr>Y^ec^SxGGuM0-;cYk=QbE5 z=J-}-i=mQD88cE9Eo}9TlV5yihgvGyOni6#ohPzg_O}`~%gxyHB@QFYd#k?$>&nt| z{FpnJGfRzh;W@+~L-lTs#!zU%;o4q5fIZmD-3UIx1VLylRydDP_BfY#fn=pv7$7x3 zx|%a;C(flNQm;zsWXW(0C;bFJOr#uRrer$iIMyDOEXNufdxGPR^&2Mtg!%n*SknWH zjidk9>A_W#lCIo?V4W=@pSF?>1UPV03YRyXTvam!q0qYlF&(%xB`EJnP(}< zF`Xg~^2z!f7jYD~aU6Zhenf#*MLfbZejy_|=>aYuemI-o%uN!f;U#JogXZL-87W{?Tzn@;{k)M=$^Y literal 0 HcmV?d00001 diff --git a/target/classes/mapper/BmsCommentMapper.xml b/target/classes/mapper/BmsCommentMapper.xml new file mode 100644 index 0000000..b15db9d --- /dev/null +++ b/target/classes/mapper/BmsCommentMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + diff --git a/target/classes/mapper/BmsPostMapper.xml b/target/classes/mapper/BmsPostMapper.xml new file mode 100644 index 0000000..a1538d9 --- /dev/null +++ b/target/classes/mapper/BmsPostMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/target/classes/mapper/BmsPostTagMapper.xml b/target/classes/mapper/BmsPostTagMapper.xml new file mode 100644 index 0000000..c2662c5 --- /dev/null +++ b/target/classes/mapper/BmsPostTagMapper.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/target/classes/mapper/BmsTipMapper.xml b/target/classes/mapper/BmsTipMapper.xml new file mode 100644 index 0000000..75af804 --- /dev/null +++ b/target/classes/mapper/BmsTipMapper.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/target/test-classes/com/yovinchen/forum/DoubaoApplicationTests.class b/target/test-classes/com/yovinchen/forum/DoubaoApplicationTests.class new file mode 100644 index 0000000000000000000000000000000000000000..cb00daf1775fa0bb99168f16b0be22b842c51e36 GIT binary patch literal 543 zcma)2Jx{|h5Iv_Kfi}=mSP%@1P!L`!77$VaF-0KJs=JfAtxMvI9H+p~VnSlz2k@g1 z7qY>bS ze$F6>QCs-dTs#K0tu1LDCHCoqCwfzvyl+O!Vk!+@{G+bngmr|tE7+_&y zd8^6|_x>JuIu{GU;LIuInNfN=F(Q>uXdZclXt^aZzS@ZoT*npRZbkrAs4?jN|A7qJ z~b&T*ej-z@tAek4Kjjfj*uhPM(pkb>D!!y0TBU?m!>bC=QklunrB%0GdSh h9Ql~ClKhL<{6S;`!cHl1ye_!4acd;`iOfoA{! literal 0 HcmV?d00001