├── .gitignore ├── README.md ├── acimage_admin ├── .gitignore ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── acimage │ │ │ └── admin │ │ │ ├── AdminApplication.java │ │ │ ├── config │ │ │ ├── WebMvcConfig.java │ │ │ └── mybatis │ │ │ │ ├── CommunityDataSourceConfig.java │ │ │ │ ├── GlobalConfigBean.java │ │ │ │ └── ImageDataSourceConfig.java │ │ │ ├── dao │ │ │ ├── community │ │ │ │ ├── CategoryDao.java │ │ │ │ ├── CommentDao.java │ │ │ │ ├── HomeCarouselDao.java │ │ │ │ └── TopicDao.java │ │ │ ├── sys │ │ │ │ ├── ApiDao.java │ │ │ │ ├── AuthorizeDao.java │ │ │ │ ├── PermissionDao.java │ │ │ │ ├── RoleDao.java │ │ │ │ └── UserRoleDao.java │ │ │ └── user │ │ │ │ ├── UserDao.java │ │ │ │ └── UserPrivacyDao.java │ │ │ ├── global │ │ │ └── consts │ │ │ │ └── ModuleConstants.java │ │ │ ├── model │ │ │ ├── request │ │ │ │ ├── AdminLoginReq.java │ │ │ │ ├── ApiAddReq.java │ │ │ │ ├── ApiModifyReq.java │ │ │ │ ├── ApiQueryReq.java │ │ │ │ ├── CarouselAddReq.java │ │ │ │ ├── CarouselModifyReq.java │ │ │ │ ├── CommentQueryReq.java │ │ │ │ ├── PermissionAddReq.java │ │ │ │ ├── PermissionModifyReq.java │ │ │ │ ├── RoleAddReq.java │ │ │ │ ├── RoleModifyReq.java │ │ │ │ ├── TopicQueryReq.java │ │ │ │ └── UserQueryReq.java │ │ │ └── vo │ │ │ │ └── WebsiteDataVo.java │ │ │ ├── service │ │ │ ├── api │ │ │ │ ├── ApiQueryService.java │ │ │ │ ├── ApiWriteService.java │ │ │ │ └── impl │ │ │ │ │ ├── ApiQueryServiceImpl.java │ │ │ │ │ └── ApiWriteServiceImpl.java │ │ │ ├── authorize │ │ │ │ ├── AuthorizeQueryService.java │ │ │ │ ├── AuthorizeWriteService.java │ │ │ │ └── impl │ │ │ │ │ ├── AuthorizeQueryServiceImpl.java │ │ │ │ │ └── AuthorizeWriteServiceImpl.java │ │ │ ├── category │ │ │ │ ├── CategoryQueryService.java │ │ │ │ └── impl │ │ │ │ │ └── CategoryQueryServiceImpl.java │ │ │ ├── comment │ │ │ │ ├── CommentQueryService.java │ │ │ │ ├── CommentWriteService.java │ │ │ │ └── impl │ │ │ │ │ ├── CommentQueryServiceImpl.java │ │ │ │ │ └── CommentWriteServiceImpl.java │ │ │ ├── homecarousel │ │ │ │ ├── HomeCarouselQueryService.java │ │ │ │ ├── HomeCarouselWriteService.java │ │ │ │ └── impl │ │ │ │ │ ├── HomeCarouselQueryServiceImpl.java │ │ │ │ │ └── HomeCarouselWriteServiceImpl.java │ │ │ ├── login │ │ │ │ ├── LoginService.java │ │ │ │ ├── VerifyCodeService.java │ │ │ │ └── impl │ │ │ │ │ ├── LoginServiceImpl.java │ │ │ │ │ └── VerifyCodeServiceImpl.java │ │ │ ├── permission │ │ │ │ ├── PermissionQueryService.java │ │ │ │ ├── PermissionWriteSercice.java │ │ │ │ └── impl │ │ │ │ │ ├── PermissionQueryServiceImpl.java │ │ │ │ │ └── PermissionWriteServiceImpl.java │ │ │ ├── role │ │ │ │ ├── RoleQueryService.java │ │ │ │ ├── RoleWriteService.java │ │ │ │ └── impl │ │ │ │ │ ├── RoleQueryServiceImpl.java │ │ │ │ │ └── RoleWriteServiceImpl.java │ │ │ ├── topic │ │ │ │ ├── TopicQueryService.java │ │ │ │ ├── TopicWriteService.java │ │ │ │ └── impl │ │ │ │ │ ├── TopicQueryServiceImpl.java │ │ │ │ │ └── TopicWriteServiceImpl.java │ │ │ ├── user │ │ │ │ ├── UserQueryService.java │ │ │ │ ├── UserWriteService.java │ │ │ │ └── impl │ │ │ │ │ ├── UserQueryServiceImpl.java │ │ │ │ │ └── UserWriteServiceImpl.java │ │ │ ├── userrole │ │ │ │ ├── UserRoleQueryService.java │ │ │ │ ├── UserRoleWriteService.java │ │ │ │ └── impl │ │ │ │ │ ├── UserRoleQueryServiceImpl.java │ │ │ │ │ └── UserRoleWriteServiceImpl.java │ │ │ └── websitedata │ │ │ │ ├── WebsiteDataService.java │ │ │ │ └── impl │ │ │ │ └── WebsiteDataServiceImpl.java │ │ │ └── web │ │ │ └── controller │ │ │ ├── AdminLoginController.java │ │ │ ├── ApiOperateController.java │ │ │ ├── ApiQueryController.java │ │ │ ├── AuthorizeOperateController.java │ │ │ ├── AuthorizeQueryController.java │ │ │ ├── CategoryController.java │ │ │ ├── CommentOperateController.java │ │ │ ├── CommentQueryController.java │ │ │ ├── HomeCarouselController.java │ │ │ ├── PermissionOperateController.java │ │ │ ├── PermissionQueryController.java │ │ │ ├── RoleController.java │ │ │ ├── TopicOperateController.java │ │ │ ├── TopicQueryController.java │ │ │ ├── UserQueryController.java │ │ │ ├── UserRoleOperateController.java │ │ │ └── WebsiteDataController.java │ └── resources │ │ ├── application-dev.yml │ │ ├── application.yml │ │ ├── logback-spring.xml │ │ └── mapper │ │ ├── community │ │ └── TopicMapper.xml │ │ ├── image │ │ └── HomeCarouselMapper.xml │ │ ├── sys │ │ ├── ApiMapper.xml │ │ └── PermissionMapper.xml │ │ └── user │ │ └── TopicMapper.xml │ └── test │ └── java │ └── com │ └── acimage │ └── admin │ ├── AdminApplicationTest.java │ ├── dao │ ├── community │ │ ├── SpDaoTest.java │ │ └── TopicDaoTest.java │ └── sys │ │ └── ApiDaoTest.java │ └── service │ └── HomeCarouselWriteServiceTest.java ├── acimage_common ├── .gitignore ├── lib │ └── webp-imageio-core-0.1.0.jar ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── acimage │ │ └── common │ │ ├── CommonMain.java │ │ ├── config │ │ ├── EsConfig.java │ │ ├── EsProdConfig.java │ │ ├── FilterConfig.java │ │ ├── JacksonConfig.java │ │ ├── PaginationConfig.java │ │ └── RabbitmqConvertConfig.java │ │ ├── deprecated │ │ ├── IpInterceptorBak.java │ │ ├── JwtInterceptorBak.java │ │ ├── PermissionInterceptorBak.java │ │ ├── QiniuUtils.java │ │ ├── QiniuUtilsBak.java │ │ ├── UserCommunityStatistic.java │ │ ├── annotation │ │ │ ├── Authentication.java │ │ │ └── utils │ │ │ │ └── AuthenticationUtils.java │ │ └── typehandler │ │ │ └── MatchRuleTypeHandler.java │ │ ├── global │ │ ├── aop │ │ │ └── LogAdvice.java │ │ ├── consts │ │ │ ├── EsConstants.java │ │ │ ├── FileFormatConstants.java │ │ │ ├── HeaderKeyConstants.java │ │ │ ├── JwtConstants.java │ │ │ ├── MqConstants.java │ │ │ ├── StorePrefixConstants.java │ │ │ ├── SysKeyConstants.java │ │ │ └── TimeConstants.java │ │ ├── context │ │ │ └── UserContext.java │ │ ├── enums │ │ │ ├── AuthenticationType.java │ │ │ ├── MatchRule.java │ │ │ ├── MyHttpMethod.java │ │ │ ├── ServiceType.java │ │ │ └── TokenStatus.java │ │ └── exception │ │ │ ├── BaseException.java │ │ │ ├── BusinessException.java │ │ │ ├── NullTokenException.java │ │ │ └── SystemException.java │ │ ├── model │ │ ├── Index │ │ │ └── TopicIndex.java │ │ ├── domain │ │ │ ├── community │ │ │ │ ├── Category.java │ │ │ │ ├── CmtyUser.java │ │ │ │ ├── Comment.java │ │ │ │ ├── HomeCarousel.java │ │ │ │ ├── Star.java │ │ │ │ ├── Tag.java │ │ │ │ ├── TagTopic.java │ │ │ │ ├── Topic.java │ │ │ │ └── TopicHtml.java │ │ │ ├── image │ │ │ │ ├── Image.java │ │ │ │ └── ImageHash.java │ │ │ ├── sys │ │ │ │ ├── Api.java │ │ │ │ ├── Authorize.java │ │ │ │ ├── Permission.java │ │ │ │ ├── Role.java │ │ │ │ └── UserRole.java │ │ │ └── user │ │ │ │ ├── CommentMsg.java │ │ │ │ ├── User.java │ │ │ │ ├── UserMsg.java │ │ │ │ └── UserPrivacy.java │ │ ├── mq │ │ │ └── dto │ │ │ │ ├── EsAddDto.java │ │ │ │ ├── EsDeleteDto.java │ │ │ │ ├── EsUpdateByIdDto.java │ │ │ │ ├── EsUpdateByTermDto.java │ │ │ │ ├── ImageIdWithUrl.java │ │ │ │ ├── ObjectWithClass.java │ │ │ │ ├── SyncImagesUpdateDto.java │ │ │ │ ├── UserIdWithPhotoUrl.java │ │ │ │ └── UserIdWithUsername.java │ │ └── page │ │ │ └── MyPage.java │ │ ├── redis │ │ ├── QueryRedisAdvice.java │ │ ├── RequestLimitAdvice.java │ │ ├── annotation │ │ │ ├── KeyParam.java │ │ │ ├── QueryRedis.java │ │ │ └── RequestLimit.java │ │ ├── enums │ │ │ ├── DataType.java │ │ │ └── LimitTarget.java │ │ └── utils │ │ │ └── RedisAnnotationUtils.java │ │ ├── result │ │ ├── Code.java │ │ └── Result.java │ │ ├── service │ │ ├── TokenService.java │ │ └── impl │ │ │ └── TokenServiceImpl.java │ │ ├── utils │ │ ├── CookieUtils.java │ │ ├── EsUtils.java │ │ ├── ExceptionUtils.java │ │ ├── HtmlUtils.java │ │ ├── IdGenerator.java │ │ ├── ImageUtils.java │ │ ├── IpUtils.java │ │ ├── JwtUtils.java │ │ ├── LambdaUtils.java │ │ ├── RsaUtils.java │ │ ├── SensitiveWordUtils.java │ │ ├── SpringContextUtils.java │ │ ├── common │ │ │ ├── AopUtils.java │ │ │ ├── ArrayUtils.java │ │ │ ├── BeanUtils.java │ │ │ ├── FileUtils.java │ │ │ ├── JacksonUtils.java │ │ │ ├── ListUtils.java │ │ │ ├── PageUtils.java │ │ │ ├── PairUtils.java │ │ │ ├── ReflectUtils.java │ │ │ └── StringUtils.java │ │ ├── minio │ │ │ ├── MinioProperties.java │ │ │ └── MinioUtils.java │ │ └── redis │ │ │ ├── RedisLuaUtils.java │ │ │ └── RedisUtils.java │ │ └── web │ │ ├── exceptionhandler │ │ ├── ArgumentValidateExceptionHandler.java │ │ ├── GlobalExceptionHandler.java │ │ └── JwtExceptionHandler.java │ │ └── interceptor │ │ ├── AccessInterceptor.java │ │ └── JwtInterceptor.java │ └── resources │ ├── application-common.yml │ ├── application-qiniu-template.yml │ ├── lua │ ├── getAndCombineAndDelete.lua │ ├── incrementIfPresent.lua │ ├── incrementIfPresentForFieldKey.lua │ ├── incrementIfPresentForZSet.lua │ ├── requestLimit.lua │ └── setIfPresentForFieldKey.lua │ └── sensitive_word.txt ├── acimage_community ├── lib │ └── webp-imageio-core-0.1.0.jar ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── acimage │ │ │ └── community │ │ │ ├── CommunityApplication.java │ │ │ ├── dao │ │ │ ├── CategoryDao.java │ │ │ ├── CmtyUserDao.java │ │ │ ├── CommentDao.java │ │ │ ├── HomeCarrouselDao.java │ │ │ ├── ImageDao.java │ │ │ ├── StarDao.java │ │ │ ├── TagDao.java │ │ │ ├── TagTopicDao.java │ │ │ ├── TopicDao.java │ │ │ └── TopicHtmlDao.java │ │ │ ├── depreted │ │ │ ├── CmtyUserDaoBak.java │ │ │ ├── RabbitmqConvertConfig.java │ │ │ ├── UserMixWriteService.java │ │ │ ├── UserMixWriteServiceImpl.java │ │ │ └── userstatistic │ │ │ │ ├── UserCsQueryService.java │ │ │ │ ├── UserCsRankService.java │ │ │ │ ├── UserCsWriteService.java │ │ │ │ ├── consts │ │ │ │ └── KeyConstants.java │ │ │ │ └── impl │ │ │ │ ├── UserCsQueryServiceImpl.java │ │ │ │ ├── UserCsRankServiceImpl.java │ │ │ │ └── UserCsWriteServiceImpl.java │ │ │ ├── esdao │ │ │ └── UserEsDao.java │ │ │ ├── global │ │ │ ├── annotation │ │ │ │ ├── RecordPageView.java │ │ │ │ └── TopicId.java │ │ │ ├── aop │ │ │ │ └── RecordPageViewAdvice.java │ │ │ ├── config │ │ │ │ ├── JobFactory.java │ │ │ │ └── WebMvcConfig.java │ │ │ ├── consts │ │ │ │ ├── CommentKeyConstants.java │ │ │ │ ├── CoverImageConstants.java │ │ │ │ ├── PageSizeConstants.java │ │ │ │ ├── StarKeyConstants.java │ │ │ │ └── TopicKeyConstants.java │ │ │ └── enums │ │ │ │ ├── SortMode.java │ │ │ │ └── TopicAttribute.java │ │ │ ├── listener │ │ │ ├── CommentEventListener.java │ │ │ ├── PublishTopicEventListener.java │ │ │ ├── StarEventListener.java │ │ │ └── event │ │ │ │ ├── CommentEvent.java │ │ │ │ ├── StarEvent.java │ │ │ │ └── TopicEvent.java │ │ │ ├── model │ │ │ ├── request │ │ │ │ ├── CommentAddReq.java │ │ │ │ ├── CommentModifyReq.java │ │ │ │ ├── TopicAddReq.java │ │ │ │ ├── TopicModifyHtmlReq.java │ │ │ │ ├── TopicQueryByCategoryIdReq.java │ │ │ │ ├── TopicQueryBySortReq.java │ │ │ │ ├── TopicQueryByTagIdReq.java │ │ │ │ ├── TopicSearchReq.java │ │ │ │ ├── UserLoginReq.java │ │ │ │ └── UserRegisterReq.java │ │ │ └── vo │ │ │ │ └── TopicInfoVo.java │ │ │ ├── mq │ │ │ ├── config │ │ │ │ ├── SyncEsMqConfig.java │ │ │ │ ├── SyncImagesMqConfig.java │ │ │ │ └── UserMsgMqConfig.java │ │ │ ├── consumer │ │ │ │ ├── SyncEsConsumer.java │ │ │ │ └── SyncUserConsumer.java │ │ │ └── producer │ │ │ │ ├── SyncEsMqProducer.java │ │ │ │ ├── UserMsgMqProducer.java │ │ │ │ └── syncImagesMqProducer.java │ │ │ ├── runner │ │ │ ├── CreateIndexRunner.java │ │ │ └── PreheatApplicationRunner.java │ │ │ ├── schedule │ │ │ ├── UpdateActivityTimeJob.java │ │ │ ├── UpdateActivityTimeJobConfig.java │ │ │ ├── UpdateCommentCountJob.java │ │ │ ├── UpdateCommentCountJobConfig.java │ │ │ ├── UpdatePageViewJob.java │ │ │ ├── UpdatePageViewJobConfig.java │ │ │ ├── UpdateStarCountJob.java │ │ │ └── UpdateStarCountJobConfig.java │ │ │ ├── service │ │ │ ├── categoty │ │ │ │ ├── CategoryQueryService.java │ │ │ │ └── impl │ │ │ │ │ └── CategoryQueryServiceImpl.java │ │ │ ├── cmtyuser │ │ │ │ ├── CmtyUserQueryService.java │ │ │ │ ├── CmtyUserRankService.java │ │ │ │ ├── CmtyUserWriteService.java │ │ │ │ └── impl │ │ │ │ │ ├── CmtyUserQueryServiceImpl.java │ │ │ │ │ ├── CmtyUserRankServiceImpl.java │ │ │ │ │ └── CmtyUserWriteServiceImpl.java │ │ │ ├── comment │ │ │ │ ├── CommentInfoQueryService.java │ │ │ │ ├── CommentQueryService.java │ │ │ │ ├── CommentWriteService.java │ │ │ │ ├── annotation │ │ │ │ │ ├── Operation.java │ │ │ │ │ └── UpdateCcByReturn.java │ │ │ │ └── impl │ │ │ │ │ ├── CommentInfoQueryServiceImpl.java │ │ │ │ │ ├── CommentQueryServiceImpl.java │ │ │ │ │ └── CommentWriteServiceImpl.java │ │ │ ├── homecarousel │ │ │ │ ├── HomeCarouselQueryService.java │ │ │ │ └── impl │ │ │ │ │ └── HomeCarouselQueryServiceImpl.java │ │ │ ├── star │ │ │ │ ├── StarMixQueryService.java │ │ │ │ ├── StarQueryService.java │ │ │ │ ├── StarWriteService.java │ │ │ │ └── impl │ │ │ │ │ ├── StarMixQueryServiceImpl.java │ │ │ │ │ ├── StarQueryServiceImpl.java │ │ │ │ │ └── StarWriteServiceImpl.java │ │ │ ├── tag │ │ │ │ ├── TagQueryService.java │ │ │ │ ├── TagTopicQueryService.java │ │ │ │ ├── TagTopicWriteService.java │ │ │ │ ├── TagWriteService.java │ │ │ │ └── impl │ │ │ │ │ ├── TagQueryServiceImpl.java │ │ │ │ │ ├── TagTopicQueryServiceImpl.java │ │ │ │ │ ├── TagTopicWriteServiceImpl.java │ │ │ │ │ └── TagWriteServiceImpl.java │ │ │ └── topic │ │ │ │ ├── Impl │ │ │ │ ├── TopicEsSearchServiceImpl.java │ │ │ │ ├── TopicHtmlQueryServiceImpl.java │ │ │ │ ├── TopicHtmlWriteServiceImpl.java │ │ │ │ ├── TopicInfoQueryServiceImpl.java │ │ │ │ ├── TopicInfoWriteServiceImpl.java │ │ │ │ ├── TopicPreheatServiceImpl.java │ │ │ │ ├── TopicQueryServiceImpl.java │ │ │ │ ├── TopicRankQueryServiceImpl.java │ │ │ │ ├── TopicRankWriteServiceImpl.java │ │ │ │ ├── TopicSpAttrQueryServiceImpl.java │ │ │ │ ├── TopicSpAttrWriteServiceImpl.java │ │ │ │ └── TopicWriteServiceImpl.java │ │ │ │ ├── TopicEsSearchService.java │ │ │ │ ├── TopicHtmlQueryService.java │ │ │ │ ├── TopicHtmlWriteService.java │ │ │ │ ├── TopicInfoQueryService.java │ │ │ │ ├── TopicInfoWriteService.java │ │ │ │ ├── TopicPreheatService.java │ │ │ │ ├── TopicQueryService.java │ │ │ │ ├── TopicRankQueryService.java │ │ │ │ ├── TopicRankWriteService.java │ │ │ │ ├── TopicSpAttrQueryService.java │ │ │ │ ├── TopicSpAttrWriteService.java │ │ │ │ └── TopicWriteService.java │ │ │ ├── utils │ │ │ └── RsaUtils.java │ │ │ └── web │ │ │ ├── controller │ │ │ ├── CategoryQueryController.java │ │ │ ├── CommentOperateController.java │ │ │ ├── CommentQueryController.java │ │ │ ├── HomeCarouselQueryController.java │ │ │ ├── StarOperateController.java │ │ │ ├── StarQueryController.java │ │ │ ├── TagQueryController.java │ │ │ ├── TopicOperateController.java │ │ │ ├── TopicQueryController.java │ │ │ ├── TopicSearchController.java │ │ │ └── UserRankController.java │ │ │ └── provider │ │ │ ├── CmtyUserProvider.java │ │ │ ├── CommentProvider.java │ │ │ └── TopicProvider.java │ └── resources │ │ ├── application-dev.yml │ │ ├── application.yml │ │ ├── logback-spring.xml │ │ └── mapper │ │ ├── CmtyUserMapper.xml │ │ ├── CommentMapper.xml │ │ ├── ImageMapper.xml │ │ ├── StarMapper.xml │ │ ├── TagTopicMapper.xml │ │ └── TopicMapper.xml │ └── test │ └── java │ └── com │ └── acimage │ └── community │ ├── CasualTest.java │ ├── CommunityApplicationTests.java │ ├── dao │ ├── CommentDaoTest.java │ ├── ImageDaoTest.java │ ├── StarDaoTest.java │ └── TopicDaoTest.java │ ├── service │ ├── CommentWriteServiceTest.java │ └── TopicEsSearchServiceTest.java │ └── utils │ └── RedisTest.java ├── acimage_feign ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── acimage │ └── feign │ ├── FeignMain.java │ ├── client │ ├── CmtyUserClient.java │ ├── CommentClient.java │ ├── TopicClient.java │ └── UserClient.java │ ├── config │ ├── FallbackFactoryBean.java │ ├── FeignMultipartSupportConfig.java │ └── FeignRequestInterceptorConfig.java │ ├── depreted │ ├── FileClient.java │ └── ImageClient.java │ └── fallback │ ├── CmtyUserClientFallbackFactory.java │ ├── CommentClientFallbackFactory.java │ ├── ImageClientFallbackFactory.java │ ├── TopicClientFallbackFactory.java │ └── UserClientFallbackFactory.java ├── acimage_gateway ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── acimage │ │ │ └── gateway │ │ │ ├── GatewayApplication.java │ │ │ ├── apitree │ │ │ ├── ApiTree.java │ │ │ ├── ApiTreeFactory.java │ │ │ ├── ApiTreeUtils.java │ │ │ └── InitApiTreeApplicationRunner.java │ │ │ ├── config │ │ │ ├── KeySolverConfig.java │ │ │ └── RoleConfig.java │ │ │ ├── dao │ │ │ ├── ApiDao.java │ │ │ ├── AuthorizeDao.java │ │ │ ├── PermissionDao.java │ │ │ ├── RoleDao.java │ │ │ └── UserRoleDao.java │ │ │ ├── global │ │ │ └── consts │ │ │ │ └── NotationConstants.java │ │ │ ├── globalfilter │ │ │ ├── AuthenticationFilter.java │ │ │ ├── CustomWebsocketRoutingFilter.java │ │ │ ├── PermissionFilter.java │ │ │ ├── RemoveContextFilter.java │ │ │ └── RequestLimitFilter.java │ │ │ ├── schedule │ │ │ └── RefreshApiTreeSchedule.java │ │ │ └── serivce │ │ │ ├── ApiQueryService.java │ │ │ ├── AuthorizeQueryService.java │ │ │ ├── RoleQueryService.java │ │ │ ├── UserRoleQueryService.java │ │ │ └── impl │ │ │ ├── ApiQueryQueryServiceImpl.java │ │ │ ├── AuthorizeQueryServiceImpl.java │ │ │ ├── RoleQueryServiceImpl.java │ │ │ └── UserRoleQueryQueryServiceImpl.java │ └── resources │ │ ├── application-dev.yml │ │ ├── application.yml │ │ └── logback-spring.xml │ └── test │ └── java │ └── com │ └── acimage │ └── gateway │ ├── GatewayApplicationTest.java │ └── apitree │ └── ApiTreeTest.java ├── acimage_image ├── lib │ └── webp-imageio-core-0.1.0.jar ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── acimage │ │ │ └── image │ │ │ ├── ImageApplication.java │ │ │ ├── dao │ │ │ ├── ImageDao.java │ │ │ └── ImageHashDao.java │ │ │ ├── global │ │ │ ├── consts │ │ │ │ ├── MyFileConstants.java │ │ │ │ └── TopicImageKeyConstants.java │ │ │ └── context │ │ │ │ └── DirectoryContext.java │ │ │ ├── mq │ │ │ └── consumer │ │ │ │ └── SyncImagesConsumer.java │ │ │ ├── service │ │ │ ├── config │ │ │ │ └── DhashTaskPoolConfig.java │ │ │ ├── image │ │ │ │ ├── ImageMixWriteService.java │ │ │ │ ├── ImageQueryService.java │ │ │ │ ├── ImageWriteService.java │ │ │ │ └── impl │ │ │ │ │ ├── ImageMixWriteServiceImpl.java │ │ │ │ │ ├── ImageQueryServiceImpl.java │ │ │ │ │ └── ImageWriteServiceImpl.java │ │ │ ├── imagehash │ │ │ │ ├── ImageHashWriteService.java │ │ │ │ ├── SearchImageService.java │ │ │ │ └── impl │ │ │ │ │ ├── ImageHashWriteServiceImpl.java │ │ │ │ │ └── SearchImageServiceImpl.java │ │ │ └── photo │ │ │ │ ├── PhotoService.java │ │ │ │ └── impl │ │ │ │ └── PhotoServiceImpl.java │ │ │ ├── utils │ │ │ ├── BitUtils.java │ │ │ ├── DhashUtils.java │ │ │ ├── ImageFileUtils.java │ │ │ └── ImageUtils.java │ │ │ └── web │ │ │ ├── config │ │ │ └── WebMvcConfig.java │ │ │ ├── controller │ │ │ ├── ImageOperateController.java │ │ │ ├── PhotoOperateController.java │ │ │ └── SearchImageController.java │ │ │ └── provider │ │ │ └── ImageProvider.java │ └── resources │ │ ├── application-dev.yml │ │ ├── application.yml │ │ ├── logback-spring.xml │ │ └── mapper │ │ └── ImageMapper.xml │ └── test │ └── java │ └── com │ └── acimage │ └── image │ ├── CasualTest.java │ ├── ImageApplicationTests.java │ ├── dao │ ├── ImageDaoTest.java │ └── ImageHashDaoDaoTest.java │ ├── service │ ├── FileServiceTest.java │ └── SearchImageServiceTest.java │ └── utils │ └── ImageHashDaoUtilsTest.java ├── acimage_user ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── acimage │ │ │ └── user │ │ │ ├── UserApplication.java │ │ │ ├── dao │ │ │ ├── CommentMsgDao.java │ │ │ ├── UserDao.java │ │ │ ├── UserMsgDao.java │ │ │ └── UserPrivacyDao.java │ │ │ ├── global │ │ │ ├── config │ │ │ │ ├── WebMvcConfig.java │ │ │ │ └── WebSocketConfig.java │ │ │ └── consts │ │ │ │ ├── PageSizeConsts.java │ │ │ │ ├── StorePrefixConst.java │ │ │ │ └── WebSocketSessionConstants.java │ │ │ ├── model │ │ │ ├── request │ │ │ │ ├── UserLoginReq.java │ │ │ │ └── UserRegisterReq.java │ │ │ └── vo │ │ │ │ └── ProfileVo.java │ │ │ ├── mq │ │ │ ├── config │ │ │ │ └── SyncUserMqConfig.java │ │ │ ├── consumer │ │ │ │ └── UserMsgConsumer.java │ │ │ └── producer │ │ │ │ └── SyncUserMqProducer.java │ │ │ ├── service │ │ │ ├── commentmsg │ │ │ │ ├── CommentMsgQueryService.java │ │ │ │ ├── CommentMsgWriteService.java │ │ │ │ └── impl │ │ │ │ │ ├── CommentMsgQueryServiceImpl.java │ │ │ │ │ └── CommentMsgWriteServiceImpl.java │ │ │ ├── mail │ │ │ │ ├── MainService.java │ │ │ │ └── impl │ │ │ │ │ └── MailServiceImpl.java │ │ │ ├── user │ │ │ │ ├── LoginService.java │ │ │ │ ├── UserInfoService.java │ │ │ │ ├── UserQueryService.java │ │ │ │ ├── UserRankService.java │ │ │ │ ├── UserWriteService.java │ │ │ │ ├── consts │ │ │ │ │ └── KeyConstants.java │ │ │ │ └── impl │ │ │ │ │ ├── LoginServiceImpl.java │ │ │ │ │ ├── UserInfoServiceImpl.java │ │ │ │ │ ├── UserQueryServiceImpl.java │ │ │ │ │ ├── UserRankServiceImpl.java │ │ │ │ │ └── UserWriteServiceImpl.java │ │ │ ├── usermsg │ │ │ │ ├── UserMsgQueryService.java │ │ │ │ ├── UserMsgWriteService.java │ │ │ │ └── impl │ │ │ │ │ ├── UserMsgQueryServiceImpl.java │ │ │ │ │ └── UserMsgWriteServiceImpl.java │ │ │ └── verify │ │ │ │ ├── VerifyCodeService.java │ │ │ │ └── impl │ │ │ │ └── VerifyCodeServiceImpl.java │ │ │ └── web │ │ │ ├── controller │ │ │ ├── LoginController.java │ │ │ ├── MessageController.java │ │ │ ├── UserOperateController.java │ │ │ ├── UserQueryController.java │ │ │ └── VerifyCodeController.java │ │ │ ├── provider │ │ │ └── UserProvider.java │ │ │ └── websocket │ │ │ ├── MyHandshakeInterceptor.java │ │ │ └── MyWebSocketHandler.java │ └── resources │ │ ├── application-dev.yml │ │ ├── application.yml │ │ ├── logback-spring.xml │ │ └── mapper │ │ ├── CommentMsgMapper.xml │ │ └── UserMapper.xml │ └── test │ └── java │ └── com │ └── acimage │ └── user │ └── AppTest.java ├── doc ├── images │ ├── activity.webp │ ├── admin-authorize.webp │ ├── admin-home.webp │ ├── architecture.jpg │ ├── forum1.webp │ ├── forum2.webp │ ├── forum3.webp │ ├── home1.webp │ ├── home2.webp │ ├── profile.webp │ ├── publish.webp │ ├── search-image1.webp │ ├── search-image2.webp │ ├── search.webp │ ├── topic-info1.webp │ ├── topic-info2.webp │ ├── website-icon.jpg │ └── 二次元段子.jpg └── sql │ ├── .gitignore │ ├── acimage_community.sql │ ├── acimage_image.sql │ ├── acimage_sys.sql │ └── acimage_user.sql ├── pom.xml ├── vue-manage-system ├── .github │ └── FUNDING.yml ├── .gitignore ├── LICENSE ├── README.md ├── README_EN.md ├── auto-imports.d.ts ├── components.d.ts ├── index.html ├── package-lock.json ├── package.json ├── public │ ├── table.json │ └── template.xlsx ├── screenshots │ ├── wms1.png │ └── wms3.png ├── src │ ├── App.vue │ ├── api │ │ ├── HomeCarousel.ts │ │ ├── UserRole.ts │ │ ├── WebsiteData.ts │ │ ├── api.ts │ │ ├── authorize.ts │ │ ├── category.ts │ │ ├── comment.ts │ │ ├── index.ts │ │ ├── login.ts │ │ ├── permission.ts │ │ ├── role.ts │ │ ├── topic.ts │ │ └── user.ts │ ├── assets │ │ ├── css │ │ │ ├── color-dark.css │ │ │ ├── icon.css │ │ │ └── main.css │ │ └── img │ │ │ ├── img.jpg │ │ │ └── login-bg.jpg │ ├── components │ │ ├── header.vue │ │ ├── sidebar.vue │ │ └── tags.vue │ ├── config.ts │ ├── main.ts │ ├── router │ │ └── index.ts │ ├── store │ │ ├── permiss.ts │ │ ├── sidebar.ts │ │ ├── store.ts │ │ └── tags.ts │ ├── utils │ │ ├── CommonUtils.ts │ │ ├── MessageUtils.ts │ │ ├── StringUtils.ts │ │ ├── global.ts │ │ ├── request.ts │ │ ├── requestx.ts │ │ ├── result.ts │ │ └── utils.js │ ├── views │ │ ├── 403.vue │ │ ├── 404.vue │ │ ├── HomeCarousel │ │ │ └── HomeCarousel.vue │ │ ├── api │ │ │ └── api.vue │ │ ├── authorize │ │ │ └── authorize.vue │ │ ├── charts.vue │ │ ├── comment │ │ │ └── comment.vue │ │ ├── dashboard.vue │ │ ├── donate.vue │ │ ├── editor.vue │ │ ├── home.vue │ │ ├── icon.vue │ │ ├── login.vue │ │ ├── markdown.vue │ │ ├── permission │ │ │ └── permission.vue │ │ ├── permissionx.vue │ │ ├── role │ │ │ └── role.vue │ │ ├── table.vue │ │ ├── tabs.vue │ │ ├── topic │ │ │ └── topic.vue │ │ ├── upload.vue │ │ ├── user.vue │ │ └── user │ │ │ └── user.vue │ └── vite-env.d.ts ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts └── vue_acimage_web ├── .env.dev ├── .gitignore ├── README.md ├── babel.config.js ├── jsconfig.json ├── mock ├── HomeCarousel.js ├── UserRank.js ├── index.js └── topic.js ├── package-lock.json ├── package.json ├── public ├── index.html ├── static │ ├── css │ │ └── common.css │ ├── favicon.ico │ └── image │ │ ├── 0.jpeg │ │ ├── 1.jpeg │ │ ├── 2.jpeg │ │ ├── default-photo.webp │ │ ├── github.webp │ │ ├── happy.jpeg │ │ ├── header-bg.png │ │ ├── header-bg.webp │ │ ├── linhao1.1.jpg │ │ ├── linhao1.jpg │ │ ├── linhao3.jpg │ │ ├── login-bg5.jpeg │ │ ├── logo.png │ │ ├── sad.jpeg │ │ ├── similar-topics-header.webp │ │ ├── topic-rank.webp │ │ ├── user-rank-header.jpg │ │ └── user-rank-header.webp └── tinymce │ ├── icons │ └── default │ │ └── icons.min.js │ ├── langs │ ├── README.md │ └── zh-Hans.js │ ├── license.txt │ ├── models │ └── dom │ │ └── model.min.js │ ├── plugins │ ├── advlist │ │ └── plugin.min.js │ ├── anchor │ │ └── plugin.min.js │ ├── autolink │ │ └── plugin.min.js │ ├── autoresize │ │ └── plugin.min.js │ ├── autosave │ │ └── plugin.min.js │ ├── charmap │ │ └── plugin.min.js │ ├── code │ │ └── plugin.min.js │ ├── codesample │ │ └── plugin.min.js │ ├── directionality │ │ └── plugin.min.js │ ├── emoticons │ │ ├── js │ │ │ ├── emojiimages.js │ │ │ ├── emojiimages.min.js │ │ │ ├── emojis.js │ │ │ └── emojis.min.js │ │ └── plugin.min.js │ ├── fullscreen │ │ └── plugin.min.js │ ├── help │ │ └── plugin.min.js │ ├── image │ │ └── plugin.min.js │ ├── importcss │ │ └── plugin.min.js │ ├── insertdatetime │ │ └── plugin.min.js │ ├── link │ │ └── plugin.min.js │ ├── lists │ │ └── plugin.min.js │ ├── media │ │ └── plugin.min.js │ ├── nonbreaking │ │ └── plugin.min.js │ ├── pagebreak │ │ └── plugin.min.js │ ├── preview │ │ └── plugin.min.js │ ├── quickbars │ │ └── plugin.min.js │ ├── save │ │ └── plugin.min.js │ ├── searchreplace │ │ └── plugin.min.js │ ├── table │ │ └── plugin.min.js │ ├── template │ │ └── plugin.min.js │ ├── visualblocks │ │ └── plugin.min.js │ ├── visualchars │ │ └── plugin.min.js │ └── wordcount │ │ └── plugin.min.js │ ├── skins │ ├── content │ │ ├── dark │ │ │ └── content.min.css │ │ ├── default │ │ │ └── content.min.css │ │ ├── document │ │ │ └── content.min.css │ │ ├── tinymce-5-dark │ │ │ └── content.min.css │ │ ├── tinymce-5 │ │ │ └── content.min.css │ │ └── writer │ │ │ └── content.min.css │ └── ui │ │ ├── oxide-dark │ │ ├── content.inline.min.css │ │ ├── content.min.css │ │ ├── skin.min.css │ │ └── skin.shadowdom.min.css │ │ ├── oxide │ │ ├── content.inline.min.css │ │ ├── content.min.css │ │ ├── skin.min.css │ │ └── skin.shadowdom.min.css │ │ ├── tinymce-5-dark │ │ ├── content.inline.min.css │ │ ├── content.min.css │ │ ├── skin.min.css │ │ └── skin.shadowdom.min.css │ │ └── tinymce-5 │ │ ├── content.inline.min.css │ │ ├── content.min.css │ │ ├── skin.min.css │ │ └── skin.shadowdom.min.css │ ├── themes │ └── silver │ │ └── theme.min.js │ ├── tinymce.d.ts │ └── tinymce.min.js ├── src ├── App.vue ├── api │ ├── HomeCarousel.js │ ├── TopicSearch.js │ ├── UserRank.js │ ├── category.js │ ├── comment.js │ ├── image.js │ ├── login.js │ ├── message.js │ ├── photo.js │ ├── star.js │ ├── tag.js │ ├── topic.js │ └── user.js ├── assets │ └── logo.png ├── components │ ├── BaseContainer │ │ ├── BaseContainer.css │ │ └── BaseContainer.vue │ ├── CategoryCard │ │ ├── CategoryCard.css │ │ └── CategoryCard.vue │ ├── EditBoard │ │ ├── EditBoard.css │ │ └── EditBoard.vue │ ├── FloatImage │ │ ├── FloatImage.css │ │ └── FloatImage.vue │ ├── HelloWorld.vue │ ├── HomeCarousel │ │ └── HomeCarousel.vue │ ├── MaskImage │ │ ├── MaskImage.css │ │ └── MaskImage.vue │ ├── MyHeader │ │ ├── MyHeader.css │ │ ├── MyHeader.vue │ │ └── MyNavigation │ │ │ └── MyNavigation.vue │ ├── ShowTinymce │ │ └── ShowTinymce.vue │ ├── TagCard │ │ ├── TagCard.css │ │ └── TagCard.vue │ ├── TopicCard │ │ ├── TopicCard.css │ │ └── TopicCard.vue │ ├── TopicList │ │ ├── TopicList.css │ │ └── TopicList.vue │ └── TopicRank │ │ ├── TopicRank.css │ │ └── TopicRank.vue ├── config.js ├── main.js ├── router │ └── index.js ├── store │ └── index.js ├── utils │ ├── CommonUtils.js │ ├── MessageUtils.js │ ├── StringUtils.js │ ├── global.js │ ├── request.js │ ├── result.js │ └── utils.js └── views │ ├── About │ ├── About.css │ └── About.vue │ ├── Forum │ ├── Forum.css │ └── Forum.vue │ ├── Home │ ├── Home.css │ ├── Home.vue │ └── UserRank │ │ ├── UserRank.css │ │ └── UserRank.vue │ ├── Login │ ├── Login.css │ └── Login.vue │ ├── MyActivity │ ├── MyActivity.css │ ├── MyActivity.vue │ ├── MyCommentActivity │ │ ├── MyCommentActivity.css │ │ └── MyCommentActivity.vue │ ├── MyStarActivity │ │ ├── MyStarActivity.css │ │ └── MyStarActivity.vue │ └── MyTopicActivity │ │ ├── MyTopicActivity.css │ │ └── MyTopicActivity.vue │ ├── MyMessage │ ├── CommentMessage │ │ ├── CommentMessage.css │ │ └── CommentMessage.vue │ ├── MyMessage.css │ └── MyMessage.vue │ ├── MyProfile │ ├── MyProfile.css │ └── MyProfile.vue │ ├── PublishTopic │ ├── PublishTopic.css │ └── PublishTopic.vue │ ├── SearchImage │ ├── SearchImage.css │ └── SearchImage.vue │ ├── SearchTopic │ ├── SearchTopic.css │ └── SearchTopic.vue │ └── TopicInfo │ ├── PublishComment │ ├── PublishComment.css │ └── PublishComment.vue │ ├── TopicInfo.css │ ├── TopicInfo.vue │ └── UserComment │ ├── UserComment.css │ └── UserComment.vue └── vue.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | target 3 | 4 | /temp 5 | 6 | application-dev?.yml 7 | application-prod.yml 8 | application-prod?.yml 9 | application-server.yml 10 | application-server?.yml 11 | application-common-secret.yml 12 | application-qiniu.yml 13 | -------------------------------------------------------------------------------- /acimage_admin/.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/config/WebMvcConfig.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.config; 2 | 3 | import com.acimage.common.web.interceptor.AccessInterceptor; 4 | import com.acimage.common.web.interceptor.JwtInterceptor; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.context.annotation.Configuration; 8 | import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 9 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 10 | 11 | @Slf4j 12 | @Configuration 13 | public class WebMvcConfig implements WebMvcConfigurer { 14 | 15 | 16 | @Override 17 | public void addInterceptors(InterceptorRegistry registry) { 18 | 19 | 20 | registry.addInterceptor(new AccessInterceptor()).addPathPatterns("/**").order(30); 21 | } 22 | 23 | 24 | } 25 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/config/mybatis/GlobalConfigBean.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.config.mybatis; 2 | 3 | import com.baomidou.mybatisplus.core.MybatisConfiguration; 4 | import com.baomidou.mybatisplus.core.config.GlobalConfig; 5 | import org.springframework.boot.context.properties.ConfigurationProperties; 6 | import org.springframework.context.annotation.Bean; 7 | import org.springframework.context.annotation.Configuration; 8 | 9 | //@Configuration 10 | @Deprecated 11 | public class GlobalConfigBean { 12 | 13 | @Bean 14 | @ConfigurationProperties(prefix = "mybatis-plus.global-config") 15 | GlobalConfig globalConfig(){ 16 | return new GlobalConfig(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/dao/community/CategoryDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.dao.community; 2 | 3 | import com.acimage.common.model.domain.community.Category; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | public interface CategoryDao extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/dao/community/CommentDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.dao.community; 2 | 3 | import com.acimage.common.model.domain.community.Comment; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | public interface CommentDao extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/dao/community/HomeCarouselDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.dao.community; 2 | 3 | 4 | import com.acimage.common.model.domain.community.HomeCarousel; 5 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 6 | import org.apache.ibatis.annotations.Select; 7 | 8 | import java.util.List; 9 | 10 | 11 | public interface HomeCarouselDao extends BaseMapper { 12 | @Select("select coalesce(max(location),0) from tb_home_carousel") 13 | Integer getMaxLocation(); 14 | 15 | List count(); 16 | } 17 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/dao/community/TopicDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.dao.community; 2 | 3 | import com.acimage.common.model.domain.community.Topic; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | public interface TopicDao extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/dao/sys/ApiDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.dao.sys; 2 | 3 | import com.acimage.common.model.domain.sys.Api; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | public interface ApiDao extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/dao/sys/AuthorizeDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.dao.sys; 2 | 3 | import com.acimage.common.model.domain.sys.Authorize; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | public interface AuthorizeDao extends BaseMapper { 7 | 8 | 9 | } 10 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/dao/sys/PermissionDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.dao.sys; 2 | 3 | import com.acimage.common.model.domain.sys.Permission; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.apache.ibatis.annotations.Param; 6 | 7 | import javax.annotation.Nullable; 8 | import java.util.List; 9 | 10 | public interface PermissionDao extends BaseMapper { 11 | 12 | List selectTreeByParentId(@Nullable @Param("parentId") Integer parentId); 13 | 14 | List selectPermissionsWithParent(@Param("startIndex") int startIndex,@Param("recordNumber") int recordNumber); 15 | 16 | 17 | } 18 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/dao/sys/RoleDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.dao.sys; 2 | 3 | import com.acimage.common.model.domain.sys.Role; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | public interface RoleDao extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/dao/sys/UserRoleDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.dao.sys; 2 | 3 | 4 | import com.acimage.common.model.domain.sys.UserRole; 5 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 6 | 7 | public interface UserRoleDao extends BaseMapper { 8 | } 9 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/dao/user/UserDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.dao.user; 2 | 3 | import com.acimage.common.model.domain.user.User; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | public interface UserDao extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/dao/user/UserPrivacyDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.dao.user; 2 | 3 | import com.acimage.common.model.domain.user.UserPrivacy; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | public interface UserPrivacyDao extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/global/consts/ModuleConstants.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.global.consts; 2 | 3 | public class ModuleConstants { 4 | public static final String COMMUNITY="community"; 5 | public static final String SYS="sys"; 6 | 7 | public static final String IMAGE="image"; 8 | 9 | public static final String USER="user"; 10 | } 11 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/model/request/AdminLoginReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.model.request; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import javax.validation.constraints.Email; 9 | import javax.validation.constraints.Size; 10 | 11 | @Data 12 | @AllArgsConstructor 13 | @NoArgsConstructor 14 | public class AdminLoginReq { 15 | @Email(message = "邮箱格式错误") 16 | @Size(min=6,max=32,message = "邮箱长度在6到32之间") 17 | private String email; 18 | 19 | @Size(min = 100, max = 2000, message = "非法密码") 20 | String password; 21 | 22 | @Size(min=4,max=6,message = "验证码长度不符") 23 | String verifyCode; 24 | } 25 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/model/request/ApiQueryReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.model.request; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import javax.validation.constraints.Max; 8 | import javax.validation.constraints.Min; 9 | 10 | @Data 11 | @NoArgsConstructor 12 | @AllArgsConstructor 13 | public class ApiQueryReq { 14 | String keyword; 15 | @Min(1) 16 | Integer pageNo; 17 | @Min(2) 18 | @Max(20) 19 | Integer pageSize; 20 | } 21 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/model/request/CarouselAddReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.model.request; 2 | 3 | import com.acimage.common.model.domain.community.HomeCarousel; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import javax.validation.constraints.NotNull; 8 | import javax.validation.constraints.Size; 9 | 10 | @Data 11 | @NoArgsConstructor 12 | public class CarouselAddReq { 13 | @Size(min = HomeCarousel.DESC_MIN, max = HomeCarousel.DESC_MAX, message = HomeCarousel.DESC_INVALID_MSG) 14 | String description; 15 | @NotNull 16 | @Size(min = 0, max = HomeCarousel.LINK_MAX, message = HomeCarousel.LINK_INVALID_MSG) 17 | String link; 18 | 19 | } 20 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/model/request/CarouselModifyReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.model.request; 2 | 3 | import com.acimage.common.model.domain.community.HomeCarousel; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import javax.validation.constraints.NotNull; 8 | import javax.validation.constraints.Positive; 9 | import javax.validation.constraints.Size; 10 | 11 | @Data 12 | @NoArgsConstructor 13 | public class CarouselModifyReq { 14 | @NotNull 15 | @Positive 16 | private Integer id; 17 | @Size(min = HomeCarousel.DESC_MIN, max = HomeCarousel.DESC_MAX, message = HomeCarousel.DESC_INVALID_MSG) 18 | String description; 19 | @NotNull 20 | @Size(min = 0, max = HomeCarousel.LINK_MAX, message = HomeCarousel.LINK_INVALID_MSG) 21 | String link; 22 | 23 | } 24 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/model/request/CommentQueryReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.model.request; 2 | 3 | import lombok.Data; 4 | import lombok.NoArgsConstructor; 5 | import org.hibernate.validator.constraints.Range; 6 | 7 | import javax.validation.constraints.*; 8 | 9 | @Data 10 | @NoArgsConstructor 11 | public class CommentQueryReq { 12 | Long topicId; 13 | String keyword; 14 | @Range(min=1) 15 | Integer pageNo; 16 | @Range(min=5,max=20) 17 | Integer pageSize; 18 | } 19 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/model/request/PermissionAddReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.model.request; 2 | 3 | import com.acimage.common.model.domain.sys.Permission; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import javax.validation.constraints.NotNull; 8 | import javax.validation.constraints.Size; 9 | 10 | @Data 11 | @NoArgsConstructor 12 | public class PermissionAddReq { 13 | 14 | Integer parentId; 15 | @Size(max = Permission.CODE_MAX,message =Permission.CODE_VALIDATION_MSG) 16 | String code; 17 | @Size(max = Permission.NOTE_MAX,message =Permission.NOTE_VALIDATION_MSG) 18 | String note; 19 | @NotNull 20 | @Size(max = Permission.LABEL_MAX,message =Permission.LABEL_VALIDATION_MSG) 21 | String label; 22 | @NotNull 23 | Boolean module; 24 | } 25 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/model/request/PermissionModifyReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.model.request; 2 | 3 | import com.acimage.common.model.domain.sys.Permission; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import javax.validation.constraints.NotNull; 8 | import javax.validation.constraints.Positive; 9 | import javax.validation.constraints.Size; 10 | 11 | @Data 12 | @NoArgsConstructor 13 | public class PermissionModifyReq { 14 | @Positive 15 | Integer id; 16 | Integer parentId; 17 | @Size(max = Permission.CODE_MAX,message =Permission.CODE_VALIDATION_MSG) 18 | String code; 19 | @Size(max = Permission.NOTE_MAX,message =Permission.NOTE_VALIDATION_MSG) 20 | String note; 21 | @NotNull 22 | @Size(max = Permission.LABEL_MAX,message =Permission.LABEL_VALIDATION_MSG) 23 | String label; 24 | } 25 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/model/request/RoleAddReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.model.request; 2 | 3 | 4 | import com.acimage.common.model.domain.sys.Role; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import javax.validation.constraints.Size; 9 | 10 | @Data 11 | @NoArgsConstructor 12 | public class RoleAddReq { 13 | @Size(max= Role.ROLE_NAME_MAX,min=Role.ROLE_NAME_MIN,message = Role.ROLE_NAME_VALIDATION_MSG) 14 | String roleName; 15 | @Size(max=Role.NOTE_MAX,message = Role.NOTE_VALIDATION_MSG) 16 | String note; 17 | } 18 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/model/request/RoleModifyReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.model.request; 2 | 3 | import com.acimage.common.model.domain.sys.Role; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import javax.validation.constraints.Positive; 8 | import javax.validation.constraints.Size; 9 | 10 | @Data 11 | @NoArgsConstructor 12 | public class RoleModifyReq { 13 | 14 | 15 | @Positive 16 | Integer id; 17 | @Size(max= Role.ROLE_NAME_MAX,min=Role.ROLE_NAME_MIN,message = Role.ROLE_NAME_VALIDATION_MSG) 18 | String roleName; 19 | @Size(max=Role.NOTE_MAX,message = Role.NOTE_VALIDATION_MSG) 20 | String note; 21 | } 22 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/model/request/TopicQueryReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.model.request; 2 | 3 | import lombok.Data; 4 | import lombok.NoArgsConstructor; 5 | import org.hibernate.validator.constraints.Range; 6 | 7 | import javax.validation.constraints.*; 8 | 9 | @Data 10 | @NoArgsConstructor 11 | public class TopicQueryReq { 12 | @NotBlank 13 | String column; 14 | @Positive 15 | @NotNull 16 | Integer pageNo; 17 | @Range(min=5,max=20) 18 | Integer pageSize; 19 | } 20 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/model/request/UserQueryReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.model.request; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.*; 6 | 7 | @Data 8 | public class UserQueryReq { 9 | 10 | String keyword; 11 | @NotNull 12 | @Positive 13 | Integer pageNo; 14 | @Min(2) 15 | @Max(20) 16 | Integer pageSize; 17 | } 18 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/model/vo/WebsiteDataVo.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.model.vo; 2 | 3 | import lombok.Data; 4 | import lombok.NoArgsConstructor; 5 | 6 | @Data 7 | @NoArgsConstructor 8 | public class WebsiteDataVo { 9 | private Integer pageView; 10 | private Integer apiAccessCount; 11 | } 12 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/api/ApiQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.api; 2 | 3 | import com.acimage.admin.model.request.ApiQueryReq; 4 | import com.acimage.common.model.domain.sys.Api; 5 | import com.acimage.common.model.page.MyPage; 6 | 7 | public interface ApiQueryService { 8 | MyPage pageBy(ApiQueryReq apiQueryReq); 9 | } 10 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/api/ApiWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.api; 2 | 3 | import com.acimage.admin.model.request.ApiAddReq; 4 | import com.acimage.admin.model.request.ApiModifyReq; 5 | 6 | public interface ApiWriteService { 7 | void save(ApiAddReq apiAddReq); 8 | 9 | void update(ApiModifyReq apiModifyReq); 10 | 11 | void delete(int id); 12 | } 13 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/authorize/AuthorizeQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.authorize; 2 | 3 | import com.acimage.common.model.domain.sys.Authorize; 4 | 5 | import java.util.List; 6 | 7 | public interface AuthorizeQueryService { 8 | List listAuthorizeByRoleId(int roleId); 9 | } 10 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/authorize/AuthorizeWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.authorize; 2 | 3 | public interface AuthorizeWriteService { 4 | 5 | void save(int roleId, int permissionId); 6 | 7 | void remove(int roleId, int permissionId); 8 | 9 | void remove(int permissionId); 10 | } 11 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/category/CategoryQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.category; 2 | 3 | import com.acimage.common.model.domain.community.Category; 4 | 5 | import java.util.List; 6 | 7 | public interface CategoryQueryService { 8 | List listAll(); 9 | } 10 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/category/impl/CategoryQueryServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.category.impl; 2 | 3 | import com.acimage.admin.dao.community.CategoryDao; 4 | import com.acimage.admin.global.consts.ModuleConstants; 5 | import com.acimage.admin.service.category.CategoryQueryService; 6 | import com.acimage.common.model.domain.community.Category; 7 | import com.baomidou.dynamic.datasource.annotation.DS; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.List; 12 | 13 | @DS(ModuleConstants.COMMUNITY) 14 | @Service 15 | public class CategoryQueryServiceImpl implements CategoryQueryService { 16 | @Autowired 17 | CategoryDao categoryDao; 18 | 19 | @Override 20 | public List listAll(){ 21 | return categoryDao.selectList(null); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/comment/CommentQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.comment; 2 | 3 | import com.acimage.admin.model.request.CommentQueryReq; 4 | import com.acimage.common.model.domain.community.Comment; 5 | import com.acimage.common.model.page.MyPage; 6 | 7 | public interface CommentQueryService { 8 | MyPage pageCommentsBy(CommentQueryReq commentQueryReq); 9 | } 10 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/comment/CommentWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.comment; 2 | 3 | public interface CommentWriteService { 4 | void delete(long id); 5 | } 6 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/comment/impl/CommentWriteServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.comment.impl; 2 | 3 | 4 | import com.acimage.admin.global.consts.ModuleConstants; 5 | import com.acimage.admin.service.comment.CommentWriteService; 6 | import com.acimage.feign.client.CommentClient; 7 | import com.baomidou.dynamic.datasource.annotation.DS; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | @Service 12 | @DS(ModuleConstants.COMMUNITY) 13 | public class CommentWriteServiceImpl implements CommentWriteService { 14 | @Autowired 15 | private CommentClient client; 16 | 17 | @Override 18 | public void delete(long id){ 19 | client.delete(id); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/homecarousel/HomeCarouselQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.homecarousel; 2 | 3 | import com.acimage.common.model.domain.community.HomeCarousel; 4 | 5 | import java.util.List; 6 | 7 | public interface HomeCarouselQueryService { 8 | List listCurrent(); 9 | } 10 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/homecarousel/HomeCarouselWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.homecarousel; 2 | 3 | import com.acimage.admin.model.request.CarouselAddReq; 4 | import com.acimage.admin.model.request.CarouselModifyReq; 5 | import org.springframework.transaction.annotation.Transactional; 6 | import org.springframework.web.multipart.MultipartFile; 7 | 8 | public interface HomeCarouselWriteService { 9 | @Transactional(rollbackFor = Exception.class) 10 | void saveHomeCarouselImage(MultipartFile multipartFile, CarouselAddReq carouselAddReq); 11 | void deleteHomeCarouselImage(long id); 12 | void updateHomeCarouselImage(CarouselModifyReq modifyReq); 13 | @Transactional(rollbackFor = Exception.class) 14 | void coverHomeCarouselImage(long id, MultipartFile multipartFile); 15 | 16 | 17 | } 18 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/login/LoginService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.login; 2 | 3 | import com.acimage.admin.model.request.AdminLoginReq; 4 | 5 | public interface LoginService { 6 | String login(AdminLoginReq adminLoginReq); 7 | } 8 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/login/VerifyCodeService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.login; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import javax.servlet.http.HttpServletResponse; 5 | 6 | public interface VerifyCodeService { 7 | void writeCodeImageToResponseAndRecord(HttpServletRequest request, HttpServletResponse response); 8 | 9 | boolean verifyAndRemoveIfSuccess(HttpServletRequest request, String code); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/permission/PermissionQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.permission; 2 | 3 | import com.acimage.common.model.domain.sys.Permission; 4 | import com.acimage.common.model.page.MyPage; 5 | 6 | import java.util.List; 7 | 8 | public interface PermissionQueryService { 9 | Permission getPermission(int id); 10 | 11 | List getPermissionTree(); 12 | 13 | MyPage pagePermissionsWithParent(int pageNo, int pageSize); 14 | 15 | 16 | List listByModule(boolean isModule); 17 | } 18 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/permission/PermissionWriteSercice.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.permission; 2 | 3 | import com.acimage.admin.model.request.PermissionAddReq; 4 | import com.acimage.admin.model.request.PermissionModifyReq; 5 | import org.springframework.transaction.annotation.Transactional; 6 | 7 | public interface PermissionWriteSercice { 8 | void save(PermissionAddReq permissionAddReq); 9 | 10 | @Transactional 11 | void remove(int id); 12 | 13 | @Transactional 14 | void update(PermissionModifyReq permissionModifyReq); 15 | } 16 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/role/RoleQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.role; 2 | 3 | import com.acimage.common.model.domain.sys.Role; 4 | 5 | import java.util.List; 6 | 7 | public interface RoleQueryService { 8 | List listAll(); 9 | } 10 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/role/RoleWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.role; 2 | 3 | import com.acimage.admin.model.request.RoleAddReq; 4 | import com.acimage.admin.model.request.RoleModifyReq; 5 | 6 | public interface RoleWriteService { 7 | 8 | 9 | void save(RoleAddReq roleAddReq); 10 | 11 | void remove(long id); 12 | 13 | void update(RoleModifyReq roleModifyReq); 14 | } 15 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/role/impl/RoleQueryServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.role.impl; 2 | 3 | import com.acimage.admin.dao.sys.RoleDao; 4 | import com.acimage.admin.service.role.RoleQueryService; 5 | import com.acimage.common.model.domain.sys.Role; 6 | import com.baomidou.dynamic.datasource.annotation.DS; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Service; 9 | 10 | import java.util.List; 11 | 12 | @Service 13 | @DS("sys") 14 | public class RoleQueryServiceImpl implements RoleQueryService { 15 | @Autowired 16 | RoleDao roleDao; 17 | 18 | @Override 19 | public List listAll(){ 20 | return roleDao.selectList(null); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/topic/TopicQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.topic; 2 | 3 | import com.acimage.admin.model.request.TopicQueryReq; 4 | import com.acimage.common.model.domain.community.Topic; 5 | import com.acimage.common.model.page.MyPage; 6 | 7 | public interface TopicQueryService { 8 | MyPage listOrderByColumn(TopicQueryReq topicQueryReq); 9 | 10 | Integer getTopicCount(); 11 | } 12 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/topic/TopicWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.topic; 2 | 3 | public interface TopicWriteService { 4 | void remove(long topicId); 5 | } 6 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/user/UserQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.user; 2 | 3 | import com.acimage.admin.model.request.UserQueryReq; 4 | import com.acimage.common.model.domain.user.User; 5 | import com.acimage.common.model.page.MyPage; 6 | 7 | public interface UserQueryService { 8 | MyPage listBy(UserQueryReq userQueryReq); 9 | 10 | User getUser(long userId); 11 | } 12 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/user/UserWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.user; 2 | 3 | public interface UserWriteService { 4 | } 5 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/user/impl/UserWriteServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.user.impl; 2 | 3 | import com.acimage.admin.global.consts.ModuleConstants; 4 | import com.baomidou.dynamic.datasource.annotation.DS; 5 | import org.springframework.stereotype.Service; 6 | 7 | @Service 8 | @DS(ModuleConstants.USER) 9 | public class UserWriteServiceImpl { 10 | } 11 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/userrole/UserRoleQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.userrole; 2 | 3 | import com.acimage.common.model.domain.sys.UserRole; 4 | 5 | import java.util.List; 6 | import java.util.Map; 7 | 8 | public interface UserRoleQueryService { 9 | Map> listUserIdWithRoleIds(List userIds); 10 | 11 | UserRole getUserRole(long userId, int roleId); 12 | } 13 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/userrole/UserRoleWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.userrole; 2 | 3 | import java.util.List; 4 | import java.util.Map; 5 | 6 | public interface UserRoleWriteService { 7 | void save(long userId, int roleId); 8 | 9 | void remove(long userId, int roleId); 10 | } 11 | -------------------------------------------------------------------------------- /acimage_admin/src/main/java/com/acimage/admin/service/websitedata/WebsiteDataService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service.websitedata; 2 | 3 | import com.acimage.admin.model.vo.WebsiteDataVo; 4 | 5 | public interface WebsiteDataService { 6 | WebsiteDataVo getWebsiteData(); 7 | } 8 | -------------------------------------------------------------------------------- /acimage_admin/src/main/resources/mapper/image/HomeCarouselMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /acimage_admin/src/test/java/com/acimage/admin/AdminApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin; 2 | 3 | 4 | import com.acimage.common.deprecated.QiniuUtils; 5 | import org.junit.jupiter.api.Test; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.boot.test.context.SpringBootTest; 8 | 9 | import java.io.File; 10 | 11 | @SpringBootTest 12 | class AdminApplicationTest { 13 | @Autowired 14 | QiniuUtils qiniuUtils; 15 | 16 | @Test 17 | void qiniuUtilsTest() { 18 | File file = new File("F:\\MyImage\\素材\\bg2.png"); 19 | qiniuUtils.upload(file,"test/xlg.png"); 20 | } 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | } 29 | -------------------------------------------------------------------------------- /acimage_admin/src/test/java/com/acimage/admin/dao/community/TopicDaoTest.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.dao.community; 2 | 3 | 4 | import org.junit.jupiter.api.Test; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.boot.test.context.SpringBootTest; 7 | 8 | @SpringBootTest 9 | public class TopicDaoTest { 10 | 11 | @Autowired 12 | TopicDao topicDao; 13 | 14 | @Test 15 | void testSelectAll(){ 16 | System.out.println(topicDao.selectList(null)); 17 | 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /acimage_admin/src/test/java/com/acimage/admin/dao/sys/ApiDaoTest.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.dao.sys; 2 | 3 | 4 | import com.acimage.common.global.enums.MatchRule; 5 | import com.acimage.common.model.domain.sys.Api; 6 | import org.junit.jupiter.api.Test; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.boot.test.context.SpringBootTest; 9 | import org.springframework.http.HttpMethod; 10 | 11 | @SpringBootTest 12 | public class ApiDaoTest { 13 | 14 | @Autowired 15 | ApiDao apiDao; 16 | 17 | 18 | @Test 19 | void testSelect(){ 20 | System.out.println(apiDao.selectList(null)); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /acimage_admin/src/test/java/com/acimage/admin/service/HomeCarouselWriteServiceTest.java: -------------------------------------------------------------------------------- 1 | package com.acimage.admin.service; 2 | 3 | import com.acimage.admin.service.homecarousel.HomeCarouselWriteService; 4 | import org.junit.jupiter.api.Test; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.boot.test.context.SpringBootTest; 7 | 8 | @SpringBootTest 9 | public class HomeCarouselWriteServiceTest { 10 | 11 | @Autowired 12 | HomeCarouselWriteService homeCarouselWriteService; 13 | 14 | 15 | } 16 | -------------------------------------------------------------------------------- /acimage_common/.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | /src/main/resources/application-qiniu.yml 3 | -------------------------------------------------------------------------------- /acimage_common/lib/webp-imageio-core-0.1.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/acimage_common/lib/webp-imageio-core-0.1.0.jar -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/CommonMain.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common; 2 | 3 | 4 | public class CommonMain { 5 | public static void main(String[] args) { 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/deprecated/UserCommunityStatistic.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.deprecated; 2 | 3 | import com.acimage.common.model.domain.community.CmtyUser; 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Data; 8 | import lombok.NoArgsConstructor; 9 | 10 | 11 | @Data 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | @Deprecated 15 | public class UserCommunityStatistic { 16 | @TableId 17 | Long userId; 18 | Integer topicCount; 19 | Integer starCount; 20 | @TableField(exist = false) 21 | CmtyUser cmtyUser; 22 | } 23 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/deprecated/annotation/Authentication.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.deprecated.annotation; 2 | 3 | import com.acimage.common.global.enums.AuthenticationType; 4 | 5 | import java.lang.annotation.ElementType; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.RetentionPolicy; 8 | import java.lang.annotation.Target; 9 | 10 | /** 11 | * 注解上的类或方法表示不需要登录后才能访问 12 | */ 13 | @Target({ElementType.METHOD,ElementType.TYPE}) 14 | @Retention(RetentionPolicy.RUNTIME) 15 | public @interface Authentication { 16 | AuthenticationType type() default AuthenticationType.TOKEN_REQUIRED; 17 | 18 | } 19 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/global/consts/EsConstants.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.global.consts; 2 | 3 | public class EsConstants { 4 | public static final String IK_SMART="ik_smart"; 5 | public static final String IK_MAX_WORD="ik_max_word"; 6 | } 7 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/global/consts/FileFormatConstants.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.global.consts; 2 | 3 | import java.util.Arrays; 4 | import java.util.List; 5 | 6 | public class FileFormatConstants { 7 | public static List ALLOWED_IMAGE_FORMAT = Arrays.asList("jpeg", "jpg", "png"); 8 | public static List ALLOWED_CAROUSEL_FORMAT = Arrays.asList("jpeg", "jpg", "png","webp"); 9 | public static List ALLOWED_COVER_IMAGE_FORMAT = Arrays.asList("jpeg", "jpg", "png","webp"); 10 | public static final String WEBP="webp"; 11 | public static final String WEBP_CONTENT_TYPE="image/webp"; 12 | } 13 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/global/consts/HeaderKeyConstants.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.global.consts; 2 | 3 | public class HeaderKeyConstants { 4 | public static final String AUTHORIZATION="authorization"; 5 | public static final String FEIGN_X_USER_IP ="x-origin-user-ip"; 6 | 7 | public static final String SEC_WEBSOCKET_PROTOCOL="Sec-WebSocket-Protocol"; 8 | } 9 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/global/consts/JwtConstants.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.global.consts; 2 | 3 | public class JwtConstants { 4 | 5 | public static final int USER_EXPIRE_DAYS = 2; 6 | public static final int ADMIN_EXPIRE_DAYS = 1; 7 | 8 | public static final String KEY_USERNAME="username"; 9 | public static final String KEY_USER_ID="userId"; 10 | public static final String KEY_PHOTO_URL="photoUrl"; 11 | } 12 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/global/consts/StorePrefixConstants.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.global.consts; 2 | 3 | public class StorePrefixConstants { 4 | public final static String TOPIC_IMAGE="topicImage"; 5 | public final static String USER_PHOTO="userPhoto"; 6 | public final static String COVER_IMAGE="coverImage"; 7 | public final static String HOME_CAROUSEL="homeCarousel"; 8 | } 9 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/global/consts/SysKeyConstants.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.global.consts; 2 | 3 | public class SysKeyConstants { 4 | 5 | /** 6 | * 记录网站浏览量 7 | */ 8 | public static final String LOGK_PAGE_VIEW="acimage:admin:websiteData:pageView"; 9 | /** 10 | * 记录接口访问次数 11 | */ 12 | public static final String STRINGK_INTERFACE_TOTAL="acimage:admin:websiteData:interface:total"; 13 | 14 | public static final String STRINGK_INTERFACE_SUCCESS="acimage:admin:websiteData:interface:success"; 15 | 16 | public static final String STRINGK_INTERFACE_FAILURE="acimage:admin:websiteData:interface:failure"; 17 | } 18 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/global/consts/TimeConstants.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.global.consts; 2 | 3 | public class TimeConstants { 4 | 5 | public static final long DAY_SECONDS=24*60*60; 6 | } 7 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/global/enums/AuthenticationType.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.global.enums; 2 | 3 | public enum AuthenticationType { 4 | NONE(0), 5 | TOKEN_REQUIRED(1), 6 | ADMIN(2); 7 | 8 | private final int key; 9 | AuthenticationType(int key) { 10 | this.key = key; 11 | } 12 | 13 | public int getKey() { 14 | return this.key; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/global/enums/MatchRule.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.global.enums; 2 | 3 | /** 4 | * interface表中匹配规则 5 | */ 6 | public enum MatchRule { 7 | /** 8 | * 精确匹配 9 | */ 10 | EXACT(1), 11 | /** 12 | * 匹配前缀 13 | */ 14 | PREFIX(2); 15 | 16 | private final int key; 17 | 18 | MatchRule(int key) { 19 | this.key = key; 20 | } 21 | 22 | public int getKey() { 23 | return this.key; 24 | } 25 | 26 | public static MatchRule from(int key){ 27 | for(MatchRule matchRule:MatchRule.values()){ 28 | if(matchRule.getKey()==key){ 29 | return matchRule; 30 | } 31 | } 32 | return null; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/global/enums/MyHttpMethod.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.global.enums; 2 | 3 | import org.springframework.http.HttpMethod; 4 | 5 | public enum MyHttpMethod { 6 | GET, 7 | POST, 8 | PUT, 9 | DELETE, 10 | ALL; 11 | 12 | public static MyHttpMethod from(HttpMethod method) { 13 | try { 14 | return MyHttpMethod.valueOf(method.toString()); 15 | } catch (IllegalArgumentException e) { 16 | return null; 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/global/enums/ServiceType.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.global.enums; 2 | 3 | public enum ServiceType { 4 | ADD, 5 | DELETE, 6 | UPDATE 7 | } 8 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/global/enums/TokenStatus.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.global.enums; 2 | 3 | public enum TokenStatus { 4 | PASS_TOKEN_VERIFY(0), 5 | NULL(1), 6 | EXPIRE(2), 7 | INVALID(3), 8 | MISMATCH_IP(4), 9 | VALID(5); 10 | private final int key; 11 | 12 | TokenStatus(int key) { 13 | this.key = key; 14 | } 15 | 16 | public int getKey() { 17 | return this.key; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/global/exception/BaseException.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.global.exception; 2 | 3 | import com.acimage.common.result.Result; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | import lombok.Setter; 8 | 9 | 10 | @Getter 11 | @Setter 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public abstract class BaseException extends RuntimeException{ 15 | Integer code; 16 | String msg; 17 | 18 | public Result asResult(){ 19 | return new Result(code,null,msg); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/global/exception/BusinessException.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.global.exception; 2 | 3 | import com.acimage.common.result.Code; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | 8 | @Getter 9 | @Setter 10 | @AllArgsConstructor 11 | public class BusinessException extends BaseException{ 12 | 13 | public BusinessException(String msg){ 14 | this.msg=msg; 15 | this.code= Code.ERR; 16 | } 17 | 18 | public BusinessException(Integer code, String msg) { 19 | super(code, msg); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/global/exception/NullTokenException.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.global.exception; 2 | 3 | import com.auth0.jwt.exceptions.JWTVerificationException; 4 | 5 | public class NullTokenException extends JWTVerificationException { 6 | 7 | public NullTokenException(String message){super(message);} 8 | } 9 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/global/exception/SystemException.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.global.exception; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import lombok.Setter; 7 | 8 | @Getter 9 | @Setter 10 | @AllArgsConstructor 11 | public class SystemException extends BaseException{ 12 | 13 | } 14 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/model/domain/community/CmtyUser.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.model.domain.community; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableId; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Data 9 | @NoArgsConstructor 10 | @AllArgsConstructor 11 | public class CmtyUser { 12 | @TableId 13 | Long id; 14 | String username; 15 | String photoUrl; 16 | Integer topicCount; 17 | Integer starCount; 18 | } 19 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/model/domain/community/Star.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.model.domain.community; 2 | 3 | import com.acimage.common.model.domain.community.Topic; 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.fasterxml.jackson.annotation.JsonFormat; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.util.Date; 10 | 11 | @Data 12 | @NoArgsConstructor 13 | public class Star { 14 | private Long userId; 15 | private Long topicId; 16 | 17 | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 18 | private Date createTime; 19 | 20 | @TableField(exist = false) 21 | Topic topic; 22 | 23 | public Star(Long userId, Long topicId) { 24 | this.userId = userId; 25 | this.topicId = topicId; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/model/domain/community/Tag.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.model.domain.community; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableLogic; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Data; 9 | import lombok.NoArgsConstructor; 10 | 11 | import java.util.Date; 12 | 13 | @Data 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class Tag { 17 | @TableId(type = IdType.AUTO) 18 | Integer id; 19 | String label; 20 | private Date createTime; 21 | private Date updateTime; 22 | @TableLogic(delval = "1") 23 | boolean deleted; 24 | } 25 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/model/domain/community/TagTopic.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.model.domain.community; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableLogic; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Data; 9 | import lombok.NoArgsConstructor; 10 | 11 | import java.util.Date; 12 | 13 | @Data 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | @Builder 17 | public class TagTopic { 18 | 19 | @TableId(type = IdType.AUTO) 20 | Long id; 21 | Long topicId; 22 | Integer tagId; 23 | private Date createTime; 24 | @TableLogic(delval = "1") 25 | boolean deleted; 26 | } 27 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/model/domain/sys/Authorize.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.model.domain.sys; 2 | 3 | 4 | import com.baomidou.mybatisplus.annotation.IdType; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.fasterxml.jackson.annotation.JsonFormat; 7 | import lombok.AllArgsConstructor; 8 | import lombok.Data; 9 | import lombok.NoArgsConstructor; 10 | 11 | import java.util.Date; 12 | 13 | @Data 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class Authorize { 17 | @TableId(type = IdType.AUTO) 18 | Integer id; 19 | Integer roleId; 20 | Integer permissionId; 21 | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") 22 | private Date createTime; 23 | 24 | public Authorize(Integer roleId, Integer permissionId) { 25 | this.roleId = roleId; 26 | this.permissionId = permissionId; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/model/domain/sys/UserRole.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.model.domain.sys; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.util.Date; 10 | 11 | @Data 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class UserRole { 15 | @TableId(type = IdType.INPUT) 16 | private Long id; 17 | private Long userId; 18 | private Integer roleId; 19 | private Date createTime; 20 | } 21 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/model/domain/user/CommentMsg.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.model.domain.user; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableField; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Builder; 8 | import lombok.Data; 9 | import lombok.NoArgsConstructor; 10 | 11 | import java.util.Date; 12 | 13 | @Data 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | @Builder 17 | public class CommentMsg { 18 | @TableId(type = IdType.INPUT) 19 | Long commentId; 20 | String content; 21 | Long fromUserId; 22 | Long toUserId; 23 | Long topicId; 24 | String topicTitle; 25 | Date createTime; 26 | @TableField(exist = false) 27 | User user; 28 | } 29 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/model/domain/user/UserMsg.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.model.domain.user; 2 | 3 | 4 | import com.baomidou.mybatisplus.annotation.IdType; 5 | import com.baomidou.mybatisplus.annotation.TableField; 6 | import com.baomidou.mybatisplus.annotation.TableId; 7 | import lombok.AllArgsConstructor; 8 | import lombok.Data; 9 | import lombok.NoArgsConstructor; 10 | 11 | import java.util.Date; 12 | import java.util.List; 13 | 14 | @Data 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | public class UserMsg { 18 | @TableId(type= IdType.INPUT) 19 | private Long userId; 20 | private Integer commentMsgCount; 21 | private Integer starMsgCount; 22 | 23 | private Date readCommentTime; 24 | private Date readStarTime; 25 | 26 | } 27 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/model/mq/dto/EsAddDto.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.model.mq.dto; 2 | 3 | import lombok.*; 4 | 5 | 6 | @Getter 7 | @Setter 8 | @NoArgsConstructor 9 | public class EsAddDto extends ObjectWithClass { 10 | public EsAddDto(Object obj){ 11 | this.with(obj); 12 | } 13 | 14 | @Override 15 | public String toString() { 16 | return super.toString(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/model/mq/dto/EsDeleteDto.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.model.mq.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | @Data 8 | @NoArgsConstructor 9 | @AllArgsConstructor 10 | public class EsDeleteDto { 11 | String id; 12 | Class type; 13 | } 14 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/model/mq/dto/EsUpdateByIdDto.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.model.mq.dto; 2 | 3 | import lombok.*; 4 | 5 | import java.util.List; 6 | 7 | @Getter 8 | @Setter 9 | @NoArgsConstructor 10 | public class EsUpdateByIdDto extends ObjectWithClass { 11 | List columns; 12 | 13 | @Override 14 | public String toString() { 15 | return columns+super.toString(); 16 | } 17 | // List> columns; 18 | 19 | } 20 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/model/mq/dto/EsUpdateByTermDto.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.model.mq.dto; 2 | 3 | import lombok.Data; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | import java.util.List; 9 | 10 | @Getter 11 | @Setter 12 | @NoArgsConstructor 13 | public class EsUpdateByTermDto extends ObjectWithClass{ 14 | String termColumn; 15 | List columns; 16 | 17 | @Override 18 | public String toString() { 19 | return "EsUpdateByTermDto{" + 20 | "termColumn='" + termColumn + '\'' + 21 | ", columns=" + columns + 22 | '}'+super.toString(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/model/mq/dto/ImageIdWithUrl.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.model.mq.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | @Data 8 | @AllArgsConstructor 9 | @NoArgsConstructor 10 | public class ImageIdWithUrl { 11 | private Long imageId; 12 | private String url; 13 | } 14 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/model/mq/dto/ObjectWithClass.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.model.mq.dto; 2 | 3 | import com.acimage.common.utils.common.JacksonUtils; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * 用于序列化时候传输 10 | */ 11 | @Data 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class ObjectWithClass { 15 | private String json; 16 | private Class type; 17 | 18 | public void with(Object obj){ 19 | this.setJson(JacksonUtils.writeValueAsString(obj)); 20 | this.setType(obj.getClass()); 21 | } 22 | 23 | /** 24 | * 千万别写成getObject,否则会导致序列化出错 25 | */ 26 | public Object object(){ 27 | return JacksonUtils.convert(json,type); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/model/mq/dto/SyncImagesUpdateDto.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.model.mq.dto; 2 | 3 | import com.acimage.common.global.enums.ServiceType; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.util.List; 10 | 11 | @Builder 12 | @Data 13 | @NoArgsConstructor 14 | @AllArgsConstructor 15 | public class SyncImagesUpdateDto { 16 | private Long topicId; 17 | /** 18 | * 话题内新增的图片链接 19 | */ 20 | private List addImageUrls; 21 | /** 22 | * 话题内移除的图片链接 23 | */ 24 | private List removeImageUrls; 25 | 26 | private ServiceType serviceType; 27 | } 28 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/model/mq/dto/UserIdWithPhotoUrl.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.model.mq.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | @Data 8 | @AllArgsConstructor 9 | @NoArgsConstructor 10 | public class UserIdWithPhotoUrl { 11 | private Long userId; 12 | private String photoUrl; 13 | } 14 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/model/mq/dto/UserIdWithUsername.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.model.mq.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | @Data 8 | @AllArgsConstructor 9 | @NoArgsConstructor 10 | public class UserIdWithUsername { 11 | private Long userId; 12 | private String username; 13 | } 14 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/model/page/MyPage.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.model.page; 2 | 3 | 4 | import com.baomidou.mybatisplus.core.metadata.IPage; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.util.List; 10 | 11 | @Data 12 | @AllArgsConstructor 13 | @NoArgsConstructor 14 | public class MyPage { 15 | int totalCount; 16 | List dataList; 17 | 18 | public static MyPage from(IPage page){ 19 | return new MyPage<>((int)page.getTotal(),page.getRecords()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/redis/annotation/KeyParam.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.redis.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * 和@QueryRedis配合使用,被注解的参数作为redis键的后缀,可以有多个 10 | * 但只能有一个KeyParam设置spValues和expire 11 | */ 12 | @Target({ElementType.FIELD,ElementType.PARAMETER}) 13 | @Retention(RetentionPolicy.RUNTIME) 14 | public @interface KeyParam { 15 | /** 16 | * 后缀取这些值时,过期时间根据本身的expire设置 17 | */ 18 | String[] specials() default {}; 19 | 20 | /** 21 | * 对应的过期时间 22 | */ 23 | long[] expires() default {}; 24 | } 25 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/redis/annotation/QueryRedis.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.redis.annotation; 2 | 3 | import com.acimage.common.redis.enums.DataType; 4 | 5 | import java.lang.annotation.ElementType; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.RetentionPolicy; 8 | import java.lang.annotation.Target; 9 | import java.util.concurrent.TimeUnit; 10 | 11 | @Target({ElementType.METHOD}) 12 | @Retention(RetentionPolicy.RUNTIME) 13 | public @interface QueryRedis { 14 | 15 | String keyPrefix() ; 16 | /** 17 | * expire<=0并且参数中没有@KeyParam设置了expire时,不会设置到redis, 18 | */ 19 | long expire() default 1L; 20 | TimeUnit unit() default TimeUnit.MINUTES; 21 | DataType dataType() default DataType.STRING; 22 | 23 | } 24 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/redis/annotation/RequestLimit.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.redis.annotation; 2 | 3 | 4 | import com.acimage.common.redis.enums.LimitTarget; 5 | 6 | import java.lang.annotation.ElementType; 7 | import java.lang.annotation.Retention; 8 | import java.lang.annotation.RetentionPolicy; 9 | import java.lang.annotation.Target; 10 | import java.util.concurrent.TimeUnit; 11 | 12 | @Target({ElementType.METHOD}) 13 | @Retention(RetentionPolicy.RUNTIME) 14 | public @interface RequestLimit { 15 | 16 | long[] limitTimes(); 17 | long[] durations(); 18 | long[] penaltyTimes(); 19 | LimitTarget[] targets(); 20 | TimeUnit unit() default TimeUnit.SECONDS; 21 | } 22 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/redis/enums/DataType.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.redis.enums; 2 | 3 | public enum DataType { 4 | STRING, 5 | HASH; 6 | } 7 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/redis/enums/LimitTarget.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.redis.enums; 2 | 3 | public enum LimitTarget { 4 | USER, 5 | IP, 6 | ALL, 7 | } 8 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/result/Code.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.result; 2 | 3 | public class Code { 4 | public static final Integer SAVE_ERR=20010; 5 | 6 | public static final Integer OK=20000; 7 | public static final Integer ERR=20001; 8 | 9 | public static final Integer SYSTEM_ERR=50001; 10 | public static final Integer BUSINESS_ERR=50002; 11 | 12 | public static final Integer DATA_NOT_EXIST=20011; 13 | public static final Integer PARAM_INVALID =40001; 14 | public static final Integer TOKEN_ERR=40011; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/result/Result.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.result; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Data 9 | @AllArgsConstructor 10 | @NoArgsConstructor 11 | public class Result { 12 | private Integer code; 13 | private T data; 14 | private String msg; 15 | public static Result fail(String message){ 16 | return new Result(Code.ERR,null,message); 17 | } 18 | public static Result ok(){ 19 | return new Result(Code.OK,null,""); 20 | } 21 | public static Result ok(T data){ 22 | return new Result(Code.OK,data,""); 23 | } 24 | public static boolean isOk(Result result){ 25 | return Code.OK.equals(result.getCode()); 26 | } 27 | 28 | public Boolean isOk(){ 29 | return Code.OK.equals(code); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/service/TokenService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.service; 2 | 3 | public interface TokenService { 4 | 5 | 6 | Boolean hasRecorded(String token); 7 | 8 | String createAndRecordToken(long userId, String username, String photoUrl,int expireDays); 9 | 10 | void record(String token, int expireDays); 11 | 12 | void invalidate(String token); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/utils/ExceptionUtils.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.utils; 2 | 3 | public class ExceptionUtils { 4 | 5 | public static void printIfDev(Throwable e){ 6 | if(SpringContextUtils.isDev()){ 7 | e.printStackTrace(); 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/utils/IdGenerator.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.utils; 2 | 3 | import cn.hutool.core.util.IdUtil; 4 | 5 | public class IdGenerator { 6 | public static long getSnowflakeNextId(){ 7 | return IdUtil.getSnowflakeNextId(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/utils/RsaUtils.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.utils; 2 | 3 | import cn.hutool.crypto.asymmetric.KeyType; 4 | import cn.hutool.crypto.asymmetric.RSA; 5 | 6 | public class RsaUtils { 7 | private static final String privateKey; 8 | private static final String publicKey; 9 | 10 | static { 11 | RSA rsa = new RSA(); 12 | privateKey=rsa.getPrivateKeyBase64(); 13 | publicKey =rsa.getPublicKeyBase64(); 14 | } 15 | public static String decrypt(String privateKeyBase64,String encryptBase64){ 16 | RSA rsa=new RSA(privateKeyBase64,null); 17 | return rsa.decryptStr(encryptBase64, KeyType.PrivateKey); 18 | } 19 | 20 | public static String getPrivateKey(){ 21 | return privateKey; 22 | } 23 | public static String getPublicKey(){ 24 | return publicKey; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /acimage_common/src/main/java/com/acimage/common/utils/common/ArrayUtils.java: -------------------------------------------------------------------------------- 1 | package com.acimage.common.utils.common; 2 | 3 | import javax.validation.constraints.NotNull; 4 | import java.util.Arrays; 5 | import java.util.List; 6 | 7 | public class ArrayUtils { 8 | 9 | public static Integer firstIndexOf(String[] strs, String targetStr){ 10 | for(int i=0;i=0 then 19 | redis.call('expire',KEYS[i],ARGV[2*len+i]) 20 | end 21 | end 22 | result[i]=res 23 | end 24 | return result 25 | -------------------------------------------------------------------------------- /acimage_common/src/main/resources/lua/setIfPresentForFieldKey.lua: -------------------------------------------------------------------------------- 1 | --如果KEYS[1]的hash key ARGV[1]存在,则将其它设置为ARGV[2],并返回增加后的值 2 | --否则返回nil 3 | local base = redis.call('hget',KEYS[1],ARGV[1]) 4 | if not base then 5 | return nil 6 | end 7 | if redis.call('hset',KEYS[1],ARGV[1],ARGV[2])==1 then 8 | return true 9 | else 10 | return false 11 | end 12 | -------------------------------------------------------------------------------- /acimage_community/lib/webp-imageio-core-0.1.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/acimage_community/lib/webp-imageio-core-0.1.0.jar -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/dao/CategoryDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.dao; 2 | 3 | 4 | import com.acimage.common.model.domain.community.Category; 5 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 6 | 7 | public interface CategoryDao extends BaseMapper { 8 | } 9 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/dao/HomeCarrouselDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.dao; 2 | 3 | 4 | import com.acimage.common.model.domain.community.HomeCarousel; 5 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 6 | 7 | public interface HomeCarrouselDao extends BaseMapper { 8 | } 9 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/dao/ImageDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.dao; 2 | 3 | import cn.hutool.core.lang.Pair; 4 | import com.acimage.common.model.domain.image.Image; 5 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 6 | import org.apache.ibatis.annotations.Param; 7 | import org.apache.ibatis.annotations.Select; 8 | 9 | import java.util.List; 10 | 11 | public interface ImageDao extends BaseMapper { 12 | 13 | Integer insertList(List images); 14 | 15 | Integer updateDescription(List> idAndDescriptions); 16 | 17 | @Select("select * from tb_image where topic_id=#{topicId} order by id") 18 | List selectListOrderById(@Param("topicId") long topicId); 19 | 20 | 21 | List selectImagesWithTopic(List imageIds); 22 | } 23 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/dao/TagDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.dao; 2 | 3 | import com.acimage.common.model.domain.community.Tag; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.apache.ibatis.annotations.Select; 6 | 7 | import java.util.List; 8 | 9 | public interface TagDao extends BaseMapper { 10 | 11 | 12 | } 13 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/dao/TagTopicDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.dao; 2 | 3 | import com.acimage.common.model.domain.community.TagTopic; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.apache.ibatis.annotations.Param; 6 | import org.apache.ibatis.annotations.Select; 7 | 8 | import java.util.List; 9 | 10 | public interface TagTopicDao extends BaseMapper { 11 | 12 | void insertBatch(List tagTopicList); 13 | 14 | @Select("select tag_id from tb_tag_topic where topic_id=#{topicId} and deleted=0") 15 | List selectTagIds(@Param("topicId") long topicId); 16 | } 17 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/dao/TopicHtmlDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.dao; 2 | 3 | import com.acimage.common.model.domain.community.TopicHtml; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | public interface TopicHtmlDao extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/depreted/UserMixWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.depreted; 2 | 3 | import com.acimage.common.model.domain.community.CmtyUser; 4 | 5 | public interface UserMixWriteService { 6 | void addUserBasicAndUserCommunityStatistic(CmtyUser cmtyUser); 7 | } 8 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/depreted/UserMixWriteServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.depreted; 2 | 3 | import com.acimage.common.model.domain.community.CmtyUser; 4 | import com.acimage.community.service.cmtyuser.CmtyUserWriteService; 5 | import com.acimage.community.depreted.UserMixWriteService; 6 | import com.acimage.community.depreted.userstatistic.UserCsWriteService; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | 9 | 10 | public class UserMixWriteServiceImpl implements UserMixWriteService { 11 | @Autowired 12 | CmtyUserWriteService cmtyUserWriteService; 13 | @Autowired 14 | UserCsWriteService userCsWriteService; 15 | 16 | @Override 17 | public void addUserBasicAndUserCommunityStatistic(CmtyUser cmtyUser){ 18 | cmtyUserWriteService.save(cmtyUser); 19 | userCsWriteService.save(cmtyUser.getId()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/depreted/userstatistic/UserCsQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.depreted.userstatistic; 2 | 3 | import com.acimage.common.deprecated.UserCommunityStatistic; 4 | import com.acimage.common.redis.annotation.QueryRedis; 5 | import com.acimage.community.depreted.userstatistic.consts.KeyConstants; 6 | 7 | public interface UserCsQueryService { 8 | @QueryRedis(keyPrefix = KeyConstants.STRINGKP_CMTY_USER,expire = 10L) 9 | UserCommunityStatistic getUserCommunityStatistic(long userId); 10 | } 11 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/depreted/userstatistic/UserCsRankService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.depreted.userstatistic; 2 | 3 | import com.acimage.common.model.domain.user.User; 4 | import com.acimage.common.redis.annotation.QueryRedis; 5 | 6 | import java.util.List; 7 | 8 | public interface UserCsRankService { 9 | 10 | @QueryRedis(keyPrefix = "acimage:community:users:rank:topicCount",expire = 5L) 11 | List pageUserRankByTopicCount(int pageNo, int pageSize); 12 | 13 | @QueryRedis(keyPrefix = "acimage:community:users:rank:starCount",expire = 5L) 14 | List pageUserRankByStarCount(int pageNo, int pageSize); 15 | } 16 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/depreted/userstatistic/UserCsWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.depreted.userstatistic; 2 | 3 | import org.apache.ibatis.annotations.Param; 4 | 5 | import java.util.List; 6 | 7 | public interface UserCsWriteService { 8 | Integer updateStarCountByIncrements(List userIds, List starCounts); 9 | 10 | Integer updateTopicCountByIncrements(List userIds, List starCounts); 11 | 12 | Integer updateTopicCountByIncrement(long userId, int increment); 13 | 14 | Integer updateStarCountByIncrement(long userId, int increment); 15 | 16 | void save(long userId); 17 | } 18 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/depreted/userstatistic/consts/KeyConstants.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.depreted.userstatistic.consts; 2 | 3 | public class KeyConstants { 4 | 5 | public static final String STRINGKP_CMTY_USER ="acimage:community:cmtyUser:userId:"; 6 | } 7 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/esdao/UserEsDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.esdao; 2 | 3 | import com.acimage.common.model.Index.TopicIndex; 4 | import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | @Repository 8 | public interface UserEsDao extends ElasticsearchRepository { 9 | 10 | } -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/global/annotation/RecordPageView.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.global.annotation; 2 | 3 | 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * 带有该注解的接口,被调用时会记录到对应话题的浏览量中 11 | */ 12 | @Target({ElementType.METHOD}) 13 | @Retention(RetentionPolicy.RUNTIME) 14 | public @interface RecordPageView { 15 | } 16 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/global/annotation/TopicId.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.global.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * 注解在参数或javabean对象的成员变量上 10 | */ 11 | @Target({ElementType.FIELD,ElementType.PARAMETER}) 12 | @Retention(RetentionPolicy.RUNTIME) 13 | public @interface TopicId { 14 | } 15 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/global/config/JobFactory.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.global.config; 2 | 3 | import org.quartz.spi.TriggerFiredBundle; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.beans.factory.config.AutowireCapableBeanFactory; 6 | import org.springframework.scheduling.quartz.AdaptableJobFactory; 7 | 8 | 9 | 10 | public class JobFactory extends AdaptableJobFactory { 11 | @Autowired 12 | private AutowireCapableBeanFactory capableBeanFactory; 13 | 14 | @Override 15 | protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { 16 | // 调用父类的方法 17 | Object jobInstance = super.createJobInstance(bundle); 18 | // 进行注入 19 | capableBeanFactory.autowireBean(jobInstance); 20 | return jobInstance; 21 | } 22 | } 23 | 24 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/global/consts/CommentKeyConstants.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.global.consts; 2 | 3 | public class CommentKeyConstants { 4 | public static final String STRINGKP_COMMENT_COUNT = "acimage:community:comments:commentCount:topicId:"; 5 | public static final String STRINGKP_TOPIC_COMMENTS = "acimage:community:comments:topicId:pageNo:"; 6 | public static final String STRINGKP_USER_COMMENTS = "acimage:community:comments:userId:pageNo:"; 7 | 8 | public static final String STRINGKP_PUBLISHED_COMMENTS = "acimage:community:comments:published:userId:"; 9 | 10 | public static String keyOfTopicComments(long topicId, int pageNo) { 11 | return String.format("%s%s:%s", STRINGKP_TOPIC_COMMENTS, topicId, pageNo); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/global/consts/CoverImageConstants.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.global.consts; 2 | 3 | public class CoverImageConstants { 4 | public static final int WIDTH=405; 5 | public static final int HEIGHT=390; 6 | //压缩后大小不能超过40kb 7 | public static final int LIMIT_COMPRESS_SIZE =40*1000; 8 | } 9 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/global/consts/PageSizeConstants.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.global.consts; 2 | 3 | public class PageSizeConstants { 4 | public static final int TOPIC_COMMENTS =10; 5 | public static final int ACTIVITY_TOPICS =5; 6 | public static final int ACTIVITY_COMMENTS =5; 7 | public static final int ACTIVITY_STARS =5; 8 | public static final int FORUM_TOPICS =12; 9 | } 10 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/global/consts/StarKeyConstants.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.global.consts; 2 | 3 | public class StarKeyConstants { 4 | public static final String STRINGKP_TOPIC_STAR_COUNT = "acimage:community:stars:starCount:topicId:"; 5 | public static final String STRINGKP_USER_STAR_COUNT = "acimage:community:stars:starCount:userId:"; 6 | public static final String STRINGKP_STAR_USER_TOPIC = "acimage:community:stars:isStar:userId:topicId:"; 7 | 8 | public static String keyOfIsStar(long userId, long topicId) { 9 | return STRINGKP_STAR_USER_TOPIC + userId + ":" + topicId; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/listener/CommentEventListener.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.listener; 2 | 3 | 4 | import com.acimage.community.listener.event.CommentEvent; 5 | import org.springframework.context.ApplicationListener; 6 | import org.springframework.stereotype.Component; 7 | 8 | @Component 9 | public class CommentEventListener implements ApplicationListener { 10 | 11 | @Override 12 | public void onApplicationEvent(CommentEvent event) { 13 | //增加用户发表话题数 14 | 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/listener/PublishTopicEventListener.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.listener; 2 | 3 | 4 | import com.acimage.community.listener.event.TopicEvent; 5 | import com.acimage.community.service.cmtyuser.CmtyUserWriteService; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.context.ApplicationListener; 8 | import org.springframework.stereotype.Component; 9 | 10 | @Component 11 | public class PublishTopicEventListener implements ApplicationListener { 12 | @Autowired 13 | CmtyUserWriteService cmtyUserWriteService; 14 | 15 | @Override 16 | public void onApplicationEvent(TopicEvent event) { 17 | //增加用户发表话题数 18 | cmtyUserWriteService.updateTopicCountByIncrement(event.getUserId(),1); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/listener/StarEventListener.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.listener; 2 | 3 | 4 | import com.acimage.community.listener.event.StarEvent; 5 | import com.acimage.community.service.cmtyuser.CmtyUserWriteService; 6 | import com.acimage.community.service.topic.TopicSpAttrWriteService; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.context.ApplicationListener; 9 | import org.springframework.stereotype.Component; 10 | 11 | @Component 12 | public class StarEventListener implements ApplicationListener { 13 | @Autowired 14 | CmtyUserWriteService cmtyUserWriteService; 15 | @Autowired 16 | TopicSpAttrWriteService topicSpAttrWriteService; 17 | 18 | @Override 19 | public void onApplicationEvent(StarEvent event) { 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/listener/event/CommentEvent.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.listener.event; 2 | 3 | 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import org.springframework.context.ApplicationEvent; 7 | 8 | @Getter 9 | @Setter 10 | public class CommentEvent extends ApplicationEvent { 11 | private Long userId; 12 | private Long topicId; 13 | 14 | public CommentEvent(Object source, Long userId, Long topicId) { 15 | super(source); 16 | this.userId = userId; 17 | this.topicId = topicId; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/listener/event/StarEvent.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.listener.event; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import org.springframework.context.ApplicationEvent; 6 | 7 | 8 | @Getter 9 | @Setter 10 | public class StarEvent extends ApplicationEvent { 11 | Long topicId; 12 | Long ownerId; 13 | Long fromUserId; 14 | 15 | public StarEvent(Object source, Long topicId, Long ownerId, Long fromUserId) { 16 | super(source); 17 | this.topicId = topicId; 18 | this.ownerId = ownerId; 19 | this.fromUserId = fromUserId; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/listener/event/TopicEvent.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.listener.event; 2 | 3 | 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import org.springframework.context.ApplicationEvent; 7 | 8 | @Getter 9 | @Setter 10 | public class TopicEvent extends ApplicationEvent { 11 | private Long userId; 12 | private Long topicId; 13 | 14 | public TopicEvent(Object source, Long userId, Long topicId) { 15 | super(source); 16 | this.userId = userId; 17 | this.topicId = topicId; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/model/request/CommentAddReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.model.request; 2 | 3 | 4 | import com.acimage.common.model.domain.community.Comment; 5 | import lombok.Data; 6 | 7 | import javax.validation.constraints.NotNull; 8 | import javax.validation.constraints.Positive; 9 | import javax.validation.constraints.Size; 10 | 11 | @Data 12 | public class CommentAddReq { 13 | 14 | @Positive 15 | @NotNull(message = "话题id不能为空") 16 | private Long topicId; 17 | 18 | @Size(min = Comment.CONTENT_MIN, max = Comment.CONTENT_MAX, message = Comment.CONTENT_VALIDATION_MSG) 19 | private String content; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/model/request/CommentModifyReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.model.request; 2 | 3 | 4 | import com.acimage.common.model.domain.community.Comment; 5 | import lombok.Data; 6 | 7 | import javax.validation.constraints.NotNull; 8 | import javax.validation.constraints.Positive; 9 | import javax.validation.constraints.Size; 10 | 11 | @Data 12 | public class CommentModifyReq { 13 | 14 | @Positive 15 | @NotNull(message = "id不能为空") 16 | Long id; 17 | 18 | @Size(min = Comment.CONTENT_MIN, max = Comment.CONTENT_MAX, message = Comment.CONTENT_VALIDATION_MSG) 19 | String content; 20 | } 21 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/model/request/TopicModifyHtmlReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.model.request; 2 | 3 | import com.acimage.common.model.domain.community.TopicHtml; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import javax.validation.constraints.Positive; 8 | import javax.validation.constraints.Size; 9 | 10 | 11 | @Data 12 | @NoArgsConstructor 13 | public class TopicModifyHtmlReq { 14 | @Positive 15 | Long id; 16 | @Size(min = TopicHtml.HTML_MIN, max = TopicHtml.HTML_MAX, message = TopicHtml.HTML_VALIDATION_MSG) 17 | private String html; 18 | } 19 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/model/request/TopicQueryByCategoryIdReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.model.request; 2 | 3 | import com.acimage.community.global.enums.SortMode; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | import org.hibernate.validator.constraints.Range; 7 | 8 | 9 | import javax.validation.constraints.NotNull; 10 | import javax.validation.constraints.Positive; 11 | 12 | @Data 13 | @NoArgsConstructor 14 | public class TopicQueryByCategoryIdReq { 15 | @Positive 16 | @NotNull 17 | private Integer categoryId; 18 | @Range(min=1,max=100,message = "页码在1到100之间") 19 | private Integer pageNo; 20 | @Range(min=4,max=20,message = "页大小在4到20之间") 21 | private Integer pageSize; 22 | private SortMode sortMode; 23 | } 24 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/model/request/TopicQueryBySortReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.model.request; 2 | 3 | import com.acimage.community.global.enums.SortMode; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | import org.hibernate.validator.constraints.Range; 7 | 8 | import javax.validation.constraints.NotNull; 9 | 10 | @Data 11 | @NoArgsConstructor 12 | public class TopicQueryBySortReq { 13 | @Range(min=1,max=100,message = "页码在1到100之间") 14 | private Integer pageNo; 15 | @Range(min=4,max=20,message = "页大小在4到20之间") 16 | private Integer pageSize; 17 | @NotNull 18 | private SortMode sortMode; 19 | } 20 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/model/request/TopicQueryByTagIdReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.model.request; 2 | 3 | import com.acimage.community.global.enums.SortMode; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import javax.validation.constraints.Max; 8 | import javax.validation.constraints.Min; 9 | import javax.validation.constraints.NotNull; 10 | import javax.validation.constraints.Positive; 11 | 12 | @Data 13 | @NoArgsConstructor 14 | public class TopicQueryByTagIdReq { 15 | @Positive 16 | @NotNull 17 | private Integer tagId; 18 | @Min(1) 19 | @Max(50) 20 | private Integer pageNo; 21 | @Min(1) 22 | @Max(20) 23 | private Integer pageSize; 24 | private SortMode sortMode; 25 | } 26 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/model/request/TopicSearchReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.model.request; 2 | 3 | 4 | import com.acimage.community.global.enums.SortMode; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import javax.validation.constraints.Max; 10 | import javax.validation.constraints.NotNull; 11 | import javax.validation.constraints.Positive; 12 | import javax.validation.constraints.Size; 13 | 14 | @Data 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | public class TopicSearchReq { 18 | 19 | 20 | private Integer categoryId; 21 | private Integer tagId; 22 | @Positive 23 | @NotNull 24 | @Max(30) 25 | private Integer pageNo; 26 | @Size(max = 15, message = "搜索字数不超过15") 27 | private String search; 28 | private SortMode sortMode; 29 | } 30 | 31 | 32 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/model/request/UserLoginReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.model.request; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.Size; 6 | 7 | @Data 8 | public class UserLoginReq { 9 | 10 | @Size(min = 2, max = 12, message = "用户名长度在2到12之间") 11 | private String username; 12 | 13 | @Size(min = 100, max = 2000, message = "非法密码") 14 | String password; 15 | } 16 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/model/request/UserRegisterReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.model.request; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import javax.validation.constraints.*; 8 | 9 | 10 | @Data 11 | @NoArgsConstructor 12 | @AllArgsConstructor 13 | public class UserRegisterReq { 14 | 15 | @Size(min=2,max=12,message = "用户名长度在2到12之间") 16 | private String username; 17 | 18 | @Size(min=100,max=2000,message = "非法密码") 19 | String password; 20 | 21 | @Email(message = "邮箱格式错误") 22 | @Size(min=6,max=32,message = "邮箱长度在6到32之间") 23 | private String email; 24 | } 25 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/mq/producer/UserMsgMqProducer.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.mq.producer; 2 | 3 | import com.acimage.common.global.consts.MqConstants; 4 | import com.acimage.common.model.domain.user.CommentMsg; 5 | import org.springframework.amqp.rabbit.core.RabbitTemplate; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Component 10 | public class UserMsgMqProducer { 11 | 12 | @Autowired 13 | RabbitTemplate rabbitTemplate; 14 | 15 | public void sendCommentMessage(CommentMsg commentMsg) { 16 | rabbitTemplate.convertAndSend(MqConstants.COMMUNITY_USER_EXCHANGE, MqConstants.USER_MSG_ROUTE, commentMsg); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/runner/CreateIndexRunner.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.runner; 2 | 3 | import com.acimage.common.model.Index.TopicIndex; 4 | import com.acimage.common.utils.EsUtils; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.boot.ApplicationArguments; 8 | import org.springframework.boot.ApplicationRunner; 9 | import org.springframework.stereotype.Component; 10 | 11 | @Slf4j 12 | @Component 13 | public class CreateIndexRunner implements ApplicationRunner { 14 | 15 | @Autowired 16 | EsUtils esUtils; 17 | 18 | 19 | @Override 20 | public void run(ApplicationArguments args) { 21 | esUtils.createIndexIfNotExist(TopicIndex.class); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/categoty/CategoryQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.categoty; 2 | 3 | import com.acimage.common.model.domain.community.Category; 4 | 5 | import java.util.List; 6 | 7 | public interface CategoryQueryService { 8 | List listAll(); 9 | } 10 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/categoty/impl/CategoryQueryServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.categoty.impl; 2 | 3 | import com.acimage.common.model.domain.community.Category; 4 | import com.acimage.community.dao.CategoryDao; 5 | import com.acimage.community.service.categoty.CategoryQueryService; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.List; 10 | 11 | @Service 12 | public class CategoryQueryServiceImpl implements CategoryQueryService { 13 | 14 | @Autowired 15 | CategoryDao categoryDao; 16 | 17 | @Override 18 | public List listAll(){ 19 | return categoryDao.selectList(null); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/cmtyuser/CmtyUserQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.cmtyuser; 2 | 3 | import com.acimage.common.model.domain.community.CmtyUser; 4 | import com.acimage.common.redis.annotation.QueryRedis; 5 | import com.acimage.common.redis.enums.DataType; 6 | import com.acimage.community.depreted.userstatistic.consts.KeyConstants; 7 | 8 | public interface CmtyUserQueryService { 9 | @QueryRedis(keyPrefix = KeyConstants.STRINGKP_CMTY_USER, expire = 10L, dataType = DataType.HASH) 10 | CmtyUser getCmtyUser(long userId); 11 | } 12 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/cmtyuser/CmtyUserRankService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.cmtyuser; 2 | 3 | import com.acimage.common.model.domain.community.CmtyUser; 4 | import com.acimage.common.model.page.MyPage; 5 | import com.acimage.common.redis.annotation.QueryRedis; 6 | 7 | import java.util.List; 8 | 9 | public interface CmtyUserRankService { 10 | MyPage pageUserRankBy(String column, int pageNo, int pageSize); 11 | 12 | @QueryRedis(keyPrefix = "acimage:community:users:rank:topicCount:",expire = 5L) 13 | List pageUserRankByTopicCount(int pageNo, int pageSize); 14 | 15 | @QueryRedis(keyPrefix = "acimage:community:users:rank:starCount:",expire = 5L) 16 | List pageUserRankByStarCount(int pageNo, int pageSize); 17 | } 18 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/cmtyuser/CmtyUserWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.cmtyuser; 2 | 3 | import com.acimage.common.model.domain.community.CmtyUser; 4 | import org.springframework.transaction.annotation.Transactional; 5 | 6 | import java.util.List; 7 | 8 | public interface CmtyUserWriteService { 9 | void updateUsername(long userId, String username); 10 | 11 | void updatePhotoUrl(long userId, String photoUrl); 12 | 13 | @Transactional 14 | void save(CmtyUser cmtyUser); 15 | 16 | Integer updateStarCountByIncrements(List userIds, List starCounts); 17 | 18 | Integer updateTopicCountByIncrements(List userIds, List starCounts); 19 | 20 | Integer updateTopicCountByIncrement(long userId, int increment); 21 | 22 | Integer updateStarCountByIncrement(long userId, int increment); 23 | } 24 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/comment/CommentInfoQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.comment; 2 | 3 | import com.acimage.common.model.domain.community.Comment; 4 | import com.acimage.common.model.page.MyPage; 5 | 6 | import java.util.List; 7 | 8 | public interface CommentInfoQueryService { 9 | List pageCommentsWithUser(long topicId, int pageNo,int pageSize); 10 | 11 | MyPage pageCommentsWithTopicOrderByCreateTime(long userId, int pageNo,int pageSize); 12 | } 13 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/comment/CommentQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.comment; 2 | 3 | import com.acimage.common.model.domain.community.Comment; 4 | 5 | public interface CommentQueryService { 6 | Comment getComment(long commentId); 7 | Integer getCommentCount(long topicId); 8 | } 9 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/comment/CommentWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.comment; 2 | 3 | import com.acimage.community.model.request.CommentAddReq; 4 | import com.acimage.community.model.request.CommentModifyReq; 5 | import org.springframework.transaction.annotation.Transactional; 6 | 7 | public interface CommentWriteService { 8 | 9 | Integer saveComment(CommentAddReq commentAddReq); 10 | 11 | 12 | Integer removeComment(long commentId); 13 | 14 | Integer removeCommentWithoutVerification(long commentId); 15 | 16 | Integer removeComments(long topicId); 17 | 18 | Integer updateComment(CommentModifyReq commentModifyReq); 19 | 20 | } 21 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/comment/annotation/Operation.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.comment.annotation; 2 | 3 | public enum Operation { 4 | ADD, 5 | SUB, 6 | REMOVE_ALL 7 | } 8 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/comment/annotation/UpdateCcByReturn.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.comment.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * 根据被注解的方法的返回值更改对应评论的话题数 10 | */ 11 | @Retention(RetentionPolicy.RUNTIME) 12 | @Target(ElementType.METHOD) 13 | public @interface UpdateCcByReturn { 14 | Operation operation() default Operation.ADD; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/homecarousel/HomeCarouselQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.homecarousel; 2 | 3 | import com.acimage.common.model.domain.community.HomeCarousel; 4 | 5 | import java.util.List; 6 | 7 | public interface HomeCarouselQueryService { 8 | 9 | List listAll(); 10 | } 11 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/star/StarMixQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.star; 2 | 3 | import com.acimage.common.model.domain.community.Star; 4 | import com.acimage.common.model.page.MyPage; 5 | 6 | public interface StarMixQueryService { 7 | MyPage pageStarsWithTopic(long userId, int pageNo); 8 | } 9 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/star/StarQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.star; 2 | 3 | public interface StarQueryService { 4 | boolean isStar(long userId,long topicId); 5 | 6 | Integer getTopicStarCount(long topicId); 7 | 8 | Integer getStarCountOwnedBy(long userId); 9 | } 10 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/star/StarWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.star; 2 | 3 | 4 | public interface StarWriteService { 5 | 6 | 7 | void saveStar(long userId,long topicId); 8 | 9 | void removeStar(long userId,long topicId); 10 | 11 | void removeStars(long topicId); 12 | 13 | 14 | } 15 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/tag/TagQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.tag; 2 | 3 | import com.acimage.common.model.domain.community.Tag; 4 | 5 | import java.util.List; 6 | 7 | public interface TagQueryService { 8 | List listAll(); 9 | 10 | List checkAndListTags(List tagIds); 11 | } 12 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/tag/TagTopicQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.tag; 2 | 3 | import java.util.List; 4 | 5 | public interface TagTopicQueryService { 6 | List listTagIds(long topicId); 7 | } 8 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/tag/TagTopicWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.tag; 2 | 3 | import java.util.List; 4 | 5 | public interface TagTopicWriteService { 6 | void save(long topicId, List tagIdList); 7 | 8 | void remove(long topicId); 9 | } 10 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/tag/TagWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.tag; 2 | 3 | import java.util.List; 4 | 5 | public interface TagWriteService { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/tag/impl/TagTopicQueryServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.tag.impl; 2 | 3 | import com.acimage.common.redis.annotation.QueryRedis; 4 | import com.acimage.community.dao.TagTopicDao; 5 | import com.acimage.community.service.tag.TagTopicQueryService; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.List; 10 | 11 | @Service 12 | public class TagTopicQueryServiceImpl implements TagTopicQueryService { 13 | @Autowired 14 | TagTopicDao tagTopicDao; 15 | 16 | @QueryRedis(keyPrefix = "acimage:community:tags:topicId:") 17 | @Override 18 | public List listTagIds(long topicId){ 19 | return tagTopicDao.selectTagIds(topicId); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/tag/impl/TagWriteServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.tag.impl; 2 | 3 | import com.acimage.community.service.tag.TagWriteService; 4 | import org.springframework.stereotype.Service; 5 | 6 | @Service 7 | public class TagWriteServiceImpl implements TagWriteService { 8 | } 9 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/topic/TopicHtmlQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.topic; 2 | 3 | import com.acimage.common.model.domain.community.TopicHtml; 4 | 5 | public interface TopicHtmlQueryService { 6 | 7 | TopicHtml getTopicHtml(long topicId); 8 | } 9 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/topic/TopicHtmlWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.topic; 2 | 3 | import com.acimage.common.model.domain.community.TopicHtml; 4 | 5 | public interface TopicHtmlWriteService { 6 | TopicHtml save(long topicId, String html); 7 | 8 | void remove(long topicId); 9 | 10 | void update(long topicId, String html); 11 | } 12 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/topic/TopicInfoQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.topic; 2 | 3 | import com.acimage.common.model.domain.community.Topic; 4 | import com.acimage.common.model.page.MyPage; 5 | import com.acimage.community.global.enums.TopicAttribute; 6 | import com.acimage.community.model.vo.TopicInfoVo; 7 | 8 | import java.util.List; 9 | 10 | public interface TopicInfoQueryService { 11 | Topic getTopicWithUserTagIds(long topicId); 12 | TopicInfoVo getTopicInfoAndFirstCommentPage(long topicId); 13 | MyPage pageUserTopicsInfoOrderByCreateTime(long userId, int pageNo, int pageSize); 14 | List listTopicsInfoSortBy(TopicAttribute attribute, int pageNo, int pageSize); 15 | 16 | List listRandomTopicsInRank(int size); 17 | 18 | MyPage pageTopicsInfoRankByActivityTime(int pageNo, int pageSize); 19 | } 20 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/topic/TopicPreheatService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.topic; 2 | 3 | import com.acimage.community.global.enums.TopicAttribute; 4 | 5 | import java.util.concurrent.TimeUnit; 6 | 7 | public interface TopicPreheatService { 8 | void preheatTopicsOrderBy(TopicAttribute attr, int rankSize, int cacheSize, long timeout, TimeUnit timeUnit); 9 | } 10 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/topic/TopicQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.topic; 2 | 3 | import com.acimage.common.model.domain.community.Topic; 4 | 5 | import java.util.List; 6 | 7 | public interface TopicQueryService { 8 | Topic getTopic(long id); 9 | List listTopicWithUser(List ids); 10 | List listTopicsByIds(List ids); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/topic/TopicRankQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.topic; 2 | 3 | import cn.hutool.core.lang.Pair; 4 | import com.acimage.community.global.enums.TopicAttribute; 5 | 6 | import java.util.List; 7 | 8 | 9 | /** 10 | * 负责话题的 浏览量、收藏数、评论数、最新活跃时间 相关的服务 11 | */ 12 | public interface TopicRankQueryService { 13 | 14 | List listTopicIdsInRank(TopicAttribute topicAttribute, int pageNo, int pageSize); 15 | 16 | List listRandomTopicIdsInRank(TopicAttribute topicAttribute, int size); 17 | 18 | List> listTopicIdWithScoresInRank(TopicAttribute topicAttribute, int pageNo, int pageSize); 19 | Integer countTopicIdsInRank(TopicAttribute topicAttribute); 20 | 21 | } 22 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/topic/TopicRankWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.topic; 2 | 3 | import com.acimage.common.model.domain.community.Topic; 4 | import com.acimage.community.global.enums.TopicAttribute; 5 | 6 | import javax.validation.constraints.NotNull; 7 | 8 | public interface TopicRankWriteService { 9 | 10 | void updateRank(TopicAttribute attr, long topicId, double newScore); 11 | 12 | void updateRank(TopicAttribute attr, @NotNull Topic topic); 13 | } 14 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/topic/TopicSpAttrQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.topic; 2 | 3 | import com.acimage.common.model.domain.community.Topic; 4 | import com.acimage.community.global.enums.TopicAttribute; 5 | 6 | import java.util.Date; 7 | 8 | public interface TopicSpAttrQueryService { 9 | Integer getPageView(long topicId); 10 | Date getActivityTime(long topicId); 11 | Integer getStarCount(long topicId); 12 | Integer getCommentCount(long topicId); 13 | void setAttrIntoTopic(Topic topic, TopicAttribute... attrs); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/topic/TopicSpAttrWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.topic; 2 | 3 | import java.util.Date; 4 | import java.util.List; 5 | 6 | public interface TopicSpAttrWriteService { 7 | void removeAttributes(long topicId); 8 | void updateStarCountByIncrement(List topicIds,List increments); 9 | void updateCommentCountByIncrement(List topicIds,List increments); 10 | void updatePageViewByIncrement(List topicIds,List increments); 11 | void updateBatchActivityTime(List topicIds, List activityTimes); 12 | void changeActivityTime(long topicId, Date date); 13 | 14 | void increaseStarCount(long topicId, int increment); 15 | void increaseCommentCount(long topicId, int increment); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/service/topic/TopicWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service.topic; 2 | 3 | import com.acimage.common.model.domain.community.Topic; 4 | import com.acimage.community.model.request.TopicModifyHtmlReq; 5 | 6 | public interface TopicWriteService { 7 | void save(Topic topic); 8 | void remove(long id); 9 | void update(long id,String title,String content); 10 | 11 | void updateTitle(long id, String title); 12 | 13 | void updateContent(TopicModifyHtmlReq topicModifyHtmlReq); 14 | 15 | void updateContent(long id, String content); 16 | } 17 | -------------------------------------------------------------------------------- /acimage_community/src/main/java/com/acimage/community/utils/RsaUtils.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.utils; 2 | 3 | import cn.hutool.crypto.asymmetric.KeyType; 4 | import cn.hutool.crypto.asymmetric.RSA; 5 | 6 | public class RsaUtils { 7 | private static final String privateKey; 8 | private static final String publicKey; 9 | 10 | static { 11 | RSA rsa = new RSA(); 12 | privateKey=rsa.getPrivateKeyBase64(); 13 | publicKey =rsa.getPublicKeyBase64(); 14 | } 15 | public static String decrypt(String privateKeyBase64,String encryptBase64){ 16 | RSA rsa=new RSA(privateKeyBase64,null); 17 | return rsa.decryptStr(encryptBase64, KeyType.PrivateKey); 18 | } 19 | 20 | public static String getPrivateKey(){ 21 | return privateKey; 22 | } 23 | public static String getPublicKey(){ 24 | return publicKey; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /acimage_community/src/main/resources/mapper/TagTopicMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | insert into tb_tag_topic(id,topic_id,tag_id,create_time) values 9 | 10 | (#{item.id},#{item.topicId},#{item.tagId},#{item.createTime}) 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /acimage_community/src/test/java/com/acimage/community/CommunityApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class CommunityApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /acimage_community/src/test/java/com/acimage/community/dao/ImageDaoTest.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.dao; 2 | 3 | 4 | import org.junit.jupiter.api.Test; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.boot.test.context.SpringBootTest; 7 | 8 | import java.util.Arrays; 9 | import java.util.List; 10 | 11 | @SpringBootTest 12 | public class ImageDaoTest { 13 | @Autowired 14 | ImageDao imageDao; 15 | 16 | @Test 17 | public void selectImagesWithTopic(){ 18 | List imageIds= Arrays.asList(1572508721903943680L,1572508721903943681L); 19 | System.out.println(imageDao.selectImagesWithTopic(imageIds)); 20 | 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /acimage_community/src/test/java/com/acimage/community/dao/StarDaoTest.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.dao; 2 | 3 | 4 | 5 | import org.junit.jupiter.api.Test; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.boot.test.context.SpringBootTest; 8 | 9 | 10 | 11 | @SpringBootTest 12 | public class StarDaoTest { 13 | @Autowired 14 | StarDao starDao; 15 | 16 | 17 | @Test 18 | public void countStarsByUserId(){ 19 | 20 | long userId=1572443275490078720L; 21 | System.out.println(starDao.countStarsOwnedBy(userId)); 22 | 23 | 24 | 25 | } 26 | 27 | @Test 28 | public void countSelectStarsWithTopic(){ 29 | 30 | long userId=1572443275490078720L; 31 | System.out.println(starDao.selectStarsWithTopicOrderByCreateTime(userId,1,5)); 32 | 33 | } 34 | 35 | 36 | } 37 | -------------------------------------------------------------------------------- /acimage_community/src/test/java/com/acimage/community/service/CommentWriteServiceTest.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service; 2 | 3 | import com.acimage.common.model.domain.community.Comment; 4 | import com.acimage.community.service.comment.CommentInfoQueryService; 5 | import org.junit.jupiter.api.Test; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.boot.test.context.SpringBootTest; 8 | 9 | import java.util.List; 10 | 11 | @SpringBootTest 12 | public class CommentWriteServiceTest { 13 | @Autowired 14 | CommentInfoQueryService commentIInfoService; 15 | 16 | } 17 | 18 | -------------------------------------------------------------------------------- /acimage_community/src/test/java/com/acimage/community/service/TopicEsSearchServiceTest.java: -------------------------------------------------------------------------------- 1 | package com.acimage.community.service; 2 | 3 | import com.acimage.community.service.topic.TopicEsSearchService; 4 | import org.junit.jupiter.api.Test; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.boot.test.context.SpringBootTest; 7 | 8 | @SpringBootTest 9 | public class TopicEsSearchServiceTest { 10 | @Autowired 11 | TopicEsSearchService topicEsSearchService; 12 | 13 | } 14 | 15 | -------------------------------------------------------------------------------- /acimage_feign/src/main/java/com/acimage/feign/FeignMain.java: -------------------------------------------------------------------------------- 1 | package com.acimage.feign; 2 | 3 | /** 4 | * Hello world! 5 | * 6 | */ 7 | public class FeignMain 8 | { 9 | public static void main( String[] args ) { 10 | 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /acimage_feign/src/main/java/com/acimage/feign/client/CmtyUserClient.java: -------------------------------------------------------------------------------- 1 | package com.acimage.feign.client; 2 | 3 | 4 | import com.acimage.common.model.domain.community.CmtyUser; 5 | import com.acimage.common.result.Result; 6 | import com.acimage.feign.fallback.CmtyUserClientFallbackFactory; 7 | import org.springframework.cloud.openfeign.FeignClient; 8 | import org.springframework.web.bind.annotation.GetMapping; 9 | import org.springframework.web.bind.annotation.PathVariable; 10 | 11 | @FeignClient(value="community-service/community/cmtyUsers",fallbackFactory = CmtyUserClientFallbackFactory.class) 12 | public interface CmtyUserClient { 13 | 14 | @GetMapping("/userId/{userId}") 15 | Result queryCmtyUser(@PathVariable Long userId); 16 | } 17 | -------------------------------------------------------------------------------- /acimage_feign/src/main/java/com/acimage/feign/client/CommentClient.java: -------------------------------------------------------------------------------- 1 | package com.acimage.feign.client; 2 | 3 | 4 | import com.acimage.common.result.Result; 5 | import com.acimage.feign.fallback.CommentClientFallbackFactory; 6 | import org.springframework.cloud.openfeign.FeignClient; 7 | import org.springframework.web.bind.annotation.DeleteMapping; 8 | import org.springframework.web.bind.annotation.PathVariable; 9 | 10 | 11 | import java.util.List; 12 | 13 | @FeignClient(value="community-service/community/comments",fallbackFactory = CommentClientFallbackFactory.class) 14 | public interface CommentClient { 15 | 16 | @DeleteMapping("/{id}") 17 | public Result delete(@PathVariable("id") Long id) ; 18 | } 19 | -------------------------------------------------------------------------------- /acimage_feign/src/main/java/com/acimage/feign/client/UserClient.java: -------------------------------------------------------------------------------- 1 | package com.acimage.feign.client; 2 | 3 | import com.acimage.common.model.domain.user.User; 4 | import com.acimage.common.result.Result; 5 | import com.acimage.feign.fallback.UserClientFallbackFactory; 6 | import org.springframework.cloud.openfeign.FeignClient; 7 | import org.springframework.web.bind.annotation.*; 8 | 9 | 10 | @FeignClient(value="user-service/user/users",fallbackFactory = UserClientFallbackFactory.class) 11 | public interface UserClient { 12 | @GetMapping("/id/{id}") 13 | Result queryUser(@PathVariable Long id); 14 | 15 | @PutMapping("/photoUrl") 16 | Result modifyPhotoUrl(@RequestBody String photoUrl); 17 | } 18 | -------------------------------------------------------------------------------- /acimage_feign/src/main/java/com/acimage/feign/config/FallbackFactoryBean.java: -------------------------------------------------------------------------------- 1 | package com.acimage.feign.config; 2 | 3 | import com.acimage.feign.fallback.ImageClientFallbackFactory; 4 | import com.acimage.feign.fallback.UserClientFallbackFactory; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | 9 | 10 | public class FallbackFactoryBean { 11 | 12 | @Bean 13 | public ImageClientFallbackFactory imageClientFallbackFactory(){ 14 | return new ImageClientFallbackFactory(); 15 | } 16 | 17 | @Bean 18 | public UserClientFallbackFactory userClientFallbackFactory(){ 19 | return new UserClientFallbackFactory(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /acimage_feign/src/main/java/com/acimage/feign/config/FeignMultipartSupportConfig.java: -------------------------------------------------------------------------------- 1 | package com.acimage.feign.config; 2 | 3 | import feign.codec.Encoder; 4 | import feign.form.spring.SpringFormEncoder; 5 | import org.springframework.beans.factory.ObjectFactory; 6 | import org.springframework.boot.autoconfigure.http.HttpMessageConverters; 7 | import org.springframework.cloud.openfeign.support.SpringEncoder; 8 | import org.springframework.context.annotation.Bean; 9 | import org.springframework.context.annotation.Configuration; 10 | 11 | @Configuration 12 | public class FeignMultipartSupportConfig { 13 | 14 | @Bean 15 | public Encoder feignFormEncoder(ObjectFactory messageConverters) { 16 | return new SpringFormEncoder(new SpringEncoder(messageConverters)); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /acimage_gateway/src/main/java/com/acimage/gateway/apitree/ApiTree.java: -------------------------------------------------------------------------------- 1 | package com.acimage.gateway.apitree; 2 | 3 | import com.acimage.common.global.enums.MyHttpMethod; 4 | import com.acimage.common.model.domain.sys.Api; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | import org.springframework.http.HttpMethod; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | import java.util.concurrent.ConcurrentMap; 12 | 13 | @NoArgsConstructor 14 | @Data 15 | public class ApiTree { 16 | /** 17 | * 路径id 18 | // */ 19 | // private List ids=new ArrayList<>(); 20 | // /** 21 | // * 权限id 22 | // */ 23 | // private List permissionIds=new ArrayList<>(); 24 | // private List methods=new ArrayList<>(); 25 | private List apiList=new ArrayList<>(); 26 | private ConcurrentMap children; 27 | } 28 | -------------------------------------------------------------------------------- /acimage_gateway/src/main/java/com/acimage/gateway/apitree/ApiTreeFactory.java: -------------------------------------------------------------------------------- 1 | package com.acimage.gateway.apitree; 2 | 3 | import lombok.Data; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.springframework.stereotype.Component; 6 | 7 | @Component 8 | @Slf4j 9 | @Data 10 | public class ApiTreeFactory { 11 | private ApiTree prefixMatchApiTree; 12 | private ApiTree exactMatchApiTree; 13 | private ApiTree apiTree; 14 | } 15 | -------------------------------------------------------------------------------- /acimage_gateway/src/main/java/com/acimage/gateway/config/KeySolverConfig.java: -------------------------------------------------------------------------------- 1 | package com.acimage.gateway.config; 2 | 3 | 4 | import com.acimage.common.utils.IpUtils; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver; 7 | import org.springframework.context.annotation.Bean; 8 | import org.springframework.context.annotation.Configuration; 9 | 10 | import org.springframework.http.server.reactive.ServerHttpRequest; 11 | import reactor.core.publisher.Mono; 12 | 13 | @Slf4j 14 | @Configuration 15 | public class KeySolverConfig { 16 | 17 | @Bean 18 | public KeyResolver ipKeyResolver() { 19 | return exchange ->{ 20 | ServerHttpRequest request=exchange.getRequest(); 21 | return Mono.just(IpUtils.getUserIp(request)); 22 | }; 23 | } 24 | 25 | 26 | } 27 | -------------------------------------------------------------------------------- /acimage_gateway/src/main/java/com/acimage/gateway/config/RoleConfig.java: -------------------------------------------------------------------------------- 1 | package com.acimage.gateway.config; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | @Configuration 8 | @Data 9 | @ConfigurationProperties(prefix = "role") 10 | public class RoleConfig { 11 | private int visitorId; 12 | private int userId; 13 | } 14 | -------------------------------------------------------------------------------- /acimage_gateway/src/main/java/com/acimage/gateway/dao/ApiDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.gateway.dao; 2 | 3 | import com.acimage.common.model.domain.sys.Api; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | public interface ApiDao extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /acimage_gateway/src/main/java/com/acimage/gateway/dao/AuthorizeDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.gateway.dao; 2 | 3 | import com.acimage.common.model.domain.sys.Authorize; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | public interface AuthorizeDao extends BaseMapper { 7 | 8 | 9 | } 10 | -------------------------------------------------------------------------------- /acimage_gateway/src/main/java/com/acimage/gateway/dao/PermissionDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.gateway.dao; 2 | 3 | import com.acimage.common.model.domain.sys.Permission; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.apache.ibatis.annotations.Param; 6 | 7 | import javax.annotation.Nullable; 8 | import java.util.List; 9 | 10 | public interface PermissionDao extends BaseMapper { 11 | 12 | List selectTreeByParentId(@Nullable @Param("parentId") Integer parentId); 13 | 14 | List selectPermissionsWithParent(@Param("startIndex") int startIndex,@Param("recordNumber") int recordNumber); 15 | 16 | 17 | } 18 | -------------------------------------------------------------------------------- /acimage_gateway/src/main/java/com/acimage/gateway/dao/RoleDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.gateway.dao; 2 | 3 | import com.acimage.common.model.domain.sys.Role; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | public interface RoleDao extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /acimage_gateway/src/main/java/com/acimage/gateway/dao/UserRoleDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.gateway.dao; 2 | 3 | 4 | import com.acimage.common.model.domain.sys.UserRole; 5 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 6 | 7 | public interface UserRoleDao extends BaseMapper { 8 | } 9 | -------------------------------------------------------------------------------- /acimage_gateway/src/main/java/com/acimage/gateway/global/consts/NotationConstants.java: -------------------------------------------------------------------------------- 1 | package com.acimage.gateway.global.consts; 2 | 3 | public class NotationConstants { 4 | public static final String ASTERISK="*"; 5 | public static final String DOUBLE_ASTERISK="**"; 6 | } 7 | -------------------------------------------------------------------------------- /acimage_gateway/src/main/java/com/acimage/gateway/globalfilter/RemoveContextFilter.java: -------------------------------------------------------------------------------- 1 | package com.acimage.gateway.globalfilter; 2 | 3 | 4 | import com.acimage.common.global.context.UserContext; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.cloud.gateway.filter.GatewayFilterChain; 7 | import org.springframework.cloud.gateway.filter.GlobalFilter; 8 | import org.springframework.core.annotation.Order; 9 | import org.springframework.web.server.ServerWebExchange; 10 | import reactor.core.publisher.Mono; 11 | 12 | @Slf4j 13 | @Order(Integer.MAX_VALUE) 14 | public class RemoveContextFilter implements GlobalFilter { 15 | 16 | @Override 17 | public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { 18 | UserContext.remove(); 19 | return chain.filter(exchange); 20 | 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /acimage_gateway/src/main/java/com/acimage/gateway/serivce/ApiQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.gateway.serivce; 2 | 3 | import com.acimage.common.model.domain.sys.Api; 4 | 5 | import java.util.List; 6 | 7 | public interface ApiQueryService { 8 | List listEnableApis(); 9 | } 10 | -------------------------------------------------------------------------------- /acimage_gateway/src/main/java/com/acimage/gateway/serivce/AuthorizeQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.gateway.serivce; 2 | 3 | import com.acimage.common.model.domain.sys.Authorize; 4 | 5 | import java.util.List; 6 | import java.util.Map; 7 | 8 | public interface AuthorizeQueryService { 9 | 10 | 11 | Map> getRolePermissionIdsMap(); 12 | 13 | List listPermissionIds(Integer roleId); 14 | 15 | List listAll(); 16 | } 17 | -------------------------------------------------------------------------------- /acimage_gateway/src/main/java/com/acimage/gateway/serivce/RoleQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.gateway.serivce; 2 | 3 | import java.util.List; 4 | 5 | public interface RoleQueryService { 6 | List listAllIds(); 7 | } 8 | -------------------------------------------------------------------------------- /acimage_gateway/src/main/java/com/acimage/gateway/serivce/UserRoleQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.gateway.serivce; 2 | 3 | import java.util.List; 4 | 5 | public interface UserRoleQueryService { 6 | List listRoleIds(long userId); 7 | } 8 | -------------------------------------------------------------------------------- /acimage_gateway/src/main/resources/application-dev.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8070 3 | 4 | spring: 5 | config: 6 | activate: 7 | on-profile: 8 | - dev 9 | redis: 10 | host: 192.168.130.128 11 | port: 6379 12 | password: redis 13 | lettuce: 14 | pool: 15 | max-active: 8 16 | max-idle: 8 #最大空闲连接 17 | min-idle: 0 #最小空闲连接 18 | max-wait: 100ms #连接等待时间 19 | cloud: 20 | nacos: 21 | server-addr: localhost:8848 #nacos 服务地址 22 | discovery: 23 | enabled: true #关闭nacos发现,用于调试 24 | 25 | -------------------------------------------------------------------------------- /acimage_gateway/src/test/java/com/acimage/gateway/GatewayApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.acimage.gateway; 2 | 3 | 4 | import com.acimage.gateway.apitree.ApiTree; 5 | import com.acimage.gateway.apitree.ApiTreeUtils; 6 | import org.junit.jupiter.api.Test; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.boot.autoconfigure.SpringBootApplication; 9 | import org.springframework.boot.test.context.SpringBootTest; 10 | import org.springframework.http.HttpMethod; 11 | 12 | import java.util.Arrays; 13 | import java.util.List; 14 | 15 | 16 | @SpringBootTest 17 | public class GatewayApplicationTest 18 | { 19 | 20 | 21 | } 22 | -------------------------------------------------------------------------------- /acimage_image/lib/webp-imageio-core-0.1.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/acimage_image/lib/webp-imageio-core-0.1.0.jar -------------------------------------------------------------------------------- /acimage_image/src/main/java/com/acimage/image/dao/ImageDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.image.dao; 2 | 3 | import cn.hutool.core.lang.Pair; 4 | import com.acimage.common.model.domain.image.Image; 5 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 6 | import org.apache.ibatis.annotations.Param; 7 | import org.apache.ibatis.annotations.Select; 8 | 9 | import java.util.List; 10 | 11 | public interface ImageDao extends BaseMapper { 12 | 13 | Integer insertList(List images); 14 | 15 | Integer updateDescription(List> idAndDescriptions); 16 | 17 | @Select("select * from tb_image where topic_id=#{topicId} order by id") 18 | List selectListOrderById(@Param("topicId") long topicId); 19 | 20 | } 21 | -------------------------------------------------------------------------------- /acimage_image/src/main/java/com/acimage/image/dao/ImageHashDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.image.dao; 2 | 3 | import com.acimage.common.model.domain.image.ImageHash; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | public interface ImageHashDao extends BaseMapper { 7 | } 8 | -------------------------------------------------------------------------------- /acimage_image/src/main/java/com/acimage/image/global/consts/MyFileConstants.java: -------------------------------------------------------------------------------- 1 | package com.acimage.image.global.consts; 2 | 3 | public class MyFileConstants { 4 | public static final String IMAGE_FORMAT="jpeg"; 5 | public static final String ZIP_FORMAT="zip"; 6 | } 7 | -------------------------------------------------------------------------------- /acimage_image/src/main/java/com/acimage/image/global/consts/TopicImageKeyConstants.java: -------------------------------------------------------------------------------- 1 | package com.acimage.image.global.consts; 2 | 3 | public class TopicImageKeyConstants { 4 | public static final String STRINGKP_TOPIC_IMAGES="acimage:image:images:topicId:"; 5 | public static final String STRINGKP_IMAGE="acimage:image:images:imageId:"; 6 | } 7 | -------------------------------------------------------------------------------- /acimage_image/src/main/java/com/acimage/image/global/context/DirectoryContext.java: -------------------------------------------------------------------------------- 1 | package com.acimage.image.global.context; 2 | 3 | import org.springframework.beans.factory.annotation.Value; 4 | import org.springframework.stereotype.Component; 5 | 6 | import javax.annotation.PostConstruct; 7 | 8 | 9 | public class DirectoryContext { 10 | @Value("${my-config.images-directory}") 11 | public String imagesDirectory; 12 | @Value("${my-config.photos-directory}") 13 | public String photosDirectory; 14 | 15 | public static String IMAGES_DIRECTORY; 16 | 17 | public static String PHOTOS_DIRECTORY; 18 | 19 | @PostConstruct 20 | void init(){ 21 | IMAGES_DIRECTORY= imagesDirectory; 22 | PHOTOS_DIRECTORY= photosDirectory; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /acimage_image/src/main/java/com/acimage/image/service/image/ImageMixWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.image.service.image; 2 | 3 | import com.acimage.common.model.mq.dto.SyncImagesUpdateDto; 4 | import org.springframework.transaction.annotation.Transactional; 5 | import org.springframework.web.multipart.MultipartFile; 6 | 7 | import java.util.List; 8 | 9 | public interface ImageMixWriteService { 10 | 11 | 12 | String saveImage(MultipartFile imageFile); 13 | 14 | void removeTopicPartialImages(long topicId, List imageUrls); 15 | 16 | void removeTopicImages(long topicId); 17 | 18 | void updateImageAndHash(SyncImagesUpdateDto updateDto); 19 | } 20 | -------------------------------------------------------------------------------- /acimage_image/src/main/java/com/acimage/image/service/image/ImageQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.image.service.image; 2 | 3 | import com.acimage.common.model.domain.image.Image; 4 | 5 | import java.util.List; 6 | 7 | public interface ImageQueryService { 8 | List listImagesOrderById(long topicId); 9 | 10 | List listImagesByIds(List imageIds); 11 | 12 | List listImageIds(long topicId, List imageUrls); 13 | 14 | List listImageIds(long topicId); 15 | 16 | List listImagesForHavingNullTopicId(List imageUrls); 17 | } 18 | -------------------------------------------------------------------------------- /acimage_image/src/main/java/com/acimage/image/service/image/ImageWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.image.service.image; 2 | 3 | 4 | import com.acimage.common.model.domain.image.Image; 5 | import com.baomidou.mybatisplus.extension.service.IService; 6 | import org.springframework.transaction.annotation.Transactional; 7 | import org.springframework.web.multipart.MultipartFile; 8 | 9 | import java.util.List; 10 | 11 | 12 | public interface ImageWriteService extends IService { 13 | 14 | @Deprecated 15 | void saveImages(List images); 16 | Image saveImage(String url,int size,String fileName); 17 | void removeImages(long topicId); 18 | 19 | int removeImages(long topicId, List imageUrls); 20 | 21 | void updateTopicId(List imageIds,long topicId); 22 | 23 | void updateTopicIdForHavingNullTopicId(List imageIds, long topicId); 24 | 25 | 26 | 27 | } 28 | -------------------------------------------------------------------------------- /acimage_image/src/main/java/com/acimage/image/service/imagehash/ImageHashWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.image.service.imagehash; 2 | 3 | import java.io.InputStream; 4 | import java.util.List; 5 | 6 | public interface ImageHashWriteService { 7 | 8 | void removeImageHashes(List imageIds); 9 | 10 | void HashImagesByDhash(InputStream imageInputStream, long imageId) ; 11 | } 12 | -------------------------------------------------------------------------------- /acimage_image/src/main/java/com/acimage/image/service/imagehash/SearchImageService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.image.service.imagehash; 2 | 3 | import com.acimage.common.model.domain.image.Image; 4 | import org.springframework.web.multipart.MultipartFile; 5 | 6 | import java.io.InputStream; 7 | import java.util.List; 8 | 9 | public interface SearchImageService { 10 | @Deprecated 11 | void processImagesHashForNotProcessedImages(); 12 | 13 | void hashImageByDhashAlgorithm(InputStream imageInputStream, long imageId) ; 14 | 15 | List searchMostSimilarImages(MultipartFile imageFile); 16 | 17 | void removeImageHashes(List imageIds); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /acimage_image/src/main/java/com/acimage/image/service/photo/PhotoService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.image.service.photo; 2 | 3 | import org.springframework.web.multipart.MultipartFile; 4 | 5 | public interface PhotoService { 6 | String uploadPhotoAndUpdatePhotoUrl(MultipartFile photoFile); 7 | } 8 | -------------------------------------------------------------------------------- /acimage_image/src/main/java/com/acimage/image/utils/ImageFileUtils.java: -------------------------------------------------------------------------------- 1 | package com.acimage.image.utils; 2 | 3 | import com.acimage.image.global.consts.MyFileConstants; 4 | import com.acimage.image.global.context.DirectoryContext; 5 | 6 | import javax.validation.constraints.NotNull; 7 | 8 | public class ImageFileUtils { 9 | public static String imageIdToImagePath(@NotNull Long imageId){ 10 | return DirectoryContext.IMAGES_DIRECTORY+"/"+imageId+"."+ MyFileConstants.IMAGE_FORMAT; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /acimage_image/src/main/java/com/acimage/image/utils/ImageUtils.java: -------------------------------------------------------------------------------- 1 | package com.acimage.image.utils; 2 | 3 | public class ImageUtils { 4 | public static int rgb2Gray(int r, int g, int b) { 5 | return (int) Math.round(r * 0.299 + g * 0.581 + b * 0.114); 6 | } 7 | } 8 | 9 | -------------------------------------------------------------------------------- /acimage_image/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | include: common,common-secret 4 | active: dev2 5 | application: 6 | name: image-service 7 | servlet: 8 | multipart: 9 | max-file-size: 2MB 10 | max-request-size: 4MB 11 | 12 | feign: 13 | okhttp: 14 | enabled: true 15 | httpclient: 16 | max-connections: 20 # 最大的连接数 17 | max-connections-per-route: 5 # 每个路径的最大连接数 18 | 19 | mybatis-plus: 20 | mapper-locations: classpath:mapper/*.xml 21 | type-aliases-package: com.acimage.image.model.domain,com.acimage.common.model.domain 22 | configuration: 23 | map-underscore-to-camel-case: true 24 | log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl 25 | global-config: 26 | db-config: 27 | table-prefix: tb_ 28 | 29 | 30 | -------------------------------------------------------------------------------- /acimage_image/src/test/java/com/acimage/image/ImageApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.acimage.image; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class ImageApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /acimage_image/src/test/java/com/acimage/image/dao/ImageDaoTest.java: -------------------------------------------------------------------------------- 1 | package com.acimage.image.dao; 2 | 3 | 4 | import com.acimage.common.model.domain.image.Image; 5 | import org.junit.jupiter.api.Test; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.boot.test.context.SpringBootTest; 8 | 9 | import java.util.List; 10 | 11 | 12 | @SpringBootTest 13 | public class ImageDaoTest { 14 | @Autowired 15 | ImageDao imageDao; 16 | 17 | @Test 18 | public void testSelectAll() { 19 | long topicId = 1585529145054986240L; 20 | List imageList = imageDao.selectListOrderById(topicId); 21 | System.out.println(imageList); 22 | System.out.println(imageList.size()); 23 | } 24 | 25 | 26 | } 27 | -------------------------------------------------------------------------------- /acimage_image/src/test/java/com/acimage/image/dao/ImageHashDaoDaoTest.java: -------------------------------------------------------------------------------- 1 | package com.acimage.image.dao; 2 | 3 | 4 | 5 | 6 | import org.junit.jupiter.api.Test; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.boot.test.context.SpringBootTest; 9 | 10 | 11 | @SpringBootTest 12 | public class ImageHashDaoDaoTest { 13 | @Autowired 14 | ImageHashDao imageHashDao; 15 | 16 | @Test 17 | public void testSelectAll(){ 18 | System.out.println(imageHashDao.selectList(null)); 19 | } 20 | 21 | 22 | 23 | } 24 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/dao/CommentMsgDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.dao; 2 | 3 | import com.acimage.common.model.domain.user.CommentMsg; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.apache.ibatis.annotations.Param; 6 | 7 | import java.util.List; 8 | 9 | public interface CommentMsgDao extends BaseMapper { 10 | 11 | List selectCommentMsgsWithUser(@Param("toUserId") long toUserId,@Param("startIndex") int startIndex,@Param("size") int size); 12 | } 13 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/dao/UserMsgDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.dao; 2 | 3 | import com.acimage.common.model.domain.user.UserMsg; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.apache.ibatis.annotations.Param; 6 | import org.apache.ibatis.annotations.Update; 7 | 8 | public interface UserMsgDao extends BaseMapper { 9 | 10 | @Update("update tb_user_msg set ${column}=${column}+#{increment} where user_id=#{userId}") 11 | void increaseColumn(@Param("userId") long userId,@Param("column") String column,@Param("increment") int increment); 12 | } 13 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/dao/UserPrivacyDao.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.dao; 2 | 3 | 4 | 5 | 6 | import com.acimage.common.model.domain.user.UserPrivacy; 7 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 8 | 9 | public interface UserPrivacyDao extends BaseMapper { 10 | 11 | // @Insert("insert into tb_user(id,username,pwd,email,salt) values (#{id},#{username},#{password},#{email},#{salt})") 12 | // void insert(@Param("id") long id,@Param("username") String username,@Param("password") String passwordDigest, 13 | // @Param("email") String email,@Param("salt") String salt); 14 | 15 | // @Update("update tb_user set username=#{username} where id=#{id}") 16 | // Integer updateUsername(@Param("id") long id, @Param("username") String username); 17 | 18 | 19 | } 20 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/global/consts/PageSizeConsts.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.global.consts; 2 | 3 | public class PageSizeConsts { 4 | public static final int TOPIC_COMMENTS =5; 5 | 6 | public static final int ACTIVITY_TOPICS =5; 7 | 8 | public static final int ACTIVITY_COMMENTS =5; 9 | 10 | public static final int ACTIVITY_STARS =5; 11 | 12 | public static final int FORUM_TOPICS =10; 13 | } 14 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/global/consts/StorePrefixConst.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.global.consts; 2 | 3 | public class StorePrefixConst { 4 | public final static String TOPIC_IMAGE="topicImage"; 5 | public final static String USER_PHOTO="userPhoto"; 6 | } 7 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/global/consts/WebSocketSessionConstants.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.global.consts; 2 | 3 | public class WebSocketSessionConstants { 4 | public static final String KEY_USER_ID="userId"; 5 | 6 | } 7 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/model/request/UserLoginReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.model.request; 2 | 3 | import lombok.Data; 4 | import lombok.NoArgsConstructor; 5 | 6 | import javax.validation.constraints.Email; 7 | import javax.validation.constraints.Size; 8 | 9 | @Data 10 | @NoArgsConstructor 11 | public class UserLoginReq { 12 | 13 | @Email(message = "邮箱格式错误") 14 | @Size(min=6,max=32,message = "邮箱长度在6到32之间") 15 | private String email; 16 | 17 | @Size(min = 100, max = 2000, message = "非法密码") 18 | String password; 19 | 20 | @Size(min=4,max=6,message = "验证码长度不符") 21 | String verifyCode; 22 | } 23 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/model/request/UserRegisterReq.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.model.request; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import javax.validation.constraints.*; 8 | 9 | 10 | @Data 11 | @NoArgsConstructor 12 | @AllArgsConstructor 13 | public class UserRegisterReq { 14 | public static final int VERIFY_CODE_LENGTH=8; 15 | 16 | @Size(min=2,max=12,message = "用户名长度在2到12之间") 17 | private String username; 18 | 19 | @Size(min=100,max=2000,message = "非法密码") 20 | private String password; 21 | 22 | @Email(message = "邮箱格式错误") 23 | @Size(min=6,max=32,message = "邮箱长度在6到32之间") 24 | private String email; 25 | 26 | /** 27 | * 有可能带空格 28 | */ 29 | @Size(min=VERIFY_CODE_LENGTH,max = VERIFY_CODE_LENGTH+2) 30 | private String verifyCode; 31 | } 32 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/model/vo/ProfileVo.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.model.vo; 2 | 3 | 4 | import com.fasterxml.jackson.annotation.JsonFormat; 5 | import lombok.Data; 6 | 7 | import java.util.Date; 8 | 9 | @Data 10 | public class ProfileVo { 11 | String username; 12 | String email; 13 | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") 14 | Date registerTime; 15 | Integer topicCount; 16 | Integer starCount; 17 | } 18 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/service/commentmsg/CommentMsgQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.service.commentmsg; 2 | 3 | import com.acimage.common.model.domain.user.CommentMsg; 4 | import com.acimage.common.model.page.MyPage; 5 | 6 | public interface CommentMsgQueryService { 7 | MyPage pageMyCommentMsg(long userId, int pageNo, int pageSize); 8 | } 9 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/service/commentmsg/CommentMsgWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.service.commentmsg; 2 | 3 | import com.acimage.common.model.domain.user.CommentMsg; 4 | 5 | public interface CommentMsgWriteService { 6 | void insert(CommentMsg commentMsg); 7 | } 8 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/service/commentmsg/impl/CommentMsgWriteServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.service.commentmsg.impl; 2 | 3 | import com.acimage.common.model.domain.user.CommentMsg; 4 | import com.acimage.user.dao.CommentMsgDao; 5 | import com.acimage.user.service.commentmsg.CommentMsgWriteService; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Service; 8 | 9 | @Service 10 | public class CommentMsgWriteServiceImpl implements CommentMsgWriteService { 11 | @Autowired 12 | CommentMsgDao commentMsgDao; 13 | 14 | @Override 15 | public void insert(CommentMsg commentMsg){ 16 | commentMsgDao.insert(commentMsg); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/service/mail/MainService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.service.mail; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | public interface MainService { 6 | void sendTextMailMessage(String to, String subject, String text); 7 | 8 | void sendVerifyCodeMailMessage(String to, String code, int timeoutMinute); 9 | } 10 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/service/user/LoginService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.service.user; 2 | 3 | 4 | 5 | import com.acimage.user.model.request.UserLoginReq; 6 | import com.acimage.user.model.request.UserRegisterReq; 7 | import org.springframework.transaction.annotation.Transactional; 8 | 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | 12 | 13 | public interface LoginService { 14 | 15 | String getPublicKey(); 16 | 17 | @Transactional 18 | String registerUser(UserRegisterReq userRegister); 19 | 20 | @Transactional 21 | String login(UserLoginReq userLogin); 22 | 23 | 24 | void logout(HttpServletRequest request); 25 | 26 | void checkAndSendCodeToEmail(String email); 27 | } 28 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/service/user/UserInfoService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.service.user; 2 | 3 | 4 | import com.acimage.common.model.domain.user.User; 5 | import com.acimage.user.model.vo.ProfileVo; 6 | 7 | 8 | public interface UserInfoService { 9 | ProfileVo getProfile(); 10 | 11 | 12 | } 13 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/service/user/UserQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.service.user; 2 | 3 | 4 | import com.acimage.common.model.domain.user.User; 5 | 6 | public interface UserQueryService { 7 | User getUser(long userId); 8 | Boolean isUsernameExist(String username); 9 | } 10 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/service/user/UserRankService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.service.user; 2 | 3 | import com.acimage.common.model.domain.user.User; 4 | 5 | import java.util.List; 6 | 7 | public interface UserRankService { 8 | 9 | List pageUsersRankByStarCount(); 10 | } 11 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/service/user/UserWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.service.user; 2 | 3 | import org.springframework.transaction.annotation.Transactional; 4 | import org.springframework.web.multipart.MultipartFile; 5 | 6 | import javax.servlet.http.HttpServletResponse; 7 | 8 | public interface UserWriteService { 9 | @Transactional 10 | String updateUsername(String username); 11 | 12 | @Deprecated 13 | @Transactional(rollbackFor = Exception.class) 14 | String uploadPhotoAndUpdatePhotoUrl(MultipartFile photoFile); 15 | 16 | 17 | String updatePhotoUrl(String newPhotoUrl); 18 | 19 | 20 | } 21 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/service/user/consts/KeyConstants.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.service.user.consts; 2 | 3 | public class KeyConstants { 4 | public static final String STRINGKP_USER = "acimage:users:id:"; 5 | public static final String STRINGKP_USERNAME = "acimage:users:username:"; 6 | } 7 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/service/user/impl/UserRankServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.service.user.impl; 2 | 3 | import com.acimage.common.model.domain.user.User; 4 | import com.acimage.user.service.user.UserRankService; 5 | 6 | 7 | import java.util.List; 8 | 9 | public class UserRankServiceImpl implements UserRankService { 10 | @Override 11 | public List pageUsersRankByStarCount() { 12 | return null; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/service/usermsg/UserMsgQueryService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.service.usermsg; 2 | 3 | import com.acimage.common.model.domain.user.UserMsg; 4 | import com.baomidou.mybatisplus.core.toolkit.support.SFunction; 5 | 6 | public interface UserMsgQueryService { 7 | 8 | Integer getMsgCount(long userId); 9 | 10 | } 11 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/service/usermsg/UserMsgWriteService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.service.usermsg; 2 | 3 | import com.acimage.common.model.domain.user.UserMsg; 4 | import com.baomidou.mybatisplus.core.toolkit.support.SFunction; 5 | 6 | public interface UserMsgWriteService { 7 | 8 | void insert(long userId); 9 | 10 | void increaseMsg(long userId, SFunction column, int increment); 11 | 12 | void resetMsgCount(long userId, SFunction column); 13 | } 14 | -------------------------------------------------------------------------------- /acimage_user/src/main/java/com/acimage/user/service/verify/VerifyCodeService.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user.service.verify; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import javax.servlet.http.HttpServletResponse; 5 | 6 | public interface VerifyCodeService { 7 | void writeCodeImageToResponseAndRecord(HttpServletRequest request, HttpServletResponse response); 8 | 9 | boolean verifyAndRemoveIfSuccess(HttpServletRequest request, String code); 10 | 11 | void sendVerifyCodeToEmail(String email,int length); 12 | 13 | boolean verifyEmailByVerifyCode(String email, String code); 14 | } 15 | -------------------------------------------------------------------------------- /acimage_user/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | include: common,common-secret 4 | active: dev2 5 | servlet: 6 | multipart: 7 | max-file-size: 3MB 8 | max-request-size: 6MB 9 | application: 10 | name: user-service #服务名称 11 | datasource: 12 | type: com.alibaba.druid.pool.DruidDataSource 13 | driver-class-name: com.mysql.cj.jdbc.Driver 14 | rabbitmq: 15 | 16 | mybatis-plus: 17 | mapper-locations: classpath:mapper/*.xml 18 | type-aliases-package: com.acimage.common.model.domain,com.acimage.user.model.domain, 19 | configuration: 20 | map-underscore-to-camel-case: true 21 | global-config: 22 | db-config: 23 | table-prefix: tb_ 24 | 25 | feign: 26 | okhttp: 27 | enabled: true 28 | httpclient: 29 | max-connections: 20 # 最大的连接数 30 | max-connections-per-route: 5 # 每个路径的最大连接数 31 | 32 | -------------------------------------------------------------------------------- /acimage_user/src/test/java/com/acimage/user/AppTest.java: -------------------------------------------------------------------------------- 1 | package com.acimage.user; 2 | 3 | 4 | import org.junit.jupiter.api.Test; 5 | import org.springframework.boot.test.context.SpringBootTest; 6 | 7 | @SpringBootTest 8 | public class AppTest 9 | { 10 | @Test 11 | public void testApp () 12 | { } 13 | 14 | 15 | } 16 | -------------------------------------------------------------------------------- /doc/images/activity.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/doc/images/activity.webp -------------------------------------------------------------------------------- /doc/images/admin-authorize.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/doc/images/admin-authorize.webp -------------------------------------------------------------------------------- /doc/images/admin-home.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/doc/images/admin-home.webp -------------------------------------------------------------------------------- /doc/images/architecture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/doc/images/architecture.jpg -------------------------------------------------------------------------------- /doc/images/forum1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/doc/images/forum1.webp -------------------------------------------------------------------------------- /doc/images/forum2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/doc/images/forum2.webp -------------------------------------------------------------------------------- /doc/images/forum3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/doc/images/forum3.webp -------------------------------------------------------------------------------- /doc/images/home1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/doc/images/home1.webp -------------------------------------------------------------------------------- /doc/images/home2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/doc/images/home2.webp -------------------------------------------------------------------------------- /doc/images/profile.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/doc/images/profile.webp -------------------------------------------------------------------------------- /doc/images/publish.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/doc/images/publish.webp -------------------------------------------------------------------------------- /doc/images/search-image1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/doc/images/search-image1.webp -------------------------------------------------------------------------------- /doc/images/search-image2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/doc/images/search-image2.webp -------------------------------------------------------------------------------- /doc/images/search.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/doc/images/search.webp -------------------------------------------------------------------------------- /doc/images/topic-info1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/doc/images/topic-info1.webp -------------------------------------------------------------------------------- /doc/images/topic-info2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/doc/images/topic-info2.webp -------------------------------------------------------------------------------- /doc/images/website-icon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/doc/images/website-icon.jpg -------------------------------------------------------------------------------- /doc/images/二次元段子.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/doc/images/二次元段子.jpg -------------------------------------------------------------------------------- /doc/sql/.gitignore: -------------------------------------------------------------------------------- 1 | /*.bat 2 | -------------------------------------------------------------------------------- /vue-manage-system/.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: https://lin-xin.gitee.io/images/weixin.jpg 13 | -------------------------------------------------------------------------------- /vue-manage-system/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /vue-manage-system/auto-imports.d.ts: -------------------------------------------------------------------------------- 1 | // Generated by 'unplugin-auto-import' 2 | export {} 3 | declare global { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /vue-manage-system/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | vue-manage-system 9 | 10 | 11 | 12 | 13 | 17 |
18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /vue-manage-system/public/template.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue-manage-system/public/template.xlsx -------------------------------------------------------------------------------- /vue-manage-system/screenshots/wms1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue-manage-system/screenshots/wms1.png -------------------------------------------------------------------------------- /vue-manage-system/screenshots/wms3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue-manage-system/screenshots/wms3.png -------------------------------------------------------------------------------- /vue-manage-system/src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 11 | 15 | -------------------------------------------------------------------------------- /vue-manage-system/src/api/UserRole.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | //查 4 | export function addRoleForUser(userId, roleId) { 5 | let params = { userId: userId, roleId: roleId }; 6 | let config = { params: params } 7 | return request.post("/api/admin/userRoles/operate", {}, config); 8 | } 9 | 10 | export function deleteRoleForUser(userId, roleId) { 11 | let params = { userId: userId, roleId: roleId }; 12 | let config = { params: params } 13 | return request.delete("/api/admin/userRoles/operate/"+userId+'/'+roleId); 14 | } 15 | 16 | //操作 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /vue-manage-system/src/api/WebsiteData.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | 4 | export function queryWebsiteData() { 5 | return request.get("/api/admin/websites/accessData"); 6 | } 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /vue-manage-system/src/api/api.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function searchApis(params) { 4 | return request.get("/api/admin/apis/query/search",{params:params}); 5 | } 6 | 7 | 8 | export function addApi(data) { 9 | return request.post("/api/admin/apis/operate",data); 10 | } 11 | 12 | export function modifyApi(data) { 13 | return request.put("/api/admin/apis/operate",data); 14 | } 15 | 16 | export function deleteApi(id) { 17 | return request.delete("/api/admin/apis/operate/"+id); 18 | } 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /vue-manage-system/src/api/authorize.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | //查 4 | export function queryRoleAuthorize(roleId) { 5 | return request.get("/api/admin/authorizes/roleId/"+roleId); 6 | } 7 | 8 | //写 9 | export function addAuthorize(formData) { 10 | let config={params:formData} 11 | return request.post("/api/admin/authorizes",formData,config); 12 | } 13 | 14 | export function deleteAuthorize(roleId,permissionId) { 15 | return request.delete("/api/admin/authorizes/"+roleId+'/'+permissionId); 16 | } 17 | -------------------------------------------------------------------------------- /vue-manage-system/src/api/category.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | //查 4 | export function queryAllCategories() { 5 | return request.get("/api/admin/categories/all"); 6 | } 7 | 8 | 9 | -------------------------------------------------------------------------------- /vue-manage-system/src/api/comment.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | //查 4 | export function queryCommentsBy(params) { 5 | return request.get("/api/admin/comments/query/by", { params: params }); 6 | } 7 | 8 | //操作 9 | export function deleteComment(commentId) { 10 | return request.delete("/api/admin/comments/operate/" + commentId); 11 | } -------------------------------------------------------------------------------- /vue-manage-system/src/api/index.ts: -------------------------------------------------------------------------------- 1 | import request from '../utils/requestx'; 2 | 3 | export const fetchData = () => { 4 | return request({ 5 | url: './table.json', 6 | method: 'get' 7 | }); 8 | }; 9 | -------------------------------------------------------------------------------- /vue-manage-system/src/api/login.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function getPublicKey(){ 4 | return request.get("/api/admin/logins/publicKey"); 5 | } 6 | 7 | export function doLogin(data){ 8 | return request.post("/api/admin/logins/doLogin",data); 9 | } -------------------------------------------------------------------------------- /vue-manage-system/src/api/permission.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | //查 4 | export function queryPermissionTree() { 5 | return request.get("/api/admin/permissions/tree"); 6 | } 7 | 8 | export function pagePermission(pageNo,pageSize) { 9 | return request.get("/api/admin/permissions/page/"+pageNo+'/'+pageSize); 10 | } 11 | 12 | export function queryModules() { 13 | return request.get("/api/admin/permissions/modules"); 14 | } 15 | 16 | export function queryNonModules() { 17 | return request.get("/api/admin/permissions/nonModules"); 18 | } 19 | 20 | //写 21 | export function addPermission(data) { 22 | return request.post("/api/admin/permissions",data); 23 | } 24 | 25 | export function modifyPermission(data) { 26 | return request.put("/api/admin/permissions",data); 27 | } 28 | 29 | export function deletePermission(id) { 30 | return request.delete("/api/admin/permissions/"+id); 31 | } 32 | -------------------------------------------------------------------------------- /vue-manage-system/src/api/role.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | 4 | export function queryAllRoles() { 5 | return request.get("/api/admin/roles/all"); 6 | } 7 | 8 | export function addRole(data) { 9 | return request.post("/api/admin/roles", data); 10 | } 11 | 12 | export function deleteRole(id) { 13 | return request.delete("/api/admin/roles/"+id); 14 | } 15 | 16 | export function modifyRole(data) { 17 | return request.put("/api/admin/roles", data); 18 | } 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /vue-manage-system/src/api/topic.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | //查 4 | export function queryTopicsOrderBy(params) { 5 | return request.get("/api/admin/topics/query/orderBy", { params: params }); 6 | } 7 | 8 | //操作 9 | export function deleteTopic(topicId) { 10 | return request.delete("/api/admin/topics/operate/" + topicId); 11 | } 12 | 13 | 14 | -------------------------------------------------------------------------------- /vue-manage-system/src/api/user.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | //查 4 | export function queryUsers(params) { 5 | return request.get("/api/admin/users/query/search", { params: params }); 6 | } 7 | 8 | //操作 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /vue-manage-system/src/assets/css/color-dark.css: -------------------------------------------------------------------------------- 1 | .header{ 2 | background-color: #242f42; 3 | } 4 | .login-wrap{ 5 | background: #324157; 6 | } 7 | .plugins-tips{ 8 | background: #eef1f6; 9 | } 10 | .plugins-tips a{ 11 | color: #20a0ff; 12 | } 13 | 14 | .tags-li.active { 15 | border: 1px solid #409EFF; 16 | background-color: #409EFF; 17 | } 18 | .message-title{ 19 | color: #20a0ff; 20 | } 21 | .collapse-btn:hover{ 22 | background: rgb(40,52,70); 23 | } -------------------------------------------------------------------------------- /vue-manage-system/src/assets/css/icon.css: -------------------------------------------------------------------------------- 1 | [class*=" el-icon-lx"], 2 | [class^=el-icon-lx] { 3 | font-family: lx-iconfont !important; 4 | } -------------------------------------------------------------------------------- /vue-manage-system/src/assets/img/img.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue-manage-system/src/assets/img/img.jpg -------------------------------------------------------------------------------- /vue-manage-system/src/assets/img/login-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue-manage-system/src/assets/img/login-bg.jpg -------------------------------------------------------------------------------- /vue-manage-system/src/config.ts: -------------------------------------------------------------------------------- 1 | export default{ 2 | domainOfImages:'http://rof8epeiz.hn-bkt.clouddn.com/', 3 | } -------------------------------------------------------------------------------- /vue-manage-system/src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue'; 2 | import { createPinia } from 'pinia'; 3 | import * as ElementPlusIconsVue from '@element-plus/icons-vue'; 4 | import App from './App.vue'; 5 | import router from './router'; 6 | import { usePermissStore } from './store/permiss'; 7 | import 'element-plus/dist/index.css'; 8 | import './assets/css/icon.css'; 9 | 10 | const app = createApp(App); 11 | app.use(createPinia()); 12 | app.use(router); 13 | 14 | // 注册elementplus图标 15 | for (const [key, component] of Object.entries(ElementPlusIconsVue)) { 16 | app.component(key, component); 17 | } 18 | // 自定义权限指令 19 | const permiss = usePermissStore(); 20 | app.directive('permiss', { 21 | mounted(el, binding) { 22 | if (!permiss.key.includes(String(binding.value))) { 23 | el['hidden'] = true; 24 | } 25 | }, 26 | }); 27 | 28 | app.mount('#app'); 29 | -------------------------------------------------------------------------------- /vue-manage-system/src/store/permiss.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia'; 2 | 3 | interface ObjectList { 4 | [key: string]: string[]; 5 | } 6 | 7 | export const usePermissStore = defineStore('permiss', { 8 | state: () => { 9 | const keys = localStorage.getItem('ms_keys'); 10 | // const keys = localStorage.getItem('token'); 11 | return { 12 | key: keys ? JSON.parse(keys) : [], 13 | defaultList: { 14 | admin: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16'], 15 | user: ['1', '2', '3', '11', '13', '14', '15'] 16 | } 17 | }; 18 | }, 19 | actions: { 20 | handleSet(val: string[]) { 21 | this.key = val; 22 | } 23 | } 24 | }); 25 | -------------------------------------------------------------------------------- /vue-manage-system/src/store/sidebar.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia'; 2 | 3 | export const useSidebarStore = defineStore('sidebar', { 4 | state: () => { 5 | return { 6 | collapse: true 7 | }; 8 | }, 9 | getters: {}, 10 | actions: { 11 | handleCollapse() { 12 | this.collapse = !this.collapse; 13 | } 14 | } 15 | }); 16 | -------------------------------------------------------------------------------- /vue-manage-system/src/utils/MessageUtils.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ElMessageBox, 3 | ElNotification 4 | } from 'element-plus'; 5 | export default{ 6 | notice(msg,durationSeconds){ 7 | let newDuration=durationSeconds||2; 8 | ElNotification({ 9 | title: '提示', 10 | message: msg, 11 | type: 'warning', 12 | duration: newDuration*1000 13 | }); 14 | }, 15 | success(msg,durationSeconds){ 16 | let newDuration=durationSeconds||4; 17 | ElNotification({ 18 | title: '成功', 19 | message: msg, 20 | type: 'success', 21 | duration: newDuration*1000 22 | }); 23 | }, 24 | confirm(msg){ 25 | return ElMessageBox.confirm(msg, '提示', { 26 | confirmButtonText: '确定', 27 | cancelButtonText: '取消', 28 | type: 'warning' 29 | }) 30 | }, 31 | 32 | 33 | } -------------------------------------------------------------------------------- /vue-manage-system/src/utils/StringUtils.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | html2Text(htmlString) { 3 | return htmlString.toString().replace(/<(style|script|iframe)[^>]*?>[\s\S]+?<\/\1\s*>/gi, '') 4 | .replace(/<[^>]+?>/g, '') 5 | .replace(/\s+/g, ' ') 6 | .replace(/ /g, ' ') 7 | .replace(/>/g, ' ') 8 | .replace(/ /gm,' '); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /vue-manage-system/src/utils/requestx.ts: -------------------------------------------------------------------------------- 1 | import axios, {AxiosInstance, AxiosError, AxiosResponse, AxiosRequestConfig} from 'axios'; 2 | 3 | const service:AxiosInstance = axios.create({ 4 | timeout: 5000 5 | }); 6 | 7 | service.interceptors.request.use( 8 | (config: AxiosRequestConfig) => { 9 | return config; 10 | }, 11 | (error: AxiosError) => { 12 | console.log(error); 13 | return Promise.reject(); 14 | } 15 | ); 16 | 17 | service.interceptors.response.use( 18 | (response: AxiosResponse) => { 19 | if (response.status === 200) { 20 | return response; 21 | } else { 22 | Promise.reject(); 23 | } 24 | }, 25 | (error: AxiosError) => { 26 | console.log(error); 27 | return Promise.reject(); 28 | } 29 | ); 30 | 31 | export default service; 32 | -------------------------------------------------------------------------------- /vue-manage-system/src/utils/utils.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /vue-manage-system/src/views/donate.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /vue-manage-system/src/views/home.vue: -------------------------------------------------------------------------------- 1 | 17 | 27 | -------------------------------------------------------------------------------- /vue-manage-system/src/views/markdown.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 22 | -------------------------------------------------------------------------------- /vue-manage-system/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | declare module '*.vue' { 4 | import type { DefineComponent } from 'vue' 5 | const component: DefineComponent<{}, {}, any> 6 | export default component 7 | } 8 | 9 | declare module 'vue-schart'; 10 | declare module 'vue-cropperjs'; -------------------------------------------------------------------------------- /vue-manage-system/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "moduleResolution": "Node", 7 | "strict": true, 8 | "jsx": "preserve", 9 | "sourceMap": true, 10 | "resolveJsonModule": true, 11 | "isolatedModules": true, 12 | "esModuleInterop": true, 13 | "lib": ["ESNext", "DOM"], 14 | "skipLibCheck": true, 15 | "baseUrl": ".", 16 | "noImplicitAny": false, 17 | "paths": { 18 | "@/*": ["src/*"] 19 | } 20 | }, 21 | "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.vue"], 22 | "references": [{ "path": "./tsconfig.node.json" }] 23 | } 24 | -------------------------------------------------------------------------------- /vue-manage-system/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "ESNext", 5 | "moduleResolution": "Node", 6 | "allowSyntheticDefaultImports": true 7 | }, 8 | "include": ["vite.config.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /vue_acimage_web/.env.dev: -------------------------------------------------------------------------------- 1 | VUE_APP_MOCK = true -------------------------------------------------------------------------------- /vue_acimage_web/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /vue_acimage_web/README.md: -------------------------------------------------------------------------------- 1 | # vue_acimage_web 2 | 3 | > acimage网页端 4 | 5 | ## clone仓库 6 | 7 | ``` 8 | git clone https://github.com/ggggborn/SpringCloud-acimage.git 9 | ``` 10 | 11 | ## 进入到vue_acimage_web目录 12 | 13 | ``` 14 | cd vue_acimage_web 15 | ``` 16 | 17 | ## 安装依赖 18 | 19 | ``` 20 | npm install -i 21 | ``` 22 | 23 | ## 运行 24 | 25 | ``` 26 | npm run serve 27 | ``` 28 | -------------------------------------------------------------------------------- /vue_acimage_web/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /vue_acimage_web/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "esnext", 5 | "baseUrl": "./", 6 | "moduleResolution": "node", 7 | "paths": { 8 | "@/*": [ 9 | "src/*" 10 | ] 11 | }, 12 | "lib": [ 13 | "esnext", 14 | "dom", 15 | "dom.iterable", 16 | "scripthost" 17 | ] 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /vue_acimage_web/mock/HomeCarousel.js: -------------------------------------------------------------------------------- 1 | import Mock from 'mockjs' 2 | import { Code } from '@/utils/result.js' 3 | 4 | Mock.mock('/api/image/homeCarousels/all', 'get', { 5 | code: Code.OK, 6 | 'data|2': [{ 7 | id: '@id()', 8 | description: '@cparagraph()', 9 | url: '/test/test1.jpeg', 10 | }, 11 | { 12 | id: '@id()', 13 | description: '@cparagraph()', 14 | url: '/test/test2.jpeg', 15 | } 16 | ] 17 | }) 18 | -------------------------------------------------------------------------------- /vue_acimage_web/mock/UserRank.js: -------------------------------------------------------------------------------- 1 | import Mock from 'mockjs' 2 | import { Code } from '@/utils/result.js' 3 | 4 | Mock.mock('/api/community/users/rank/starCount/1', 'get', { 5 | code: Code.OK, 6 | 'data|4': [{ 7 | id: '@id', 8 | username: '@cname()', 9 | photoUrl: '', 10 | starCount: '@integer(0, 10000)', 11 | topicCount: '@integer(0, 10000)', 12 | }] 13 | }) 14 | 15 | Mock.mock('/api/community/users/rank/topicCount/1', 'get', { 16 | code: Code.OK, 17 | 'data|5': [{ 18 | id: '@id', 19 | username: '@cname()', 20 | photoUrl: '', 21 | starCount: '@integer(0, 10000)', 22 | topicCount: '@integer(0, 10000)', 23 | }] 24 | }) 25 | -------------------------------------------------------------------------------- /vue_acimage_web/mock/index.js: -------------------------------------------------------------------------------- 1 | import Mock from 'mockjs' 2 | require('./topic.js') 3 | require('./HomeCarousel.js') 4 | require('./UserRank.js') -------------------------------------------------------------------------------- /vue_acimage_web/public/static/css/common.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0px; 3 | padding: 0px; 4 | } 5 | 6 | /* 隐藏上传图片时的+号 */ 7 | .upload-plus-disabled .el-upload--picture-card { 8 | display: none; 9 | } 10 | 11 | .no-underline { 12 | text-decoration: none; 13 | } 14 | 15 | /* 改变router-link颜色变化 */ 16 | .router-link-item { 17 | color: #666666; 18 | } 19 | 20 | .router-link-item:hover { 21 | color: #0074A0; 22 | } 23 | 24 | .hover-pointer:hover { 25 | cursor: pointer 26 | } 27 | 28 | .hover-shadow:hover{ 29 | box-shadow: 0px 0px 15px #E7E6E3 !important; 30 | transition: 0.4s; 31 | } 32 | 33 | /* .hover-border-light:hover { 34 | border: 1px solid skyblue !important; 35 | } */ 36 | 37 | 38 | .c6 { 39 | color: #666666; 40 | } 41 | .c9 { 42 | color: #999999; 43 | } 44 | -------------------------------------------------------------------------------- /vue_acimage_web/public/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/public/static/favicon.ico -------------------------------------------------------------------------------- /vue_acimage_web/public/static/image/0.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/public/static/image/0.jpeg -------------------------------------------------------------------------------- /vue_acimage_web/public/static/image/1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/public/static/image/1.jpeg -------------------------------------------------------------------------------- /vue_acimage_web/public/static/image/2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/public/static/image/2.jpeg -------------------------------------------------------------------------------- /vue_acimage_web/public/static/image/default-photo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/public/static/image/default-photo.webp -------------------------------------------------------------------------------- /vue_acimage_web/public/static/image/github.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/public/static/image/github.webp -------------------------------------------------------------------------------- /vue_acimage_web/public/static/image/happy.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/public/static/image/happy.jpeg -------------------------------------------------------------------------------- /vue_acimage_web/public/static/image/header-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/public/static/image/header-bg.png -------------------------------------------------------------------------------- /vue_acimage_web/public/static/image/header-bg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/public/static/image/header-bg.webp -------------------------------------------------------------------------------- /vue_acimage_web/public/static/image/linhao1.1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/public/static/image/linhao1.1.jpg -------------------------------------------------------------------------------- /vue_acimage_web/public/static/image/linhao1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/public/static/image/linhao1.jpg -------------------------------------------------------------------------------- /vue_acimage_web/public/static/image/linhao3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/public/static/image/linhao3.jpg -------------------------------------------------------------------------------- /vue_acimage_web/public/static/image/login-bg5.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/public/static/image/login-bg5.jpeg -------------------------------------------------------------------------------- /vue_acimage_web/public/static/image/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/public/static/image/logo.png -------------------------------------------------------------------------------- /vue_acimage_web/public/static/image/sad.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/public/static/image/sad.jpeg -------------------------------------------------------------------------------- /vue_acimage_web/public/static/image/similar-topics-header.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/public/static/image/similar-topics-header.webp -------------------------------------------------------------------------------- /vue_acimage_web/public/static/image/topic-rank.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/public/static/image/topic-rank.webp -------------------------------------------------------------------------------- /vue_acimage_web/public/static/image/user-rank-header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/public/static/image/user-rank-header.jpg -------------------------------------------------------------------------------- /vue_acimage_web/public/static/image/user-rank-header.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/public/static/image/user-rank-header.webp -------------------------------------------------------------------------------- /vue_acimage_web/public/tinymce/langs/README.md: -------------------------------------------------------------------------------- 1 | This is where language files should be placed. 2 | 3 | Please DO NOT translate these directly use this service: https://www.transifex.com/projects/p/tinymce/ 4 | -------------------------------------------------------------------------------- /vue_acimage_web/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 2 | -------------------------------------------------------------------------------- /vue_acimage_web/public/tinymce/skins/ui/oxide/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 2 | -------------------------------------------------------------------------------- /vue_acimage_web/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 2 | -------------------------------------------------------------------------------- /vue_acimage_web/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 2 | -------------------------------------------------------------------------------- /vue_acimage_web/src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | 16 | 35 | -------------------------------------------------------------------------------- /vue_acimage_web/src/api/HomeCarousel.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request.js' 2 | 3 | 4 | export let queryHomeCarousel = function() { 5 | return request.get('/api/community/homeCarousels/list'); 6 | } 7 | -------------------------------------------------------------------------------- /vue_acimage_web/src/api/TopicSearch.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request.js' 2 | 3 | export let searchTopics = function(formData) { 4 | let config = { params: formData } 5 | return request.get('/api/community/topics/search/multiSearch', config) 6 | } 7 | -------------------------------------------------------------------------------- /vue_acimage_web/src/api/UserRank.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request.js' 2 | import { Code } from '@/utils/result.js' 3 | 4 | export let pageUserRankBy = function(params) { 5 | return request.get('/api/community/users/rank/byColumn', { params: params }); 6 | } 7 | -------------------------------------------------------------------------------- /vue_acimage_web/src/api/category.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request.js' 2 | import axios from 'axios' 3 | import MessageUtils from '@/utils/MessageUtils' 4 | import global from '@/utils/global.js' 5 | 6 | export let queryAllCategories = function() { 7 | return request.get('/api/community/categories/query/all') 8 | } -------------------------------------------------------------------------------- /vue_acimage_web/src/api/comment.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request.js' 2 | 3 | 4 | //操作 5 | export let addComment = function(data) { 6 | return request.post('/api/community/comments/operate', data); 7 | } 8 | 9 | export let deleteComment = function(commentId) { 10 | return request.delete('/api/community/comments/operate/' + commentId); 11 | } 12 | 13 | export let modifyComment = function(data) { 14 | return request.put('/api/community/comments/operate', data); 15 | } 16 | 17 | 18 | //查询 19 | export let queryCommentPage = function(topicId, pageNo) { 20 | let reqParams = { 21 | topicId: topicId, 22 | pageNo: pageNo 23 | }; 24 | let config = { params: reqParams }; 25 | return request.get('/api/community/comments/query/topicComments', config) 26 | } 27 | 28 | export let pageMyComments = function(pageNo) { 29 | return request.get('/api/community/comments/query/mine/' + pageNo) 30 | } 31 | -------------------------------------------------------------------------------- /vue_acimage_web/src/api/message.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request.js' 2 | 3 | 4 | 5 | //查询 6 | export let pageCommentMessages = function(pageNo,pageSize) { 7 | return request.get('/api/user/messages/query/comments/page/'+pageNo+'/'+pageSize) 8 | } 9 | 10 | 11 | -------------------------------------------------------------------------------- /vue_acimage_web/src/api/photo.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request.js' 2 | import axios from 'axios' 3 | import MessageUtils from '@/utils/MessageUtils' 4 | import global from '@/utils/global.js' 5 | 6 | 7 | export let uploadPhoto = function(reqData) { 8 | let config = { 'Content-type': 'multipart/form-data' }; 9 | return request.post('/api/image/photos/operate/upload', reqData, config); 10 | } 11 | 12 | 13 | -------------------------------------------------------------------------------- /vue_acimage_web/src/api/star.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request.js' 2 | 3 | //操作 4 | export let deleteStar=function(topicId){ 5 | return request.delete('/api/community/stars/operate/'+topicId); 6 | } 7 | 8 | export let addStar=function(topicId){ 9 | return request.post('/api/community/stars/operate/'+topicId); 10 | } 11 | 12 | 13 | //查询 14 | export let queryIsStar=function(topicId){ 15 | return request.get('/api/community/stars/query/isStar/'+topicId) 16 | } 17 | 18 | export let pageMyStar=function(pageNo){ 19 | return request.get('/api/community/stars/query/mine/' + pageNo); 20 | } -------------------------------------------------------------------------------- /vue_acimage_web/src/api/tag.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request.js' 2 | import axios from 'axios' 3 | import MessageUtils from '@/utils/MessageUtils' 4 | import global from '@/utils/global.js' 5 | 6 | export let queryAllTags = function() { 7 | return request.get('/api/community/tags/query/all') 8 | } -------------------------------------------------------------------------------- /vue_acimage_web/src/api/user.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request.js' 2 | import axios from 'axios' 3 | import { Code } from '@/utils/result.js' 4 | 5 | 6 | //查询 7 | export let queryProfile = function() { 8 | return request.get('/api/user/users/query/me'); 9 | } 10 | 11 | 12 | //操作 13 | export let modifyUsername = function(newUsername) { 14 | return request.put('/api/user/users/operate/username/' + newUsername) 15 | } 16 | 17 | // export let uploadPhoto = function(reqData) { 18 | // let config = { 'Content-type': 'multipart/form-data' }; 19 | // return request.post('/api/user/users/uploadPhoto', reqData, config); 20 | // } 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /vue_acimage_web/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ggggborn/SpringCloud-acimage/32c50a3e1d8bb04b2e60ded26c471607970ef601/vue_acimage_web/src/assets/logo.png -------------------------------------------------------------------------------- /vue_acimage_web/src/components/BaseContainer/BaseContainer.css: -------------------------------------------------------------------------------- 1 | .container{ 2 | display:inline-block; 3 | width: 100%; 4 | } 5 | 6 | .header{ 7 | position:relative; 8 | height:60px; 9 | } 10 | 11 | .header-icon{ 12 | font-size:40px; 13 | color:#E5E544; 14 | } 15 | 16 | .header-title{ 17 | position:relative; 18 | top:-6px; 19 | display: inline-block; 20 | font-size:25px; 21 | color:#999999; 22 | } -------------------------------------------------------------------------------- /vue_acimage_web/src/components/CategoryCard/CategoryCard.css: -------------------------------------------------------------------------------- 1 | .categories-container>>>.el-button { 2 | display: inline-block; 3 | margin-top: 6px; 4 | margin-right: 4px; 5 | margin-left: auto; 6 | } 7 | 8 | .category-card-div>>> .el-card{ 9 | border-width:2px; 10 | } 11 | 12 | .categories-container { 13 | padding-bottom: 10px; 14 | } -------------------------------------------------------------------------------- /vue_acimage_web/src/components/EditBoard/EditBoard.css: -------------------------------------------------------------------------------- 1 | .wrapper{ 2 | 3 | } -------------------------------------------------------------------------------- /vue_acimage_web/src/components/MyHeader/MyHeader.css: -------------------------------------------------------------------------------- 1 | /* tabs */ 2 | .tabs-wrapper { 3 | height: 60px; 4 | font-size: 22px; 5 | background-color: white; 6 | box-shadow: 0px 0px 2px #A7A796; 7 | text-align: center; 8 | position: relative; 9 | } 10 | 11 | .tabs-wrapper>img:last-child { 12 | height: 55px; 13 | position: absolute; 14 | right: 10px; 15 | } 16 | 17 | .tabs-wrapper>img:first-child { 18 | height: 55px; 19 | position: absolute; 20 | left: 10px; 21 | } 22 | 23 | .tabs-container { 24 | display: inline-block; 25 | margin-top: 16px; 26 | font-family: serif; 27 | } 28 | 29 | .tabs-container>div { 30 | display: inline-block; 31 | } 32 | 33 | .tabs-item-link { 34 | color: #666666; 35 | font-size: 22px; 36 | } 37 | 38 | .tabs-item-link:hover { 39 | color: #0074A0; 40 | } 41 | 42 | /* End tabs */ 43 | -------------------------------------------------------------------------------- /vue_acimage_web/src/components/TagCard/TagCard.css: -------------------------------------------------------------------------------- 1 | .tags-container>>>.el-tag:hover { 2 | border: 1px solid skyblue; 3 | } 4 | 5 | .tags-container>>>.el-tag:active { 6 | border: 1px solid blue; 7 | } 8 | 9 | .tags-container>>>.el-tag:focus { 10 | border: 1px solid blue !important; 11 | } 12 | 13 | .tags-container>>>.el-tag { 14 | display: inline-block; 15 | margin-top: 6px; 16 | margin-right: 5px; 17 | margin-left: auto; 18 | } 19 | 20 | -------------------------------------------------------------------------------- /vue_acimage_web/src/components/TopicList/TopicList.css: -------------------------------------------------------------------------------- 1 | .categories-container>>>.el-button { 2 | display: inline-block; 3 | margin-top: 6px; 4 | margin-right: 4px; 5 | margin-left: auto; 6 | } 7 | 8 | .category-card-div>>> .el-card{ 9 | border-width:2px; 10 | } 11 | 12 | .categories-container { 13 | padding-bottom: 10px; 14 | } 15 | 16 | .icon-medal{ 17 | position: relative; 18 | font-size: 20px; 19 | top:4px; 20 | } 21 | 22 | .data-container{ 23 | margin-left: 20px; 24 | margin-bottom: -5px; 25 | font-size: 12px; 26 | } 27 | 28 | .item-container{ 29 | font-size: 14px; 30 | position: relative; 31 | margin-bottom: 5px; 32 | } 33 | 34 | .ml7{ 35 | margin-left: 7px; 36 | } -------------------------------------------------------------------------------- /vue_acimage_web/src/config.js: -------------------------------------------------------------------------------- 1 | export default{ 2 | domainOfImages:'http://rof8epeiz.hn-bkt.clouddn.com/', 3 | } -------------------------------------------------------------------------------- /vue_acimage_web/src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | import router from '@/router' 4 | import store from '@/store' 5 | 6 | import axios from 'axios' 7 | Vue.prototype.axios = axios 8 | 9 | import ElementUI from 'element-ui'; 10 | import 'element-ui/lib/theme-chalk/index.css'; 11 | Vue.use(ElementUI); 12 | 13 | import {Notification} from 'element-ui'; 14 | Vue.prototype.$notify = Notification; 15 | 16 | import global from '@/utils/global.js'; 17 | Vue.prototype.$global=global 18 | 19 | //防xss攻击 20 | import VueDOMPurifyHTML from 'vue-dompurify-html' 21 | Vue.use(VueDOMPurifyHTML) 22 | 23 | Vue.config.productionTip = false 24 | if(process.env.VUE_APP_MOCK){ 25 | require('../mock') 26 | } 27 | 28 | 29 | new Vue({ 30 | render: h => h(App), 31 | router, 32 | store 33 | }).$mount('#app') 34 | -------------------------------------------------------------------------------- /vue_acimage_web/src/utils/MessageUtils.js: -------------------------------------------------------------------------------- 1 | import { 2 | Message, 3 | MessageBox, 4 | Loading, 5 | Notification 6 | } from 'element-ui'; 7 | export default{ 8 | notice(msg,durationSeconds,type){ 9 | let newType=type||'warning'; 10 | let newDuration=durationSeconds||4; 11 | Notification({ 12 | title: '提示', 13 | message: msg, 14 | type: newType, 15 | duration: newDuration*1000 16 | }); 17 | }, 18 | success(msg,durationSeconds){ 19 | let newDuration=durationSeconds||4; 20 | Notification({ 21 | title: '成功', 22 | message: msg, 23 | type: 'success', 24 | duration: newDuration*1000 25 | }); 26 | }, 27 | confirm(msg){ 28 | return MessageBox.confirm(msg, '提示', { 29 | confirmButtonText: '确定', 30 | cancelButtonText: '取消', 31 | type: 'warning' 32 | }) 33 | } 34 | 35 | } -------------------------------------------------------------------------------- /vue_acimage_web/src/utils/StringUtils.js: -------------------------------------------------------------------------------- 1 | export default { 2 | html2Text(htmlString) { 3 | return htmlString.toString().replace(/<(style|script|iframe)[^>]*?>[\s\S]+?<\/\1\s*>/gi, '') 4 | .replace(/<[^>]+?>/g, '') 5 | .replace(/\s+/g, ' ') 6 | .replace(/ /g, ' ') 7 | .replace(/>/g, ' ') 8 | .replace(/ /gm,' '); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /vue_acimage_web/src/utils/result.js: -------------------------------------------------------------------------------- 1 | // 状态码 2 | export let Code = { 3 | OK: 20000, 4 | ERR: 20001, 5 | DATA_NOT_EXIST: 20011 6 | } 7 | -------------------------------------------------------------------------------- /vue_acimage_web/src/utils/utils.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /vue_acimage_web/src/views/Home/Home.css: -------------------------------------------------------------------------------- 1 | 2 | .home-wrapper{ 3 | background-color: white; 4 | padding-bottom: 200px; 5 | } 6 | 7 | .home-main{ 8 | width:1130px; 9 | margin-left: calc( (100% - 1120px) / 2 ); 10 | margin-top: 20px; 11 | display: block; 12 | } 13 | 14 | .mask-images-container{ 15 | width:520px; 16 | margin-left:10px; 17 | display: inline-block; 18 | vertical-align: top; 19 | } 20 | 21 | .mask-images-container>div{ 22 | display: inline-block; 23 | } 24 | 25 | .float-image-container{ 26 | display: inline-block; 27 | margin-left: 18px; 28 | margin-right:18px; 29 | width: 190px; 30 | } 31 | 32 | -------------------------------------------------------------------------------- /vue_acimage_web/src/views/MyActivity/MyCommentActivity/MyCommentActivity.css: -------------------------------------------------------------------------------- 1 | 2 | .activity-content{ 3 | position: relative; 4 | padding:10px; 5 | margin-top: 10px; 6 | padding-bottom: 20px; 7 | } 8 | 9 | .activity-title{ 10 | font-size: 16px; 11 | margin-top:-5px; 12 | } 13 | 14 | .activity-title-label{ 15 | color:#AAAAAA; 16 | font-size:15px; 17 | } 18 | 19 | .activity-medium{ 20 | display:inline-block; 21 | vertical-align: top; 22 | margin-left:10px; 23 | width:500px; 24 | } 25 | 26 | .activity-time{ 27 | margin-top:5px; 28 | color:#999999; 29 | font-size:16px; 30 | } 31 | 32 | .activity-right{ 33 | display:inline-block; 34 | vertical-align: top; 35 | float:right; 36 | } -------------------------------------------------------------------------------- /vue_acimage_web/src/views/MyActivity/MyStarActivity/MyStarActivity.css: -------------------------------------------------------------------------------- 1 | 2 | .activity-content{ 3 | position: relative; 4 | padding:10px; 5 | margin-top: 10px; 6 | padding-bottom: 20px; 7 | } 8 | 9 | .activity-title{ 10 | font-size: 16px; 11 | margin-top:-5px; 12 | } 13 | 14 | .activity-title-label{ 15 | color:#AAAAAA; 16 | font-size:15px; 17 | } 18 | 19 | .activity-medium{ 20 | display:inline-block; 21 | vertical-align: top; 22 | margin-left:10px; 23 | width:300px; 24 | } 25 | 26 | .activity-time{ 27 | margin-top:5px; 28 | color:#999999; 29 | font-size:16px; 30 | } 31 | 32 | .activity-right{ 33 | display:inline-block; 34 | vertical-align: top; 35 | float:right; 36 | } -------------------------------------------------------------------------------- /vue_acimage_web/src/views/MyActivity/MyTopicActivity/MyTopicActivity.css: -------------------------------------------------------------------------------- 1 | 2 | .activity-content{ 3 | position: relative; 4 | padding:10px; 5 | margin-top: 10px; 6 | padding-bottom: 20px; 7 | } 8 | 9 | .activity-title{ 10 | font-size: 16px; 11 | margin-top:-5px; 12 | } 13 | 14 | .topic-data{ 15 | color:#999999; 16 | } 17 | 18 | .activity-title-label{ 19 | color:#AAAAAA; 20 | font-size:15px; 21 | } 22 | 23 | .activity-medium{ 24 | display:inline-block; 25 | vertical-align: top; 26 | margin-left:10px; 27 | width:300px; 28 | } 29 | 30 | .activity-time{ 31 | margin-top:5px; 32 | color:#999999; 33 | font-size:16px; 34 | } 35 | 36 | .activity-right{ 37 | display:inline-block; 38 | vertical-align: top; 39 | float:right; 40 | } -------------------------------------------------------------------------------- /vue_acimage_web/src/views/MyMessage/CommentMessage/CommentMessage.css: -------------------------------------------------------------------------------- 1 | 2 | .activity-content{ 3 | position: relative; 4 | padding:10px; 5 | margin-top: 10px; 6 | padding-bottom: 20px; 7 | } 8 | 9 | .activity-title{ 10 | font-size: 16px; 11 | margin-top:-5px; 12 | } 13 | 14 | .activity-title-label{ 15 | color:#AAAAAA; 16 | font-size:15px; 17 | } 18 | 19 | .activity-medium{ 20 | display:inline-block; 21 | vertical-align: top; 22 | margin-left:10px; 23 | width:500px; 24 | } 25 | 26 | .activity-time{ 27 | margin-top:5px; 28 | color:#999999; 29 | font-size:16px; 30 | } 31 | 32 | .activity-right{ 33 | display:inline-block; 34 | vertical-align: top; 35 | float:right; 36 | } -------------------------------------------------------------------------------- /vue_acimage_web/src/views/TopicInfo/PublishComment/PublishComment.css: -------------------------------------------------------------------------------- 1 | 2 | .user-comment-container{ 3 | text-align: center; 4 | width:100%; 5 | margin-bottom: 20px; 6 | } 7 | 8 | .user-comment-container>div{ 9 | display: inline-block; 10 | vertical-align: top; 11 | } 12 | --------------------------------------------------------------------------------