From 11856998d2389a623f504b0ab2798dde82db6dd9 Mon Sep 17 00:00:00 2001 From: a <872694426@qq.com> Date: Tue, 17 Dec 2024 18:22:51 +0800 Subject: [PATCH] 1 --- .idea/.gitignore | 8 + .idea/MyBlog.iml | 9 + .idea/inspectionProfiles/Project_Default.xml | 6 + .idea/misc.xml | 6 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + poetize-server/.gitignore | 33 + poetize-server/LICENSE | 661 ++++++++++++++++++ poetize-server/poetry-web/pom.xml | 125 ++++ .../java/com/ld/poetry/PoetryApplication.java | 17 + .../java/com/ld/poetry/aop/LoginCheck.java | 12 + .../com/ld/poetry/aop/LoginCheckAspect.java | 89 +++ .../java/com/ld/poetry/aop/ResourceCheck.java | 12 + .../ld/poetry/aop/ResourceCheckAspect.java | 32 + .../java/com/ld/poetry/aop/SaveCheck.java | 11 + .../com/ld/poetry/aop/SaveCheckAspect.java | 68 ++ .../java/com/ld/poetry/config/CorsConfig.java | 31 + .../CustomEnvironmentPostProcessor.java | 76 ++ .../com/ld/poetry/config/DataAutoFill.java | 21 + .../ld/poetry/config/MybatisPlusConfig.java | 20 + .../config/PoetryApplicationRunner.java | 82 +++ .../com/ld/poetry/config/PoetryFilter.java | 45 ++ .../com/ld/poetry/config/PoetryResult.java | 56 ++ .../ld/poetry/config/WebInfoConfigurer.java | 15 + .../config/WebInfoHandlerInterceptor.java | 26 + .../com/ld/poetry/constants/CommonConst.java | 251 +++++++ .../controller/AdminArticleController.java | 81 +++ .../controller/AdminCommentController.java | 82 +++ .../ld/poetry/controller/AdminController.java | 60 ++ .../controller/AdminUserController.java | 119 ++++ .../poetry/controller/ArticleController.java | 99 +++ .../poetry/controller/CollectController.java | 54 ++ .../poetry/controller/CommentController.java | 85 +++ .../poetry/controller/FamilyController.java | 149 ++++ .../poetry/controller/FriendController.java | 82 +++ .../ld/poetry/controller/MusicController.java | 68 ++ .../poetry/controller/PictureController.java | 73 ++ .../ld/poetry/controller/QiniuController.java | 34 + .../ResourceAggregationController.java | 126 ++++ .../poetry/controller/ResourceController.java | 144 ++++ .../controller/SortLabelController.java | 161 +++++ .../controller/SysConfigController.java | 83 +++ .../poetry/controller/TreeHoleController.java | 82 +++ .../ld/poetry/controller/UserController.java | 168 +++++ .../poetry/controller/WebInfoController.java | 173 +++++ .../poetry/controller/WeiYanController.java | 157 +++++ .../java/com/ld/poetry/dao/ArticleMapper.java | 20 + .../java/com/ld/poetry/dao/CommentMapper.java | 16 + .../java/com/ld/poetry/dao/FamilyMapper.java | 16 + .../com/ld/poetry/dao/HistoryInfoMapper.java | 54 ++ .../java/com/ld/poetry/dao/LabelMapper.java | 16 + .../com/ld/poetry/dao/ResourceMapper.java | 16 + .../com/ld/poetry/dao/ResourcePathMapper.java | 16 + .../java/com/ld/poetry/dao/SortMapper.java | 16 + .../com/ld/poetry/dao/SysConfigMapper.java | 16 + .../com/ld/poetry/dao/TreeHoleMapper.java | 21 + .../java/com/ld/poetry/dao/UserMapper.java | 16 + .../java/com/ld/poetry/dao/WebInfoMapper.java | 16 + .../java/com/ld/poetry/dao/WeiYanMapper.java | 16 + .../java/com/ld/poetry/entity/Article.java | 141 ++++ .../java/com/ld/poetry/entity/Comment.java | 92 +++ .../java/com/ld/poetry/entity/Family.java | 119 ++++ .../com/ld/poetry/entity/HistoryInfo.java | 74 ++ .../main/java/com/ld/poetry/entity/Label.java | 54 ++ .../java/com/ld/poetry/entity/Resource.java | 89 +++ .../com/ld/poetry/entity/ResourcePath.java | 85 +++ .../main/java/com/ld/poetry/entity/Sort.java | 63 ++ .../java/com/ld/poetry/entity/SysConfig.java | 59 ++ .../java/com/ld/poetry/entity/TreeHole.java | 49 ++ .../main/java/com/ld/poetry/entity/User.java | 129 ++++ .../java/com/ld/poetry/entity/WebInfo.java | 107 +++ .../java/com/ld/poetry/entity/WeiYan.java | 76 ++ .../java/com/ld/poetry/enums/CodeMsg.java | 27 + .../com/ld/poetry/enums/CommentTypeEnum.java | 62 ++ .../java/com/ld/poetry/enums/PoetryEnum.java | 59 ++ .../poetry/handle/PoetryExceptionHandler.java | 49 ++ .../poetry/handle/PoetryLoginException.java | 31 + .../poetry/handle/PoetryRuntimeException.java | 31 + .../com/ld/poetry/handle/ScheduleTask.java | 41 ++ .../controller/ImChatGroupController.java | 258 +++++++ .../controller/ImChatGroupUserController.java | 397 +++++++++++ .../ImChatUserFriendController.java | 156 +++++ .../ImChatUserGroupMessageController.java | 118 ++++ .../ImChatUserMessageController.java | 157 +++++ .../poetry/im/http/dao/ImChatGroupMapper.java | 16 + .../im/http/dao/ImChatGroupUserMapper.java | 16 + .../im/http/dao/ImChatUserFriendMapper.java | 16 + .../dao/ImChatUserGroupMessageMapper.java | 16 + .../im/http/dao/ImChatUserMessageMapper.java | 16 + .../ld/poetry/im/http/entity/ImChatGroup.java | 80 +++ .../im/http/entity/ImChatGroupUser.java | 74 ++ .../im/http/entity/ImChatUserFriend.java | 62 ++ .../http/entity/ImChatUserGroupMessage.java | 68 ++ .../im/http/entity/ImChatUserMessage.java | 68 ++ .../im/http/service/ImChatGroupService.java | 16 + .../http/service/ImChatGroupUserService.java | 16 + .../http/service/ImChatUserFriendService.java | 16 + .../ImChatUserGroupMessageService.java | 16 + .../service/ImChatUserMessageService.java | 16 + .../service/impl/ImChatGroupServiceImpl.java | 20 + .../impl/ImChatGroupUserServiceImpl.java | 20 + .../impl/ImChatUserFriendServiceImpl.java | 20 + .../ImChatUserGroupMessageServiceImpl.java | 20 + .../impl/ImChatUserMessageServiceImpl.java | 20 + .../ld/poetry/im/http/vo/GroupMessageVO.java | 41 ++ .../com/ld/poetry/im/http/vo/GroupUserVO.java | 35 + .../com/ld/poetry/im/http/vo/GroupVO.java | 65 ++ .../ld/poetry/im/http/vo/UserFriendVO.java | 45 ++ .../ld/poetry/im/http/vo/UserMessageVO.java | 27 + .../ld/poetry/im/websocket/ImConfigConst.java | 92 +++ .../com/ld/poetry/im/websocket/ImEnum.java | 26 + .../poetry/im/websocket/ImIpStatListener.java | 49 ++ .../com/ld/poetry/im/websocket/ImMessage.java | 21 + .../im/websocket/ImServerAioListener.java | 88 +++ .../poetry/im/websocket/ImWsMsgHandler.java | 181 +++++ .../ld/poetry/im/websocket/MessageCache.java | 89 +++ .../com/ld/poetry/im/websocket/TioUtil.java | 21 + .../im/websocket/TioWebsocketStarter.java | 66 ++ .../com/ld/poetry/service/ArticleService.java | 38 + .../com/ld/poetry/service/CommentService.java | 28 + .../com/ld/poetry/service/FamilyService.java | 16 + .../ld/poetry/service/HistoryInfoService.java | 16 + .../ld/poetry/service/ResourceService.java | 16 + .../ld/poetry/service/SysConfigService.java | 16 + .../com/ld/poetry/service/UserService.java | 54 ++ .../com/ld/poetry/service/WebInfoService.java | 16 + .../com/ld/poetry/service/WeiYanService.java | 16 + .../service/impl/ArticleServiceImpl.java | 407 +++++++++++ .../service/impl/CommentServiceImpl.java | 201 ++++++ .../service/impl/FamilyServiceImpl.java | 20 + .../service/impl/HistoryInfoServiceImpl.java | 20 + .../service/impl/ResourceServiceImpl.java | 20 + .../service/impl/SysConfigServiceImpl.java | 20 + .../poetry/service/impl/UserServiceImpl.java | 606 ++++++++++++++++ .../service/impl/WebInfoServiceImpl.java | 20 + .../service/impl/WeiYanServiceImpl.java | 20 + .../com/ld/poetry/utils/CodeGenerator.java | 88 +++ .../java/com/ld/poetry/utils/CommonQuery.java | 252 +++++++ .../java/com/ld/poetry/utils/PoetryUtil.java | 157 +++++ .../java/com/ld/poetry/utils/StringUtil.java | 46 ++ .../ld/poetry/utils/cache/PoetryCache.java | 133 ++++ .../ld/poetry/utils/mail/MailSendUtil.java | 160 +++++ .../com/ld/poetry/utils/mail/MailUtil.java | 133 ++++ .../ld/poetry/utils/storage/FileFilter.java | 54 ++ .../utils/storage/FileStorageService.java | 65 ++ .../ld/poetry/utils/storage/LocalUtil.java | 101 +++ .../ld/poetry/utils/storage/QiniuUtil.java | 179 +++++ .../ld/poetry/utils/storage/StoreEnum.java | 32 + .../ld/poetry/utils/storage/StoreService.java | 17 + .../main/java/com/ld/poetry/vo/ArticleVO.java | 67 ++ .../java/com/ld/poetry/vo/BaseRequestVO.java | 41 ++ .../main/java/com/ld/poetry/vo/CommentVO.java | 54 ++ .../main/java/com/ld/poetry/vo/FamilyVO.java | 85 +++ .../main/java/com/ld/poetry/vo/FileVO.java | 22 + .../java/com/ld/poetry/vo/ResourcePathVO.java | 63 ++ .../main/java/com/ld/poetry/vo/UserVO.java | 48 ++ .../main/resources/META-INF/spring.factories | 1 + .../src/main/resources/application.yml | 66 ++ .../src/main/resources/ip2region.xdb | Bin 0 -> 11070130 bytes .../src/main/resources/logback-spring.xml | 119 ++++ .../main/resources/mapper/ArticleMapper.xml | 33 + .../main/resources/mapper/CommentMapper.xml | 25 + .../main/resources/mapper/FamilyMapper.xml | 29 + .../resources/mapper/HistoryInfoMapper.xml | 21 + .../src/main/resources/mapper/LabelMapper.xml | 18 + .../main/resources/mapper/ResourceMapper.xml | 24 + .../resources/mapper/ResourcePathMapper.xml | 24 + .../src/main/resources/mapper/SortMapper.xml | 19 + .../main/resources/mapper/SysConfigMapper.xml | 19 + .../main/resources/mapper/TreeHoleMapper.xml | 25 + .../src/main/resources/mapper/UserMapper.xml | 31 + .../main/resources/mapper/WebInfoMapper.xml | 26 + .../main/resources/mapper/WeiYanMapper.xml | 22 + .../resources/mapper/im/ImChatGroupMapper.xml | 23 + .../mapper/im/ImChatGroupUserMapper.xml | 22 + .../mapper/im/ImChatUserFriendMapper.xml | 20 + .../im/ImChatUserGroupMessageMapper.xml | 20 + .../mapper/im/ImChatUserMessageMapper.xml | 20 + poetize-server/pom.xml | 129 ++++ poetize-server/sql/poetry.sql | 341 +++++++++ 180 files changed, 12466 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/MyBlog.iml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 poetize-server/.gitignore create mode 100644 poetize-server/LICENSE create mode 100644 poetize-server/poetry-web/pom.xml create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/PoetryApplication.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/LoginCheck.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/LoginCheckAspect.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/ResourceCheck.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/ResourceCheckAspect.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/SaveCheck.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/SaveCheckAspect.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/config/CorsConfig.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/config/CustomEnvironmentPostProcessor.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/config/DataAutoFill.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/config/MybatisPlusConfig.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryApplicationRunner.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryFilter.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryResult.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/config/WebInfoConfigurer.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/config/WebInfoHandlerInterceptor.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/constants/CommonConst.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminArticleController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminCommentController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminUserController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/ArticleController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/CollectController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/CommentController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/FamilyController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/FriendController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/MusicController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/PictureController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/QiniuController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/ResourceAggregationController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/ResourceController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/SortLabelController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/SysConfigController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/TreeHoleController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/UserController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/WebInfoController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/WeiYanController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/ArticleMapper.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/CommentMapper.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/FamilyMapper.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/HistoryInfoMapper.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/LabelMapper.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/ResourceMapper.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/ResourcePathMapper.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/SortMapper.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/SysConfigMapper.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/TreeHoleMapper.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/UserMapper.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/WebInfoMapper.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/WeiYanMapper.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/entity/Article.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/entity/Comment.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/entity/Family.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/entity/HistoryInfo.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/entity/Label.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/entity/Resource.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/entity/ResourcePath.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/entity/Sort.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/entity/SysConfig.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/entity/TreeHole.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/entity/User.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/entity/WebInfo.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/entity/WeiYan.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/enums/CodeMsg.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/enums/CommentTypeEnum.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/enums/PoetryEnum.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/handle/PoetryExceptionHandler.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/handle/PoetryLoginException.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/handle/PoetryRuntimeException.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/handle/ScheduleTask.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/controller/ImChatGroupController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/controller/ImChatGroupUserController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/controller/ImChatUserFriendController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/controller/ImChatUserGroupMessageController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/controller/ImChatUserMessageController.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/dao/ImChatGroupMapper.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/dao/ImChatGroupUserMapper.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/dao/ImChatUserFriendMapper.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/dao/ImChatUserGroupMessageMapper.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/dao/ImChatUserMessageMapper.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/entity/ImChatGroup.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/entity/ImChatGroupUser.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/entity/ImChatUserFriend.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/entity/ImChatUserGroupMessage.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/entity/ImChatUserMessage.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/service/ImChatGroupService.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/service/ImChatGroupUserService.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/service/ImChatUserFriendService.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/service/ImChatUserGroupMessageService.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/service/ImChatUserMessageService.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/service/impl/ImChatGroupServiceImpl.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/service/impl/ImChatGroupUserServiceImpl.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/service/impl/ImChatUserFriendServiceImpl.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/service/impl/ImChatUserGroupMessageServiceImpl.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/service/impl/ImChatUserMessageServiceImpl.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/vo/GroupMessageVO.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/vo/GroupUserVO.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/vo/GroupVO.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/vo/UserFriendVO.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/http/vo/UserMessageVO.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/websocket/ImConfigConst.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/websocket/ImEnum.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/websocket/ImIpStatListener.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/websocket/ImMessage.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/websocket/ImServerAioListener.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/websocket/ImWsMsgHandler.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/websocket/MessageCache.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/websocket/TioUtil.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/im/websocket/TioWebsocketStarter.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/service/ArticleService.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/service/CommentService.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/service/FamilyService.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/service/HistoryInfoService.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/service/ResourceService.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/service/SysConfigService.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/service/UserService.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/service/WebInfoService.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/service/WeiYanService.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/service/impl/ArticleServiceImpl.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/service/impl/CommentServiceImpl.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/service/impl/FamilyServiceImpl.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/service/impl/HistoryInfoServiceImpl.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/service/impl/ResourceServiceImpl.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/service/impl/SysConfigServiceImpl.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/service/impl/UserServiceImpl.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/service/impl/WebInfoServiceImpl.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/service/impl/WeiYanServiceImpl.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/utils/CodeGenerator.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/utils/CommonQuery.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/utils/PoetryUtil.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/utils/StringUtil.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/utils/cache/PoetryCache.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/utils/mail/MailSendUtil.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/utils/mail/MailUtil.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/utils/storage/FileFilter.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/utils/storage/FileStorageService.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/utils/storage/LocalUtil.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/utils/storage/QiniuUtil.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/utils/storage/StoreEnum.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/utils/storage/StoreService.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/vo/ArticleVO.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/vo/BaseRequestVO.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/vo/CommentVO.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/vo/FamilyVO.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/vo/FileVO.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/vo/ResourcePathVO.java create mode 100644 poetize-server/poetry-web/src/main/java/com/ld/poetry/vo/UserVO.java create mode 100644 poetize-server/poetry-web/src/main/resources/META-INF/spring.factories create mode 100644 poetize-server/poetry-web/src/main/resources/application.yml create mode 100644 poetize-server/poetry-web/src/main/resources/ip2region.xdb create mode 100644 poetize-server/poetry-web/src/main/resources/logback-spring.xml create mode 100644 poetize-server/poetry-web/src/main/resources/mapper/ArticleMapper.xml create mode 100644 poetize-server/poetry-web/src/main/resources/mapper/CommentMapper.xml create mode 100644 poetize-server/poetry-web/src/main/resources/mapper/FamilyMapper.xml create mode 100644 poetize-server/poetry-web/src/main/resources/mapper/HistoryInfoMapper.xml create mode 100644 poetize-server/poetry-web/src/main/resources/mapper/LabelMapper.xml create mode 100644 poetize-server/poetry-web/src/main/resources/mapper/ResourceMapper.xml create mode 100644 poetize-server/poetry-web/src/main/resources/mapper/ResourcePathMapper.xml create mode 100644 poetize-server/poetry-web/src/main/resources/mapper/SortMapper.xml create mode 100644 poetize-server/poetry-web/src/main/resources/mapper/SysConfigMapper.xml create mode 100644 poetize-server/poetry-web/src/main/resources/mapper/TreeHoleMapper.xml create mode 100644 poetize-server/poetry-web/src/main/resources/mapper/UserMapper.xml create mode 100644 poetize-server/poetry-web/src/main/resources/mapper/WebInfoMapper.xml create mode 100644 poetize-server/poetry-web/src/main/resources/mapper/WeiYanMapper.xml create mode 100644 poetize-server/poetry-web/src/main/resources/mapper/im/ImChatGroupMapper.xml create mode 100644 poetize-server/poetry-web/src/main/resources/mapper/im/ImChatGroupUserMapper.xml create mode 100644 poetize-server/poetry-web/src/main/resources/mapper/im/ImChatUserFriendMapper.xml create mode 100644 poetize-server/poetry-web/src/main/resources/mapper/im/ImChatUserGroupMessageMapper.xml create mode 100644 poetize-server/poetry-web/src/main/resources/mapper/im/ImChatUserMessageMapper.xml create mode 100644 poetize-server/pom.xml create mode 100644 poetize-server/sql/poetry.sql diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/MyBlog.iml b/.idea/MyBlog.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/MyBlog.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..03d9549 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.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..639900d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..c2b387a --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/poetize-server/.gitignore b/poetize-server/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/poetize-server/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/poetize-server/LICENSE b/poetize-server/LICENSE new file mode 100644 index 0000000..dbbe355 --- /dev/null +++ b/poetize-server/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/poetize-server/poetry-web/pom.xml b/poetize-server/poetry-web/pom.xml new file mode 100644 index 0000000..0a3fe65 --- /dev/null +++ b/poetize-server/poetry-web/pom.xml @@ -0,0 +1,125 @@ + + + 4.0.0 + + + poetry + com.ld + 2.0 + + + jar + poetry-web + poetry-web + 最美博客 IM + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-mail + + + + org.springframework.boot + spring-boot-starter-aop + + + + org.springframework.boot + spring-boot-starter-cache + + + + mysql + mysql-connector-java + 8.0.20 + + + com.alibaba + druid-spring-boot-starter + 1.2.6 + + + com.baomidou + mybatis-plus-boot-starter + + + com.baomidou + mybatis-plus-generator + 3.4.1 + + + org.apache.velocity + velocity-engine-core + 2.3 + + + + org.projectlombok + lombok + + + + com.alibaba + fastjson + 2.0.20 + + + + javax.validation + validation-api + 2.0.1.Final + + + + org.t-io + tio-websocket-server + 3.7.5.v20211028-RELEASE + + + + cn.hutool + hutool-crypto + + + + cn.hutool + hutool-extra + + + + com.qiniu + qiniu-java-sdk + 7.8.0 + + + + org.lionsoul + ip2region + + + + + poetize-server + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/PoetryApplication.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/PoetryApplication.java new file mode 100644 index 0000000..a4789f4 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/PoetryApplication.java @@ -0,0 +1,17 @@ +package com.ld.poetry; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; + +@SpringBootApplication +@EnableScheduling +@EnableAsync +public class PoetryApplication { + + public static void main(String[] args) { + SpringApplication.run(PoetryApplication.class, args); + } + +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/LoginCheck.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/LoginCheck.java new file mode 100644 index 0000000..2b5e637 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/LoginCheck.java @@ -0,0 +1,12 @@ +package com.ld.poetry.aop; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface LoginCheck { + int value() default 2; +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/LoginCheckAspect.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/LoginCheckAspect.java new file mode 100644 index 0000000..7cd94dc --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/LoginCheckAspect.java @@ -0,0 +1,89 @@ +package com.ld.poetry.aop; + +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.constants.CommonConst; +import com.ld.poetry.entity.User; +import com.ld.poetry.enums.CodeMsg; +import com.ld.poetry.enums.PoetryEnum; +import com.ld.poetry.handle.PoetryLoginException; +import com.ld.poetry.handle.PoetryRuntimeException; +import com.ld.poetry.utils.*; +import com.ld.poetry.utils.cache.PoetryCache; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + + +@Aspect +@Component +@Order(0) +@Slf4j +public class LoginCheckAspect { + + @Around("@annotation(loginCheck)") + public Object around(ProceedingJoinPoint joinPoint, LoginCheck loginCheck) throws Throwable { + String token = PoetryUtil.getToken(); + if (!StringUtils.hasText(token)) { + throw new PoetryLoginException(CodeMsg.NOT_LOGIN.getMsg()); + } + + User user = (User) PoetryCache.get(token); + + if (user == null) { + throw new PoetryLoginException(CodeMsg.LOGIN_EXPIRED.getMsg()); + } + + if (token.contains(CommonConst.USER_ACCESS_TOKEN)) { + if (loginCheck.value() == PoetryEnum.USER_TYPE_ADMIN.getCode() || loginCheck.value() == PoetryEnum.USER_TYPE_DEV.getCode()) { + return PoetryResult.fail("请输入管理员账号!"); + } + } else if (token.contains(CommonConst.ADMIN_ACCESS_TOKEN)) { + log.info("请求IP:" + PoetryUtil.getIpAddr(PoetryUtil.getRequest())); + if (loginCheck.value() == PoetryEnum.USER_TYPE_ADMIN.getCode() && user.getId().intValue() != CommonConst.ADMIN_USER_ID) { + return PoetryResult.fail("请输入管理员账号!"); + } + } else { + throw new PoetryLoginException(CodeMsg.NOT_LOGIN.getMsg()); + } + + if (loginCheck.value() < user.getUserType()) { + throw new PoetryRuntimeException("权限不足!"); + } + + //重置过期时间 + String userId = user.getId().toString(); + boolean flag1 = false; + if (token.contains(CommonConst.USER_ACCESS_TOKEN)) { + flag1 = PoetryCache.get(CommonConst.USER_TOKEN_INTERVAL + userId) == null; + } else if (token.contains(CommonConst.ADMIN_ACCESS_TOKEN)) { + flag1 = PoetryCache.get(CommonConst.ADMIN_TOKEN_INTERVAL + userId) == null; + } + + if (flag1) { + synchronized (userId.intern()) { + boolean flag2 = false; + if (token.contains(CommonConst.USER_ACCESS_TOKEN)) { + flag2 = PoetryCache.get(CommonConst.USER_TOKEN_INTERVAL + userId) == null; + } else if (token.contains(CommonConst.ADMIN_ACCESS_TOKEN)) { + flag2 = PoetryCache.get(CommonConst.ADMIN_TOKEN_INTERVAL + userId) == null; + } + + if (flag2) { + PoetryCache.put(token, user, CommonConst.TOKEN_EXPIRE); + if (token.contains(CommonConst.USER_ACCESS_TOKEN)) { + PoetryCache.put(CommonConst.USER_TOKEN + userId, token, CommonConst.TOKEN_EXPIRE); + PoetryCache.put(CommonConst.USER_TOKEN_INTERVAL + userId, token, CommonConst.TOKEN_INTERVAL); + } else if (token.contains(CommonConst.ADMIN_ACCESS_TOKEN)) { + PoetryCache.put(CommonConst.ADMIN_TOKEN + userId, token, CommonConst.TOKEN_EXPIRE); + PoetryCache.put(CommonConst.ADMIN_TOKEN_INTERVAL + userId, token, CommonConst.TOKEN_INTERVAL); + } + } + } + } + return joinPoint.proceed(); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/ResourceCheck.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/ResourceCheck.java new file mode 100644 index 0000000..7359a8a --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/ResourceCheck.java @@ -0,0 +1,12 @@ +package com.ld.poetry.aop; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface ResourceCheck { + String value(); +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/ResourceCheckAspect.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/ResourceCheckAspect.java new file mode 100644 index 0000000..23b8ddc --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/ResourceCheckAspect.java @@ -0,0 +1,32 @@ +package com.ld.poetry.aop; + +import com.ld.poetry.utils.*; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import java.util.List; + + +@Aspect +@Component +@Order(2) +@Slf4j +public class ResourceCheckAspect { + + @Autowired + private CommonQuery commonQuery; + + @Value("${resource.article.doc:}") + private List articleDoc; + + @Around("@annotation(resourceCheck)") + public Object around(ProceedingJoinPoint joinPoint, ResourceCheck resourceCheck) throws Throwable { + return joinPoint.proceed(); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/SaveCheck.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/SaveCheck.java new file mode 100644 index 0000000..276f3d4 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/SaveCheck.java @@ -0,0 +1,11 @@ +package com.ld.poetry.aop; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface SaveCheck { +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/SaveCheckAspect.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/SaveCheckAspect.java new file mode 100644 index 0000000..e562901 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/aop/SaveCheckAspect.java @@ -0,0 +1,68 @@ +package com.ld.poetry.aop; + +import com.ld.poetry.entity.User; +import com.ld.poetry.handle.PoetryRuntimeException; +import com.ld.poetry.constants.CommonConst; +import com.ld.poetry.utils.cache.PoetryCache; +import com.ld.poetry.utils.PoetryUtil; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.util.concurrent.atomic.AtomicInteger; + + +@Aspect +@Component +@Order(1) +@Slf4j +public class SaveCheckAspect { + + @Around("@annotation(saveCheck)") + public Object around(ProceedingJoinPoint joinPoint, SaveCheck saveCheck) throws Throwable { + boolean flag = false; + + String token = PoetryUtil.getToken(); + if (StringUtils.hasText(token)) { + User user = (User) PoetryCache.get(token); + if (user != null) { + if (user.getId().intValue() == PoetryUtil.getAdminUser().getId().intValue()) { + return joinPoint.proceed(); + } + + AtomicInteger atomicInteger = (AtomicInteger) PoetryCache.get(CommonConst.SAVE_COUNT_USER_ID + user.getId().toString()); + if (atomicInteger == null) { + atomicInteger = new AtomicInteger(); + PoetryCache.put(CommonConst.SAVE_COUNT_USER_ID + user.getId().toString(), atomicInteger, CommonConst.SAVE_EXPIRE); + } + int userIdCount = atomicInteger.getAndIncrement(); + if (userIdCount >= CommonConst.SAVE_MAX_COUNT) { + log.info("用户保存超限:" + user.getId().toString() + ",次数:" + userIdCount); + flag = true; + } + } + } + + String ip = PoetryUtil.getIpAddr(PoetryUtil.getRequest()); + AtomicInteger atomic = (AtomicInteger) PoetryCache.get(CommonConst.SAVE_COUNT_IP + ip); + if (atomic == null) { + atomic = new AtomicInteger(); + PoetryCache.put(CommonConst.SAVE_COUNT_IP + ip, atomic, CommonConst.SAVE_EXPIRE); + } + int ipCount = atomic.getAndIncrement(); + if (ipCount > CommonConst.SAVE_MAX_COUNT) { + log.info("IP保存超限:" + ip + ",次数:" + ipCount); + flag = true; + } + + if (flag) { + throw new PoetryRuntimeException("今日提交次数已用尽,请一天后再来!"); + } + + return joinPoint.proceed(); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/CorsConfig.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/CorsConfig.java new file mode 100644 index 0000000..8423d36 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/CorsConfig.java @@ -0,0 +1,31 @@ +package com.ld.poetry.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 java.util.ArrayList; +import java.util.List; + + +@Configuration +public class CorsConfig { + + @Bean + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration config = new CorsConfiguration(); + // 是否允许请求带有验证信息 + config.setAllowCredentials(true); + List allowedOriginPatterns = new ArrayList<>(); + allowedOriginPatterns.add("*"); + config.setAllowedOriginPatterns(allowedOriginPatterns); + + config.addAllowedHeader("*"); + config.addAllowedMethod("*"); + source.registerCorsConfiguration("/**", config); + return new CorsFilter(source); + } +} \ No newline at end of file diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/CustomEnvironmentPostProcessor.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/CustomEnvironmentPostProcessor.java new file mode 100644 index 0000000..cca5511 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/CustomEnvironmentPostProcessor.java @@ -0,0 +1,76 @@ +package com.ld.poetry.config; + +import com.ld.poetry.handle.PoetryRuntimeException; +import lombok.SneakyThrows; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.env.EnvironmentPostProcessor; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; +import org.springframework.core.env.MutablePropertySources; +import org.springframework.core.env.PropertySource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; + +import java.sql.*; +import java.util.HashMap; +import java.util.Map; + +@Order(Ordered.LOWEST_PRECEDENCE) +public class CustomEnvironmentPostProcessor implements EnvironmentPostProcessor { + + private static final String SOURCE_NAME = "sys_config"; + + private static final String SOURCE_SQL = "select * from poetize.sys_config"; + + private static final String DATABASE = "poetize"; + + private static final String sqlPath = "file:/home/poetry.sql"; + + @Override + public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { + try { + Map map = new HashMap<>(); + + String username = environment.getProperty("spring.datasource.username"); + String password = environment.getProperty("spring.datasource.password"); + String url = environment.getProperty("spring.datasource.url").replace("/poetize", ""); + String driver = environment.getProperty("spring.datasource.driver-class-name"); + Class.forName(driver); + try (Connection connection = DriverManager.getConnection(url, username, password)) { + //初始化数据库 + initDb(connection); + //加载配置文件 + try (Statement statement = connection.createStatement()) { + try (ResultSet resultSet = statement.executeQuery(SOURCE_SQL)) { + while (resultSet.next()) { + map.put(resultSet.getString("config_key"), resultSet.getString("config_value")); + } + } + } + } + + MutablePropertySources propertySources = environment.getPropertySources(); + PropertySource source = new MapPropertySource(SOURCE_NAME, map); + propertySources.addFirst(source); + } catch (Exception e) { + throw new PoetryRuntimeException(e); + } + } + + @SneakyThrows + private void initDb(Connection connection) { + try (Statement statement = connection.createStatement()) { + try (ResultSet resultSet = statement.executeQuery("SHOW DATABASES LIKE '" + DATABASE + "'")) { + if (!resultSet.next()) { + ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); + ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + populator.addScripts(resolver.getResources(sqlPath)); + populator.populate(connection); + } + } + } + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/DataAutoFill.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/DataAutoFill.java new file mode 100644 index 0000000..f0bf632 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/DataAutoFill.java @@ -0,0 +1,21 @@ +package com.ld.poetry.config; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.ld.poetry.utils.PoetryUtil; +import org.apache.ibatis.reflection.MetaObject; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +@Component +public class DataAutoFill implements MetaObjectHandler { + + @Override + public void insertFill(MetaObject metaObject) { + this.strictInsertFill(metaObject, "createBy", String.class, !StringUtils.hasText(PoetryUtil.getUsername()) ? "Sara" : PoetryUtil.getUsername()); + } + + @Override + public void updateFill(MetaObject metaObject) { + this.strictInsertFill(metaObject, "updateBy", String.class, !StringUtils.hasText(PoetryUtil.getUsername()) ? "Sara" : PoetryUtil.getUsername()); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/MybatisPlusConfig.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/MybatisPlusConfig.java new file mode 100644 index 0000000..8a6a69f --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/MybatisPlusConfig.java @@ -0,0 +1,20 @@ +package com.ld.poetry.config; + +import com.baomidou.mybatisplus.annotation.DbType; +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.ld.poetry.dao", "com.ld.poetry.im.http.dao"}) +public class MybatisPlusConfig { + + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } +} \ No newline at end of file diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryApplicationRunner.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryApplicationRunner.java new file mode 100644 index 0000000..2a9973d --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryApplicationRunner.java @@ -0,0 +1,82 @@ +package com.ld.poetry.config; + +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.ld.poetry.dao.HistoryInfoMapper; +import com.ld.poetry.dao.WebInfoMapper; +import com.ld.poetry.entity.*; +import com.ld.poetry.im.websocket.TioUtil; +import com.ld.poetry.im.websocket.TioWebsocketStarter; +import com.ld.poetry.service.FamilyService; +import com.ld.poetry.service.UserService; +import com.ld.poetry.constants.CommonConst; +import com.ld.poetry.utils.cache.PoetryCache; +import com.ld.poetry.enums.PoetryEnum; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArraySet; +import java.util.stream.Collectors; + +@Component +public class PoetryApplicationRunner implements ApplicationRunner { + + @Value("${store.type}") + private String defaultType; + + @Autowired + private WebInfoMapper webInfoMapper; + + @Autowired + private UserService userService; + + @Autowired + private FamilyService familyService; + + @Autowired + private HistoryInfoMapper historyInfoMapper; + + @Override + public void run(ApplicationArguments args) throws Exception { + LambdaQueryChainWrapper wrapper = new LambdaQueryChainWrapper<>(webInfoMapper); + List list = wrapper.list(); + if (!CollectionUtils.isEmpty(list)) { + list.get(0).setDefaultStoreType(defaultType); + PoetryCache.put(CommonConst.WEB_INFO, list.get(0)); + } + + User admin = userService.lambdaQuery().eq(User::getUserType, PoetryEnum.USER_TYPE_ADMIN.getCode()).one(); + PoetryCache.put(CommonConst.ADMIN, admin); + + Family family = familyService.lambdaQuery().eq(Family::getUserId, admin.getId()).one(); + PoetryCache.put(CommonConst.ADMIN_FAMILY, family); + + List infoList = new LambdaQueryChainWrapper<>(historyInfoMapper) + .select(HistoryInfo::getIp, HistoryInfo::getUserId) + .ge(HistoryInfo::getCreateTime, LocalDateTime.now().with(LocalTime.MIN)) + .list(); + + PoetryCache.put(CommonConst.IP_HISTORY, new CopyOnWriteArraySet<>(infoList.stream().map(info -> info.getIp() + (info.getUserId() != null ? "_" + info.getUserId().toString() : "")).collect(Collectors.toList()))); + + Map history = new HashMap<>(); + history.put(CommonConst.IP_HISTORY_PROVINCE, historyInfoMapper.getHistoryByProvince()); + history.put(CommonConst.IP_HISTORY_IP, historyInfoMapper.getHistoryByIp()); + history.put(CommonConst.IP_HISTORY_HOUR, historyInfoMapper.getHistoryBy24Hour()); + history.put(CommonConst.IP_HISTORY_COUNT, historyInfoMapper.getHistoryCount()); + PoetryCache.put(CommonConst.IP_HISTORY_STATISTICS, history); + + TioUtil.buildTio(); + TioWebsocketStarter websocketStarter = TioUtil.getTio(); + if (websocketStarter != null) { + websocketStarter.start(); + } + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryFilter.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryFilter.java new file mode 100644 index 0000000..4106a55 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryFilter.java @@ -0,0 +1,45 @@ +package com.ld.poetry.config; + +import com.alibaba.fastjson.JSON; +import com.ld.poetry.enums.CodeMsg; +import com.ld.poetry.utils.CommonQuery; +import com.ld.poetry.utils.PoetryUtil; +import com.ld.poetry.utils.storage.FileFilter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +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; + +@Component +public class PoetryFilter extends OncePerRequestFilter { + + @Autowired + private CommonQuery commonQuery; + + @Autowired + private FileFilter fileFilter; + + @Override + protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { + if (!"OPTIONS".equals(httpServletRequest.getMethod())) { + try { + commonQuery.saveHistory(PoetryUtil.getIpAddr(httpServletRequest)); + } catch (Exception e) { + } + + if (fileFilter.doFilterFile(httpServletRequest, httpServletResponse)) { + httpServletResponse.setHeader("Access-Control-Allow-Origin", "*"); + httpServletResponse.setContentType("application/json;charset=UTF-8"); + httpServletResponse.getWriter().write(JSON.toJSONString(PoetryResult.fail(CodeMsg.PARAMETER_ERROR.getCode(), CodeMsg.PARAMETER_ERROR.getMsg()))); + return; + } + } + + filterChain.doFilter(httpServletRequest, httpServletResponse); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryResult.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryResult.java new file mode 100644 index 0000000..5f4bb8a --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/PoetryResult.java @@ -0,0 +1,56 @@ +package com.ld.poetry.config; + +import com.ld.poetry.enums.CodeMsg; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class PoetryResult implements Serializable { + + private static final long serialVersionUI = 1L; + + private int code; + private String message; + private T data; + private long currentTimeMillis = System.currentTimeMillis(); + + public PoetryResult() { + this.code = 200; + } + + public PoetryResult(int code, String message) { + this.code = code; + this.message = message; + } + + public PoetryResult(T data) { + this.code = 200; + this.data = data; + } + + public PoetryResult(String message) { + this.code = 500; + this.message = message; + } + + public static PoetryResult fail(String message) { + return new PoetryResult(message); + } + + public static PoetryResult fail(CodeMsg codeMsg) { + return new PoetryResult(codeMsg.getCode(), codeMsg.getMsg()); + } + + public static PoetryResult fail(Integer code, String message) { + return new PoetryResult(code, message); + } + + public static PoetryResult success(T data) { + return new PoetryResult(data); + } + + public static PoetryResult success() { + return new PoetryResult(); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/WebInfoConfigurer.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/WebInfoConfigurer.java new file mode 100644 index 0000000..b206960 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/WebInfoConfigurer.java @@ -0,0 +1,15 @@ +package com.ld.poetry.config; + +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Component +public class WebInfoConfigurer implements WebMvcConfigurer { + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new WebInfoHandlerInterceptor()) + .addPathPatterns("/**") + .excludePathPatterns("/user/login", "/admin/**", "/webInfo/getWebInfo", "/webInfo/updateWebInfo"); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/WebInfoHandlerInterceptor.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/WebInfoHandlerInterceptor.java new file mode 100644 index 0000000..d3e5ad4 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/config/WebInfoHandlerInterceptor.java @@ -0,0 +1,26 @@ +package com.ld.poetry.config; + +import com.alibaba.fastjson.JSON; +import com.ld.poetry.entity.WebInfo; +import com.ld.poetry.enums.CodeMsg; +import com.ld.poetry.constants.CommonConst; +import com.ld.poetry.utils.cache.PoetryCache; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class WebInfoHandlerInterceptor implements HandlerInterceptor { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + WebInfo webInfo = (WebInfo) PoetryCache.get(CommonConst.WEB_INFO); + if (webInfo == null || !webInfo.getStatus()) { + response.setContentType("application/json;charset=UTF-8"); + response.getWriter().write(JSON.toJSONString(PoetryResult.fail(CodeMsg.SYSTEM_REPAIR.getCode(), CodeMsg.SYSTEM_REPAIR.getMsg()))); + return false; + } else { + return true; + } + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/constants/CommonConst.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/constants/CommonConst.java new file mode 100644 index 0000000..c41ec31 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/constants/CommonConst.java @@ -0,0 +1,251 @@ +package com.ld.poetry.constants; + + +public class CommonConst { + + /** + * 超级管理员的用户Id + */ + public static final int ADMIN_USER_ID = 1; + + /** + * 根据用户ID获取Token + */ + public static final String USER_TOKEN = "user_token_"; + + public static final String ADMIN_TOKEN = "admin_token_"; + + /** + * 根据用户ID获取Token + */ + public static final String USER_TOKEN_INTERVAL = "user_token_interval_"; + + public static final String ADMIN_TOKEN_INTERVAL = "admin_token_interval_"; + + /** + * Token + */ + public static final String USER_ACCESS_TOKEN = "user_access_token_"; + + public static final String ADMIN_ACCESS_TOKEN = "admin_access_token_"; + + public static final String TOKEN_HEADER = "Authorization"; + + /** + * 保存次数 + */ + public static final String SAVE_COUNT_IP = "save_count_ip_"; + public static final String SAVE_COUNT_USER_ID = "save_count_user_id_"; + public static final long SAVE_EXPIRE = 86400; + public static final int SAVE_MAX_COUNT = 15; + + /** + * IP历史记录缓存 + */ + public static final String IP_HISTORY = "ip_history"; + public static final String IP_HISTORY_STATISTICS = "ip_history_statistics"; + public static final String IP_HISTORY_PROVINCE = "ip_history_province"; + public static final String IP_HISTORY_IP = "ip_history_ip"; + public static final String IP_HISTORY_HOUR = "ip_history_hour"; + public static final String IP_HISTORY_COUNT = "ip_history_count"; + + /** + * Token过期时间:10天 + */ + public static final long TOKEN_EXPIRE = 864000; + + /** + * Code过期时间:1天 + */ + public static final long CODE_EXPIRE = 86400; + + /** + * Token重设过期时间间隔:1小时 + */ + public static final long TOKEN_INTERVAL = 3600; + + /** + * Boss信息 + */ + public static final String ADMIN = "admin"; + + /** + * BossFamily信息 + */ + public static final String ADMIN_FAMILY = "adminFamily"; + + /** + * FamilyList信息 + */ + public static final String FAMILY_LIST = "familyList"; + + /** + * 评论和IM邮件 + */ + public static final String COMMENT_IM_MAIL = "comment_im_mail_"; + + /** + * 验证码邮件 + */ + public static final String CODE_MAIL = "code_mail_"; + + /** + * 评论和IM邮件发送次数 + */ + public static final int COMMENT_IM_MAIL_COUNT = 1; + + /** + * 验证码邮件发送次数 + */ + public static final int CODE_MAIL_COUNT = 3; + + /** + * 验证码 + */ + public static final String USER_CODE = "user_code_"; + + /** + * 忘记密码时获取验证码用于找回密码 + */ + public static final String FORGET_PASSWORD = "forget_password_"; + + /** + * 网站信息 + */ + public static final String WEB_INFO = "webInfo"; + + /** + * 分类信息 + */ + public static final String SORT_INFO = "sortInfo"; + + /** + * 赞赏 + */ + public static final String ADMIRE = "admire"; + + /** + * 密钥 + */ + public static final String CRYPOTJS_KEY = "sarasarasarasara"; + + /** + * 根据用户ID获取用户信息 + */ + public static final String USER_CACHE = "user_"; + + /** + * 根据文章ID获取评论数量 + */ + public static final String COMMENT_COUNT_CACHE = "comment_count_"; + + /** + * 根据用户ID获取该用户所有文章ID + */ + public static final String USER_ARTICLE_LIST = "user_article_list_"; + + /** + * 文章缓存,用于搜索 + */ + public static final String ARTICLE_LIST = "article_list"; + + /** + * 文章缓存,用于首页 + */ + public static final String SORT_ARTICLE_LIST = "sort_article_list"; + + /** + * 默认缓存过期时间 + */ + public static final long EXPIRE = 1800; + + /** + * 树洞一次最多查询条数 + */ + public static final int TREE_HOLE_COUNT = 100; + + /** + * 顶层评论ID + */ + public static final int FIRST_COMMENT = 0; + + /** + * 文章摘要默认字数 + */ + public static final int SUMMARY = 80; + + /** + * 留言的源 + */ + public static final int TREE_HOLE_COMMENT_SOURCE = 0; + + /** + * 资源类型 + */ + public static final String PATH_TYPE_GRAFFITI = "graffiti"; + + public static final String PATH_TYPE_ARTICLE_PICTURE = "articlePicture"; + + public static final String PATH_TYPE_USER_AVATAR = "userAvatar"; + + public static final String PATH_TYPE_ARTICLE_COVER = "articleCover"; + + public static final String PATH_TYPE_WEB_BACKGROUND_IMAGE = "webBackgroundImage"; + + public static final String PATH_TYPE_WEB_AVATAR = "webAvatar"; + + public static final String PATH_TYPE_RANDOM_AVATAR = "randomAvatar"; + + public static final String PATH_TYPE_RANDOM_COVER = "randomCover"; + + public static final String PATH_TYPE_COMMENT_PICTURE = "commentPicture"; + + public static final String PATH_TYPE_INTERNET_MEME = "internetMeme"; + + public static final String PATH_TYPE_IM_GROUP_AVATAR = "im/groupAvatar"; + + public static final String PATH_TYPE_IM_GROUP_MESSAGE = "im/groupMessage"; + + public static final String PATH_TYPE_IM_FRIEND_MESSAGE = "im/friendMessage"; + + public static final String PATH_TYPE_FUNNY_URL = "funnyUrl"; + + public static final String PATH_TYPE_FUNNY_COVER = "funnyCover"; + + public static final String PATH_TYPE_FAVORITES_COVER = "favoritesCover"; + + public static final String PATH_TYPE_LOVE_COVER = "love/bgCover"; + + public static final String PATH_TYPE_LOVE_MAN = "love/manCover"; + + public static final String PATH_TYPE_LOVE_WOMAN = "love/womanCover"; + + public static final String PATH_TYPE_VIDEO_ARTICLE = "video/article"; + + public static final String PATH_TYPE_ASSETS = "assets"; + + /** + * 资源聚合 + */ + public static final String RESOURCE_PATH_TYPE_FRIEND = "friendUrl"; + public static final String RESOURCE_PATH_TYPE_FUNNY = "funny"; + public static final String RESOURCE_PATH_TYPE_FAVORITES = "favorites"; + public static final String RESOURCE_PATH_TYPE_LOVE_PHOTO = "lovePhoto"; + + /** + * 微言 + */ + public static final String WEIYAN_TYPE_FRIEND = "friend"; + + public static final String WEIYAN_TYPE_NEWS = "news"; + + /** + * 友情链接 + */ + public static final String DEFAULT_FRIEND = "\uD83E\uDD47友情链接"; + + /** + * 资源校验 + */ + public static final String RESOURCE_ARTICLE_DOC = "resource_article_doc"; +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminArticleController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminArticleController.java new file mode 100644 index 0000000..bea776d --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminArticleController.java @@ -0,0 +1,81 @@ +package com.ld.poetry.controller; + +import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ld.poetry.aop.LoginCheck; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.entity.*; +import com.ld.poetry.service.ArticleService; +import com.ld.poetry.utils.PoetryUtil; +import com.ld.poetry.vo.ArticleVO; +import com.ld.poetry.vo.BaseRequestVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 后台文章 前端控制器 + *

+ * + * @author sara + * @since 2021-08-13 + */ +@RestController +@RequestMapping("/admin") +public class AdminArticleController { + + @Autowired + private ArticleService articleService; + + /** + * 用户查询文章 + */ + @PostMapping("/article/user/list") + @LoginCheck(1) + public PoetryResult listUserArticle(@RequestBody BaseRequestVO baseRequestVO) { + return articleService.listAdminArticle(baseRequestVO, false); + } + + /** + * Boss查询文章 + */ + @PostMapping("/article/boss/list") + @LoginCheck(0) + public PoetryResult listBossArticle(@RequestBody BaseRequestVO baseRequestVO) { + return articleService.listAdminArticle(baseRequestVO, true); + } + + /** + * 修改文章状态 + */ + @GetMapping("/article/changeArticleStatus") + @LoginCheck(1) + public PoetryResult changeArticleStatus(@RequestParam("articleId") Integer articleId, + @RequestParam(value = "viewStatus", required = false) Boolean viewStatus, + @RequestParam(value = "commentStatus", required = false) Boolean commentStatus, + @RequestParam(value = "recommendStatus", required = false) Boolean recommendStatus) { + LambdaUpdateChainWrapper
updateChainWrapper = articleService.lambdaUpdate() + .eq(Article::getId, articleId) + .eq(Article::getUserId, PoetryUtil.getUserId()); + if (viewStatus != null) { + updateChainWrapper.set(Article::getViewStatus, viewStatus); + } + if (commentStatus != null) { + updateChainWrapper.set(Article::getCommentStatus, commentStatus); + } + if (recommendStatus != null) { + updateChainWrapper.set(Article::getRecommendStatus, recommendStatus); + } + updateChainWrapper.update(); + return PoetryResult.success(); + } + + /** + * 查询文章 + */ + @GetMapping("/article/getArticleById") + @LoginCheck(1) + public PoetryResult getArticleByIdForUser(@RequestParam("id") Integer id) { + return articleService.getArticleByIdForUser(id); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminCommentController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminCommentController.java new file mode 100644 index 0000000..54344f9 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminCommentController.java @@ -0,0 +1,82 @@ +package com.ld.poetry.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ld.poetry.aop.LoginCheck; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.entity.Article; +import com.ld.poetry.entity.Comment; +import com.ld.poetry.enums.CommentTypeEnum; +import com.ld.poetry.service.ArticleService; +import com.ld.poetry.service.CommentService; +import com.ld.poetry.utils.PoetryUtil; +import com.ld.poetry.vo.BaseRequestVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + *

+ * 后台评论 前端控制器 + *

+ * + * @author sara + * @since 2021-08-13 + */ +@RestController +@RequestMapping("/admin") +public class AdminCommentController { + + @Autowired + private ArticleService articleService; + + @Autowired + private CommentService commentService; + + /** + * 作者删除评论 + */ + @GetMapping("/comment/user/deleteComment") + @LoginCheck(1) + public PoetryResult userDeleteComment(@RequestParam("id") Integer id) { + Comment comment = commentService.lambdaQuery().select(Comment::getSource, Comment::getType).eq(Comment::getId, id).one(); + if (comment == null) { + return PoetryResult.success(); + } + if (!CommentTypeEnum.COMMENT_TYPE_ARTICLE.getCode().equals(comment.getType())) { + return PoetryResult.fail("权限不足!"); + } + Article one = articleService.lambdaQuery().eq(Article::getId, comment.getSource()).select(Article::getUserId).one(); + if (one == null || (PoetryUtil.getUserId().intValue() != one.getUserId().intValue())) { + return PoetryResult.fail("权限不足!"); + } + commentService.removeById(id); + return PoetryResult.success(); + } + + /** + * Boss删除评论 + */ + @GetMapping("/comment/boss/deleteComment") + @LoginCheck(0) + public PoetryResult bossDeleteComment(@RequestParam("id") Integer id) { + commentService.removeById(id); + return PoetryResult.success(); + } + + /** + * 用户查询评论 + */ + @PostMapping("/comment/user/list") + @LoginCheck(1) + public PoetryResult listUserComment(@RequestBody BaseRequestVO baseRequestVO) { + return commentService.listAdminComment(baseRequestVO, false); + } + + /** + * Boss查询评论 + */ + @PostMapping("/comment/boss/list") + @LoginCheck(0) + public PoetryResult listBossComment(@RequestBody BaseRequestVO baseRequestVO) { + return commentService.listAdminComment(baseRequestVO, true); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminController.java new file mode 100644 index 0000000..b4a7bf5 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminController.java @@ -0,0 +1,60 @@ +package com.ld.poetry.controller; + +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ld.poetry.aop.LoginCheck; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.dao.TreeHoleMapper; +import com.ld.poetry.dao.WebInfoMapper; +import com.ld.poetry.entity.*; +import com.ld.poetry.vo.BaseRequestVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + *

+ * 后台 前端控制器 + *

+ * + * @author sara + * @since 2021-08-13 + */ +@RestController +@RequestMapping("/admin") +public class AdminController { + + @Autowired + private WebInfoMapper webInfoMapper; + + @Autowired + private TreeHoleMapper treeHoleMapper; + + /** + * 获取网站信息 + */ + @GetMapping("/webInfo/getAdminWebInfo") + @LoginCheck(0) + public PoetryResult getWebInfo() { + LambdaQueryChainWrapper wrapper = new LambdaQueryChainWrapper<>(webInfoMapper); + List list = wrapper.list(); + if (!CollectionUtils.isEmpty(list)) { + return PoetryResult.success(list.get(0)); + } else { + return PoetryResult.success(); + } + } + + /** + * Boss查询树洞 + */ + @PostMapping("/treeHole/boss/list") + @LoginCheck(0) + public PoetryResult listBossTreeHole(@RequestBody BaseRequestVO baseRequestVO) { + LambdaQueryChainWrapper wrapper = new LambdaQueryChainWrapper<>(treeHoleMapper); + wrapper.orderByDesc(TreeHole::getCreateTime).page(baseRequestVO); + return PoetryResult.success(baseRequestVO); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminUserController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminUserController.java new file mode 100644 index 0000000..39951b0 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/AdminUserController.java @@ -0,0 +1,119 @@ +package com.ld.poetry.controller; + +import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ld.poetry.aop.LoginCheck; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.constants.CommonConst; +import com.ld.poetry.entity.*; +import com.ld.poetry.enums.CodeMsg; +import com.ld.poetry.enums.PoetryEnum; +import com.ld.poetry.im.websocket.TioUtil; +import com.ld.poetry.im.websocket.TioWebsocketStarter; +import com.ld.poetry.service.UserService; +import com.ld.poetry.utils.PoetryUtil; +import com.ld.poetry.utils.cache.PoetryCache; +import com.ld.poetry.vo.BaseRequestVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.tio.core.Tio; + +/** + *

+ * 后台用户 前端控制器 + *

+ * + * @author sara + * @since 2021-08-13 + */ +@RestController +@RequestMapping("/admin") +public class AdminUserController { + + @Autowired + private UserService userService; + + /** + * 查询用户 + */ + @PostMapping("/user/list") + @LoginCheck(0) + public PoetryResult listUser(@RequestBody BaseRequestVO baseRequestVO) { + return userService.listUser(baseRequestVO); + } + + /** + * 修改用户状态 + *

+ * flag = true:解禁 + * flag = false:封禁 + */ + @GetMapping("/user/changeUserStatus") + @LoginCheck(0) + public PoetryResult changeUserStatus(@RequestParam("userId") Integer userId, @RequestParam("flag") Boolean flag) { + if (userId.intValue() == PoetryUtil.getAdminUser().getId().intValue()) { + return PoetryResult.fail("站长状态不能修改!"); + } + + LambdaUpdateChainWrapper updateChainWrapper = userService.lambdaUpdate().eq(User::getId, userId); + if (flag) { + updateChainWrapper.eq(User::getUserStatus, PoetryEnum.STATUS_DISABLE.getCode()).set(User::getUserStatus, PoetryEnum.STATUS_ENABLE.getCode()).update(); + } else { + updateChainWrapper.eq(User::getUserStatus, PoetryEnum.STATUS_ENABLE.getCode()).set(User::getUserStatus, PoetryEnum.STATUS_DISABLE.getCode()).update(); + } + logout(userId); + return PoetryResult.success(); + } + + /** + * 修改用户赞赏 + */ + @GetMapping("/user/changeUserAdmire") + @LoginCheck(0) + public PoetryResult changeUserAdmire(@RequestParam("userId") Integer userId, @RequestParam("admire") String admire) { + userService.lambdaUpdate() + .eq(User::getId, userId) + .set(User::getAdmire, admire) + .update(); + PoetryCache.remove(CommonConst.ADMIRE); + return PoetryResult.success(); + } + + /** + * 修改用户类型 + */ + @GetMapping("/user/changeUserType") + @LoginCheck(0) + public PoetryResult changeUserType(@RequestParam("userId") Integer userId, @RequestParam("userType") Integer userType) { + if (userId.intValue() == PoetryUtil.getAdminUser().getId().intValue()) { + return PoetryResult.fail("站长类型不能修改!"); + } + + if (userType != 0 && userType != 1 && userType != 2) { + return PoetryResult.fail(CodeMsg.PARAMETER_ERROR); + } + userService.lambdaUpdate().eq(User::getId, userId).set(User::getUserType, userType).update(); + + logout(userId); + return PoetryResult.success(); + } + + private void logout(Integer userId) { + if (PoetryCache.get(CommonConst.ADMIN_TOKEN + userId) != null) { + String token = (String) PoetryCache.get(CommonConst.ADMIN_TOKEN + userId); + PoetryCache.remove(CommonConst.ADMIN_TOKEN + userId); + PoetryCache.remove(token); + } + + if (PoetryCache.get(CommonConst.USER_TOKEN + userId) != null) { + String token = (String) PoetryCache.get(CommonConst.USER_TOKEN + userId); + PoetryCache.remove(CommonConst.USER_TOKEN + userId); + PoetryCache.remove(token); + } + TioWebsocketStarter tioWebsocketStarter = TioUtil.getTio(); + if (tioWebsocketStarter != null) { + Tio.removeUser(tioWebsocketStarter.getServerTioConfig(), String.valueOf(userId), "remove user"); + } + + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/ArticleController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/ArticleController.java new file mode 100644 index 0000000..53b3de3 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/ArticleController.java @@ -0,0 +1,99 @@ +package com.ld.poetry.controller; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ld.poetry.aop.LoginCheck; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.service.ArticleService; +import com.ld.poetry.constants.CommonConst; +import com.ld.poetry.utils.cache.PoetryCache; +import com.ld.poetry.utils.PoetryUtil; +import com.ld.poetry.vo.ArticleVO; +import com.ld.poetry.vo.BaseRequestVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + + +/** + *

+ * 文章表 前端控制器 + *

+ * + * @author sara + * @since 2021-08-13 + */ +@RestController +@RequestMapping("/article") +public class ArticleController { + + @Autowired + private ArticleService articleService; + + + /** + * 保存文章 + */ + @LoginCheck(1) + @PostMapping("/saveArticle") + public PoetryResult saveArticle(@Validated @RequestBody ArticleVO articleVO) { + PoetryCache.remove(CommonConst.USER_ARTICLE_LIST + PoetryUtil.getUserId().toString()); + PoetryCache.remove(CommonConst.ARTICLE_LIST); + PoetryCache.remove(CommonConst.SORT_ARTICLE_LIST); + return articleService.saveArticle(articleVO); + } + + + /** + * 删除文章 + */ + @GetMapping("/deleteArticle") + @LoginCheck(1) + public PoetryResult deleteArticle(@RequestParam("id") Integer id) { + PoetryCache.remove(CommonConst.USER_ARTICLE_LIST + PoetryUtil.getUserId().toString()); + PoetryCache.remove(CommonConst.ARTICLE_LIST); + PoetryCache.remove(CommonConst.SORT_ARTICLE_LIST); + return articleService.deleteArticle(id); + } + + + /** + * 更新文章 + */ + @PostMapping("/updateArticle") + @LoginCheck(1) + public PoetryResult updateArticle(@Validated @RequestBody ArticleVO articleVO) { + PoetryCache.remove(CommonConst.ARTICLE_LIST); + PoetryCache.remove(CommonConst.SORT_ARTICLE_LIST); + return articleService.updateArticle(articleVO); + } + + + /** + * 查询文章List + */ + @PostMapping("/listArticle") + public PoetryResult listArticle(@RequestBody BaseRequestVO baseRequestVO) { + return articleService.listArticle(baseRequestVO); + } + + /** + * 查询分类文章List + */ + @GetMapping("/listSortArticle") + public PoetryResult>> listSortArticle() { + return articleService.listSortArticle(); + } + + /** + * 查询文章 + */ + @GetMapping("/getArticleById") + public PoetryResult getArticleById(@RequestParam("id") Integer id, @RequestParam(value = "password", required = false) String password) { + return articleService.getArticleById(id, password); + } +} + diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/CollectController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/CollectController.java new file mode 100644 index 0000000..29da522 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/CollectController.java @@ -0,0 +1,54 @@ +package com.ld.poetry.controller; + +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.constants.CommonConst; +import com.ld.poetry.dao.ResourcePathMapper; +import com.ld.poetry.entity.ResourcePath; +import com.ld.poetry.vo.ResourcePathVO; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + *

+ * 资源聚合里的收藏夹,其他接口在ResourceAggregationController + *

+ * + * @author sara + * @since 2021-09-14 + */ +@RestController +@RequestMapping("/webInfo") +public class CollectController { + + @Autowired + private ResourcePathMapper resourcePathMapper; + + /** + * 查询收藏 + */ + @GetMapping("/listCollect") + public PoetryResult>> listCollect() { + LambdaQueryChainWrapper wrapper = new LambdaQueryChainWrapper<>(resourcePathMapper); + List resourcePaths = wrapper.eq(ResourcePath::getType, CommonConst.RESOURCE_PATH_TYPE_FAVORITES) + .eq(ResourcePath::getStatus, Boolean.TRUE) + .orderByAsc(ResourcePath::getTitle) + .list(); + Map> collect = new HashMap<>(); + if (!CollectionUtils.isEmpty(resourcePaths)) { + collect = resourcePaths.stream().map(rp -> { + ResourcePathVO resourcePathVO = new ResourcePathVO(); + BeanUtils.copyProperties(rp, resourcePathVO); + return resourcePathVO; + }).collect(Collectors.groupingBy(ResourcePathVO::getClassify)); + } + return PoetryResult.success(collect); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/CommentController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/CommentController.java new file mode 100644 index 0000000..17ec818 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/CommentController.java @@ -0,0 +1,85 @@ +package com.ld.poetry.controller; + + +import com.ld.poetry.aop.LoginCheck; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.aop.SaveCheck; +import com.ld.poetry.service.CommentService; +import com.ld.poetry.constants.CommonConst; +import com.ld.poetry.utils.CommonQuery; +import com.ld.poetry.utils.cache.PoetryCache; +import com.ld.poetry.utils.StringUtil; +import com.ld.poetry.vo.BaseRequestVO; +import com.ld.poetry.vo.CommentVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + + +/** + *

+ * 文章评论表 前端控制器 + *

+ * + * @author sara + * @since 2021-08-13 + */ +@RestController +@RequestMapping("/comment") +public class CommentController { + + + @Autowired + private CommentService commentService; + + @Autowired + private CommonQuery commonQuery; + + + /** + * 保存评论 + */ + @PostMapping("/saveComment") + @LoginCheck + @SaveCheck + public PoetryResult saveComment(@Validated @RequestBody CommentVO commentVO) { + String content = StringUtil.removeHtml(commentVO.getCommentContent()); + if (!StringUtils.hasText(content)) { + return PoetryResult.fail("评论内容不合法!"); + } + commentVO.setCommentContent(content); + + PoetryCache.remove(CommonConst.COMMENT_COUNT_CACHE + commentVO.getSource().toString() + "_" + commentVO.getType()); + return commentService.saveComment(commentVO); + } + + + /** + * 删除评论 + */ + @GetMapping("/deleteComment") + @LoginCheck + public PoetryResult deleteComment(@RequestParam("id") Integer id) { + return commentService.deleteComment(id); + } + + + /** + * 查询评论数量 + */ + @GetMapping("/getCommentCount") + public PoetryResult getCommentCount(@RequestParam("source") Integer source, @RequestParam("type") String type) { + return PoetryResult.success(commonQuery.getCommentCount(source, type)); + } + + + /** + * 查询评论 + */ + @PostMapping("/listComment") + public PoetryResult listComment(@RequestBody BaseRequestVO baseRequestVO) { + return commentService.listComment(baseRequestVO); + } +} + diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/FamilyController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/FamilyController.java new file mode 100644 index 0000000..b656757 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/FamilyController.java @@ -0,0 +1,149 @@ +package com.ld.poetry.controller; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ld.poetry.aop.LoginCheck; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.entity.Family; +import com.ld.poetry.service.FamilyService; +import com.ld.poetry.constants.CommonConst; +import com.ld.poetry.utils.CommonQuery; +import com.ld.poetry.utils.cache.PoetryCache; +import com.ld.poetry.utils.PoetryUtil; +import com.ld.poetry.vo.BaseRequestVO; +import com.ld.poetry.vo.FamilyVO; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Collections; +import java.util.List; + +/** + *

+ * 家庭信息 前端控制器 + *

+ * + * @author sara + * @since 2023-01-03 + */ +@RestController +@RequestMapping("/family") +public class FamilyController { + + @Autowired + private FamilyService familyService; + + @Autowired + private CommonQuery commonQuery; + + /** + * 保存 + */ + @PostMapping("/saveFamily") + @LoginCheck + public PoetryResult saveFamily(@Validated @RequestBody FamilyVO familyVO) { + Integer userId = PoetryUtil.getUserId(); + familyVO.setUserId(userId); + Family oldFamily = familyService.lambdaQuery().select(Family::getId).eq(Family::getUserId, userId).one(); + Family family = new Family(); + BeanUtils.copyProperties(familyVO, family); + if (userId.intValue() == PoetryUtil.getAdminUser().getId().intValue()) { + family.setStatus(Boolean.TRUE); + } else { + family.setStatus(Boolean.FALSE); + } + + if (oldFamily != null) { + family.setId(oldFamily.getId()); + familyService.updateById(family); + } else { + family.setId(null); + familyService.save(family); + } + if (userId.intValue() == PoetryUtil.getAdminUser().getId().intValue()) { + PoetryCache.put(CommonConst.ADMIN_FAMILY, family); + } + PoetryCache.remove(CommonConst.FAMILY_LIST); + return PoetryResult.success(); + } + + /** + * 删除 + */ + @GetMapping("/deleteFamily") + @LoginCheck(0) + public PoetryResult deleteFamily(@RequestParam("id") Integer id) { + familyService.removeById(id); + PoetryCache.remove(CommonConst.FAMILY_LIST); + return PoetryResult.success(); + } + + /** + * 获取 + */ + @GetMapping("/getFamily") + @LoginCheck + public PoetryResult getFamily() { + Integer userId = PoetryUtil.getUserId(); + Family family = familyService.lambdaQuery().eq(Family::getUserId, userId).one(); + if (family == null) { + return PoetryResult.success(); + } else { + FamilyVO familyVO = new FamilyVO(); + BeanUtils.copyProperties(family, familyVO); + return PoetryResult.success(familyVO); + } + } + + /** + * 获取 + */ + @GetMapping("/getAdminFamily") + public PoetryResult getAdminFamily() { + Family family = (Family) PoetryCache.get(CommonConst.ADMIN_FAMILY); + if (family == null) { + return PoetryResult.fail("请初始化表白墙"); + } + FamilyVO familyVO = new FamilyVO(); + BeanUtils.copyProperties(family, familyVO); + return PoetryResult.success(familyVO); + } + + /** + * 查询随机家庭 + */ + @GetMapping("/listRandomFamily") + public PoetryResult> listRandomFamily(@RequestParam(value = "size", defaultValue = "10") Integer size) { + List familyList = commonQuery.getFamilyList(); + if (familyList.size() > size) { + Collections.shuffle(familyList); + familyList = familyList.subList(0, size); + } + return PoetryResult.success(familyList); + } + + /** + * 查询 + */ + @PostMapping("/listFamily") + @LoginCheck(0) + public PoetryResult listFamily(@RequestBody BaseRequestVO baseRequestVO) { + familyService.lambdaQuery() + .eq(baseRequestVO.getStatus() != null, Family::getStatus, baseRequestVO.getStatus()) + .orderByDesc(Family::getCreateTime).page(baseRequestVO); + return PoetryResult.success(baseRequestVO); + } + + /** + * 修改状态 + */ + @GetMapping("/changeLoveStatus") + @LoginCheck(0) + public PoetryResult changeLoveStatus(@RequestParam("id") Integer id, @RequestParam("flag") Boolean flag) { + familyService.lambdaUpdate().eq(Family::getId, id).set(Family::getStatus, flag).update(); + PoetryCache.remove(CommonConst.FAMILY_LIST); + return PoetryResult.success(); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/FriendController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/FriendController.java new file mode 100644 index 0000000..19f1b7c --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/FriendController.java @@ -0,0 +1,82 @@ +package com.ld.poetry.controller; + +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.ld.poetry.aop.LoginCheck; +import com.ld.poetry.aop.SaveCheck; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.constants.CommonConst; +import com.ld.poetry.dao.ResourcePathMapper; +import com.ld.poetry.entity.ResourcePath; +import com.ld.poetry.utils.PoetryUtil; +import com.ld.poetry.vo.ResourcePathVO; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + *

+ * 资源聚合里的友链,其他接口在ResourceAggregationController + *

+ * + * @author sara + * @since 2021-09-14 + */ +@RestController +@RequestMapping("/webInfo") +public class FriendController { + + @Autowired + private ResourcePathMapper resourcePathMapper; + + /** + * 保存友链 + */ + @LoginCheck + @PostMapping("/saveFriend") + @SaveCheck + public PoetryResult saveFriend(@RequestBody ResourcePathVO resourcePathVO) { + if (!StringUtils.hasText(resourcePathVO.getTitle()) || !StringUtils.hasText(resourcePathVO.getCover()) || + !StringUtils.hasText(resourcePathVO.getUrl()) || !StringUtils.hasText(resourcePathVO.getIntroduction())) { + return PoetryResult.fail("信息不全!"); + } + ResourcePath friend = new ResourcePath(); + friend.setClassify(CommonConst.DEFAULT_FRIEND); + friend.setTitle(resourcePathVO.getTitle()); + friend.setIntroduction(resourcePathVO.getIntroduction()); + friend.setCover(resourcePathVO.getCover()); + friend.setUrl(resourcePathVO.getUrl()); + friend.setRemark(PoetryUtil.getUserId().toString()); + friend.setType(CommonConst.RESOURCE_PATH_TYPE_FRIEND); + friend.setStatus(Boolean.FALSE); + resourcePathMapper.insert(friend); + return PoetryResult.success(); + } + + /** + * 查询友链 + */ + @GetMapping("/listFriend") + public PoetryResult>> listFriend() { + LambdaQueryChainWrapper wrapper = new LambdaQueryChainWrapper<>(resourcePathMapper); + List resourcePaths = wrapper.eq(ResourcePath::getType, CommonConst.RESOURCE_PATH_TYPE_FRIEND) + .eq(ResourcePath::getStatus, Boolean.TRUE) + .orderByAsc(ResourcePath::getCreateTime) + .list(); + Map> collect = new HashMap<>(); + if (!CollectionUtils.isEmpty(resourcePaths)) { + collect = resourcePaths.stream().map(rp -> { + ResourcePathVO resourcePathVO = new ResourcePathVO(); + BeanUtils.copyProperties(rp, resourcePathVO); + return resourcePathVO; + }).collect(Collectors.groupingBy(ResourcePathVO::getClassify)); + } + return PoetryResult.success(collect); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/MusicController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/MusicController.java new file mode 100644 index 0000000..538dd95 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/MusicController.java @@ -0,0 +1,68 @@ +package com.ld.poetry.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ld.poetry.aop.LoginCheck; +import com.ld.poetry.aop.SaveCheck; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.constants.CommonConst; +import com.ld.poetry.dao.ResourcePathMapper; +import com.ld.poetry.entity.ResourcePath; +import com.ld.poetry.vo.ResourcePathVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 资源聚合里的音乐,其他接口在ResourceAggregationController + *

+ * + * @author sara + * @since 2021-09-14 + */ +@RestController +@RequestMapping("/webInfo") +public class MusicController { + + @Autowired + private ResourcePathMapper resourcePathMapper; + + /** + * 查询音乐 + */ + @GetMapping("/listFunny") + public PoetryResult>> listFunny() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("classify, count(*) as count") + .eq("status", Boolean.TRUE) + .eq("type", CommonConst.RESOURCE_PATH_TYPE_FUNNY) + .groupBy("classify"); + List> maps = resourcePathMapper.selectMaps(queryWrapper); + return PoetryResult.success(maps); + } + + /** + * 保存音乐 + */ + @LoginCheck + @SaveCheck + @PostMapping("/saveFunny") + public PoetryResult saveFunny(@RequestBody ResourcePathVO resourcePathVO) { + if (!StringUtils.hasText(resourcePathVO.getClassify()) || !StringUtils.hasText(resourcePathVO.getCover()) || + !StringUtils.hasText(resourcePathVO.getUrl()) || !StringUtils.hasText(resourcePathVO.getTitle())) { + return PoetryResult.fail("信息不全!"); + } + ResourcePath funny = new ResourcePath(); + funny.setClassify(resourcePathVO.getClassify()); + funny.setTitle(resourcePathVO.getTitle()); + funny.setCover(resourcePathVO.getCover()); + funny.setUrl(resourcePathVO.getUrl()); + funny.setType(CommonConst.RESOURCE_PATH_TYPE_FUNNY); + funny.setStatus(Boolean.FALSE); + resourcePathMapper.insert(funny); + return PoetryResult.success(); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/PictureController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/PictureController.java new file mode 100644 index 0000000..62cc24e --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/PictureController.java @@ -0,0 +1,73 @@ +package com.ld.poetry.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ld.poetry.aop.LoginCheck; +import com.ld.poetry.aop.SaveCheck; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.constants.CommonConst; +import com.ld.poetry.dao.ResourcePathMapper; +import com.ld.poetry.entity.ResourcePath; +import com.ld.poetry.utils.PoetryUtil; +import com.ld.poetry.vo.ResourcePathVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + *

+ * 资源聚合里的图片,其他接口在ResourceAggregationController + *

+ * + * @author sara + * @since 2021-09-14 + */ +@RestController +@RequestMapping("/webInfo") +public class PictureController { + + @Autowired + private ResourcePathMapper resourcePathMapper; + + /** + * 查询爱情 + */ + @GetMapping("/listAdminLovePhoto") + public PoetryResult>> listAdminLovePhoto() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("classify, count(*) as count") + .eq("status", Boolean.TRUE) + .eq("remark", PoetryUtil.getAdminUser().getId().toString()) + .eq("type", CommonConst.RESOURCE_PATH_TYPE_LOVE_PHOTO) + .groupBy("classify"); + List> maps = resourcePathMapper.selectMaps(queryWrapper); + + return PoetryResult.success(maps); + } + + /** + * 保存爱情 + */ + @LoginCheck + @SaveCheck + @PostMapping("/saveLovePhoto") + public PoetryResult saveLovePhoto(@RequestBody ResourcePathVO resourcePathVO) { + if (!StringUtils.hasText(resourcePathVO.getClassify()) || !StringUtils.hasText(resourcePathVO.getCover()) || + !StringUtils.hasText(resourcePathVO.getTitle())) { + return PoetryResult.fail("信息不全!"); + } + ResourcePath lovePhoto = new ResourcePath(); + lovePhoto.setClassify(resourcePathVO.getClassify()); + lovePhoto.setTitle(resourcePathVO.getTitle()); + lovePhoto.setCover(resourcePathVO.getCover()); + lovePhoto.setRemark(PoetryUtil.getUserId().toString()); + lovePhoto.setType(CommonConst.RESOURCE_PATH_TYPE_LOVE_PHOTO); + lovePhoto.setStatus(Boolean.FALSE); + resourcePathMapper.insert(lovePhoto); + return PoetryResult.success(); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/QiniuController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/QiniuController.java new file mode 100644 index 0000000..fb69409 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/QiniuController.java @@ -0,0 +1,34 @@ +package com.ld.poetry.controller; + +import com.ld.poetry.aop.LoginCheck; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.aop.SaveCheck; +import com.ld.poetry.utils.storage.QiniuUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +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; + +/** + * 七牛云 + */ +@RestController +@RequestMapping("/qiniu") +@ConditionalOnBean(QiniuUtil.class) +public class QiniuController { + + @Autowired + private QiniuUtil qiniuUtil; + + /** + * 获取覆盖凭证,用于七牛云 + */ + @GetMapping("/getUpToken") + @LoginCheck + @SaveCheck + public PoetryResult getUpToken(@RequestParam(value = "key") String key) { + return PoetryResult.success(qiniuUtil.getToken(key)); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/ResourceAggregationController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/ResourceAggregationController.java new file mode 100644 index 0000000..17db3ca --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/ResourceAggregationController.java @@ -0,0 +1,126 @@ +package com.ld.poetry.controller; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ld.poetry.aop.LoginCheck; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.constants.CommonConst; +import com.ld.poetry.dao.ResourcePathMapper; +import com.ld.poetry.entity.ResourcePath; +import com.ld.poetry.utils.PoetryUtil; +import com.ld.poetry.vo.BaseRequestVO; +import com.ld.poetry.vo.ResourcePathVO; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * 资源聚合 前端控制器 + *

+ * + * @author sara + * @since 2021-09-14 + */ +@RestController +@RequestMapping("/webInfo") +public class ResourceAggregationController { + + @Autowired + private ResourcePathMapper resourcePathMapper; + + /** + * 保存 + */ + @LoginCheck(0) + @PostMapping("/saveResourcePath") + public PoetryResult saveResourcePath(@RequestBody ResourcePathVO resourcePathVO) { + if (!StringUtils.hasText(resourcePathVO.getTitle()) || !StringUtils.hasText(resourcePathVO.getType())) { + return PoetryResult.fail("标题和资源类型不能为空!"); + } + if (CommonConst.RESOURCE_PATH_TYPE_LOVE_PHOTO.equals(resourcePathVO.getType())) { + resourcePathVO.setRemark(PoetryUtil.getAdminUser().getId().toString()); + } + ResourcePath resourcePath = new ResourcePath(); + BeanUtils.copyProperties(resourcePathVO, resourcePath); + resourcePathMapper.insert(resourcePath); + return PoetryResult.success(); + } + + /** + * 删除 + */ + @GetMapping("/deleteResourcePath") + @LoginCheck(0) + public PoetryResult deleteResourcePath(@RequestParam("id") Integer id) { + resourcePathMapper.deleteById(id); + return PoetryResult.success(); + } + + /** + * 更新 + */ + @PostMapping("/updateResourcePath") + @LoginCheck(0) + public PoetryResult updateResourcePath(@RequestBody ResourcePathVO resourcePathVO) { + if (!StringUtils.hasText(resourcePathVO.getTitle()) || !StringUtils.hasText(resourcePathVO.getType())) { + return PoetryResult.fail("标题和资源类型不能为空!"); + } + if (resourcePathVO.getId() == null) { + return PoetryResult.fail("Id不能为空!"); + } + if (CommonConst.RESOURCE_PATH_TYPE_LOVE_PHOTO.equals(resourcePathVO.getType())) { + resourcePathVO.setRemark(PoetryUtil.getAdminUser().getId().toString()); + } + ResourcePath resourcePath = new ResourcePath(); + BeanUtils.copyProperties(resourcePathVO, resourcePath); + resourcePathMapper.updateById(resourcePath); + return PoetryResult.success(); + } + + + /** + * 查询资源 + */ + @PostMapping("/listResourcePath") + public PoetryResult listResourcePath(@RequestBody BaseRequestVO baseRequestVO) { + LambdaQueryChainWrapper wrapper = new LambdaQueryChainWrapper<>(resourcePathMapper); + wrapper.eq(StringUtils.hasText(baseRequestVO.getResourceType()), ResourcePath::getType, baseRequestVO.getResourceType()); + wrapper.eq(StringUtils.hasText(baseRequestVO.getClassify()), ResourcePath::getClassify, baseRequestVO.getClassify()); + + Integer userId = PoetryUtil.getUserId(); + if (!PoetryUtil.getAdminUser().getId().equals(userId)) { + wrapper.eq(ResourcePath::getStatus, Boolean.TRUE); + } else { + wrapper.eq(baseRequestVO.getStatus() != null, ResourcePath::getStatus, baseRequestVO.getStatus()); + } + + OrderItem orderItem = new OrderItem(); + orderItem.setColumn(StringUtils.hasText(baseRequestVO.getOrder()) ? StrUtil.toUnderlineCase(baseRequestVO.getOrder()) : "create_time"); + orderItem.setAsc(!baseRequestVO.isDesc()); + List orderItemList = new ArrayList<>(); + orderItemList.add(orderItem); + baseRequestVO.setOrders(orderItemList); + + wrapper.page(baseRequestVO); + + List resourcePaths = baseRequestVO.getRecords(); + if (!CollectionUtils.isEmpty(resourcePaths)) { + List resourcePathVOs = resourcePaths.stream().map(rp -> { + ResourcePathVO resourcePathVO = new ResourcePathVO(); + BeanUtils.copyProperties(rp, resourcePathVO); + return resourcePathVO; + }).collect(Collectors.toList()); + baseRequestVO.setRecords(resourcePathVOs); + } + return PoetryResult.success(baseRequestVO); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/ResourceController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/ResourceController.java new file mode 100644 index 0000000..35b2a71 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/ResourceController.java @@ -0,0 +1,144 @@ +package com.ld.poetry.controller; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ld.poetry.aop.LoginCheck; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.constants.CommonConst; +import com.ld.poetry.entity.Resource; +import com.ld.poetry.enums.PoetryEnum; +import com.ld.poetry.service.ResourceService; +import com.ld.poetry.utils.storage.StoreService; +import com.ld.poetry.utils.*; +import com.ld.poetry.utils.storage.FileStorageService; +import com.ld.poetry.vo.BaseRequestVO; +import com.ld.poetry.vo.FileVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * 资源信息 前端控制器 + *

+ * + * @author sara + * @since 2022-03-06 + */ +@RestController +@RequestMapping("/resource") +public class ResourceController { + + @Autowired + private ResourceService resourceService; + + @Autowired + private FileStorageService fileStorageService; + + /** + * 保存 + */ + @PostMapping("/saveResource") + @LoginCheck + public PoetryResult saveResource(@RequestBody Resource resource) { + if (!StringUtils.hasText(resource.getType()) || !StringUtils.hasText(resource.getPath())) { + return PoetryResult.fail("资源类型和资源路径不能为空!"); + } + Resource re = new Resource(); + re.setPath(resource.getPath()); + re.setType(resource.getType()); + re.setSize(resource.getSize()); + re.setOriginalName(resource.getOriginalName()); + re.setMimeType(resource.getMimeType()); + re.setStoreType(resource.getStoreType()); + re.setUserId(PoetryUtil.getUserId()); + resourceService.save(re); + return PoetryResult.success(); + } + + /** + * 上传文件 + */ + @PostMapping("/upload") + @LoginCheck + public PoetryResult upload(@RequestParam("file") MultipartFile file, FileVO fileVO) { + if (file == null || !StringUtils.hasText(fileVO.getType()) || !StringUtils.hasText(fileVO.getRelativePath())) { + return PoetryResult.fail("文件和资源类型和资源路径不能为空!"); + } + + fileVO.setFile(file); + StoreService storeService = fileStorageService.getFileStorage(fileVO.getStoreType()); + FileVO result = storeService.saveFile(fileVO); + + Resource re = new Resource(); + re.setPath(result.getVisitPath()); + re.setType(fileVO.getType()); + re.setSize(Integer.valueOf(Long.toString(file.getSize()))); + re.setMimeType(file.getContentType()); + re.setStoreType(fileVO.getStoreType()); + re.setOriginalName(fileVO.getOriginalName()); + re.setUserId(PoetryUtil.getUserId()); + resourceService.save(re); + return PoetryResult.success(result.getVisitPath()); + } + + /** + * 删除 + */ + @PostMapping("/deleteResource") + @LoginCheck(0) + public PoetryResult deleteResource(@RequestParam("path") String path) { + Resource resource = resourceService.lambdaQuery().select(Resource::getStoreType).eq(Resource::getPath, path).one(); + if (resource == null) { + return PoetryResult.fail("文件不存在:" + path); + } + + StoreService storeService = fileStorageService.getFileStorageByStoreType(resource.getStoreType()); + storeService.deleteFile(Collections.singletonList(path)); + return PoetryResult.success(); + } + + /** + * 查询表情包 + */ + @GetMapping("/getImageList") + @LoginCheck + public PoetryResult> getImageList() { + List list = resourceService.lambdaQuery().select(Resource::getPath) + .eq(Resource::getType, CommonConst.PATH_TYPE_INTERNET_MEME) + .eq(Resource::getStatus, PoetryEnum.STATUS_ENABLE.getCode()) + .eq(Resource::getUserId, PoetryUtil.getAdminUser().getId()) + .orderByDesc(Resource::getCreateTime) + .list(); + List paths = list.stream().map(Resource::getPath).collect(Collectors.toList()); + return PoetryResult.success(paths); + } + + /** + * 查询资源 + */ + @PostMapping("/listResource") + @LoginCheck(0) + public PoetryResult listResource(@RequestBody BaseRequestVO baseRequestVO) { + resourceService.lambdaQuery() + .eq(StringUtils.hasText(baseRequestVO.getResourceType()), Resource::getType, baseRequestVO.getResourceType()) + .orderByDesc(Resource::getCreateTime).page(baseRequestVO); + return PoetryResult.success(baseRequestVO); + } + + /** + * 修改资源状态 + */ + @GetMapping("/changeResourceStatus") + @LoginCheck(0) + public PoetryResult changeResourceStatus(@RequestParam("id") Integer id, @RequestParam("flag") Boolean flag) { + resourceService.lambdaUpdate().eq(Resource::getId, id).set(Resource::getStatus, flag).update(); + return PoetryResult.success(); + } +} + diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/SortLabelController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/SortLabelController.java new file mode 100644 index 0000000..2c93cba --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/SortLabelController.java @@ -0,0 +1,161 @@ +package com.ld.poetry.controller; + +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.ld.poetry.aop.LoginCheck; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.constants.CommonConst; +import com.ld.poetry.dao.LabelMapper; +import com.ld.poetry.dao.SortMapper; +import com.ld.poetry.entity.Label; +import com.ld.poetry.entity.Sort; +import com.ld.poetry.utils.CommonQuery; +import com.ld.poetry.utils.cache.PoetryCache; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 分类标签 前端控制器 + *

+ * + * @author sara + * @since 2021-09-14 + */ +@RestController +@RequestMapping("/webInfo") +public class SortLabelController { + + @Autowired + private SortMapper sortMapper; + + @Autowired + private LabelMapper labelMapper; + + @Autowired + private CommonQuery commonQuery; + + /** + * 获取分类标签信息 + */ + @GetMapping("/getSortInfo") + public PoetryResult> getSortInfo() { + return PoetryResult.success(commonQuery.getSortInfo()); + } + + /** + * 保存 + */ + @PostMapping("/saveSort") + @LoginCheck(0) + public PoetryResult saveSort(@RequestBody Sort sort) { + if (!StringUtils.hasText(sort.getSortName()) || !StringUtils.hasText(sort.getSortDescription())) { + return PoetryResult.fail("分类名称和分类描述不能为空!"); + } + + if (sort.getPriority() == null) { + return PoetryResult.fail("分类必须配置优先级!"); + } + + sortMapper.insert(sort); + PoetryCache.remove(CommonConst.SORT_INFO); + return PoetryResult.success(); + } + + + /** + * 删除 + */ + @GetMapping("/deleteSort") + @LoginCheck(0) + public PoetryResult deleteSort(@RequestParam("id") Integer id) { + sortMapper.deleteById(id); + PoetryCache.remove(CommonConst.SORT_INFO); + return PoetryResult.success(); + } + + + /** + * 更新 + */ + @PostMapping("/updateSort") + @LoginCheck(0) + public PoetryResult updateSort(@RequestBody Sort sort) { + sortMapper.updateById(sort); + PoetryCache.remove(CommonConst.SORT_INFO); + return PoetryResult.success(); + } + + + /** + * 查询List + */ + @GetMapping("/listSort") + public PoetryResult> listSort() { + return PoetryResult.success(new LambdaQueryChainWrapper<>(sortMapper).list()); + } + + + /** + * 保存 + */ + @PostMapping("/saveLabel") + @LoginCheck(0) + public PoetryResult saveLabel(@RequestBody Label label) { + if (!StringUtils.hasText(label.getLabelName()) || !StringUtils.hasText(label.getLabelDescription()) || label.getSortId() == null) { + return PoetryResult.fail("标签名称和标签描述和分类Id不能为空!"); + } + labelMapper.insert(label); + PoetryCache.remove(CommonConst.SORT_INFO); + return PoetryResult.success(); + } + + + /** + * 删除 + */ + @GetMapping("/deleteLabel") + @LoginCheck(0) + public PoetryResult deleteLabel(@RequestParam("id") Integer id) { + labelMapper.deleteById(id); + PoetryCache.remove(CommonConst.SORT_INFO); + return PoetryResult.success(); + } + + + /** + * 更新 + */ + @PostMapping("/updateLabel") + @LoginCheck(0) + public PoetryResult updateLabel(@RequestBody Label label) { + labelMapper.updateById(label); + PoetryCache.remove(CommonConst.SORT_INFO); + return PoetryResult.success(); + } + + + /** + * 查询List + */ + @GetMapping("/listLabel") + public PoetryResult> listLabel() { + return PoetryResult.success(new LambdaQueryChainWrapper<>(labelMapper).list()); + } + + + /** + * 查询List + */ + @GetMapping("/listSortAndLabel") + public PoetryResult listSortAndLabel() { + Map map = new HashMap<>(); + map.put("sorts", new LambdaQueryChainWrapper<>(sortMapper).list()); + map.put("labels", new LambdaQueryChainWrapper<>(labelMapper).list()); + return PoetryResult.success(map); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/SysConfigController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/SysConfigController.java new file mode 100644 index 0000000..f87c6bf --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/SysConfigController.java @@ -0,0 +1,83 @@ +package com.ld.poetry.controller; + + +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.ld.poetry.aop.LoginCheck; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.entity.SysConfig; +import com.ld.poetry.enums.PoetryEnum; +import com.ld.poetry.service.SysConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + *

+ * 参数配置表 前端控制器 + *

+ * + * @author sara + * @since 2024-03-23 + */ +@RestController +@RequestMapping("/sysConfig") +public class SysConfigController { + + @Autowired + private SysConfigService sysConfigService; + + /** + * 查询系统参数 + */ + @GetMapping("/listSysConfig") + public PoetryResult> listSysConfig() { + LambdaQueryChainWrapper wrapper = new LambdaQueryChainWrapper<>(sysConfigService.getBaseMapper()); + List sysConfigs = wrapper.eq(SysConfig::getConfigType, Integer.toString(PoetryEnum.SYS_CONFIG_PUBLIC.getCode())) + .list(); + Map collect = sysConfigs.stream().collect(Collectors.toMap(SysConfig::getConfigKey, SysConfig::getConfigValue)); + return PoetryResult.success(collect); + } + + /** + * 保存或更新 + */ + @PostMapping("/saveOrUpdateConfig") + @LoginCheck(0) + public PoetryResult saveConfig(@RequestBody SysConfig sysConfig) { + if (!StringUtils.hasText(sysConfig.getConfigName()) || + !StringUtils.hasText(sysConfig.getConfigKey()) || + !StringUtils.hasText(sysConfig.getConfigType())) { + return PoetryResult.fail("请完善所有配置信息!"); + } + String configType = sysConfig.getConfigType(); + if (!Integer.toString(PoetryEnum.SYS_CONFIG_PUBLIC.getCode()).equals(configType) && + !Integer.toString(PoetryEnum.SYS_CONFIG_PRIVATE.getCode()).equals(configType)) { + return PoetryResult.fail("配置类型不正确!"); + } + sysConfigService.saveOrUpdate(sysConfig); + return PoetryResult.success(); + } + + /** + * 删除 + */ + @GetMapping("/deleteConfig") + @LoginCheck(0) + public PoetryResult deleteConfig(@RequestParam("id") Integer id) { + sysConfigService.removeById(id); + return PoetryResult.success(); + } + + /** + * 查询 + */ + @GetMapping("/listConfig") + @LoginCheck(0) + public PoetryResult> listConfig() { + return PoetryResult.success(new LambdaQueryChainWrapper<>(sysConfigService.getBaseMapper()).list()); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/TreeHoleController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/TreeHoleController.java new file mode 100644 index 0000000..e6aa038 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/TreeHoleController.java @@ -0,0 +1,82 @@ +package com.ld.poetry.controller; + +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.ld.poetry.aop.LoginCheck; +import com.ld.poetry.aop.SaveCheck; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.constants.CommonConst; +import com.ld.poetry.dao.TreeHoleMapper; +import com.ld.poetry.entity.TreeHole; +import com.ld.poetry.utils.PoetryUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Random; + +/** + *

+ * 弹幕 前端控制器 + *

+ * + * @author sara + * @since 2021-09-14 + */ +@RestController +@RequestMapping("/webInfo") +public class TreeHoleController { + + @Autowired + private TreeHoleMapper treeHoleMapper; + + /** + * 保存 + */ + @PostMapping("/saveTreeHole") + @SaveCheck + public PoetryResult saveTreeHole(@RequestBody TreeHole treeHole) { + if (!StringUtils.hasText(treeHole.getMessage())) { + return PoetryResult.fail("留言不能为空!"); + } + treeHoleMapper.insert(treeHole); + if (!StringUtils.hasText(treeHole.getAvatar())) { + treeHole.setAvatar(PoetryUtil.getRandomAvatar(null)); + } + return PoetryResult.success(treeHole); + } + + + /** + * 删除 + */ + @GetMapping("/deleteTreeHole") + @LoginCheck(0) + public PoetryResult deleteTreeHole(@RequestParam("id") Integer id) { + treeHoleMapper.deleteById(id); + return PoetryResult.success(); + } + + + /** + * 查询List + */ + @GetMapping("/listTreeHole") + public PoetryResult> listTreeHole() { + List treeHoles; + Integer count = new LambdaQueryChainWrapper<>(treeHoleMapper).count(); + if (count > CommonConst.TREE_HOLE_COUNT) { + int i = new Random().nextInt(count + 1 - CommonConst.TREE_HOLE_COUNT); + treeHoles = treeHoleMapper.queryAllByLimit(i, CommonConst.TREE_HOLE_COUNT); + } else { + treeHoles = new LambdaQueryChainWrapper<>(treeHoleMapper).list(); + } + + treeHoles.forEach(treeHole -> { + if (!StringUtils.hasText(treeHole.getAvatar())) { + treeHole.setAvatar(PoetryUtil.getRandomAvatar(treeHole.getId().toString())); + } + }); + return PoetryResult.success(treeHoles); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/UserController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/UserController.java new file mode 100644 index 0000000..0e0d9f3 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/UserController.java @@ -0,0 +1,168 @@ +package com.ld.poetry.controller; + + +import com.ld.poetry.aop.LoginCheck; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.aop.SaveCheck; +import com.ld.poetry.service.UserService; +import com.ld.poetry.constants.CommonConst; +import com.ld.poetry.utils.cache.PoetryCache; +import com.ld.poetry.utils.PoetryUtil; +import com.ld.poetry.vo.UserVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + *

+ * 用户信息表 前端控制器 + *

+ * + * @author sara + * @since 2021-08-12 + */ +@RestController +@RequestMapping("/user") +public class UserController { + + @Autowired + private UserService userService; + + + /** + * 用户名/密码注册 + */ + @PostMapping("/regist") + public PoetryResult regist(@Validated @RequestBody UserVO user) { + return userService.regist(user); + } + + + /** + * 用户名、邮箱、手机号/密码登录 + */ + @PostMapping("/login") + public PoetryResult login(@RequestParam("account") String account, + @RequestParam("password") String password, + @RequestParam(value = "isAdmin", defaultValue = "false") Boolean isAdmin) { + return userService.login(account, password, isAdmin); + } + + + /** + * Token登录 + */ + @PostMapping("/token") + public PoetryResult login(@RequestParam("userToken") String userToken) { + return userService.token(userToken); + } + + + /** + * 退出 + */ + @GetMapping("/logout") + @LoginCheck + public PoetryResult exit() { + return userService.exit(); + } + + + /** + * 更新用户信息 + */ + @PostMapping("/updateUserInfo") + @LoginCheck + public PoetryResult updateUserInfo(@RequestBody UserVO user) { + PoetryCache.remove(CommonConst.USER_CACHE + PoetryUtil.getUserId().toString()); + return userService.updateUserInfo(user); + } + + /** + * 获取验证码 + *

+ * 1 手机号 + * 2 邮箱 + */ + @GetMapping("/getCode") + @LoginCheck + @SaveCheck + public PoetryResult getCode(@RequestParam("flag") Integer flag) { + return userService.getCode(flag); + } + + /** + * 绑定手机号或者邮箱 + *

+ * 1 手机号 + * 2 邮箱 + */ + @GetMapping("/getCodeForBind") + @LoginCheck + @SaveCheck + public PoetryResult getCodeForBind(@RequestParam("place") String place, @RequestParam("flag") Integer flag) { + return userService.getCodeForBind(place, flag); + } + + /** + * 更新邮箱、手机号、密码 + *

+ * 1 手机号 + * 2 邮箱 + * 3 密码:place=老密码&password=新密码 + */ + @PostMapping("/updateSecretInfo") + @LoginCheck + public PoetryResult updateSecretInfo(@RequestParam("place") String place, @RequestParam("flag") Integer flag, @RequestParam(value = "code", required = false) String code, @RequestParam("password") String password) { + PoetryCache.remove(CommonConst.USER_CACHE + PoetryUtil.getUserId().toString()); + return userService.updateSecretInfo(place, flag, code, password); + } + + /** + * 忘记密码 获取验证码 + *

+ * 1 手机号 + * 2 邮箱 + */ + @GetMapping("/getCodeForForgetPassword") + @SaveCheck + public PoetryResult getCodeForForgetPassword(@RequestParam("place") String place, @RequestParam("flag") Integer flag) { + return userService.getCodeForForgetPassword(place, flag); + } + + /** + * 忘记密码 更新密码 + *

+ * 1 手机号 + * 2 邮箱 + */ + @PostMapping("/updateForForgetPassword") + public PoetryResult updateForForgetPassword(@RequestParam("place") String place, @RequestParam("flag") Integer flag, @RequestParam("code") String code, @RequestParam("password") String password) { + return userService.updateForForgetPassword(place, flag, code, password); + } + + /** + * 根据用户名查找用户信息 + */ + @GetMapping("/getUserByUsername") + @LoginCheck + public PoetryResult> getUserByUsername(@RequestParam("username") String username) { + return userService.getUserByUsername(username); + } + + /** + * 订阅/取消订阅专栏(标签) + *

+ * flag = true:订阅 + * flag = false:取消订阅 + */ + @GetMapping("/subscribe") + @LoginCheck + public PoetryResult subscribe(@RequestParam("labelId") Integer labelId, @RequestParam("flag") Boolean flag) { + PoetryCache.remove(CommonConst.USER_CACHE + PoetryUtil.getUserId().toString()); + return userService.subscribe(labelId, flag); + } +} + diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/WebInfoController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/WebInfoController.java new file mode 100644 index 0000000..198dc5a --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/WebInfoController.java @@ -0,0 +1,173 @@ +package com.ld.poetry.controller; + + +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.ld.poetry.aop.LoginCheck; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.constants.CommonConst; +import com.ld.poetry.dao.*; +import com.ld.poetry.entity.*; +import com.ld.poetry.service.WebInfoService; +import com.ld.poetry.utils.*; +import com.ld.poetry.utils.cache.PoetryCache; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + *

+ * 网站信息表 前端控制器 + *

+ * + * @author sara + * @since 2021-09-14 + */ +@RestController +@RequestMapping("/webInfo") +public class WebInfoController { + + @Value("${store.type}") + private String defaultType; + + @Autowired + private WebInfoService webInfoService; + + @Autowired + private HistoryInfoMapper historyInfoMapper; + + @Autowired + private CommonQuery commonQuery; + + + /** + * 更新网站信息 + */ + @LoginCheck(0) + @PostMapping("/updateWebInfo") + public PoetryResult updateWebInfo(@RequestBody WebInfo webInfo) { + webInfoService.updateById(webInfo); + + LambdaQueryChainWrapper wrapper = new LambdaQueryChainWrapper<>(webInfoService.getBaseMapper()); + List list = wrapper.list(); + if (!CollectionUtils.isEmpty(list)) { + list.get(0).setDefaultStoreType(defaultType); + PoetryCache.put(CommonConst.WEB_INFO, list.get(0)); + } + return PoetryResult.success(); + } + + + /** + * 获取网站信息 + */ + @GetMapping("/getWebInfo") + public PoetryResult getWebInfo() { + WebInfo webInfo = (WebInfo) PoetryCache.get(CommonConst.WEB_INFO); + if (webInfo != null) { + WebInfo result = new WebInfo(); + BeanUtils.copyProperties(webInfo, result); + result.setRandomAvatar(null); + result.setRandomName(null); + result.setWaifuJson(null); + + webInfo.setHistoryAllCount(((Long) ((Map) PoetryCache.get(CommonConst.IP_HISTORY_STATISTICS)).get(CommonConst.IP_HISTORY_COUNT)).toString()); + webInfo.setHistoryDayCount(Integer.toString(((List>) ((Map) PoetryCache.get(CommonConst.IP_HISTORY_STATISTICS)).get(CommonConst.IP_HISTORY_HOUR)).size())); + return PoetryResult.success(result); + } + return PoetryResult.success(); + } + + /** + * 获取网站统计信息 + */ + @LoginCheck(0) + @GetMapping("/getHistoryInfo") + public PoetryResult> getHistoryInfo() { + Map result = new HashMap<>(); + + Map history = (Map) PoetryCache.get(CommonConst.IP_HISTORY_STATISTICS); + List infoList = new LambdaQueryChainWrapper<>(historyInfoMapper) + .select(HistoryInfo::getIp, HistoryInfo::getUserId, HistoryInfo::getNation, HistoryInfo::getProvince, HistoryInfo::getCity) + .ge(HistoryInfo::getCreateTime, LocalDateTime.now().with(LocalTime.MIN)) + .list(); + + result.put(CommonConst.IP_HISTORY_PROVINCE, history.get(CommonConst.IP_HISTORY_PROVINCE)); + result.put(CommonConst.IP_HISTORY_IP, history.get(CommonConst.IP_HISTORY_IP)); + result.put(CommonConst.IP_HISTORY_COUNT, history.get(CommonConst.IP_HISTORY_COUNT)); + List> ipHistoryCount = (List>) history.get(CommonConst.IP_HISTORY_HOUR); + result.put("ip_count_yest", ipHistoryCount.stream().map(m -> m.get("ip")).distinct().count()); + result.put("username_yest", ipHistoryCount.stream().map(m -> { + Object userId = m.get("user_id"); + if (userId != null) { + User user = commonQuery.getUser(Integer.valueOf(userId.toString())); + if (user != null) { + Map userInfo = new HashMap<>(); + userInfo.put("avatar", user.getAvatar()); + userInfo.put("username", user.getUsername()); + return userInfo; + } + } + return null; + }).filter(Objects::nonNull).collect(Collectors.toList())); + result.put("ip_count_today", infoList.stream().map(HistoryInfo::getIp).distinct().count()); + result.put("username_today", infoList.stream().map(m -> { + Integer userId = m.getUserId(); + if (userId != null) { + User user = commonQuery.getUser(userId); + if (user != null) { + Map userInfo = new HashMap<>(); + userInfo.put("avatar", user.getAvatar()); + userInfo.put("username", user.getUsername()); + return userInfo; + } + } + return null; + }).filter(Objects::nonNull).collect(Collectors.toList())); + + List> list = infoList.stream() + .map(HistoryInfo::getProvince).filter(Objects::nonNull) + .collect(Collectors.groupingBy(m -> m, Collectors.counting())) + .entrySet().stream() + .map(entry -> { + HashMap map = new HashMap<>(); + map.put("province", entry.getKey()); + map.put("num", entry.getValue()); + return map; + }) + .sorted((o1, o2) -> Long.valueOf(o2.get("num").toString()).compareTo(Long.valueOf(o1.get("num").toString()))) + .collect(Collectors.toList()); + + result.put("province_today", list); + + return PoetryResult.success(result); + } + + /** + * 获取赞赏 + */ + @GetMapping("/getAdmire") + public PoetryResult> getAdmire() { + return PoetryResult.success(commonQuery.getAdmire()); + } + + /** + * 获取看板娘消息 + */ + @GetMapping("/getWaifuJson") + public String getWaifuJson() { + WebInfo webInfo = (WebInfo) PoetryCache.get(CommonConst.WEB_INFO); + if (webInfo != null && StringUtils.hasText(webInfo.getWaifuJson())) { + return webInfo.getWaifuJson(); + } + return "{}"; + } +} + diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/WeiYanController.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/WeiYanController.java new file mode 100644 index 0000000..b209b10 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/controller/WeiYanController.java @@ -0,0 +1,157 @@ +package com.ld.poetry.controller; + + +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.ld.poetry.aop.LoginCheck; +import com.ld.poetry.config.PoetryResult; +import com.ld.poetry.aop.SaveCheck; +import com.ld.poetry.dao.ArticleMapper; +import com.ld.poetry.entity.Article; +import com.ld.poetry.entity.WeiYan; +import com.ld.poetry.service.WeiYanService; +import com.ld.poetry.constants.CommonConst; +import com.ld.poetry.enums.PoetryEnum; +import com.ld.poetry.utils.PoetryUtil; +import com.ld.poetry.utils.StringUtil; +import com.ld.poetry.vo.BaseRequestVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; + +/** + *

+ * 微言表 前端控制器 + *

+ * + * @author sara + * @since 2021-10-26 + */ +@RestController +@RequestMapping("/weiYan") +public class WeiYanController { + + @Autowired + private WeiYanService weiYanService; + + @Autowired + private ArticleMapper articleMapper; + + /** + * 保存 + */ + @PostMapping("/saveWeiYan") + @LoginCheck + @SaveCheck + public PoetryResult saveWeiYan(@RequestBody WeiYan weiYanVO) { + if (!StringUtils.hasText(weiYanVO.getContent())) { + return PoetryResult.fail("微言不能为空!"); + } + + String content = StringUtil.removeHtml(weiYanVO.getContent()); + if (!StringUtils.hasText(content)) { + return PoetryResult.fail("微言内容不合法!"); + } + weiYanVO.setContent(content); + + WeiYan weiYan = new WeiYan(); + weiYan.setUserId(PoetryUtil.getUserId()); + weiYan.setContent(weiYanVO.getContent()); + weiYan.setIsPublic(weiYanVO.getIsPublic()); + weiYan.setType(CommonConst.WEIYAN_TYPE_FRIEND); + weiYanService.save(weiYan); + return PoetryResult.success(); + } + + + /** + * 保存 + */ + @PostMapping("/saveNews") + @LoginCheck + public PoetryResult saveNews(@RequestBody WeiYan weiYanVO) { + if (!StringUtils.hasText(weiYanVO.getContent()) || weiYanVO.getSource() == null) { + return PoetryResult.fail("信息不全!"); + } + + if (weiYanVO.getCreateTime() == null) { + weiYanVO.setCreateTime(LocalDateTime.now()); + } + + Integer userId = PoetryUtil.getUserId(); + + LambdaQueryChainWrapper
wrapper = new LambdaQueryChainWrapper<>(articleMapper); + Integer count = wrapper.eq(Article::getId, weiYanVO.getSource()).eq(Article::getUserId, userId).count(); + + if (count == null || count < 1) { + return PoetryResult.fail("来源不存在!"); + } + + WeiYan weiYan = new WeiYan(); + weiYan.setUserId(userId); + weiYan.setContent(weiYanVO.getContent()); + weiYan.setIsPublic(Boolean.TRUE); + weiYan.setSource(weiYanVO.getSource()); + weiYan.setCreateTime(weiYanVO.getCreateTime()); + weiYan.setType(CommonConst.WEIYAN_TYPE_NEWS); + weiYanService.save(weiYan); + return PoetryResult.success(); + } + + /** + * 查询List + */ + @PostMapping("/listNews") + public PoetryResult listNews(@RequestBody BaseRequestVO baseRequestVO) { + if (baseRequestVO.getSource() == null) { + return PoetryResult.fail("来源不能为空!"); + } + LambdaQueryChainWrapper lambdaQuery = weiYanService.lambdaQuery(); + lambdaQuery.eq(WeiYan::getType, CommonConst.WEIYAN_TYPE_NEWS); + lambdaQuery.eq(WeiYan::getSource, baseRequestVO.getSource()); + lambdaQuery.eq(WeiYan::getIsPublic, PoetryEnum.PUBLIC.getCode()); + + lambdaQuery.orderByDesc(WeiYan::getCreateTime).page(baseRequestVO); + return PoetryResult.success(baseRequestVO); + } + + /** + * 删除 + */ + @GetMapping("/deleteWeiYan") + @LoginCheck + public PoetryResult deleteWeiYan(@RequestParam("id") Integer id) { + Integer userId = PoetryUtil.getUserId(); + weiYanService.lambdaUpdate().eq(WeiYan::getId, id) + .eq(WeiYan::getUserId, userId) + .remove(); + return PoetryResult.success(); + } + + + /** + * 查询List + */ + @PostMapping("/listWeiYan") + public PoetryResult listWeiYan(@RequestBody BaseRequestVO baseRequestVO) { + LambdaQueryChainWrapper lambdaQuery = weiYanService.lambdaQuery(); + lambdaQuery.eq(WeiYan::getType, CommonConst.WEIYAN_TYPE_FRIEND); + if (baseRequestVO.getUserId() == null) { + if (PoetryUtil.getUserId() != null) { + lambdaQuery.eq(WeiYan::getUserId, PoetryUtil.getUserId()); + } else { + lambdaQuery.eq(WeiYan::getIsPublic, PoetryEnum.PUBLIC.getCode()); + lambdaQuery.eq(WeiYan::getUserId, PoetryUtil.getAdminUser().getId()); + } + } else { + if (!baseRequestVO.getUserId().equals(PoetryUtil.getUserId())) { + lambdaQuery.eq(WeiYan::getIsPublic, PoetryEnum.PUBLIC.getCode()); + } + lambdaQuery.eq(WeiYan::getUserId, baseRequestVO.getUserId()); + } + + lambdaQuery.orderByDesc(WeiYan::getCreateTime).page(baseRequestVO); + return PoetryResult.success(baseRequestVO); + } +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/ArticleMapper.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/ArticleMapper.java new file mode 100644 index 0000000..01b53a0 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/ArticleMapper.java @@ -0,0 +1,20 @@ +package com.ld.poetry.dao; + +import com.ld.poetry.entity.Article; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +/** + *

+ * 文章表 Mapper 接口 + *

+ * + * @author sara + * @since 2021-08-13 + */ +public interface ArticleMapper extends BaseMapper
{ + + @Update("update article set view_count=view_count+1 where id=#{id}") + int updateViewCount(@Param("id") Integer id); +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/CommentMapper.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/CommentMapper.java new file mode 100644 index 0000000..9f81447 --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/CommentMapper.java @@ -0,0 +1,16 @@ +package com.ld.poetry.dao; + +import com.ld.poetry.entity.Comment; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 文章评论表 Mapper 接口 + *

+ * + * @author sara + * @since 2021-08-13 + */ +public interface CommentMapper extends BaseMapper { + +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/FamilyMapper.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/FamilyMapper.java new file mode 100644 index 0000000..f5e33bc --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/FamilyMapper.java @@ -0,0 +1,16 @@ +package com.ld.poetry.dao; + +import com.ld.poetry.entity.Family; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 家庭信息 Mapper 接口 + *

+ * + * @author sara + * @since 2023-01-03 + */ +public interface FamilyMapper extends BaseMapper { + +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/HistoryInfoMapper.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/HistoryInfoMapper.java new file mode 100644 index 0000000..58917ff --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/HistoryInfoMapper.java @@ -0,0 +1,54 @@ +package com.ld.poetry.dao; + +import com.ld.poetry.entity.HistoryInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +import java.util.Map; + +/** + *

+ * 历史信息 Mapper 接口 + *

+ * + * @author sara + * @since 2023-07-24 + */ +public interface HistoryInfoMapper extends BaseMapper { + + /** + * 访问IP最多的10个省 + */ + @Select("select nation, province, count(distinct ip) as num" + + " from history_info" + + " where nation is not null and province is not null" + + " group by nation, province" + + " order by num desc" + + " limit 10") + List> getHistoryByProvince(); + + /** + * 访问次数最多的10个IP + */ + @Select("select ip, count(*) as num" + + " from history_info" + + " group by ip" + + " order by num desc" + + " limit 10") + List> getHistoryByIp(); + + /** + * 访问24小时内的数据 + */ + @Select("select ip, user_id, nation, province" + + " from history_info" + + " where create_time >= (now() - interval 24 hour)") + List> getHistoryBy24Hour(); + + /** + * 总访问量 + */ + @Select("select count(*) from history_info") + Long getHistoryCount(); +} diff --git a/poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/LabelMapper.java b/poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/LabelMapper.java new file mode 100644 index 0000000..9a6c01a --- /dev/null +++ b/poetize-server/poetry-web/src/main/java/com/ld/poetry/dao/LabelMapper.java @@ -0,0 +1,16 @@ +package com.ld.poetry.dao; + +import com.ld.poetry.entity.Label; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 标签 Mapper 接口 + *

+ * + * @author sara + * @since 2021-09-14 + */ +public interface LabelMapper extends BaseMapper