Full Code of ggggborn/SpringCloud-acimage for AI

main 32c50a3e1d8b cached
718 files
1.7 MB
515.9k tokens
2192 symbols
1 requests
Download .txt
Showing preview only (2,030K chars total). Download the full file or copy to clipboard to get everything.
Repository: ggggborn/SpringCloud-acimage
Branch: main
Commit: 32c50a3e1d8b
Files: 718
Total size: 1.7 MB

Directory structure:
gitextract_r94k4dmb/

├── .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/
│   └── 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.json
│   ├── public/
│   │   ├── table.json
│   │   └── template.xlsx
│   ├── 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
│   │   ├── 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/
│   │   │   │   └── user.vue
│   │   │   └── user.vue
│   │   └── vite-env.d.ts
│   ├── tsconfig.json
│   ├── tsconfig.node.json
│   └── vite.config.ts
└── vue_acimage_web/
    ├── .gitignore
    ├── README.md
    ├── babel.config.js
    ├── jsconfig.json
    ├── mock/
    │   ├── HomeCarousel.js
    │   ├── UserRank.js
    │   ├── index.js
    │   └── topic.js
    ├── package.json
    ├── public/
    │   ├── index.html
    │   ├── static/
    │   │   └── css/
    │   │       └── common.css
    │   └── tinymce/
    │       ├── langs/
    │       │   ├── README.md
    │       │   └── zh-Hans.js
    │       ├── license.txt
    │       ├── plugins/
    │       │   └── emoticons/
    │       │       └── js/
    │       │           ├── emojiimages.js
    │       │           └── emojis.js
    │       └── tinymce.d.ts
    ├── 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
    │   ├── 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

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
/.idea
target

/temp

application-dev?.yml
application-prod.yml
application-prod?.yml
application-server.yml
application-server?.yml
application-common-secret.yml
application-qiniu.yml


================================================
FILE: README.md
================================================
# 次元印象

<p align="center">
<img widht="240px" height="240px" src="./doc/images/website-icon.jpg" ></img>
</p>
<p align="center">
次元印象,一个SpringCloud构建的动漫交流论坛
</p>

<p align="center">
<img src="https://img.shields.io/badge/JDK-1.8-green.svg" ></img>
<img src="https://img.shields.io/badge/springboot-2.6.11-green" ></img>
<img src="https://img.shields.io/badge/SpringCloud-2021.0.3-brightgreen" ></img>
<img src="https://img.shields.io/badge/mybatis--plus-3.4.1-green" ></img>
<img src="https://img.shields.io/badge/vue-2.6.14-green" ></img>
<img src="https://img.shields.io/badge/license-Apache2.0-blue" ></img>
</p>

## 前言

传说Github上的中国程序员有一半是二次元,于是~~为了吸引更多star~~我边学习SpringCloud技术边开发了这个动漫交流论坛。

<p align="center">
<img width="240px" src="./doc/images/二次元段子.jpg" ></img>
</p>

## 项目介绍

**次元印象** ( **acimage**) 是一个**基于SpringCloud**构建的**前后端分离**的动漫交流论坛。后端使用 **SpringCloud**+**Mybatis-Plus**+**Reids**+**Rabbitmq**+**Elasticsearch**。前端使用 **Vue** + **ElementUi** + **Vite** 。项目已经上线。各位Github的二次元们,还不来点个star(๑•̀ㅂ•́)و✧。

## 网址

**次元印象o(*≧▽≦)ツ~动漫交流论坛** www.acimage.top (只适配网页端,如果画面显小,可以适当放大浏览器,视觉效果更佳)。

**首页**

<p align="center">
<img src="./doc/images/home1.webp" ></img>
</p>

<p align="center">
<img src="./doc/images/home2.webp" ></img>
</p>

**论坛页**

<p align="center">
<img src="./doc/images/forum1.webp" ></img>
</p>

<p align="center">
<img src="./doc/images/forum2.webp" ></img>
</p>

<p align="center">
<img src="./doc/images/forum3.webp" ></img>
</p>

## 系统架构

<p align="center">
<img src="./doc/images/architecture.jpg" ></img>
</p>

## 项目功能

#### 用户前台

- **以图识图**,即上传图片,识别出论坛内相似图片及其所在话题。
- **多样化搜索**,可以同时根据关键词、分类、标签以及排序字段等搜索,并根据关键词高亮匹配文字。
- **相关话题推荐**,**随机推荐**。
- **话题排行榜**(按star、浏览量、评论数等、活跃时间排行)。
- **用户排行榜**(按话题数、star等排行)。
- 分类、标签,并且点击可筛选出符合相关分类或标签的话题。
- **实时展示最新活跃话题**。
- **敏感词过滤**,**图片压缩**。
- **消息通知**
- 查看个人动态、修改个人信息。
- 登录、注册、登出,**验证码防刷**,**邮箱验证**。
- 发表话题,评论,star等。

#### 后台管理

- 较为完善的RBAC权限控制,可动态调整用户角色、角色权限、接口权限等。
- 网站基本数据展示,访客量,接口调用数等。
- 首页轮播图片管理。
- 话题、评论、用户管理。
- 

## 项目特点

- **JWT**实现单点登录,网关统一身份认证和鉴权,完善的**RBAC**权限控制。
- 利用**Redis+Lua脚本+定时任务**对变动比较频繁的数据(浏览量等)定时持久化。
- 利用**Redis+Lua脚本+自定义注解**,只需一个注解就可以实现针对ip、用户、和总体请求量的限流。
- 利用**Dhash**算法实现以图识图功能,效果还可以。
- 上传的图片均用webp压缩,极大地减少带宽压力。

## 项目目录

**后端服务**

- **acimage_gateway**:网关,统一身份认证、鉴权,分别针对用户和总体请求量的限流
- **acimage_user**:用户中心,用户注册、登录,邮箱服务等
- **acimage_community**:社区服务,负责论坛话题相关的核心功能
- **acimage_image**:图片服务,负责话题图片上传、头像上传、以图识图等功能
- **acimage_admin**: 管理服务

**后端模块**

- **acimage_common**:公共模块,存放实体类、公共的拦截器、公共配置以及公共工具类等
- **acimage_feign**:放置各个模块的feign客户端

**前端**

- **vue_manage_system**:后台管理页面
- **vue_acimage_web**:门户网站页面

**其它**

- **doc**: 一些文档、图片和数据库文件

## 运行与部署

**目前项目仍在不断完善,运行与部署流程以后再更新**。

- ~~将**doc/sql** 下的三个数据库分别导入到**mysql**中,四个数据库分别是四个前台服务对应的数据库~~

- ~~在每个服务的**application-dev.yml**文件中配置**mysql、redis、rabbitmq**、**nacos**相应的地址或账号密码~~

- ~~填写**acimage_common**中的**application-qiniu-template.yml**中的七牛云账号信息,包括**access-key**、**secret-key**、**domian**、**bucket**,或者给这四个属性随便赋值(不能为空,否则**NPE**),但是这样无法使用上传图片。并将**application-qiniu-template.yml**重命名为**application-qiniu.yml**~~

- ~~在**acimage_common**模块的下的**application.yml**配置 **nacos** 地址、**sentinel**地址(**sentinel**不配也不影响运行)~~

- ~~启动**nacos、redis、rabbitmq、mysql**~~

- ~~依次启动**acimage_user**、**acimage_community**、**acimage_image**、**acimage_gateway**,不这样启动的话可能会由于**rabbitmq**队列创建和绑定顺序的问题报错,如果遇到了,则全部服务再重新启动一遍。~~

- ~~运行前端(具体看**vue_acimage_web**的**README**)后点击默认弹出的链接即可访问首页~~

- ~~前台登录**:用户:wk,密码:wk123456 
  (还有几个用户可以从数据库sql文件看到,密码均为  用户名123456)~~

- 端口:
  
  - **acimage_user**: 8100  
  
  - **acimage_image** : 8090 
  
  - **acimage_community**: 8080
  
  - **acimage_gateway**: 8070

## 技术选型

#### 后端技术栈

**SpringBoot**、**SpringCloud**、**MyBatis-plus**、**Druid**(数据库连接池)、**Redis**(分布式缓存)、**Rabbitmq**(消息队列)、**Elasticsearch**(分布式搜索引擎)、**Minio**(对象存储服务)、**Nginx**(反向代理服务器)、**Docker**(应用容器引擎)

#### 用户界面前端

**Vue2**、**Vue Router**(路由)、**ElementUi**(Vue基础组件库)、**axios**(http客户端)、**jsencrypt**(基于RSA加解密的js库)、**vue-dompurify-html**(防xss攻击)、**tinymce-vue**(富文本编辑器)

#### 后台管理界面前端

**Vite**、**TypeSript**

## Todo

- [x] 分类、标签
- [x] 话题、用户排行榜
- [x] 随机推荐
- [x] 相似话题推荐
- [x] 敏感词过滤
- [x] 接口幂等
- [x] 细化限流
- [x] 完善RABC权限控制,网关统一身份认证及鉴权
- [x] 增加邮件服务,邮箱验证,验证码等
- [x] 将图片存储在minio(原来存储在七牛云)
- [x] elasticsearch多样化搜索,关键词高亮
- [x] 增加用户消息通知功能
- [ ] 利用redis+lua批量提取缓存中话题和浏览量等,减少通信次数,实时展示数据。
- [ ] 增加评论表情
- [ ] 增加关注功能
- [ ] 完善sentinel和nacos等配置和使用
- [ ] 增加爬虫模块
- [ ] 完善单元测试
- [ ] 等等等

## 交流

项目起初是为了学习技术搭建的,由于能力有限,还有很多不完善的地方,欢迎各位能够指正。如果有人感兴趣(多么希望真的有人感兴趣 手动捂脸)或者该项目遇到什么问题或有什么建议提issue,可联系邮箱1179836161@qq.com或进群692992463交流。喜欢的话记得点个star。

## 网站截图

 **Web端** 
![image text](./doc/images/home1.webp)             
![image text](./doc/images/home2.webp)  
![image text](./doc/images/forum1.webp)             
![image text](./doc/images/forum2.webp)  
![image text](./doc/images/forum3.webp) 
![image text](./doc/images/topic-info1.webp) 
![image text](./doc/images/topic-info2.webp) 
![image text](./doc/images/search.webp) 
![image text](./doc/images/search-image1.webp) 
![image text](./doc/images/search-image2.webp)  
![image text](./doc/images/login.webp)  
![image text](./doc/images/activity.webp) 
![image text](./doc/images/profile.webp)              

 **Admin端**  
 管理系统随便放几张吧,反正管理系统都长一个样。
 ![image text](./doc/images/admin-home.webp) 
![image text](./doc/images/admin-authorize.webp)  

## 开源协议

[Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0.html)


================================================
FILE: acimage_admin/.gitignore
================================================
/target/


================================================
FILE: acimage_admin/pom.xml
================================================
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>acimage</artifactId>
        <groupId>com.acimage</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>acimage_admin</artifactId>
    <packaging>jar</packaging>

    <name>acimage_admin</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.acimage</groupId>
            <artifactId>acimage_common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>com.acimage</groupId>
            <artifactId>acimage_feign</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

        <!--druid依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>

        <!--mysql依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--动态多数据源-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
        </dependency>

        <!--minio-->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skipTests>true</skipTests><!--跳过测试包-->
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/AdminApplication.java
================================================
package com.acimage.admin;

import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling;

@Slf4j
@SpringBootApplication
@EnableDiscoveryClient
@EnableScheduling
@EnableFeignClients(basePackages="com.acimage.feign")
@ComponentScan(value={"com.acimage"})
@MapperScan(basePackages = {"com.acimage.admin.dao"})
public class AdminApplication {

	public static void main(String[] args) {
		SpringApplication.run(AdminApplication.class, args);
		log.info("------------->>>Admin启动<<<-------------");
	}

}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/config/WebMvcConfig.java
================================================
package com.acimage.admin.config;

import com.acimage.common.web.interceptor.AccessInterceptor;
import com.acimage.common.web.interceptor.JwtInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Slf4j
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {


        registry.addInterceptor(new AccessInterceptor()).addPathPatterns("/**").order(30);
    }


}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/config/mybatis/CommunityDataSourceConfig.java
================================================
package com.acimage.admin.config.mybatis;


import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Deprecated
//@Configuration
//@MapperScan(basePackages = "com.acimage.admin.dao.community", sqlSessionFactoryRef = "communitySqlSessionFactory")
public class CommunityDataSourceConfig {

    @Bean(name = "communityDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.community")
    public DataSource communityDataSource() {
        return DataSourceBuilder.create().build();
    }


    @Bean(name = "communitySqlSessionFactory")
    public SqlSessionFactory orderSqlSessionFactory(@Qualifier("communityDataSource")DataSource dataSource,@Autowired GlobalConfig globalConfig) throws Exception {
        MybatisSqlSessionFactoryBean sqlSessionFactoryBean=new MybatisSqlSessionFactoryBean();

        sqlSessionFactoryBean.setDataSource(dataSource);

        sqlSessionFactoryBean.setGlobalConfig(globalConfig);

        sqlSessionFactoryBean.setTypeAliasesPackage("com.acimage.common.model.domain");
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/community/*.xml"));
        sqlSessionFactoryBean.setTypeHandlersPackage("com.acimage.admin.config.mybatis.typehandler");
        return sqlSessionFactoryBean.getObject();
    }


    @Bean(name = "communityTransactionManager")
    public DataSourceTransactionManager orderTransactionManager(@Qualifier("communityDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }


    @Bean(name = "communitySqlSessionTemplate")
    public SqlSessionTemplate memberSqlSessionTemplate(
            @Qualifier("communitySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/config/mybatis/GlobalConfigBean.java
================================================
package com.acimage.admin.config.mybatis;

import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//@Configuration
@Deprecated
public class GlobalConfigBean {

    @Bean
    @ConfigurationProperties(prefix = "mybatis-plus.global-config")
    GlobalConfig globalConfig(){
        return new GlobalConfig();
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/config/mybatis/ImageDataSourceConfig.java
================================================
package com.acimage.admin.config.mybatis;


import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Deprecated
//@Configuration
//@MapperScan(basePackages = "com.acimage.admin.dao.image", sqlSessionFactoryRef = "imageSqlSessionFactory",sqlSessionTemplateRef ="imageSqlSessionTemplate")
public class ImageDataSourceConfig {


    @Bean(name = "imageDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.image")
    public DataSource imageDataSource() {
        return DataSourceBuilder.create().build();
    }

//    @Bean
//    @ConfigurationProperties(prefix = "mybatis-plus.global-config")
//    GlobalConfig globalConfig(){
//        return new GlobalConfig();
//    }




    @Bean(name = "imageSqlSessionFactory")
    public SqlSessionFactory imageSqlSessionFactory(@Qualifier("imageDataSource") DataSource dataSource, @Autowired GlobalConfig globalConfig) throws Exception {
        MybatisSqlSessionFactoryBean sqlSessionFactoryBean=new MybatisSqlSessionFactoryBean();

        sqlSessionFactoryBean.setDataSource(dataSource);

        sqlSessionFactoryBean.setGlobalConfig(globalConfig);

        sqlSessionFactoryBean.setTypeAliasesPackage("com.acimage.common.model.domain");
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/image/*.xml"));
        sqlSessionFactoryBean.setTypeHandlersPackage("com.acimage.admin.config.mybatis.typehandler");
        return sqlSessionFactoryBean.getObject();

    }


    @Bean(name = "imageTransactionManager")
    public DataSourceTransactionManager imageTransactionManager(@Qualifier("imageDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }


    @Bean(name = "imageSqlSessionTemplate")
    public SqlSessionTemplate memberSqlSessionTemplate(
            @Qualifier("imageSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/dao/community/CategoryDao.java
================================================
package com.acimage.admin.dao.community;

import com.acimage.common.model.domain.community.Category;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface CategoryDao extends BaseMapper<Category> {
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/dao/community/CommentDao.java
================================================
package com.acimage.admin.dao.community;

import com.acimage.common.model.domain.community.Comment;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface CommentDao extends BaseMapper<Comment> {
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/dao/community/HomeCarouselDao.java
================================================
package com.acimage.admin.dao.community;


import com.acimage.common.model.domain.community.HomeCarousel;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;


public interface HomeCarouselDao extends BaseMapper<HomeCarousel> {
    @Select("select coalesce(max(location),0) from tb_home_carousel")
    Integer getMaxLocation();

    List<HomeCarousel> count();
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/dao/community/TopicDao.java
================================================
package com.acimage.admin.dao.community;

import com.acimage.common.model.domain.community.Topic;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface TopicDao extends BaseMapper<Topic> {
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/dao/sys/ApiDao.java
================================================
package com.acimage.admin.dao.sys;

import com.acimage.common.model.domain.sys.Api;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface ApiDao extends BaseMapper<Api> {
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/dao/sys/AuthorizeDao.java
================================================
package com.acimage.admin.dao.sys;

import com.acimage.common.model.domain.sys.Authorize;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface AuthorizeDao extends BaseMapper<Authorize> {


}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/dao/sys/PermissionDao.java
================================================
package com.acimage.admin.dao.sys;

import com.acimage.common.model.domain.sys.Permission;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;

import javax.annotation.Nullable;
import java.util.List;

public interface PermissionDao extends BaseMapper<Permission> {

    List<Permission> selectTreeByParentId(@Nullable @Param("parentId") Integer parentId);

    List<Permission> selectPermissionsWithParent(@Param("startIndex") int startIndex,@Param("recordNumber") int recordNumber);


}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/dao/sys/RoleDao.java
================================================
package com.acimage.admin.dao.sys;

import com.acimage.common.model.domain.sys.Role;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface RoleDao extends BaseMapper<Role> {
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/dao/sys/UserRoleDao.java
================================================
package com.acimage.admin.dao.sys;


import com.acimage.common.model.domain.sys.UserRole;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface UserRoleDao extends BaseMapper<UserRole> {
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/dao/user/UserDao.java
================================================
package com.acimage.admin.dao.user;

import com.acimage.common.model.domain.user.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface UserDao extends BaseMapper<User> {
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/dao/user/UserPrivacyDao.java
================================================
package com.acimage.admin.dao.user;

import com.acimage.common.model.domain.user.UserPrivacy;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface UserPrivacyDao extends BaseMapper<UserPrivacy> {
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/global/consts/ModuleConstants.java
================================================
package com.acimage.admin.global.consts;

public class ModuleConstants {
    public static final String COMMUNITY="community";
    public static final String SYS="sys";

    public static final String IMAGE="image";

    public static final String USER="user";
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/AdminLoginReq.java
================================================
package com.acimage.admin.model.request;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.Email;
import javax.validation.constraints.Size;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class AdminLoginReq {
    @Email(message = "邮箱格式错误")
    @Size(min=6,max=32,message = "邮箱长度在6到32之间")
    private String email;

    @Size(min = 100, max = 2000, message = "非法密码")
    String password;

    @Size(min=4,max=6,message = "验证码长度不符")
    String verifyCode;
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/ApiAddReq.java
================================================
package com.acimage.admin.model.request;

import com.acimage.common.global.enums.MatchRule;
import com.acimage.common.global.enums.MyHttpMethod;
import com.acimage.common.model.domain.sys.Api;
import com.acimage.common.model.domain.sys.Permission;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.http.HttpMethod;

import javax.annotation.Nullable;
import javax.validation.constraints.*;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ApiAddReq {
    public static final int PATH_MAX = 200;
    public static final int PATH_MIN = 2;
    public static final int NOTE_MAX = 100;


    @NotBlank
    @Pattern(regexp = Api.PATH_PATTERN)
    @Size(min= Api.PATH_MIN,max=Api.PATH_MAX)
    String path;
    @NotNull
    MyHttpMethod method;
    @Positive
    @NotNull
    Integer permissionId;
    @Size(max=Api.NOTE_MAX)
    String note;
    boolean enable;
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/ApiModifyReq.java
================================================
package com.acimage.admin.model.request;

import com.acimage.common.global.enums.MatchRule;
import com.acimage.common.global.enums.MyHttpMethod;
import com.acimage.common.model.domain.sys.Api;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.http.HttpMethod;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Positive;
import javax.validation.constraints.Size;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ApiModifyReq {
    public static final int PATH_MAX = 200;
    public static final int PATH_MIN = 2;
    public static final int NOTE_MAX = 100;
    @Positive
    Integer id;
    @Size(min = Api.PATH_MIN, max = Api.PATH_MAX)
    @Pattern(regexp = Api.PATH_PATTERN)
    String path;
    @NotNull
    MyHttpMethod method;
    @Positive
    @NotNull
    Integer permissionId;
    @Size(max = Api.NOTE_MAX)
    String note;
    boolean enable;
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/ApiQueryReq.java
================================================
package com.acimage.admin.model.request;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ApiQueryReq {
    String keyword;
    @Min(1)
    Integer pageNo;
    @Min(2)
    @Max(20)
    Integer pageSize;
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/CarouselAddReq.java
================================================
package com.acimage.admin.model.request;

import com.acimage.common.model.domain.community.HomeCarousel;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Data
@NoArgsConstructor
public class CarouselAddReq {
    @Size(min = HomeCarousel.DESC_MIN, max = HomeCarousel.DESC_MAX, message = HomeCarousel.DESC_INVALID_MSG)
    String description;
    @NotNull
    @Size(min = 0, max = HomeCarousel.LINK_MAX, message = HomeCarousel.LINK_INVALID_MSG)
    String link;

}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/CarouselModifyReq.java
================================================
package com.acimage.admin.model.request;

import com.acimage.common.model.domain.community.HomeCarousel;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive;
import javax.validation.constraints.Size;

@Data
@NoArgsConstructor
public class CarouselModifyReq {
    @NotNull
    @Positive
    private Integer id;
    @Size(min = HomeCarousel.DESC_MIN, max = HomeCarousel.DESC_MAX, message = HomeCarousel.DESC_INVALID_MSG)
    String description;
    @NotNull
    @Size(min = 0, max = HomeCarousel.LINK_MAX, message = HomeCarousel.LINK_INVALID_MSG)
    String link;

}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/CommentQueryReq.java
================================================
package com.acimage.admin.model.request;

import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.*;

@Data
@NoArgsConstructor
public class CommentQueryReq {
    Long topicId;
    String keyword;
    @Range(min=1)
    Integer pageNo;
    @Range(min=5,max=20)
    Integer pageSize;
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/PermissionAddReq.java
================================================
package com.acimage.admin.model.request;

import com.acimage.common.model.domain.sys.Permission;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Data
@NoArgsConstructor
public class PermissionAddReq {

    Integer parentId;
    @Size(max = Permission.CODE_MAX,message =Permission.CODE_VALIDATION_MSG)
    String code;
    @Size(max = Permission.NOTE_MAX,message =Permission.NOTE_VALIDATION_MSG)
    String note;
    @NotNull
    @Size(max = Permission.LABEL_MAX,message =Permission.LABEL_VALIDATION_MSG)
    String label;
    @NotNull
    Boolean module;
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/PermissionModifyReq.java
================================================
package com.acimage.admin.model.request;

import com.acimage.common.model.domain.sys.Permission;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive;
import javax.validation.constraints.Size;

@Data
@NoArgsConstructor
public class PermissionModifyReq {
    @Positive
    Integer id;
    Integer parentId;
    @Size(max = Permission.CODE_MAX,message =Permission.CODE_VALIDATION_MSG)
    String code;
    @Size(max = Permission.NOTE_MAX,message =Permission.NOTE_VALIDATION_MSG)
    String note;
    @NotNull
    @Size(max = Permission.LABEL_MAX,message =Permission.LABEL_VALIDATION_MSG)
    String label;
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/RoleAddReq.java
================================================
package com.acimage.admin.model.request;


import com.acimage.common.model.domain.sys.Role;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.Size;

@Data
@NoArgsConstructor
public class RoleAddReq {
    @Size(max= Role.ROLE_NAME_MAX,min=Role.ROLE_NAME_MIN,message = Role.ROLE_NAME_VALIDATION_MSG)
    String roleName;
    @Size(max=Role.NOTE_MAX,message = Role.NOTE_VALIDATION_MSG)
    String note;
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/RoleModifyReq.java
================================================
package com.acimage.admin.model.request;

import com.acimage.common.model.domain.sys.Role;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.Positive;
import javax.validation.constraints.Size;

@Data
@NoArgsConstructor
public class RoleModifyReq {


    @Positive
    Integer id;
    @Size(max= Role.ROLE_NAME_MAX,min=Role.ROLE_NAME_MIN,message = Role.ROLE_NAME_VALIDATION_MSG)
    String roleName;
    @Size(max=Role.NOTE_MAX,message = Role.NOTE_VALIDATION_MSG)
    String note;
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/TopicQueryReq.java
================================================
package com.acimage.admin.model.request;

import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.*;

@Data
@NoArgsConstructor
public class TopicQueryReq {
    @NotBlank
    String column;
    @Positive
    @NotNull
    Integer pageNo;
    @Range(min=5,max=20)
    Integer pageSize;
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/UserQueryReq.java
================================================
package com.acimage.admin.model.request;

import lombok.Data;

import javax.validation.constraints.*;

@Data
public class UserQueryReq {

    String keyword;
    @NotNull
    @Positive
    Integer pageNo;
    @Min(2)
    @Max(20)
    Integer pageSize;
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/model/vo/WebsiteDataVo.java
================================================
package com.acimage.admin.model.vo;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class WebsiteDataVo {
    private Integer pageView;
    private Integer apiAccessCount;
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/api/ApiQueryService.java
================================================
package com.acimage.admin.service.api;

import com.acimage.admin.model.request.ApiQueryReq;
import com.acimage.common.model.domain.sys.Api;
import com.acimage.common.model.page.MyPage;

public interface ApiQueryService {
    MyPage<Api> pageBy(ApiQueryReq apiQueryReq);
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/api/ApiWriteService.java
================================================
package com.acimage.admin.service.api;

import com.acimage.admin.model.request.ApiAddReq;
import com.acimage.admin.model.request.ApiModifyReq;

public interface ApiWriteService {
    void save(ApiAddReq apiAddReq);

    void update(ApiModifyReq apiModifyReq);

    void delete(int id);
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/api/impl/ApiQueryServiceImpl.java
================================================
package com.acimage.admin.service.api.impl;

import com.acimage.admin.dao.sys.ApiDao;
import com.acimage.admin.global.consts.ModuleConstants;
import com.acimage.admin.model.request.ApiQueryReq;
import com.acimage.admin.service.api.ApiQueryService;
import com.acimage.common.model.domain.sys.Api;
import com.acimage.common.model.page.MyPage;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
@DS(ModuleConstants.SYS)
public class ApiQueryServiceImpl implements ApiQueryService {
    @Autowired
    ApiDao apiDao;

    @Override
    public MyPage<Api> pageBy(ApiQueryReq apiQueryReq) {
        IPage<Api> page = new Page<>(apiQueryReq.getPageNo(), apiQueryReq.getPageSize());
        LambdaQueryWrapper<Api> qw = new LambdaQueryWrapper<>();
        qw.orderByAsc(Api::getPath);
        String keyword = apiQueryReq.getKeyword();
        if (keyword != null) {
            qw.like(Api::getPath, keyword);
        }
        IPage<Api> resultPage=apiDao.selectPage(page, qw);
        return MyPage.from(resultPage);
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/api/impl/ApiWriteServiceImpl.java
================================================
package com.acimage.admin.service.api.impl;


import com.acimage.admin.dao.sys.ApiDao;
import com.acimage.admin.global.consts.ModuleConstants;
import com.acimage.admin.model.request.ApiAddReq;
import com.acimage.admin.model.request.ApiModifyReq;
import com.acimage.admin.service.api.ApiWriteService;
import com.acimage.admin.service.permission.PermissionQueryService;
import com.acimage.common.global.exception.BusinessException;
import com.acimage.common.model.domain.sys.Api;
import com.acimage.common.model.domain.sys.Permission;
import com.acimage.common.utils.common.BeanUtils;
import com.acimage.common.utils.common.ListUtils;
import com.baomidou.dynamic.datasource.annotation.DS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

@Service
@DS(ModuleConstants.SYS)
public class ApiWriteServiceImpl implements ApiWriteService {
    @Autowired
    ApiDao apiDao;
    @Autowired
    PermissionQueryService permissionQueryService;

    @Override
    public void save(ApiAddReq apiAddReq){
        List<Permission> permissionList=permissionQueryService.listByModule(false);
        List<Integer> permissionIds= ListUtils.extract(Permission::getId,permissionList);
        if(!permissionIds.contains(apiAddReq.getPermissionId())){
            throw new BusinessException("权限不存在或非可用权限");
        }
        Api api= BeanUtils.copyPropertiesTo(apiAddReq,Api.class);
        api.setCreateTime(new Date());
        api.setUpdateTime(new Date());
        apiDao.insert(api);
    }

    @Override
    public void update(ApiModifyReq apiModifyReq){
        List<Permission> permissionList=permissionQueryService.listByModule(false);
        List<Integer> permissionIds= ListUtils.extract(Permission::getId,permissionList);
        if(!permissionIds.contains(apiModifyReq.getPermissionId())){
            throw new BusinessException("权限不存在或非可用权限");
        }
        Api api= BeanUtils.copyPropertiesTo(apiModifyReq,Api.class);
        api.setCreateTime(new Date());
        api.setUpdateTime(new Date());
        apiDao.updateById(api);
    }

    @Override
    public void delete(int id){
        apiDao.deleteById(id);
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/authorize/AuthorizeQueryService.java
================================================
package com.acimage.admin.service.authorize;

import com.acimage.common.model.domain.sys.Authorize;

import java.util.List;

public interface AuthorizeQueryService {
    List<Authorize> listAuthorizeByRoleId(int roleId);
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/authorize/AuthorizeWriteService.java
================================================
package com.acimage.admin.service.authorize;

public interface AuthorizeWriteService {

    void save(int roleId, int permissionId);

    void remove(int roleId, int permissionId);

    void remove(int permissionId);
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/authorize/impl/AuthorizeQueryServiceImpl.java
================================================
package com.acimage.admin.service.authorize.impl;

import com.acimage.admin.dao.sys.AuthorizeDao;
import com.acimage.admin.service.authorize.AuthorizeQueryService;
import com.acimage.common.model.domain.sys.Authorize;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@DS("sys")
public class AuthorizeQueryServiceImpl implements AuthorizeQueryService {
    @Autowired
    AuthorizeDao authorizeDao;

    @Override
    public List<Authorize> listAuthorizeByRoleId(int roleId){
        LambdaQueryWrapper<Authorize> qw=new LambdaQueryWrapper<>();
        qw.eq(Authorize::getRoleId,roleId);
        return authorizeDao.selectList(qw);
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/authorize/impl/AuthorizeWriteServiceImpl.java
================================================
package com.acimage.admin.service.authorize.impl;

import com.acimage.admin.dao.sys.AuthorizeDao;
import com.acimage.admin.service.authorize.AuthorizeWriteService;
import com.acimage.admin.service.permission.PermissionQueryService;
import com.acimage.common.global.exception.BusinessException;
import com.acimage.common.model.domain.sys.Authorize;
import com.acimage.common.model.domain.sys.Permission;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
@DS("sys")
public class AuthorizeWriteServiceImpl implements AuthorizeWriteService {
    @Autowired
    AuthorizeDao authorizeDao;
    @Autowired
    PermissionQueryService permissionQueryService;

    @Override
    public void save(int roleId, int permissionId) {
        Permission permission = permissionQueryService.getPermission(permissionId);
        if (permission.isModule()) {
            throw new BusinessException("该结点为模块,不可授权");
        }
        Authorize authorize = new Authorize(roleId, permissionId);
        authorizeDao.insert(authorize);
    }

    @Override
    public void remove(int roleId, int permissionId) {
        LambdaQueryWrapper<Authorize> uw = new LambdaQueryWrapper<>();
        uw.eq(Authorize::getRoleId, roleId)
                .eq(Authorize::getPermissionId, permissionId);
        authorizeDao.delete(uw);
    }

    @Override
    public void remove(int permissionId) {
        LambdaQueryWrapper<Authorize> uw = new LambdaQueryWrapper<>();
        uw.eq(Authorize::getPermissionId, permissionId);
        authorizeDao.delete(uw);
    }

}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/category/CategoryQueryService.java
================================================
package com.acimage.admin.service.category;

import com.acimage.common.model.domain.community.Category;

import java.util.List;

public interface CategoryQueryService {
    List<Category> listAll();
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/category/impl/CategoryQueryServiceImpl.java
================================================
package com.acimage.admin.service.category.impl;

import com.acimage.admin.dao.community.CategoryDao;
import com.acimage.admin.global.consts.ModuleConstants;
import com.acimage.admin.service.category.CategoryQueryService;
import com.acimage.common.model.domain.community.Category;
import com.baomidou.dynamic.datasource.annotation.DS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@DS(ModuleConstants.COMMUNITY)
@Service
public class CategoryQueryServiceImpl implements CategoryQueryService {
    @Autowired
    CategoryDao categoryDao;

    @Override
    public List<Category> listAll(){
        return categoryDao.selectList(null);
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/comment/CommentQueryService.java
================================================
package com.acimage.admin.service.comment;

import com.acimage.admin.model.request.CommentQueryReq;
import com.acimage.common.model.domain.community.Comment;
import com.acimage.common.model.page.MyPage;

public interface CommentQueryService {
    MyPage<Comment> pageCommentsBy(CommentQueryReq commentQueryReq);
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/comment/CommentWriteService.java
================================================
package com.acimage.admin.service.comment;

public interface CommentWriteService {
    void delete(long id);
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/comment/impl/CommentQueryServiceImpl.java
================================================
package com.acimage.admin.service.comment.impl;

import cn.hutool.core.util.StrUtil;
import com.acimage.admin.dao.community.CommentDao;
import com.acimage.admin.global.consts.ModuleConstants;
import com.acimage.admin.model.request.CommentQueryReq;
import com.acimage.admin.service.comment.CommentQueryService;
import com.acimage.common.model.domain.community.Comment;
import com.acimage.common.model.page.MyPage;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
@DS(ModuleConstants.COMMUNITY)
public class CommentQueryServiceImpl implements CommentQueryService {
    @Autowired
    CommentDao commentDao;

    @Override
    public MyPage<Comment> pageCommentsBy(CommentQueryReq commentQueryReq) {
        String keyword=commentQueryReq.getKeyword();
        Long topicId=commentQueryReq.getTopicId();

        int pageNo = commentQueryReq.getPageNo();
        int pageSize = commentQueryReq.getPageSize();
        IPage<Comment> page=new Page<>(pageNo,pageSize);

        LambdaQueryWrapper<Comment> qw = new LambdaQueryWrapper<>();
        qw.orderByDesc(Comment::getCreateTime);
        if(!StrUtil.isBlank(keyword)){
            qw.like(Comment::getContent,keyword);
        }
        if(topicId!=null&&topicId>0){
            qw.eq(Comment::getTopicId,topicId);
        }

        IPage<Comment> resultPage = commentDao.selectPage(page,qw);

        return MyPage.from(resultPage);
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/comment/impl/CommentWriteServiceImpl.java
================================================
package com.acimage.admin.service.comment.impl;


import com.acimage.admin.global.consts.ModuleConstants;
import com.acimage.admin.service.comment.CommentWriteService;
import com.acimage.feign.client.CommentClient;
import com.baomidou.dynamic.datasource.annotation.DS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
@DS(ModuleConstants.COMMUNITY)
public class CommentWriteServiceImpl implements CommentWriteService {
    @Autowired
    private CommentClient client;

    @Override
    public void delete(long id){
        client.delete(id);
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/homecarousel/HomeCarouselQueryService.java
================================================
package com.acimage.admin.service.homecarousel;

import com.acimage.common.model.domain.community.HomeCarousel;

import java.util.List;

public interface HomeCarouselQueryService {
    List<HomeCarousel> listCurrent();
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/homecarousel/HomeCarouselWriteService.java
================================================
package com.acimage.admin.service.homecarousel;

import com.acimage.admin.model.request.CarouselAddReq;
import com.acimage.admin.model.request.CarouselModifyReq;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

public interface HomeCarouselWriteService {
    @Transactional(rollbackFor = Exception.class)
    void saveHomeCarouselImage(MultipartFile multipartFile, CarouselAddReq carouselAddReq);
    void deleteHomeCarouselImage(long id);
    void updateHomeCarouselImage(CarouselModifyReq modifyReq);
    @Transactional(rollbackFor = Exception.class)
    void coverHomeCarouselImage(long id, MultipartFile multipartFile);


}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/homecarousel/impl/HomeCarouselQueryServiceImpl.java
================================================
package com.acimage.admin.service.homecarousel.impl;

import com.acimage.admin.dao.community.HomeCarouselDao;
import com.acimage.admin.global.consts.ModuleConstants;
import com.acimage.admin.service.homecarousel.HomeCarouselQueryService;
import com.acimage.common.model.domain.community.HomeCarousel;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@DS(ModuleConstants.COMMUNITY)
public class HomeCarouselQueryServiceImpl implements HomeCarouselQueryService {

    @Autowired
    HomeCarouselDao homeCarouselDao;
    @Override
    public List<HomeCarousel> listCurrent() {
        LambdaQueryWrapper<HomeCarousel> qw = new LambdaQueryWrapper<>();
        qw.orderByAsc(HomeCarousel::getLocation);
        return homeCarouselDao.selectList(qw);
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/homecarousel/impl/HomeCarouselWriteServiceImpl.java
================================================
package com.acimage.admin.service.homecarousel.impl;

import cn.hutool.core.util.RandomUtil;
import com.acimage.admin.dao.community.HomeCarouselDao;
import com.acimage.admin.global.consts.ModuleConstants;
import com.acimage.admin.model.request.CarouselAddReq;
import com.acimage.admin.model.request.CarouselModifyReq;
import com.acimage.admin.service.homecarousel.HomeCarouselWriteService;
import com.acimage.common.global.consts.StorePrefixConstants;
import com.acimage.common.global.context.UserContext;
import com.acimage.common.global.exception.BusinessException;
import com.acimage.common.model.domain.community.HomeCarousel;
import com.acimage.common.utils.common.FileUtils;
import com.acimage.common.utils.IdGenerator;
import com.acimage.common.utils.minio.MinioUtils;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.Date;

@Slf4j
@Service
@DS(ModuleConstants.COMMUNITY)
public class HomeCarouselWriteServiceImpl implements HomeCarouselWriteService {
    @Autowired
    HomeCarouselDao homeCarouselDao;
    @Autowired
    MinioUtils minioUtils;

    @Override
    public void saveHomeCarouselImage(MultipartFile multipartFile, CarouselAddReq carouselAddReq) {
        String description = carouselAddReq.getDescription();
        String link = carouselAddReq.getLink().trim();
        int length = 5;
        String idString = RandomUtil.randomString(length);
        int size = (int) multipartFile.getSize();
        int location = homeCarouselDao.getMaxLocation() + 1;
        Date now = new Date();
        String fileName = String.format("%s.%s", idString, FileUtils.formatOf(multipartFile));
        String url = minioUtils.generateBaseUrl(StorePrefixConstants.HOME_CAROUSEL, now, fileName);
        String newUrl = minioUtils.upload(multipartFile, url);

        HomeCarousel homeCarousel = new HomeCarousel();
        homeCarousel.setSize(size);
        homeCarousel.setDescription(description);
        homeCarousel.setCreateTime(now);
        homeCarousel.setUpdateTime(now);
        homeCarousel.setUrl(newUrl);
        homeCarousel.setLocation(location);
        homeCarousel.setLink(link);


        homeCarouselDao.insert(homeCarousel);
    }

    @Override
    public void deleteHomeCarouselImage(long id) {
        HomeCarousel homeCarousel = homeCarouselDao.selectById(id);
        if (homeCarousel == null) {
            log.error("用户:{} 操作:删除主页走马灯 特殊图片id:{} 错误:图片不存在", UserContext.getUsername(), id);
            throw new BusinessException("该图片不存在");
        }

        LambdaUpdateWrapper<HomeCarousel> qw = new LambdaUpdateWrapper<>();
        qw.eq(HomeCarousel::getId, id);
        int col = homeCarouselDao.delete(qw);
        minioUtils.deleteFile(homeCarousel.getUrl());

    }

    @Override
    public void updateHomeCarouselImage(CarouselModifyReq modifyReq) {
        Integer id = modifyReq.getId();
        String description = modifyReq.getDescription();
        String link = modifyReq.getLink();
        LambdaUpdateWrapper<HomeCarousel> uw = new LambdaUpdateWrapper<>();
        uw.set(HomeCarousel::getDescription, description)
                .set(HomeCarousel::getLink, link)
                .set(HomeCarousel::getUpdateTime, new Date())
                .eq(HomeCarousel::getId, id);


        int col = homeCarouselDao.update(null, uw);
        if (col == 0) {
            log.error("用户:{} 操作:修改主页走马灯描述 特殊图片id:{} 错误:图片非主页走马灯图片", UserContext.getUsername(), id);
            throw new BusinessException("该主页走马灯图片不存在");
        }
    }

    @Override
    public void coverHomeCarouselImage(long id, MultipartFile multipartFile) {
        HomeCarousel homeCarousel = homeCarouselDao.selectById(id);
        if (homeCarouselDao == null) {
            log.error("用户:{} 操作:覆盖主页走马灯 特殊图片id:{} 错误:图片不存在", UserContext.getUsername(), id);
            throw new BusinessException("图片不存在");
        }

        int size = (int) multipartFile.getSize();
        Date now = new Date();
        String oldUrl = homeCarousel.getUrl();
        String suffix = String.format("%s.%s", IdGenerator.getSnowflakeNextId(), FileUtils.formatOf(multipartFile));
        String newUrl = minioUtils.generateBaseUrl(StorePrefixConstants.HOME_CAROUSEL, now, suffix);
        newUrl = minioUtils.upload(multipartFile, newUrl);
        LambdaUpdateWrapper<HomeCarousel> uw = new LambdaUpdateWrapper<>();
        uw.set(HomeCarousel::getSize, size)
                .set(HomeCarousel::getUpdateTime, now)
                .set(HomeCarousel::getUrl, newUrl)
                .eq(HomeCarousel::getId, id);
        homeCarouselDao.update(null, uw);

        //删除文件
        minioUtils.deleteFile(oldUrl);

    }


}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/login/LoginService.java
================================================
package com.acimage.admin.service.login;

import com.acimage.admin.model.request.AdminLoginReq;

public interface LoginService {
    String login(AdminLoginReq adminLoginReq);
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/login/VerifyCodeService.java
================================================
package com.acimage.admin.service.login;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface VerifyCodeService {
    void writeCodeImageToResponseAndRecord(HttpServletRequest request, HttpServletResponse response);

    boolean verifyAndRemoveIfSuccess(HttpServletRequest request, String code);

}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/login/impl/LoginServiceImpl.java
================================================
package com.acimage.admin.service.login.impl;

import cn.hutool.crypto.digest.DigestUtil;
import com.acimage.admin.dao.user.UserDao;
import com.acimage.admin.dao.user.UserPrivacyDao;
import com.acimage.admin.global.consts.ModuleConstants;
import com.acimage.admin.model.request.AdminLoginReq;
import com.acimage.admin.service.login.LoginService;
import com.acimage.common.global.consts.JwtConstants;
import com.acimage.common.global.exception.BusinessException;
import com.acimage.common.model.domain.user.User;
import com.acimage.common.model.domain.user.UserPrivacy;
import com.acimage.common.service.TokenService;
import com.acimage.common.utils.RsaUtils;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Slf4j
@Service
@DS(ModuleConstants.USER)
public class LoginServiceImpl implements LoginService {
    @Autowired
    UserPrivacyDao userPrivacyDao;
    @Autowired
    UserDao userDao;
    @Autowired
    TokenService tokenService;

    @Override
    public String login(AdminLoginReq adminLoginReq) {
        String email = adminLoginReq.getEmail();
        String password = adminLoginReq.getPassword();

        LambdaQueryWrapper<UserPrivacy> qw = new LambdaQueryWrapper<>();
        qw.eq(UserPrivacy::getEmail, email);
        UserPrivacy userPrivacy = userPrivacyDao.selectOne(qw);
        if (userPrivacy == null) {
            throw new BusinessException("邮箱不存在");
        }

        //找到密码
        long userId=userPrivacy.getUserId();
        String salt = userPrivacy.getSalt();
        String passwordDigest = userPrivacy.getPwd();

        //获取私钥
        String privateKey = RsaUtils.getPrivateKey();
        //解密密码
        String passwordDecrypt = RsaUtils.decrypt(privateKey, password);
//        log.debug(" decrypt as:{}", passwordDecrypt);
        //判断密码正确性
        if (!DigestUtil.md5Hex(salt + passwordDecrypt).equals(passwordDigest)) {
            log.warn("登录 错误:邮箱{} 或密码错误", email);
            throw new BusinessException("用户名或密码错误");
        }

        //返回token
        User user=userDao.selectById(userId);
        return tokenService.createAndRecordToken(userId,
                user.getUsername(),
                user.getPhotoUrl(),
                JwtConstants.ADMIN_EXPIRE_DAYS);

    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/login/impl/VerifyCodeServiceImpl.java
================================================
package com.acimage.admin.service.login.impl;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.ShearCaptcha;
import com.acimage.admin.service.login.VerifyCodeService;
import com.acimage.common.utils.redis.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

@Slf4j
@Service
public class VerifyCodeServiceImpl implements VerifyCodeService {
    @Autowired
    RedisUtils redisUtils;
    public static final String STRINGKP_VERIFY_CODE="acimage:admin:verifyCode:sessionId:";

    @Override
    public void writeCodeImageToResponseAndRecord(HttpServletRequest request, HttpServletResponse response){
        int width=100;
        int height=40;
        int codeCount=4;
        int thickness=4;
        ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(width, height, codeCount, thickness);
        //图形验证码写出,可以写出到文件,也可以写出到流
        try {
            captcha.write(response.getOutputStream());
        } catch (IOException e) {
            log.error("response.getOutputStream()错误 {}",e.getMessage());
            throw new RuntimeException(e);
        }
        //获取验证码中的文字内容
        String verifyCode = captcha.getCode();
        //记录到redis
        String sessionId=request.getSession().getId();
        long timeout=30L;
        redisUtils.setAsString(STRINGKP_VERIFY_CODE+sessionId,verifyCode,timeout, TimeUnit.SECONDS);
    }

    @Override
    public boolean verifyAndRemoveIfSuccess(HttpServletRequest request, String code){
        String key=STRINGKP_VERIFY_CODE+request.getSession().getId();

        String trueCode=redisUtils.getForString(key);
        if(trueCode==null){
            return false;
        }

        if(trueCode.equals(code)){
            redisUtils.delete(key);
            return true;
        }else{
            return false;
        }
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/permission/PermissionQueryService.java
================================================
package com.acimage.admin.service.permission;

import com.acimage.common.model.domain.sys.Permission;
import com.acimage.common.model.page.MyPage;

import java.util.List;

public interface PermissionQueryService {
    Permission getPermission(int id);

    List<Permission> getPermissionTree();

    MyPage<Permission> pagePermissionsWithParent(int pageNo, int pageSize);


    List<Permission> listByModule(boolean isModule);
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/permission/PermissionWriteSercice.java
================================================
package com.acimage.admin.service.permission;

import com.acimage.admin.model.request.PermissionAddReq;
import com.acimage.admin.model.request.PermissionModifyReq;
import org.springframework.transaction.annotation.Transactional;

public interface PermissionWriteSercice {
    void save(PermissionAddReq permissionAddReq);

    @Transactional
    void remove(int id);

    @Transactional
    void update(PermissionModifyReq permissionModifyReq);
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/permission/impl/PermissionQueryServiceImpl.java
================================================
package com.acimage.admin.service.permission.impl;

import com.acimage.admin.dao.sys.PermissionDao;
import com.acimage.admin.service.permission.PermissionQueryService;
import com.acimage.common.model.domain.sys.Permission;
import com.acimage.common.model.page.MyPage;
import com.acimage.common.utils.common.PageUtils;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@DS("sys")
public class PermissionQueryServiceImpl implements PermissionQueryService {
    @Autowired
    PermissionDao permissionDao;

    @Override
    public Permission getPermission(int id){
        return permissionDao.selectById(id);
    }
    @Override
    public List<Permission> getPermissionTree(){
        return permissionDao.selectTreeByParentId(null);
    }
    @Override
    public MyPage<Permission> pagePermissionsWithParent(int pageNo, int pageSize){
        int startIndex= PageUtils.startIndexOf(pageNo,pageSize);
        List<Permission> permissionList= permissionDao.selectPermissionsWithParent(startIndex,pageSize);
        int count=permissionDao.selectCount(null);
        return new MyPage<>(count,permissionList);
    }

    @Override
    public List<Permission> listByModule(boolean isModule){
        LambdaQueryWrapper<Permission> qw=new LambdaQueryWrapper<>();
        qw.eq(Permission::isModule,isModule).orderByDesc(Permission::getCode);
        return permissionDao.selectList(qw);
    }


}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/permission/impl/PermissionWriteServiceImpl.java
================================================
package com.acimage.admin.service.permission.impl;

import cn.hutool.core.bean.BeanUtil;
import com.acimage.admin.dao.sys.PermissionDao;
import com.acimage.admin.global.consts.ModuleConstants;
import com.acimage.admin.model.request.PermissionAddReq;
import com.acimage.admin.model.request.PermissionModifyReq;
import com.acimage.admin.service.authorize.AuthorizeWriteService;
import com.acimage.admin.service.permission.PermissionWriteSercice;
import com.acimage.common.model.domain.sys.Permission;
import com.baomidou.dynamic.datasource.annotation.DS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

@Service
@DS(ModuleConstants.SYS)
public class PermissionWriteServiceImpl implements PermissionWriteSercice {

    @Autowired
    PermissionDao permissionDao;
    @Autowired
    AuthorizeWriteService authorizeWriteService;

    @Override
    public void save(PermissionAddReq permissionAddReq){
        Permission permission=new Permission();
        BeanUtil.copyProperties(permissionAddReq,permission);
        permissionDao.insert(permission);
    }

    @Override
    public void remove(int id){
        authorizeWriteService.remove(id);
        permissionDao.deleteById(id);
    }

    @Override
    public void update(PermissionModifyReq permissionModifyReq){
        Permission permission=new Permission();
        BeanUtil.copyProperties(permissionModifyReq,permission);
        permission.setUpdateTime(new Date());
        permissionDao.updateById(permission);
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/role/RoleQueryService.java
================================================
package com.acimage.admin.service.role;

import com.acimage.common.model.domain.sys.Role;

import java.util.List;

public interface RoleQueryService {
    List<Role> listAll();
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/role/RoleWriteService.java
================================================
package com.acimage.admin.service.role;

import com.acimage.admin.model.request.RoleAddReq;
import com.acimage.admin.model.request.RoleModifyReq;

public interface RoleWriteService {


    void save(RoleAddReq roleAddReq);

    void remove(long id);

    void update(RoleModifyReq roleModifyReq);
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/role/impl/RoleQueryServiceImpl.java
================================================
package com.acimage.admin.service.role.impl;

import com.acimage.admin.dao.sys.RoleDao;
import com.acimage.admin.service.role.RoleQueryService;
import com.acimage.common.model.domain.sys.Role;
import com.baomidou.dynamic.datasource.annotation.DS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@DS("sys")
public class RoleQueryServiceImpl implements RoleQueryService {
    @Autowired
    RoleDao roleDao;

    @Override
    public List<Role> listAll(){
        return roleDao.selectList(null);
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/role/impl/RoleWriteServiceImpl.java
================================================
package com.acimage.admin.service.role.impl;

import cn.hutool.core.bean.BeanUtil;
import com.acimage.admin.dao.sys.RoleDao;
import com.acimage.admin.model.request.RoleAddReq;
import com.acimage.admin.model.request.RoleModifyReq;
import com.acimage.admin.service.role.RoleWriteService;
import com.acimage.common.model.domain.sys.Role;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

@Service
@DS("sys")
public class RoleWriteServiceImpl implements RoleWriteService {
    @Autowired
    RoleDao roleDao;

    @Override
    public void save(RoleAddReq roleAddReq) {
        Role role = new Role();
        BeanUtil.copyProperties(roleAddReq,role,false);
        roleDao.insert(role);
    }

    @Override
    public void remove(long id) {
        roleDao.deleteById(id);
    }

    @Override
    public void update(RoleModifyReq roleModifyReq) {
        LambdaUpdateWrapper<Role> uw = new LambdaUpdateWrapper<>();
        uw.eq(Role::getId, roleModifyReq.getId())
                .set(Role::getRoleName, roleModifyReq.getRoleName())
                .set(Role::getNote, roleModifyReq.getNote())
                .set(Role::getUpdateTime, new Date());
        roleDao.update(null, uw);
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/topic/TopicQueryService.java
================================================
package com.acimage.admin.service.topic;

import com.acimage.admin.model.request.TopicQueryReq;
import com.acimage.common.model.domain.community.Topic;
import com.acimage.common.model.page.MyPage;

public interface TopicQueryService {
    MyPage<Topic> listOrderByColumn(TopicQueryReq topicQueryReq);

    Integer getTopicCount();
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/topic/TopicWriteService.java
================================================
package com.acimage.admin.service.topic;

public interface TopicWriteService {
    void remove(long topicId);
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/topic/impl/TopicQueryServiceImpl.java
================================================
package com.acimage.admin.service.topic.impl;

import com.acimage.admin.dao.community.TopicDao;
import com.acimage.admin.global.consts.ModuleConstants;
import com.acimage.admin.model.request.TopicQueryReq;
import com.acimage.admin.service.topic.TopicQueryService;
import com.acimage.common.model.domain.community.Topic;
import com.acimage.common.model.page.MyPage;
import com.acimage.common.utils.common.PageUtils;
import com.acimage.common.utils.redis.RedisUtils;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.TimeUnit;

@DS(ModuleConstants.COMMUNITY)
@Service
public class TopicQueryServiceImpl implements TopicQueryService {
    public static final String STRINGKP_TOPIC_COUNT = "acimage:admin:topic:totalCount:";
    @Autowired
    TopicDao topicDao;
    @Autowired
    RedisUtils redisUtils;

    @Override
    public MyPage<Topic> listOrderByColumn(TopicQueryReq topicQueryReq) {
        int pageNo = topicQueryReq.getPageNo();
        int pageSize = topicQueryReq.getPageSize();
        String column = StringUtils.camelToUnderline(topicQueryReq.getColumn()) ;
        int startIndex = PageUtils.startIndexOf(pageNo, pageSize);

        QueryWrapper<Topic> qw = new QueryWrapper<>();
        qw.orderByDesc(column).last(String.format("limit %d,%d", startIndex, pageSize));
        List<Topic> topicList = topicDao.selectList(qw);
        int count = this.getTopicCount();

        return new MyPage<>(count, topicList);
    }

    @Override
    public Integer getTopicCount() {
        Integer totalCount = redisUtils.getForString(STRINGKP_TOPIC_COUNT, Integer.class);
        if (totalCount != null) {
            return totalCount;
        }
        LambdaQueryWrapper<Topic> qw = new LambdaQueryWrapper<>();
        qw.select(Topic::getId);
        totalCount = topicDao.selectCount(qw);
        long timeout = 2L;
        redisUtils.setAsString(STRINGKP_TOPIC_COUNT, totalCount.toString(), timeout, TimeUnit.MINUTES);
        return totalCount;
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/topic/impl/TopicWriteServiceImpl.java
================================================
package com.acimage.admin.service.topic.impl;

import com.acimage.admin.global.consts.ModuleConstants;
import com.acimage.admin.service.topic.TopicWriteService;
import com.acimage.common.global.exception.BusinessException;
import com.acimage.common.result.Result;
import com.acimage.feign.client.TopicClient;
import com.baomidou.dynamic.datasource.annotation.DS;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Slf4j
@Service
@DS(ModuleConstants.COMMUNITY)
public class TopicWriteServiceImpl implements TopicWriteService {

    @Autowired
    TopicClient topicClient;

    @Override
    public void remove(long topicId){
        Result<?> result=topicClient.delete(topicId);
        if(!result.isOk()){
            log.error("话题删除失败 id:{}",topicId);
            throw new BusinessException("话题删除失败");
        }
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/user/UserQueryService.java
================================================
package com.acimage.admin.service.user;

import com.acimage.admin.model.request.UserQueryReq;
import com.acimage.common.model.domain.user.User;
import com.acimage.common.model.page.MyPage;

public interface UserQueryService {
    MyPage<User> listBy(UserQueryReq userQueryReq);

    User getUser(long userId);
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/user/UserWriteService.java
================================================
package com.acimage.admin.service.user;

public interface UserWriteService {
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/user/impl/UserQueryServiceImpl.java
================================================
package com.acimage.admin.service.user.impl;


import com.acimage.admin.dao.user.UserDao;
import com.acimage.admin.global.consts.ModuleConstants;
import com.acimage.admin.model.request.UserQueryReq;
import com.acimage.admin.service.user.UserQueryService;
import com.acimage.admin.service.userrole.UserRoleQueryService;
import com.acimage.common.model.domain.user.User;
import com.acimage.common.model.page.MyPage;
import com.acimage.common.utils.common.ListUtils;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;


@Service
@DS(ModuleConstants.USER)
public class UserQueryServiceImpl implements UserQueryService {
    @Autowired
    UserDao userDao;
    @Autowired
    UserRoleQueryService userRoleQueryService;

    @Override
    public MyPage<User> listBy(UserQueryReq userQueryReq) {
        IPage<User> page = new Page<>(userQueryReq.getPageNo(), userQueryReq.getPageSize());
        String like = userQueryReq.getKeyword();


        IPage<User> resultPage;
        if (like != null && like.trim().length() > 0) {
            LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
            qw.like(User::getUsername, userQueryReq.getKeyword());
            page = userDao.selectPage(page, qw);
            resultPage = userDao.selectPage(page, qw);
        } else {
            resultPage = userDao.selectPage(page, null);
        }

        List<User> userList = resultPage.getRecords();
        int totalCount = (int) resultPage.getTotal();
        Map<Long, List<Integer>> map = userRoleQueryService.listUserIdWithRoleIds(ListUtils.extract(User::getId, userList));
        for (User user : userList) {
            List<Integer> roleIds = map.get(user.getId());
            if (roleIds == null) {
                user.setRoleIds(new ArrayList<>());
            } else {
                user.setRoleIds(roleIds);
            }
        }

        return new MyPage<>(totalCount, userList);
    }

    @Override
    public User getUser(long userId){
        return userDao.selectById(userId);
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/user/impl/UserWriteServiceImpl.java
================================================
package com.acimage.admin.service.user.impl;

import com.acimage.admin.global.consts.ModuleConstants;
import com.baomidou.dynamic.datasource.annotation.DS;
import org.springframework.stereotype.Service;

@Service
@DS(ModuleConstants.USER)
public class UserWriteServiceImpl {
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/userrole/UserRoleQueryService.java
================================================
package com.acimage.admin.service.userrole;

import com.acimage.common.model.domain.sys.UserRole;

import java.util.List;
import java.util.Map;

public interface UserRoleQueryService {
    Map<Long, List<Integer>> listUserIdWithRoleIds(List<Long> userIds);

    UserRole getUserRole(long userId, int roleId);
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/userrole/UserRoleWriteService.java
================================================
package com.acimage.admin.service.userrole;

import java.util.List;
import java.util.Map;

public interface UserRoleWriteService {
    void save(long userId, int roleId);

    void remove(long userId, int roleId);
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/userrole/impl/UserRoleQueryServiceImpl.java
================================================
package com.acimage.admin.service.userrole.impl;

import com.acimage.admin.dao.sys.UserRoleDao;
import com.acimage.admin.global.consts.ModuleConstants;
import com.acimage.admin.service.userrole.UserRoleQueryService;
import com.acimage.common.model.domain.sys.UserRole;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
@DS(ModuleConstants.SYS)
public class UserRoleQueryServiceImpl implements UserRoleQueryService {

    @Autowired
    UserRoleDao userRoleDao;

    @Override
    public Map<Long, List<Integer>> listUserIdWithRoleIds(List<Long> userIds) {
        LambdaQueryWrapper<UserRole> qw = new LambdaQueryWrapper<>();
        qw.in(UserRole::getUserId, userIds);
        List<UserRole> userRoles = userRoleDao.selectList(qw);

        //组装
        Map<Long, List<Integer>> map = new HashMap<>();
        for (UserRole userRole : userRoles) {
            long userId = userRole.getUserId();
            List<Integer> roleIds = map.get(userId);
            if (roleIds == null) {
                roleIds = new ArrayList<>();
                roleIds.add(userRole.getRoleId());
                map.put(userId,roleIds);
            }else{
                roleIds.add(userRole.getRoleId());
            }
        }
        return map;
    }

    @Override
    public UserRole getUserRole(long userId, int roleId){
        LambdaQueryWrapper<UserRole> qw=new LambdaQueryWrapper<>();
        qw.eq(UserRole::getUserId,userId)
                .eq(UserRole::getRoleId,roleId);
        return userRoleDao.selectOne(qw);
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/userrole/impl/UserRoleWriteServiceImpl.java
================================================
package com.acimage.admin.service.userrole.impl;

import com.acimage.admin.dao.sys.UserRoleDao;
import com.acimage.admin.global.consts.ModuleConstants;
import com.acimage.admin.service.user.UserQueryService;
import com.acimage.admin.service.userrole.UserRoleQueryService;
import com.acimage.admin.service.userrole.UserRoleWriteService;
import com.acimage.common.global.exception.BusinessException;
import com.acimage.common.model.domain.sys.UserRole;
import com.acimage.common.utils.IdGenerator;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

@DS(ModuleConstants.SYS)
@Service
public class UserRoleWriteServiceImpl implements UserRoleWriteService {

    @Autowired
    UserRoleDao userRoleDao;
    @Autowired
    UserRoleQueryService userRoleQueryService;
    @Autowired
    UserQueryService userQueryService;

    @Override
    public void save(long userId, int roleId) {
        if (userRoleQueryService.getUserRole(userId, roleId) != null) {
            throw new BusinessException("该用户已有该角色");
        }

        if (userQueryService.getUser(userId) == null) {
            throw new BusinessException("该用户不存在");
        }

        long id = IdGenerator.getSnowflakeNextId();
        UserRole userRole = new UserRole(id, userId, roleId, new Date());
        userRoleDao.insert(userRole);
    }

    @Override
    public void remove(long userId, int roleId) {
        LambdaQueryWrapper<UserRole> qw=new LambdaQueryWrapper<>();
        qw.eq(UserRole::getUserId,userId)
                .eq(UserRole::getRoleId,roleId);
        userRoleDao.delete(qw);
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/websitedata/WebsiteDataService.java
================================================
package com.acimage.admin.service.websitedata;

import com.acimage.admin.model.vo.WebsiteDataVo;

public interface WebsiteDataService {
    WebsiteDataVo getWebsiteData();
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/service/websitedata/impl/WebsiteDataServiceImpl.java
================================================
package com.acimage.admin.service.websitedata.impl;

import com.acimage.admin.model.vo.WebsiteDataVo;
import com.acimage.admin.service.websitedata.WebsiteDataService;
import com.acimage.common.global.consts.SysKeyConstants;
import com.acimage.common.utils.redis.RedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class WebsiteDataServiceImpl implements WebsiteDataService {
    @Autowired
    RedisUtils redisUtils;

    @Override
    public WebsiteDataVo getWebsiteData() {
        WebsiteDataVo websiteDataVo = new WebsiteDataVo();
        Long pageViewLong = redisUtils.sizeForHyperLogLog(SysKeyConstants.LOGK_PAGE_VIEW);
        Integer apiAccessCount = redisUtils.getForString(SysKeyConstants.STRINGK_INTERFACE_TOTAL, Integer.class);
        if (pageViewLong != null) {
            websiteDataVo.setPageView(pageViewLong.intValue());
        }

        websiteDataVo.setApiAccessCount(apiAccessCount);
        return websiteDataVo;
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/AdminLoginController.java
================================================
package com.acimage.admin.web.controller;


import com.acimage.admin.model.request.AdminLoginReq;
import com.acimage.admin.service.login.LoginService;
import com.acimage.admin.service.login.VerifyCodeService;
import com.acimage.common.redis.annotation.RequestLimit;
import com.acimage.common.redis.enums.LimitTarget;
import com.acimage.common.result.Result;
import com.acimage.common.utils.RsaUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@RestController
@Slf4j
@RequestMapping("/api/admin/logins")
@Validated
public class AdminLoginController {
    @Autowired
    LoginService loginService;
    @Autowired
    VerifyCodeService verifyCodeService;

    @RequestLimit(limitTimes = {1}, durations = {2}, penaltyTimes = {-1}, targets = {LimitTarget.IP})
    @PostMapping("/doLogin")
    public Result<String> doLogin(@Validated @RequestBody AdminLoginReq adminLoginReq, HttpServletRequest request) {
        String code = adminLoginReq.getVerifyCode();
        boolean verifyCorrect = verifyCodeService.verifyAndRemoveIfSuccess(request, code);
        if (!verifyCorrect) {
            return Result.fail("验证码错误,请重新验证");
        }
        return Result.ok(loginService.login(adminLoginReq));
    }

    @GetMapping("/publicKey")
    public Result<?> getPublicKey() {
        return Result.ok(RsaUtils.getPublicKey());
    }


    @GetMapping("/commonCode")
    public Result<?> getCommonVerifyCode(HttpServletRequest request, HttpServletResponse response) {
        verifyCodeService.writeCodeImageToResponseAndRecord(request,response);
        return Result.ok();
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/ApiOperateController.java
================================================
package com.acimage.admin.web.controller;


import com.acimage.admin.model.request.ApiAddReq;
import com.acimage.admin.model.request.ApiModifyReq;
import com.acimage.admin.service.api.ApiWriteService;
import com.acimage.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive;

@RestController
@Slf4j
@RequestMapping("/api/admin/apis/operate")
@Validated
public class ApiOperateController {
    @Autowired
    ApiWriteService apiWriteService;

    @PostMapping
    public Result<?> addApi(@Validated @RequestBody ApiAddReq apiAddreq){
        String path=apiAddreq.getPath().trim();
        if(path.length()<2){
            return Result.fail("路径有效长度不少于2");
        }
        apiAddreq.setPath(path);
        apiWriteService.save(apiAddreq);
        return Result.ok();
    }

    @PutMapping
    public Result<?> modifyApi(@Validated @RequestBody ApiModifyReq apiModifyReq){
        String path=apiModifyReq.getPath().trim();
        if(path.length()<2){
            return Result.fail("路径有效长度不少于2");
        }
        apiModifyReq.setPath(path);
        apiWriteService.update(apiModifyReq);
        return Result.ok();
    }

    @DeleteMapping("/{id}")
    public Result<?> deleteApi(@Positive @NotNull @PathVariable int id){
        apiWriteService.delete(id);
        return Result.ok();
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/ApiQueryController.java
================================================
package com.acimage.admin.web.controller;


import com.acimage.admin.model.request.ApiQueryReq;
import com.acimage.admin.service.api.ApiQueryService;
import com.acimage.common.model.domain.sys.Api;
import com.acimage.common.model.page.MyPage;
import com.acimage.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@RestController
@Slf4j
@RequestMapping("/api/admin/apis/query")
@Validated
public class ApiQueryController {
    @Autowired
    ApiQueryService apiQueryService;

    @GetMapping("/search")
    public Result<MyPage<Api>> queryApisBy(@Validated @ModelAttribute ApiQueryReq apiQueryReq){
        return Result.ok(apiQueryService.pageBy(apiQueryReq));
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/AuthorizeOperateController.java
================================================
package com.acimage.admin.web.controller;


import com.acimage.admin.service.authorize.AuthorizeWriteService;
import com.acimage.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.Positive;

@RestController
@Slf4j
@RequestMapping("/api/admin/authorizes")
@Validated
public class AuthorizeOperateController {
    @Autowired
    AuthorizeWriteService authorizeWriteService;

    @PostMapping
    public Result<?> addAuthorize(@RequestParam @Positive Integer roleId,
                                  @RequestParam @Positive Integer permissionId){
        authorizeWriteService.save(roleId,permissionId);
        return Result.ok();
    }

    @DeleteMapping("/{roleId}/{permissionId}")
    public Result<?> deleteAuthorize(@PathVariable @Positive Integer roleId,
                                  @PathVariable @Positive Integer permissionId){
        authorizeWriteService.remove(roleId,permissionId);
        return Result.ok();
    }

}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/AuthorizeQueryController.java
================================================
package com.acimage.admin.web.controller;


import com.acimage.admin.service.authorize.AuthorizeQueryService;
import com.acimage.common.model.domain.sys.Authorize;
import com.acimage.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.Positive;
import java.util.List;

@RestController
@Slf4j
@RequestMapping("/api/admin/authorizes")
@Validated
public class AuthorizeQueryController {
    @Autowired
    AuthorizeQueryService authorizeQueryService;

    @GetMapping("/roleId/{roleId}")
    public Result<List<Authorize>> queryRoleAuthorize(@PathVariable @Positive Integer roleId){
        return Result.ok(authorizeQueryService.listAuthorizeByRoleId(roleId));
    }

}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/CategoryController.java
================================================
package com.acimage.admin.web.controller;


import com.acimage.admin.service.category.CategoryQueryService;
import com.acimage.common.model.domain.community.Category;
import com.acimage.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@Slf4j
@RequestMapping("/api/admin/categories")
@Validated
public class CategoryController {
    @Autowired
    CategoryQueryService categoryQueryService;

    @GetMapping("/all")
    public Result<List<Category>> queryAll(){
        return Result.ok(categoryQueryService.listAll()) ;
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/CommentOperateController.java
================================================
package com.acimage.admin.web.controller;


import com.acimage.admin.model.request.CommentQueryReq;
import com.acimage.admin.service.comment.CommentQueryService;
import com.acimage.admin.service.comment.CommentWriteService;
import com.acimage.common.model.domain.community.Comment;
import com.acimage.common.model.page.MyPage;
import com.acimage.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.Positive;

@RestController
@Slf4j
@RequestMapping("/api/admin/comments/operate")
@Validated
public class CommentOperateController {
    @Autowired
    CommentWriteService commentWriteService;

    @DeleteMapping("/{id}")
    public Result<?> pageCommentsBy(@PathVariable @Positive Long id) {
        commentWriteService.delete(id);
        return Result.ok();
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/CommentQueryController.java
================================================
package com.acimage.admin.web.controller;


import com.acimage.admin.model.request.CommentQueryReq;
import com.acimage.admin.model.request.TopicQueryReq;
import com.acimage.admin.service.comment.CommentQueryService;
import com.acimage.admin.service.topic.TopicQueryService;
import com.acimage.common.model.domain.community.Comment;
import com.acimage.common.model.domain.community.Topic;
import com.acimage.common.model.page.MyPage;
import com.acimage.common.result.Result;
import com.acimage.common.utils.LambdaUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@Slf4j
@RequestMapping("/api/admin/comments/query")
@Validated
public class CommentQueryController {
    @Autowired
    CommentQueryService commentQueryService;

    @GetMapping("/by")
    public Result<MyPage<Comment>> pageCommentsBy(@Validated @ModelAttribute CommentQueryReq queryReq) {

        return Result.ok(commentQueryService.pageCommentsBy(queryReq));
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/HomeCarouselController.java
================================================
package com.acimage.admin.web.controller;


import cn.hutool.core.util.StrUtil;
import com.acimage.admin.model.request.CarouselAddReq;
import com.acimage.admin.model.request.CarouselModifyReq;
import com.acimage.admin.service.homecarousel.HomeCarouselWriteService;
import com.acimage.admin.service.homecarousel.HomeCarouselQueryService;
import com.acimage.common.global.consts.FileFormatConstants;
import com.acimage.common.model.domain.community.HomeCarousel;
import com.acimage.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.constraints.Positive;
import javax.validation.constraints.Size;
import java.util.List;

@RestController
@Slf4j
@RequestMapping("/api/admin/homeCarousels")
@Validated
public class HomeCarouselController {
    @Autowired
    HomeCarouselWriteService homeCarouselWriteService;
    @Autowired
    HomeCarouselQueryService homeCarouselQueryService;

    @PostMapping
    public Result<?> addImage(@RequestParam("image") MultipartFile imageFile,
                              @Validated @ModelAttribute CarouselAddReq carouselAddReq) {
        String originName = imageFile.getOriginalFilename();
        String format = StrUtil.subAfter(originName, '.', true);
        if (!FileFormatConstants.ALLOWED_CAROUSEL_FORMAT.contains(format)) {
            return Result.fail("图片格式需为"+FileFormatConstants.ALLOWED_CAROUSEL_FORMAT);
        }
        homeCarouselWriteService.saveHomeCarouselImage(imageFile, carouselAddReq);
        return Result.ok();
    }


    @DeleteMapping("/{id}")
    public Result<?> deleteImage(@PathVariable @Positive Long id) {
        homeCarouselWriteService.deleteHomeCarouselImage(id);
        return Result.ok();
    }

    @PutMapping("/descriptionAndLink")
    public Result<?> modifyDescription(@Validated @ModelAttribute CarouselModifyReq carouselModifyReq) {
        homeCarouselWriteService.updateHomeCarouselImage(carouselModifyReq);
        return Result.ok();
    }

    @PostMapping("/cover")
    public Result<?> coverImageFile(@RequestParam("id") @Positive Long id,
                                    @RequestParam("image") MultipartFile imageFile) {
        String originName = imageFile.getOriginalFilename();
        String format = StrUtil.subAfter(originName, '.', true);
        if (!FileFormatConstants.ALLOWED_CAROUSEL_FORMAT.contains(format)) {
            return Result.fail("图片格式需为"+FileFormatConstants.ALLOWED_CAROUSEL_FORMAT);
        }
        homeCarouselWriteService.coverHomeCarouselImage(id, imageFile);
        return Result.ok();
    }

    @GetMapping("/current")
    public Result<List<HomeCarousel>> queryCurrentHomeCarousel() {
        return Result.ok(homeCarouselQueryService.listCurrent());

    }

}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/PermissionOperateController.java
================================================
package com.acimage.admin.web.controller;

import cn.hutool.core.util.StrUtil;
import com.acimage.admin.model.request.PermissionAddReq;
import com.acimage.admin.model.request.PermissionModifyReq;
import com.acimage.admin.service.permission.PermissionWriteSercice;
import com.acimage.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.Positive;

@RestController
@Slf4j
@Validated
@RequestMapping("/api/admin/permissions")
public class PermissionOperateController {
    @Autowired
    PermissionWriteSercice permissionWriteSercice;

    @PostMapping
    public Result<?> add(@Validated @RequestBody PermissionAddReq permissionAddReq){

        if(permissionAddReq.getCode()==null|| StrUtil.isBlank(permissionAddReq.getCode())){
            permissionAddReq.setCode(null);
        }
        if(!permissionAddReq.getModule() &&permissionAddReq.getCode()==null){
            return Result.fail("非模块的权限码不能为空");
        }
        permissionWriteSercice.save(permissionAddReq);
        return Result.ok();
    }

    @PutMapping
    public Result<?> modify(@Validated @RequestBody PermissionModifyReq permissionModifyReq){
        permissionWriteSercice.update(permissionModifyReq);
        return Result.ok();
    }

    @DeleteMapping("/{id}")
    public Result<?> modify(@PathVariable @Positive Integer id){
        permissionWriteSercice.remove(id);
        return Result.ok();
    }




}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/PermissionQueryController.java
================================================
package com.acimage.admin.web.controller;


import com.acimage.admin.service.permission.PermissionQueryService;
import com.acimage.common.model.domain.sys.Permission;
import com.acimage.common.model.page.MyPage;
import com.acimage.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.constraints.Max;
import javax.validation.constraints.Positive;
import java.util.List;

@RestController
@Slf4j
@Validated
@RequestMapping("/api/admin/permissions")
public class PermissionQueryController {
    @Autowired
    PermissionQueryService permissionQueryService;

    @GetMapping("/tree")
    public Result<List<Permission>> queryPermissionTree(){
        return Result.ok(permissionQueryService.getPermissionTree());
    }

    @GetMapping("/page/{pageNo}/{pageSize}")
    public Result<MyPage<Permission>> pagePermissionsWithParent(@PathVariable @Positive Integer pageNo,
                                                                @PathVariable @Max(20) Integer pageSize){
        return Result.ok(permissionQueryService.pagePermissionsWithParent(pageNo,pageSize));
    }

    @GetMapping("/modules")
    public Result<List<Permission>> queryModules(){
        return Result.ok(permissionQueryService.listByModule(true));
    }

    @GetMapping("/nonModules")
    public Result<List<Permission>> queryNonModules(){
        return Result.ok(permissionQueryService.listByModule(false));
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/RoleController.java
================================================
package com.acimage.admin.web.controller;


import com.acimage.admin.model.request.RoleAddReq;
import com.acimage.admin.model.request.RoleModifyReq;
import com.acimage.admin.service.role.RoleQueryService;
import com.acimage.admin.service.role.RoleWriteService;
import com.acimage.common.model.domain.sys.Role;
import com.acimage.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.Positive;
import java.util.List;

@RestController
@Slf4j
@RequestMapping("/api/admin/roles")
@Validated
public class RoleController {
    @Autowired
    RoleQueryService roleQueryService;
    @Autowired
    RoleWriteService roleWriteService;

    @GetMapping("/all")
    public Result<List<Role>> queryAllRoles(){
        return Result.ok(roleQueryService.listAll());
    }

    @PostMapping()
    public Result<?> add(@Validated @RequestBody RoleAddReq roleAddReq){
        roleWriteService.save(roleAddReq);
        return Result.ok();
    }

    @DeleteMapping("/{id}")
    public Result<?> delete(@PathVariable @Positive Integer id){
        roleWriteService.remove(id);
        return Result.ok();
    }

    @PutMapping()
    public Result<?> modify(@Validated @RequestBody RoleModifyReq roleModifyReq){
        roleWriteService.update(roleModifyReq);
        return Result.ok();
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/TopicOperateController.java
================================================
package com.acimage.admin.web.controller;


import com.acimage.admin.service.topic.TopicWriteService;
import com.acimage.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.constraints.Positive;

@RestController
@Slf4j
@RequestMapping("/api/admin/topics/operate")
@Validated
public class TopicOperateController {
    @Autowired
    TopicWriteService topicWriteService;

    @DeleteMapping("/{topicId}")
    public Result<?> delete(@PathVariable @Positive Long topicId){
        topicWriteService.remove(topicId);
        return Result.ok();
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/TopicQueryController.java
================================================
package com.acimage.admin.web.controller;


import com.acimage.admin.model.request.TopicQueryReq;
import com.acimage.admin.service.topic.TopicQueryService;
import com.acimage.common.model.domain.community.Topic;
import com.acimage.common.result.Result;
import com.acimage.common.utils.LambdaUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@Slf4j
@RequestMapping("/api/admin/topics/query")
@Validated
public class TopicQueryController {
    @Autowired
    TopicQueryService topicQueryService;

    @GetMapping("/orderBy")
    public Result listOrderBy(@Validated @ModelAttribute TopicQueryReq topicQueryReq) {
        List<String> allowedColumns= LambdaUtils.columnsFrom(Topic::getUpdateTime,Topic::getCreateTime,Topic::getPageView,Topic::getStarCount,Topic::getCommentCount);
        if(!allowedColumns.contains(topicQueryReq.getColumn())){
            return Result.fail("非法查询字段");
        }
        return Result.ok(topicQueryService.listOrderByColumn(topicQueryReq));
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/UserQueryController.java
================================================
package com.acimage.admin.web.controller;


import com.acimage.admin.model.request.UserQueryReq;
import com.acimage.admin.service.user.UserQueryService;
import com.acimage.common.model.domain.user.User;
import com.acimage.common.model.page.MyPage;
import com.acimage.common.result.Result;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
@RequestMapping("/api/admin/users/query")
@Validated
public class UserQueryController {
    @Autowired
    UserQueryService userQueryService;

    @GetMapping("/search")
    public Result<MyPage<User>> queryUsersBy(@Validated @ModelAttribute UserQueryReq userQueryReq){
        String keyword=userQueryReq.getKeyword();
        if(keyword!=null){
            if(keyword.trim().length()==0){
                userQueryReq.setKeyword(null);
            }else{
                userQueryReq.setKeyword(keyword.trim());
            }
        }
        return Result.ok(userQueryService.listBy(userQueryReq));
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/UserRoleOperateController.java
================================================
package com.acimage.admin.web.controller;


import com.acimage.admin.model.request.UserQueryReq;
import com.acimage.admin.service.userrole.UserRoleWriteService;
import com.acimage.common.model.domain.user.User;
import com.acimage.common.model.page.MyPage;
import com.acimage.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive;

@RestController
@Slf4j
@RequestMapping("/api/admin/userRoles/operate")
@Validated
public class UserRoleOperateController {
    @Autowired
    UserRoleWriteService userRoleWriteService;

    @PostMapping
    public Result<?> addRoleForUser(@Positive @NotNull Long userId, @Positive @NotNull Integer roleId) {
        userRoleWriteService.save(userId, roleId);
        return Result.ok();
    }

    @DeleteMapping("/{userId}/{roleId}")
    public Result<?> deleteRoleForUser(@PathVariable @Positive @NotNull Long userId,@PathVariable @Positive @NotNull Integer roleId) {
        userRoleWriteService.remove(userId, roleId);
        return Result.ok();
    }
}


================================================
FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/WebsiteDataController.java
================================================
package com.acimage.admin.web.controller;


import com.acimage.admin.model.vo.WebsiteDataVo;
import com.acimage.admin.service.websitedata.WebsiteDataService;
import com.acimage.common.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
@RequestMapping("/api/admin/websites")
@Validated
public class WebsiteDataController {
    @Autowired
    WebsiteDataService websiteDataService;

    @GetMapping("/accessData")
    public Result<WebsiteDataVo> queryWebsiteData() {
        return Result.ok(websiteDataService.getWebsiteData());
    }
}


================================================
FILE: acimage_admin/src/main/resources/application-dev.yml
================================================
server:
  port: 8060

spring:
  config:
    activate:
      on-profile:
        - dev
#  datasource:
#    community:
#      type: com.alibaba.druid.pool.DruidDataSource
#      driver-class-name: com.mysql.cj.jdbc.Driver
#      jdbc-url: jdbc:mysql://localhost:3306/acimage_community?useSSl=false&allowMultiQueries=true&serverTimezone=UTC
#      username: root
#      password: mysql
#    image:
#      type: com.alibaba.druid.pool.DruidDataSource
#      driver-class-name: com.mysql.cj.jdbc.Driver
#      jdbc-url: jdbc:mysql://localhost:3306/acimage_image?useSSl=false&allowMultiQueries=true&serverTimezone=UTC
#      username: root
#      password: mysql
  datasource:
    dynamic:
      primary: sys #设置默认的数据源或者数据源组,默认值即为master
      strict: true #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        sys:
          url: jdbc:mysql://localhost:3306/acimage_sys?useSSl=false&allowMultiQueries=true&serverTimezone=UTC
          username: root
          password: mysql
          driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
        community:
          url: jdbc:mysql://localhost:3306/acimage_community?useSSl=false&allowMultiQueries=true&serverTimezone=UTC
          username: root
          password: mysql
          driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
        image:
          url: jdbc:mysql://localhost:3306/acimage_image?useSSl=false&allowMultiQueries=true&serverTimezone=UTC
          username: root
          password: mysql
          driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
        user:
          url: jdbc:mysql://localhost:3306/acimage_user?useSSl=false&allowMultiQueries=true&serverTimezone=UTC
          username: root
          password: mysql
          driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
  redis:
    host: 127.0.0.1
    port: 6379
    password: redis
    lettuce:
      pool:
        max-active: 8
        max-idle: 8 #最大空闲连接
        min-idle: 0 #最小空闲连接
        max-wait: 100ms #连接等待时间
  cloud:
    nacos:
      server-addr: 43.136.68.91:8848 #nacos 服务地址


================================================
FILE: acimage_admin/src/main/resources/application.yml
================================================

spring:
  profiles:
    include: common,common-secret
    active: dev2
  application:
    name: admin-service #服务名称
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 55MB
#  rabbitmq:
#    host: 192.168.130.128
#    port: 5672
#    username: acimage
#    password: acimage
#    virtual-host: /acimage
#    listener:
#      simple:
#        auto-startup: false #消费者是否启动
#      direct:
#        auto-startup: false #生产者是否启动


mybatis-plus:
  mapper-locations: classpath*:mapper/**/*.xml
  type-aliases-package: com.acimage.common.model.domain
  type-handlers-package: com.acimage.common.config.typehandler
  global-config:
    db-config:
      table-prefix: tb_


feign:
  okhttp:
    enabled: true
  httpclient:
    max-connections: 20 # 最大的连接数
    max-connections-per-route: 5 # 每个路径的最大连接数

================================================
FILE: acimage_admin/src/main/resources/logback-spring.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>

<!-- 配置文件修改时重新加载,默认true -->
<configuration scan="true">

    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <springProperty scope="context" name="spring.application.name" source="spring.application.name"/>
    <springProperty scope="context" name="LOG_HOME" source="logback.base"/>

    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder charset="UTF-8">
            <!-- 输出日志记录格式 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%20.20thread{20}] %40logger{40} : %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/${spring.application.name}/%d{yyyy-MM-dd}-info.%i.log</FileNamePattern>
            <MaxFileSize>5MB</MaxFileSize>
            <maxHistory>8</maxHistory>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <!-- 输出日志记录格式 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/${spring.application.name}/%d{yyyy-MM-dd}-warn.%i.log</FileNamePattern>
            <MaxFileSize>5MB</MaxFileSize>
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <!-- 输出日志记录格式 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/${spring.application.name}/%d{yyyy-MM-dd}-error.%i.log</FileNamePattern>
            <MaxFileSize>5MB</MaxFileSize>
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <encoder charset="UTF-8">
            <!-- 输出日志记录格式 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>


    <springProfile name="dev2">
        <logger name="com.acimage.admin.dao" level="INFO" additivity="false">
            <appender-ref ref="console"/>
            <appender-ref ref="info"/>
            <appender-ref ref="warn"/>
            <appender-ref ref="error"/>
        </logger>
        <logger name="com.acimage" level="DEBUG" additivity="false">
            <appender-ref ref="console"/>
            <appender-ref ref="info"/>
            <appender-ref ref="warn"/>
            <appender-ref ref="error"/>
        </logger>
        <!-- 设置日志输出级别 -->
        <root level="INFO">
            <appender-ref ref="console"/>
            <appender-ref ref="info"/>
            <appender-ref ref="warn"/>
            <appender-ref ref="error"/>
        </root>
    </springProfile>

    <springProfile name="prod,server">
        <logger name="com.acimage" level="info" additivity="false">
            <appender-ref ref="info"/>
            <appender-ref ref="warn"/>
            <appender-ref ref="error"/>
        </logger>
        <!-- 设置日志输出级别 -->
        <root level="INFO">
            <appender-ref ref="info"/>
            <appender-ref ref="warn"/>
            <appender-ref ref="error"/>
        </root>
    </springProfile>


</configuration>

================================================
FILE: acimage_admin/src/main/resources/mapper/community/TopicMapper.xml
================================================
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.acimage.admin.dao.community.TopicDao">
    <resultMap id="topicWithUser" type="Topic">
        <id property="id" column="id"/>
        <result property="title" column="title"/>
        <result property="content" column="content"/>
        <result property="userId" column="user_id"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
        <result property="activityTime" column="activity_time"/>
        <result property="pageView" column="page_view"/>
        <result property="starCount" column="star_count"/>
        <result property="commentCount" column="comment_count"/>
        <result property="coverImageUrl" column="cover_image_url"/>
        <result property="categoryId" column="category_id"/>
    </resultMap>


</mapper>

================================================
FILE: acimage_admin/src/main/resources/mapper/image/HomeCarouselMapper.xml
================================================
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.acimage.admin.dao.community.HomeCarouselDao" >

<select id="count" resultType="HomeCarousel">
    select * from tb_home_carousel
</select>

</mapper>

================================================
FILE: acimage_admin/src/main/resources/mapper/sys/ApiMapper.xml
================================================
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.acimage.admin.dao.sys.ApiDao">



<!--    <resultMap id="apiWithPermission" type="Api">-->
<!--        <id property="id" column="id"/>-->
<!--        <result property="path" column="path"/>-->
<!--        <result property="matchRule" column="match_rule"/>-->
<!--        <result property="method" column="method"/>-->
<!--        <result property="note" column="note"/>-->
<!--        <result property="permissionId" column="permission_id"/>-->
<!--        <result property="createTime" column="create_time"/>-->
<!--        <result property="updateTime" column="update_time"/>-->
<!--        <association property="permission" javaType="Permission" column="permission_id"-->
<!--                     select="com.acimage.admin.dao.sys.ApiDao"/>-->
<!--    </resultMap>-->


<!--    <select id="selectApisWithPermission" resultMap="permissionWithParent">-->
<!--        select * from tb_permission order by code limit #{startIndex},#{recordNumber}-->
<!--    </select>-->

</mapper>

================================================
FILE: acimage_admin/src/main/resources/mapper/sys/PermissionMapper.xml
================================================
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.acimage.admin.dao.sys.PermissionDao">

    <resultMap id="permissionTree" type="Permission">
        <id property="id" column="id"/>
        <result property="code" column="code"/>
        <result property="parentId" column="parent_id"/>
        <result property="label" column="label"/>
        <result property="note" column="note"/>
        <result property="module" column="module"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
        <collection property="children" ofType="Permission" column="id"
                    select="com.acimage.admin.dao.sys.PermissionDao.selectTreeByParentId"/>
    </resultMap>

    <resultMap id="permissionWithParent" type="Permission">
        <id property="id" column="id"/>
        <result property="code" column="code"/>
        <result property="parentId" column="parent_id"/>
        <result property="label" column="label"/>
        <result property="note" column="note"/>
        <result property="module" column="module"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
        <association property="parent" javaType="Permission" column="parent_id"
                     select="com.acimage.admin.dao.sys.PermissionDao.selectById"/>
    </resultMap>

    <select id="selectTreeByParentId" resultMap="permissionTree">
        select * from tb_permission where
        <choose>
            <when test="parentId == null">
                parent_id is null
            </when>
            <otherwise>
                parent_id=#{parentId}
            </otherwise>
        </choose>
    </select>

    <select id="selectPermissionsWithParent" resultMap="permissionWithParent">
        select * from tb_permission order by code desc limit #{startIndex},#{recordNumber}
    </select>

</mapper>

================================================
FILE: acimage_admin/src/main/resources/mapper/user/TopicMapper.xml
================================================
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.acimage.admin.dao.sys.UserRoleDao">
<!--    <resultMap id="userWithRoleIds" type="User">-->
<!--        <result property="id" column="user_id"/>-->
<!--        <result property="createTime" column="create_time"/>-->
<!--        <result property="updateTime" column="update_time"/>-->
<!--        <result property="activityTime" column="activity_time"/>-->
<!--        <result property="pageView" column="page_view"/>-->
<!--        <result property="starCount" column="star_count"/>-->
<!--        <result property="commentCount" column="comment_count"/>-->
<!--        <result property="coverImageUrl" column="cover_image_url"/>-->
<!--        <result property="roleIds" column="category_id"/>-->
<!--        <collection property="roleIds" ofType="Integer" column="id"-->
<!--                    select="com.acimage.admin.dao.sys.tagTopicDao.selectTagIds"/>-->
<!--    </resultMap>-->


</mapper>

================================================
FILE: acimage_admin/src/test/java/com/acimage/admin/AdminApplicationTest.java
================================================
package com.acimage.admin;


import com.acimage.common.deprecated.QiniuUtils;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.File;

@SpringBootTest
class AdminApplicationTest {
	@Autowired
	QiniuUtils qiniuUtils;

	@Test
	void qiniuUtilsTest() {
		File file = new File("F:\\MyImage\\素材\\bg2.png");
		qiniuUtils.upload(file,"test/xlg.png");
	}







}


================================================
FILE: acimage_admin/src/test/java/com/acimage/admin/dao/community/SpDaoTest.java
================================================
package com.acimage.admin.dao.community;


import com.acimage.common.model.domain.community.HomeCarousel;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Date;

@SpringBootTest
public class SpDaoTest {
    @Autowired
    HomeCarouselDao homeCarouselDao;

    @Test
    public void deleteTest(){
        long id=10086L;
        homeCarouselDao.deleteById(id);
    }

    @Test
    public void getMaxLocationOfHomeCarousel(){
        System.out.println(homeCarouselDao.getMaxLocation());
    }

    @Test
    public void testSelectAll(){
        System.out.println(homeCarouselDao.selectList(null));

        System.out.println(homeCarouselDao.count());
    }

}


================================================
FILE: acimage_admin/src/test/java/com/acimage/admin/dao/community/TopicDaoTest.java
================================================
package com.acimage.admin.dao.community;


import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class TopicDaoTest {

    @Autowired
    TopicDao topicDao;

    @Test
    void testSelectAll(){
        System.out.println(topicDao.selectList(null));

    }
}


================================================
FILE: acimage_admin/src/test/java/com/acimage/admin/dao/sys/ApiDaoTest.java
================================================
package com.acimage.admin.dao.sys;


import com.acimage.common.global.enums.MatchRule;
import com.acimage.common.model.domain.sys.Api;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.HttpMethod;

@SpringBootTest
public class ApiDaoTest {

    @Autowired
    ApiDao apiDao;


    @Test
    void testSelect(){
        System.out.println(apiDao.selectList(null));
    }
}


================================================
FILE: acimage_admin/src/test/java/com/acimage/admin/service/HomeCarouselWriteServiceTest.java
================================================
package com.acimage.admin.service;

import com.acimage.admin.service.homecarousel.HomeCarouselWriteService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class HomeCarouselWriteServiceTest {

    @Autowired
    HomeCarouselWriteService homeCarouselWriteService;


}


================================================
FILE: acimage_common/.gitignore
================================================
/.idea
/src/main/resources/application-qiniu.yml


================================================
FILE: acimage_common/pom.xml
================================================
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>acimage</artifactId>
        <groupId>com.acimage</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>acimage_common</artifactId>
    <packaging>jar</packaging>

    <name>acimage_common</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>



        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>

        <!--Hutool-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>

        <!--redis依赖及其连接池依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

        <!--rabbitmq-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
            <optional>true</optional>
        </dependency>

        <!--nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--spring cloud集成sentinel  有内存泄漏的bug-->
<!--        <dependency>-->
<!--            <groupId>com.alibaba.cloud</groupId>-->
<!--            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>-->
<!--        </dependency>-->

        <!--JWT-->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
        </dependency>

        <!--七牛云存储-->
        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>qiniu-java-sdk</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>3.14.2</version>
            <scope>compile</scope>
            <optional>true</optional>
        </dependency>

        <!--minio-->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <optional>true</optional>
        </dependency>

        <!--敏感词过滤-->
<!--        <dependency>-->
<!--            <groupId>com.github.houbb</groupId>-->
<!--            <artifactId>sensitive-word</artifactId>-->
<!--            <optional>true</optional>-->
<!--        </dependency>-->

        <!--敏感词过滤2-->
        <dependency>
            <groupId>io.github.toolgood</groupId>
            <artifactId>toolgood-words</artifactId>
            <optional>true</optional>
        </dependency>
        <!--es-->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <optional>true</optional>
        </dependency>

        <!--validation依赖,用于数据校验-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

        <dependency>
            <groupId>net.coobird</groupId>
            <artifactId>thumbnailator</artifactId>
        </dependency>


        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <includeSystemScope>true</includeSystemScope>
                    <classifier>exec</classifier>
                    <skip>true</skip><!--不需要main类打包-->
                </configuration>
            </plugin>

            <!-- maven打包 跳过测试包 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skipTests>true</skipTests><!--跳过测试包-->
                </configuration>
            </plugin>

<!--            <plugin>-->
<!--                <groupId>org.apache.maven.plugins</groupId>-->
<!--                <artifactId>maven-compiler-plugin</artifactId>-->
<!--                <configuration>-->
<!--                    <compilerArguments>-->
<!--                        <extdirs>${pom.basedir}/lib</extdirs>-->
<!--                    </compilerArguments>-->
<!--                </configuration>-->
<!--            </plugin>-->

<!--            <plugin>-->
<!--                <groupId>org.apache.maven.plugins</groupId>-->
<!--                <artifactId>maven-dependency-plugin</artifactId>-->
<!--                <version>3.1.1</version>-->
<!--                <executions>-->
<!--                    <execution>-->
<!--                        <id>copy</id>-->
<!--                        <phase>package</phase>-->
<!--                        <goals>-->
<!--                            <goal>copy-dependencies</goal>-->
<!--                        </goals>-->
<!--                        <configuration>-->
<!--                            <outputDirectory>${pom.basedir}/lib</outputDirectory>-->
<!--                        </configuration>-->

<!--                    </execution>-->
<!--                </executions>-->
<!--            </plugin>-->
        </plugins>

<!--        <resources>-->
<!--            <resource>-->
<!--                <directory>libs</directory>-->
<!--                <targetPath>/WEB-INF/lib/</targetPath>-->
<!--                <includes>-->
<!--                    <include>**/*.jar</include>-->
<!--                </includes>-->
<!--            </resource>-->
<!--        </resources>-->
    </build>

</project>


================================================
FILE: acimage_common/src/main/java/com/acimage/common/CommonMain.java
================================================
package com.acimage.common;


public class CommonMain {
	public static void main(String[] args) {
	}
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/config/EsConfig.java
================================================
package com.acimage.common.config;

import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

import java.util.concurrent.TimeUnit;


@Profile(value = {"test","dev","dev2","server"})
@Configuration
@ConditionalOnClass(RestHighLevelClient.class)
public class EsConfig {

    @Bean
    public RestHighLevelClient devRestHighLevelClient(@Autowired RestClientBuilder restClientBuilder) {

        return new RestHighLevelClient(restClientBuilder.setHttpClientConfigCallback(requestConfig -> {
            final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            return requestConfig.setDefaultCredentialsProvider(credentialsProvider);
        }));
    }

}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/config/EsProdConfig.java
================================================
package com.acimage.common.config;

import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

import java.util.concurrent.TimeUnit;

@Profile("prod")
@Configuration
@ConditionalOnClass(RestHighLevelClient.class)
public class EsProdConfig {
    @Value("${spring.elasticsearch.username}")
    private String username;
    @Value("${spring.elasticsearch.password}")
    private String password;
    @Bean
    public RestHighLevelClient prodRestHighLevelClient(@Autowired RestClientBuilder restClientBuilder) {


        return new RestHighLevelClient(restClientBuilder.setHttpClientConfigCallback(requestConfig -> {
            final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
            requestConfig.setKeepAliveStrategy((response, context) -> TimeUnit.MINUTES.toMillis(3));
            return requestConfig.setDefaultCredentialsProvider(credentialsProvider);
        }));
    }
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/config/FilterConfig.java
================================================
package com.acimage.common.config;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.filter.HiddenHttpMethodFilter;

@Configuration
public class FilterConfig {

    /**
     * 设置编码
     * @return
     */
    @Bean
    public FilterRegistrationBean<CharacterEncodingFilter> registerFilter1(){
        FilterRegistrationBean<CharacterEncodingFilter> registerFilter=new FilterRegistrationBean<>();
        CharacterEncodingFilter encodeFilter=new CharacterEncodingFilter();
        encodeFilter.setEncoding("UTF-8");
        registerFilter.setFilter(encodeFilter);
        registerFilter.addUrlPatterns("/*");
        return registerFilter;
    }

    /**
     * 设置HiddenHttpMethod,支持put、get、delete等请求
     * @return
     */
    @Bean
    public FilterRegistrationBean<HiddenHttpMethodFilter> registerFilter2(){
        FilterRegistrationBean<HiddenHttpMethodFilter> registerFilter=new FilterRegistrationBean<>();
        HiddenHttpMethodFilter hiddenHttpMethodFilter=new HiddenHttpMethodFilter();
        registerFilter.setFilter(hiddenHttpMethodFilter);
        registerFilter.addUrlPatterns("/*");
        return registerFilter;
    }
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/config/JacksonConfig.java
================================================
package com.acimage.common.config;


import cn.hutool.core.date.DatePattern;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonConfig {

    /**
     * Jackson全局转化long类型为String,解决前端接受long类型缺失精度问题
     * @return Jackson2ObjectMapperBuilderCustomizer 注入的对象
     */
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder
                .serializerByType(Long.class, ToStringSerializer.instance)
                .serializerByType(Long.TYPE, ToStringSerializer.instance)
                .simpleDateFormat(DatePattern.NORM_DATETIME_PATTERN);
    }
}

================================================
FILE: acimage_common/src/main/java/com/acimage/common/config/PaginationConfig.java
================================================
package com.acimage.common.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class PaginationConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        paginationInnerInterceptor.setDbType(DbType.MYSQL);
        //页数溢出时跳到第一页
        paginationInnerInterceptor.setOverflow(true);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);

        return interceptor;
    }

}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/config/RabbitmqConvertConfig.java
================================================
package com.acimage.common.config;


import org.springframework.amqp.core.AcknowledgeMode;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@ConditionalOnClass(RabbitTemplate.class)
@Configuration
public class RabbitmqConvertConfig {
    //发送方序列化
    @Bean
    public RabbitTemplate jacksonRabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
        return rabbitTemplate;
    }

    //消费者序列化
    @Bean
    public RabbitListenerContainerFactory<?> rabbitListenerContainerFactory(ConnectionFactory connectionFactory){
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setMessageConverter(new Jackson2JsonMessageConverter());
        factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
        return factory;
    }

}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/deprecated/IpInterceptorBak.java
================================================
package com.acimage.common.deprecated;

import com.acimage.common.global.context.UserContext;
import com.acimage.common.utils.IpUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.concurrent.TimeUnit;

/**
 * 获取请求的token状态
 */
@Slf4j
@Component
public class IpInterceptorBak implements HandlerInterceptor {

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String KEY_IP="acimage:ip:";
        String KEY_BLACK_IP="acimage:ip:black";
        long EXPIRE_SECONDS=10L;
        long limitTimes=300L;

        String ip = IpUtils.getIp(request);
        UserContext.setIp(ip);
        String ipKey=KEY_IP+ip;
        String blackIpKey=KEY_BLACK_IP+ip;

        Boolean isBlackIp=stringRedisTemplate.opsForSet().isMember(blackIpKey,ip);

        if(Boolean.TRUE.equals(isBlackIp)){
            return false;
        }

        if (handler instanceof HandlerMethod) {
            Long visitNum=stringRedisTemplate.opsForValue().increment(ipKey);
            if(visitNum==null){
                log.error("ip:{} 操作:ip访问计数 错误:redis中ip计数返回值为空",ip);
            } else if (visitNum==1){
                stringRedisTemplate.expire(ipKey,EXPIRE_SECONDS, TimeUnit.SECONDS);
            } else if (visitNum>limitTimes) {
                //加入黑名单
                stringRedisTemplate.opsForSet().add(blackIpKey,ip);
                response.setStatus(HttpStatus.FORBIDDEN.value());
                return false;
            }
        }

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        UserContext.remove();
    }
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/deprecated/JwtInterceptorBak.java
================================================
package com.acimage.common.deprecated;

import com.acimage.common.global.exception.NullTokenException;
import com.acimage.common.deprecated.annotation.utils.AuthenticationUtils;
import com.acimage.common.global.consts.HeaderKeyConstants;
import com.acimage.common.global.context.UserContext;
import com.acimage.common.global.enums.AuthenticationType;
import com.acimage.common.global.enums.TokenStatus;
import com.acimage.common.service.TokenService;
import com.acimage.common.utils.IpUtils;
import com.acimage.common.utils.JwtUtils;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 获取请求的token状态
 */
public class JwtInterceptorBak implements HandlerInterceptor {
    @Autowired
    TokenService tokenService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //设置ip
        String ip = IpUtils.getIp(request);
        UserContext.setIp(ip);
        
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod=(HandlerMethod) handler;
            //获取该方法权限类型,优先注解顺序:方法、类
            AuthenticationType authenticationType = AuthenticationUtils.getAuthenticationType(handlerMethod);
            //无登录权限要求则放行
            if (authenticationType == null || authenticationType == AuthenticationType.NONE) {
                UserContext.setTokenStatus(TokenStatus.PASS_TOKEN_VERIFY);
                return true;
            }
        }

        //获取token
        String token = request.getHeader(HeaderKeyConstants.AUTHORIZATION);

        //验证token,验证不通过抛出异常
        try {
            JwtUtils.verifyToken(token);
        } catch (NullTokenException e1) {
            UserContext.setTokenStatus(TokenStatus.NULL);
            return true;
        } catch (TokenExpiredException e2) {
            UserContext.setTokenStatus(TokenStatus.EXPIRE);
            return true;
        } catch (JWTVerificationException e3) {
            UserContext.setTokenStatus(TokenStatus.INVALID);
            return true;
        }

        if (!tokenService.hasRecorded(token)) {
            UserContext.setTokenStatus(TokenStatus.MISMATCH_IP);
        } else {
            UserContext.setTokenStatus(TokenStatus.VALID);
        }

        UserContext.saveCurrentUserInfo(JwtUtils.getUserId(token), JwtUtils.getUsername(token), JwtUtils.getPhotoUrl(token));
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        UserContext.remove();
    }
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/deprecated/PermissionInterceptorBak.java
================================================
package com.acimage.common.deprecated;

import com.acimage.common.deprecated.annotation.utils.AuthenticationUtils;
import com.acimage.common.global.context.UserContext;
import com.acimage.common.global.enums.AuthenticationType;
import com.acimage.common.global.enums.TokenStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.ParameterizableViewController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 验证token状态和请求所需权限是否匹配
 */

@Slf4j
public class PermissionInterceptorBak implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String ip = UserContext.getIp();

        log.info("access 用户:{} token状态:{} 访问:{} {} ip:{}",
                UserContext.getUsername(), UserContext.getTokenStatus(), request.getRequestURI(), request.getMethod(), ip);

        TokenStatus tokenStatus = UserContext.getTokenStatus();
        if (tokenStatus == TokenStatus.PASS_TOKEN_VERIFY) {
            return true;
        }
        //如果通过viewController访问页面
        if (handler instanceof ParameterizableViewController) {
            if (!(tokenStatus == TokenStatus.VALID||tokenStatus == TokenStatus.MISMATCH_IP)) {

                response.sendRedirect("/");
                return false;
            }
        }

        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            //获取该方法权限类型,优先注解顺序:方法、类
            AuthenticationType authenticationType = AuthenticationUtils.getAuthenticationType(handlerMethod);
            //无登录权限要求则放行
            if (authenticationType == null || authenticationType == AuthenticationType.NONE) {
                return true;
            } else if (authenticationType == AuthenticationType.TOKEN_REQUIRED) {
                if (!(tokenStatus == TokenStatus.VALID||tokenStatus == TokenStatus.MISMATCH_IP)) {
                    response.setStatus(HttpStatus.UNAUTHORIZED.value());
                    return false;
                }
            }
        }
//        ParameterizableViewController viewHandler=(ParameterizableViewController) handler;
//        viewHandler.getViewName();
//        String token= CookieUtils.getValueByName(request.getCookies(), JwtUtils.KEY_TOKEN);

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView
            modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception
            ex) throws Exception {
        //移除用户信息,防止之后用该线程的信息误判(因为线程池)
        UserContext.remove();
    }
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/deprecated/QiniuUtils.java
================================================
package com.acimage.common.deprecated;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.http.HttpUtil;
import com.acimage.common.global.exception.BusinessException;
import com.acimage.common.utils.ExceptionUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.qiniu.cdn.CdnManager;
import com.qiniu.cdn.CdnResult;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Client;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.BatchStatus;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Nullable;
import javax.annotation.PostConstruct;
import javax.validation.constraints.NotNull;
import java.io.*;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

@Deprecated
@Slf4j
@ConditionalOnClass(Auth.class)
@ConfigurationProperties(prefix = "qiniu")
public class QiniuUtils {

    private String accessKey;
    private String secretKey;
    private String bucket;
    private String domain;

    private String uploadToken;
    UploadManager uploadManager;
    Auth auth;
    Configuration cfg;
    private static final ObjectMapper mapper = new ObjectMapper();

    @PostConstruct
    private void init() {
        cfg = new Configuration(Region.huanan());
        cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
        uploadManager = new UploadManager(cfg);
        auth = Auth.create(accessKey, secretKey);
        uploadToken = auth.uploadToken(bucket);
//        System.out.println(accessKey);
//        System.out.println(secretKey);
//        System.out.println(bucket);
//        System.out.println(domain);
    }

    public void setAccessKey(String accessKey) {
        this.accessKey = accessKey;
    }

    public void setSecretKey(String secretKey) {
        this.secretKey = secretKey;
    }

    public void setBucket(String bucket) {
        this.bucket = bucket;
    }

    public void setDomain(String domain) {
        this.domain = domain;
    }

    /**
     * @param multipartFile 上传的图片
     */
    public void upload(@NotNull MultipartFile multipartFile, String urlWithoutDomain) {
        InputStream is;
        try {
            is = multipartFile.getInputStream();
        } catch (IOException e) {
            ExceptionUtils.printIfDev(e);
            log.error("error: multipartFile.getInputStream()异常:{}", e.getMessage());
            throw new RuntimeException(e);
        }

        putAndLog(is, urlWithoutDomain, uploadToken);
    }

    public void upload(@NotNull File file, String urlWithoutDomain) {
        putAndLog(file, urlWithoutDomain, uploadToken);
    }

    public void cover(@NotNull MultipartFile multipartFile, String urlWithoutDomain) {
        String coverToken = auth.uploadToken(bucket, urlWithoutDomain);
        InputStream is;
        try {
            is = multipartFile.getInputStream();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        putAndLog(is, urlWithoutDomain, coverToken);
        new Thread(() -> {
            refreshFile(urlWithoutDomain);
            refreshQuery(urlWithoutDomain);
        }).start();

    }


    public void refreshFile(String... urls) {
        int urlAmountLimit = 100;
        CdnManager c = new CdnManager(auth);
        if (urls.length > urlAmountLimit) {
            log.error("调用刷新的链接超过100个");
            return;
        }

        //得到真实链接
        for (int i = 0; i < urls.length; i++) {
            urls[i] = getTrueUrl(urls[i]);
        }

        try {
            //单次方法调用刷新的链接不可以超过100个
            CdnResult.RefreshResult result = c.refreshUrls(urls);
            //获取其他的回复内容
        } catch (QiniuException e) {
            log.error("刷新七牛云url失败 urls:{}", Arrays.asList(urls));
        }
    }


    public void refreshQuery(String url) {
        String trueUrl = getTrueUrl(url);
        StringMap str = auth.authorization(trueUrl);
        Client client = new Client();
        try {
            client.post(trueUrl, "", str);
        } catch (QiniuException e) {
            log.error("刷新查询oss url失败 url:{}", url);
            ExceptionUtils.printIfDev(e);
        }
    }

    public void deleteFile(String url) {
        BucketManager bucketManager = new BucketManager(auth, cfg);
        try {
            bucketManager.delete(bucket, url);
        } catch (QiniuException ex) {
            //如果遇到异常,说明删除失败
            log.error("云文件删除失败 url:{} 返回代码:{} 返回错误信息:{}", url, ex.code(), ex.response.toString());
        }
    }

    public void batchDelete(List<String> urlList) {
        if (CollectionUtil.isEmpty(urlList)) {
            return;
        }
        BucketManager bucketManager = new BucketManager(auth, cfg);
        try {
            //单次批量请求的文件数量不得超过1000

            String[] urls = urlList.toArray(new String[0]);

            BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations();
            batchOperations.addDeleteOp(bucket, urls);
            Response response = bucketManager.batch(batchOperations);
            BatchStatus[] batchStatusList = response.jsonToObject(BatchStatus[].class);
            for (int i = 0; i < urls.length; i++) {
                BatchStatus status = batchStatusList[i];
                String key = urls[i];
                System.out.print(key + "\t");
                if (status.code == 200) {
                    System.out.println("delete success");
                } else {
                    System.out.println(status.data.error);
                }
            }
        } catch (QiniuException ex) {
            System.err.println(ex.response.toString());
        }
    }

    public String generateUrl(String suffix, Date uploadTime, @Nullable String prefix) {
        String formatPattern = "yyyy/MM/dd";
        String newPrefix = prefix == null ? "" : prefix + "/";
        SimpleDateFormat formatter = new SimpleDateFormat(formatPattern);
        return newPrefix + formatter.format(uploadTime) + "/" + suffix;
    }

    public String getTrueUrl(String urlWithoutDomain) {
        return domain + "/" + urlWithoutDomain;
    }

    public void download(String url, String toPath) {
        String encodedUrl = null;
        try {
            encodedUrl = URLEncoder.encode(url, "utf-8").replace("+", "%20");
        } catch (UnsupportedEncodingException e) {
            ExceptionUtils.printIfDev(e);
            log.error("url编码失败 error:{}", e.getLocalizedMessage());
        }
        String publicUrl = domain + "/" + encodedUrl;
        HttpUtil.downloadFile(publicUrl, new File(toPath));//下载
    }

    private void putAndLog(Object inputStreamOrFile, String urlWithoutDomain, String token) {
        Response response = null;
        try {
            if (inputStreamOrFile instanceof InputStream ) {
                InputStream is=(InputStream) inputStreamOrFile;
                response = uploadManager.put(is, urlWithoutDomain, token, null, null);
            } else if (inputStreamOrFile instanceof File) {
                File file=(File) inputStreamOrFile;
                response = uploadManager.put(file, urlWithoutDomain, token);
            } else {
                throw new IllegalArgumentException(String.format("参数inputStreamOrFile类型错误:%s", inputStreamOrFile.getClass()));
            }

            if (response == null) {
                return;
            }

            //解析上传成功的结果
            DefaultPutRet putRet = mapper.readValue(response.bodyString(), DefaultPutRet.class);
            log.info("文件上传七牛云成功 返回结果key:{} hash:{}", putRet.key, putRet.hash);
        } catch (QiniuException ex) {
            Response r = ex.response;
            System.err.println(r.toString());
            try {
                String responseMsg = r.bodyString();
                log.error(responseMsg);
                throw new BusinessException("服务器上传文件失败");
            } catch (QiniuException ex2) {
                log.error("文件上传后返回信息读取失败 url:{}", urlWithoutDomain);
                throw new BusinessException("上传文件出错了");
                //ignore
            }
        } catch (JsonProcessingException e) {
            log.error("json解析七牛云返回结果异常");
            throw new BusinessException("上传文件出错了,服务器解析结果异常");
        }

    }
}



================================================
FILE: acimage_common/src/main/java/com/acimage/common/deprecated/QiniuUtilsBak.java
================================================
package com.acimage.common.deprecated;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.http.HttpUtil;
import com.acimage.common.global.exception.BusinessException;
import com.acimage.common.utils.ExceptionUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.qiniu.cdn.CdnManager;
import com.qiniu.cdn.CdnResult;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Client;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.BatchStatus;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Nullable;
import javax.annotation.PostConstruct;
import javax.validation.constraints.NotNull;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

@Slf4j
@Component
@ConditionalOnClass(Auth.class)
@ConfigurationProperties(prefix = "qiniu")
@Deprecated
public class QiniuUtilsBak {

    private String accessKey;
    private String secretKey;
    private String bucket;
    private String domain;

    private String uploadToken;
    UploadManager uploadManager;
    Auth auth;
    Configuration cfg;
    private static final ObjectMapper mapper = new ObjectMapper();

    @PostConstruct
    private void init() {
        cfg = new Configuration(Region.huanan());
        cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
        uploadManager = new UploadManager(cfg);
        auth = Auth.create(accessKey, secretKey);
        uploadToken = auth.uploadToken(bucket);
    }

    public void setAccessKey(String accessKey) {
        this.accessKey = accessKey;
    }

    public void setSecretKey(String secretKey) {
        this.secretKey = secretKey;
    }

    public void setBucket(String bucket) {
        this.bucket = bucket;
    }

    public void setDomain(String domain) {
        this.domain = domain;
    }

    /**
     * @param multipartFile 上传的图片
     */
    public void upload(@NotNull MultipartFile multipartFile, String urlWithoutDomain) {
        InputStream is;
        try {
            is = multipartFile.getInputStream();
        } catch (IOException e) {
            ExceptionUtils.printIfDev(e);
            log.error("error: multipartFile.getInputStream()异常:{}", e.getMessage());
            throw new RuntimeException(e);
        }

        putAndLog(is, urlWithoutDomain, uploadToken);
    }

    public void upload(@NotNull File file, String urlWithoutDomain) {
        putAndLog(file, urlWithoutDomain, uploadToken);
    }

    public void cover(@NotNull MultipartFile multipartFile, String urlWithoutDomain) {
        String coverToken = auth.uploadToken(bucket, urlWithoutDomain);
        InputStream is;
        try {
            is = multipartFile.getInputStream();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        putAndLog(is, urlWithoutDomain, coverToken);
        new Thread(() -> {
            refreshFile(urlWithoutDomain);
            refreshQuery(urlWithoutDomain);
        }).start();

    }


    public void refreshFile(String... urls) {
        int urlAmountLimit = 100;
        CdnManager c = new CdnManager(auth);
        if (urls.length > urlAmountLimit) {
            log.error("调用刷新的链接超过100个");
            return;
        }

        //得到真实链接
        for (int i = 0; i < urls.length; i++) {
            urls[i] = getTrueUrl(urls[i]);
        }

        try {
            //单次方法调用刷新的链接不可以超过100个
            CdnResult.RefreshResult result = c.refreshUrls(urls);
            //获取其他的回复内容
        } catch (QiniuException e) {
            log.error("刷新七牛云url失败 urls:{}", Arrays.asList(urls));
        }
    }


    public void refreshQuery(String url) {
        String trueUrl = getTrueUrl(url);
        StringMap str = auth.authorization(trueUrl);
        Client client = new Client();
        try {
            client.post(trueUrl, "", str);
        } catch (QiniuException e) {
            log.error("刷新查询oss url失败 url:{} error:{}", url,e.getMessage());
            ExceptionUtils.printIfDev(e);
        }
    }

    public void deleteFile(String url) {
        BucketManager bucketManager = new BucketManager(auth, cfg);
        try {
            bucketManager.delete(bucket, url);
        } catch (QiniuException ex) {
            //如果遇到异常,说明删除失败
            log.error("云文件删除失败 url:{} 返回代码:{} 返回错误信息:{}", url, ex.code(), ex.response.toString());
        }
    }

    public void batchDelete(List<String> urlList) {
        if (CollectionUtil.isEmpty(urlList)) {
            return;
        }
        BucketManager bucketManager = new BucketManager(auth, cfg);
        try {
            //单次批量请求的文件数量不得超过1000

            String[] urls = urlList.toArray(new String[0]);

            BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations();
            batchOperations.addDeleteOp(bucket, urls);
            Response response = bucketManager.batch(batchOperations);
            BatchStatus[] batchStatusList = response.jsonToObject(BatchStatus[].class);
            for (int i = 0; i < urls.length; i++) {
                BatchStatus status = batchStatusList[i];
                String key = urls[i];
                System.out.print(key + "\t");
                if (status.code == 200) {
                    System.out.println("delete success");
                } else {
                    System.out.println(status.data.error);
                }
            }
        } catch (QiniuException ex) {
            System.err.println(ex.response.toString());
        }
    }

    public String generateUrl(String suffix, Date uploadTime, @Nullable String prefix) {
        String formatPattern = "yyyy/MM/dd";
        String newPrefix = prefix == null ? "" : prefix + "/";
        SimpleDateFormat formatter = new SimpleDateFormat(formatPattern);
        return newPrefix + formatter.format(uploadTime) + "/" + suffix;
    }

    public String getTrueUrl(String urlWithoutDomain) {
        return domain + "/" + urlWithoutDomain;
    }

    public void download(String url, String toPath) {
        String encodedUrl = null;
        try {
            encodedUrl = URLEncoder.encode(url, "utf-8").replace("+", "%20");
        } catch (UnsupportedEncodingException e) {
            ExceptionUtils.printIfDev(e);
            log.error("url编码失败 error:{}", e.getMessage());
        }
        String publicUrl = domain + "/" + encodedUrl;
        long expireInSeconds = 3600;//1小时,可以自定义链接过期时间

        HttpUtil.downloadFile(publicUrl, new File(toPath));//下载
    }

    private void putAndLog(Object inputStreamOrFile, String urlWithoutDomain, String token) {
        Response response = null;
        try {
            if (inputStreamOrFile instanceof InputStream) {
                InputStream is = (InputStream) inputStreamOrFile;
                response = uploadManager.put(is, urlWithoutDomain, token, null, null);
            } else if (inputStreamOrFile instanceof File) {
                File file = (File) inputStreamOrFile;
                response = uploadManager.put(file, urlWithoutDomain, token);
            } else {
                throw new IllegalArgumentException(String.format("参数inputStreamOrFile类型错误:%s", inputStreamOrFile.getClass()));
            }

            if (response == null) {
                return;
            }

            //解析上传成功的结果
            DefaultPutRet putRet = mapper.readValue(response.bodyString(), DefaultPutRet.class);
            log.info("文件上传七牛云成功 返回结果key:{} hash:{}", putRet.key, putRet.hash);
        } catch (QiniuException ex) {
            Response r = ex.response;
            System.err.println(r.toString());
            try {
                String responseMsg = r.bodyString();
                log.error(responseMsg);
                throw new BusinessException("服务器上传文件失败");
            } catch (QiniuException ex2) {
                log.error("文件上传后返回信息读取失败 url:{}", urlWithoutDomain);
                throw new BusinessException("上传文件出错了");
                //ignore
            }
        } catch (JsonProcessingException e) {
            log.error("json解析七牛云返回结果异常");
            throw new BusinessException("上传文件出错了,服务器解析结果异常");
        }

    }
}



================================================
FILE: acimage_common/src/main/java/com/acimage/common/deprecated/UserCommunityStatistic.java
================================================
package com.acimage.common.deprecated;

import com.acimage.common.model.domain.community.CmtyUser;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@NoArgsConstructor
@AllArgsConstructor
@Deprecated
public class UserCommunityStatistic {
    @TableId
    Long userId;
    Integer topicCount;
    Integer starCount;
    @TableField(exist = false)
    CmtyUser cmtyUser;
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/deprecated/annotation/Authentication.java
================================================
package com.acimage.common.deprecated.annotation;

import com.acimage.common.global.enums.AuthenticationType;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 注解上的类或方法表示不需要登录后才能访问
 */
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Authentication {
    AuthenticationType type() default AuthenticationType.TOKEN_REQUIRED;

}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/deprecated/annotation/utils/AuthenticationUtils.java
================================================
package com.acimage.common.deprecated.annotation.utils;

import com.acimage.common.deprecated.annotation.Authentication;
import com.acimage.common.global.enums.AuthenticationType;
import org.springframework.web.method.HandlerMethod;


public class AuthenticationUtils {
    public static AuthenticationType getAuthenticationType(HandlerMethod handlerMethod){
        if(handlerMethod==null){
            return null;
        }
        //判断方法上是否有Authorization注解
        Authentication methodAuthentication =handlerMethod.getMethod().getAnnotation(Authentication.class);
        if(methodAuthentication !=null){
            return methodAuthentication.type();
        }
        //获取类上的Authorization注解
        Authentication classAuthentication =handlerMethod.getBeanType().getAnnotation(Authentication.class);
        if(classAuthentication !=null){
            return classAuthentication.type();
        }
        return null;
    }
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/deprecated/typehandler/MatchRuleTypeHandler.java
================================================
package com.acimage.common.deprecated.typehandler;


import com.acimage.common.global.enums.MatchRule;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


//@MappedTypes(MatchRule.class)
public class MatchRuleTypeHandler extends BaseTypeHandler<MatchRule> {

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, MatchRule matchRule, JdbcType jdbcType) throws SQLException {
        preparedStatement.setInt(i, matchRule.getKey());
    }

    @Override
    public MatchRule getNullableResult(ResultSet resultSet, String column) throws SQLException {
        return MatchRule.from(resultSet.getInt(column));
    }

    @Override
    public MatchRule getNullableResult(ResultSet resultSet, int i) throws SQLException {
       return MatchRule.from(Integer.parseInt(resultSet.getString(i)));
    }

    @Override
    public MatchRule getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        return MatchRule.from(Integer.parseInt(callableStatement.getString(i)));
    }

}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/global/aop/LogAdvice.java
================================================
package com.acimage.common.global.aop;


import com.acimage.common.utils.common.AopUtils;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

@Aspect
@Component
@Slf4j
@Order(200)
public class LogAdvice {

    private static final int MAX_RETURN_VALUE_LENGTH = 100;

    //    @Pointcut("execution(public * com.acimage..*.controller.*Controller.*(..))")
    @Pointcut("execution(public * com.acimage..*.*Controller.*(..))")
    public void controllerPointCut() {
    }

    @Pointcut("execution(public * com.acimage..*.*Provider.*(..))")
    public void providerPointCut() {
    }

    /**
     * 记录每个接口出异常时时的入参
     */
    @Around("controllerPointCut() || providerPointCut()")
    private Object logParametersAndReturnValue(ProceedingJoinPoint joinPoint) throws Throwable {

        Method method = AopUtils.methodOf(joinPoint);
        Object[] args = joinPoint.getArgs();
        Parameter[] parameters = method.getParameters();

        long startTime = System.currentTimeMillis();

        //记录入参
        StringBuilder argsString = new StringBuilder();
        argsString.append(method.getName());
        argsString.append(" 入参-->");
        if (args != null) {
            for (int i = 0; i < args.length; i++) {
                if (i < parameters.length) {
                    argsString.append(parameters[i].getName());
                    argsString.append(": ");
                }

                argsString.append(args[i]);
                argsString.append(" ");
            }
        }

        Object obj;
        try {
            obj = joinPoint.proceed();
        } catch (Throwable e) {
            log.error("出异常: " + argsString);
            throw e;
        }

        if (!method.isAnnotationPresent(GetMapping.class)) {
            String returnValue = obj == null ? "" : obj.toString();
            log.info(method.getName() + " 返回值-->" + returnValue);
        }

        String classMethod = method.getName() + " " + method.getDeclaringClass().getSimpleName();
        long cost = System.currentTimeMillis() - startTime;
        if (cost > 500) {
            log.warn("{}耗时 {}ms", classMethod, cost);
        } else {
            log.debug("{}耗时 {}ms", classMethod, cost);
        }

        return obj;
    }
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/global/consts/EsConstants.java
================================================
package com.acimage.common.global.consts;

public class EsConstants {
    public static final String IK_SMART="ik_smart";
    public static final String IK_MAX_WORD="ik_max_word";
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/global/consts/FileFormatConstants.java
================================================
package com.acimage.common.global.consts;

import java.util.Arrays;
import java.util.List;

public class FileFormatConstants {
    public static List<String> ALLOWED_IMAGE_FORMAT = Arrays.asList("jpeg", "jpg", "png");
    public static List<String> ALLOWED_CAROUSEL_FORMAT = Arrays.asList("jpeg", "jpg", "png","webp");
    public static List<String> ALLOWED_COVER_IMAGE_FORMAT = Arrays.asList("jpeg", "jpg", "png","webp");
    public static final String WEBP="webp";
    public static final String WEBP_CONTENT_TYPE="image/webp";
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/global/consts/HeaderKeyConstants.java
================================================
package com.acimage.common.global.consts;

public class HeaderKeyConstants {
    public static final String AUTHORIZATION="authorization";
    public static final String FEIGN_X_USER_IP ="x-origin-user-ip";

    public static final String SEC_WEBSOCKET_PROTOCOL="Sec-WebSocket-Protocol";
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/global/consts/JwtConstants.java
================================================
package com.acimage.common.global.consts;

public class JwtConstants {

    public static final int USER_EXPIRE_DAYS = 2;
    public static final int ADMIN_EXPIRE_DAYS = 1;

    public static final String KEY_USERNAME="username";
    public static final String KEY_USER_ID="userId";
    public static final String KEY_PHOTO_URL="photoUrl";
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/global/consts/MqConstants.java
================================================
package com.acimage.common.global.consts;

public class MqConstants {
    public static final String HASH_IMAGE_QUEUE = "hash-image-queue";
    public static final String HASH_IMAGE_ROUTE = "hash-image-route";


    public static final String REMOVE_TOPIC_IMAGES_QUEUE = "remove-topic-images-queue";
    public static final String REMOVE_TOPIC_IMAGE_ROUTE = "remove-topic-images-route";

    public static final String SYNC_IMAGES_QUEUE="sync-images-queue";
    public static final String SYNC_IMAGES_ROUTE="sync-images-route";

    public static final String SYNC_ES_QUEUE = "sync-es-queue";
    public static final String SYNC_ES_ROUTE = "sync-es-route";

    public static final String SYNC_USER_QUEUE = "sync-user-queue";
    public static final String SYNC_USER_ROUTE = "sync-user-route";

    public static final String USER_MSG_QUEUE="user-msg-queue";
    public static final String USER_MSG_ROUTE="user-msg-route";


    public static final String TOPIC_IMAGES_EXCHANGE = "topic-images-exchange";
    public static final String SYNC_ES_EXCHANGE = "sync-es-exchange";
    public static final String COMMUNITY_USER_EXCHANGE="community-user-exchange";
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/global/consts/StorePrefixConstants.java
================================================
package com.acimage.common.global.consts;

public class StorePrefixConstants {
    public final static String TOPIC_IMAGE="topicImage";
    public final static String USER_PHOTO="userPhoto";
    public final static String COVER_IMAGE="coverImage";
    public final static String HOME_CAROUSEL="homeCarousel";
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/global/consts/SysKeyConstants.java
================================================
package com.acimage.common.global.consts;

public class SysKeyConstants {

    /**
     * 记录网站浏览量
     */
    public static final String LOGK_PAGE_VIEW="acimage:admin:websiteData:pageView";
    /**
     * 记录接口访问次数
     */
    public static final String STRINGK_INTERFACE_TOTAL="acimage:admin:websiteData:interface:total";

    public static final String STRINGK_INTERFACE_SUCCESS="acimage:admin:websiteData:interface:success";

    public static final String STRINGK_INTERFACE_FAILURE="acimage:admin:websiteData:interface:failure";
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/global/consts/TimeConstants.java
================================================
package com.acimage.common.global.consts;

public class TimeConstants {

    public static final long DAY_SECONDS=24*60*60;
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/global/context/UserContext.java
================================================
package com.acimage.common.global.context;

import com.acimage.common.global.enums.TokenStatus;


public class UserContext {
    private static final ThreadLocal<Long> userId = new ThreadLocal<>();
    private static final ThreadLocal<String> username = new ThreadLocal<>();
    private static final ThreadLocal<String> photoUrl = new ThreadLocal<>();
    private static final ThreadLocal<TokenStatus> tokenStatus = new ThreadLocal<>();
    private static final ThreadLocal<String> ip = new ThreadLocal<>();

    public static void saveCurrentUserInfo(Long userId, String username, String photoUrl) {
        UserContext.userId.set(userId);
        UserContext.username.set(username);
        UserContext.photoUrl.set(photoUrl);
    }

    /**
     * 移除登录用户信息,在拦截器方法afterCompletion中,应移除当前用户对象
     */
    public static void remove() {
        userId.remove();
        username.remove();
        photoUrl.remove();
        tokenStatus.remove();
        ip.remove();
    }

    public static void setTokenStatus(TokenStatus tokenStatus) {
        UserContext.tokenStatus.set(tokenStatus);
    }
    public static void setUserId(Long userId){
        UserContext.userId.set(userId);
    }
    public static void setUsername(String username){
        UserContext.username.set(username);
    }

    public static void setIp(String ip) {
        UserContext.ip.set(ip);
    }

    public static Long getUserId() {
        return userId.get();
    }

    public static String getUsername() {
        return username.get();
    }

    public static String getPhotoUrl() {
        return photoUrl.get();
    }

    public static TokenStatus getTokenStatus() {
        return tokenStatus.get();
    }

    public static String getIp() {
        return ip.get();
    }
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/global/enums/AuthenticationType.java
================================================
package com.acimage.common.global.enums;

public enum AuthenticationType {
    NONE(0),
    TOKEN_REQUIRED(1),
    ADMIN(2);

    private final int key;
    AuthenticationType(int key) {
        this.key = key;
    }

    public int getKey() {
        return this.key;
    }
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/global/enums/MatchRule.java
================================================
package com.acimage.common.global.enums;

/**
 * interface表中匹配规则
 */
public enum MatchRule {
    /**
     * 精确匹配
     */
    EXACT(1),
    /**
     * 匹配前缀
     */
    PREFIX(2);

    private final int key;

    MatchRule(int key) {
        this.key = key;
    }

    public int getKey() {
        return this.key;
    }

    public static MatchRule from(int key){
        for(MatchRule matchRule:MatchRule.values()){
            if(matchRule.getKey()==key){
                return matchRule;
            }
        }
        return null;
    }
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/global/enums/MyHttpMethod.java
================================================
package com.acimage.common.global.enums;

import org.springframework.http.HttpMethod;

public enum MyHttpMethod {
    GET,
    POST,
    PUT,
    DELETE,
    ALL;

    public static MyHttpMethod from(HttpMethod method) {
        try {
            return MyHttpMethod.valueOf(method.toString());
        } catch (IllegalArgumentException e) {
            return null;
        }
    }
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/global/enums/ServiceType.java
================================================
package com.acimage.common.global.enums;

public enum ServiceType {
    ADD,
    DELETE,
    UPDATE
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/global/enums/TokenStatus.java
================================================
package com.acimage.common.global.enums;

public enum TokenStatus {
    PASS_TOKEN_VERIFY(0),
    NULL(1),
    EXPIRE(2),
    INVALID(3),
    MISMATCH_IP(4),
    VALID(5);
    private final int key;

    TokenStatus(int key) {
        this.key = key;
    }

    public int getKey() {
        return this.key;
    }
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/global/exception/BaseException.java
================================================
package com.acimage.common.global.exception;

import com.acimage.common.result.Result;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;


@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public abstract class BaseException extends RuntimeException{
    Integer code;
    String msg;

    public Result asResult(){
        return new Result(code,null,msg);
    }
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/global/exception/BusinessException.java
================================================
package com.acimage.common.global.exception;

import com.acimage.common.result.Code;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@AllArgsConstructor
public class BusinessException extends BaseException{

    public BusinessException(String msg){
        this.msg=msg;
        this.code= Code.ERR;
    }

    public BusinessException(Integer code, String msg) {
        super(code, msg);
    }
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/global/exception/NullTokenException.java
================================================
package com.acimage.common.global.exception;

import com.auth0.jwt.exceptions.JWTVerificationException;

public class NullTokenException extends JWTVerificationException {

    public NullTokenException(String message){super(message);}
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/global/exception/SystemException.java
================================================
package com.acimage.common.global.exception;


import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@AllArgsConstructor
public class SystemException extends BaseException{

}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/model/Index/TopicIndex.java
================================================
package com.acimage.common.model.Index;


import cn.hutool.core.date.DatePattern;
import com.acimage.common.global.consts.EsConstants;
import com.acimage.common.model.domain.community.CmtyUser;
import com.acimage.common.model.domain.community.Tag;
import com.acimage.common.model.domain.community.Topic;
import com.acimage.common.model.domain.user.User;
import com.acimage.common.model.page.MyPage;
import com.acimage.common.utils.common.BeanUtils;
import com.acimage.common.utils.common.ListUtils;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.*;

import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;


@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
@Document(indexName = "topic")
@Setting(replicas = 0)
public class TopicIndex {

    @Id
    private Long id;

    @Field(type = FieldType.Text)
    private String all;

    @Field(type = FieldType.Keyword, store = true)
    private Long userId;
    @Field(type = FieldType.Text, analyzer = EsConstants.IK_MAX_WORD, store = true)
    private String username;
    @Field(type = FieldType.Keyword, index = false, store = true)
    private String photoUrl;

    @Field(type = FieldType.Text, analyzer = EsConstants.IK_MAX_WORD, store = true, copyTo = "all")
    private String content;

    @Field(type = FieldType.Text, analyzer = EsConstants.IK_MAX_WORD, store = true, copyTo = "all")
    private String title;

    @Field(type = FieldType.Integer, store = true)
    private Integer starCount;
    @Field(type = FieldType.Integer, store = true)
    private Integer pageView;
    @Field(type = FieldType.Integer, store = true)
    private Integer commentCount;

    @Field(store = true, index = false, type = FieldType.Keyword)
    private String coverImageUrl;

    @Field(type = FieldType.Date, pattern = DatePattern.NORM_DATETIME_PATTERN, store = true)
    private Date createTime;
    @Field(type = FieldType.Date, pattern = DatePattern.NORM_DATETIME_PATTERN, store = true)
    private Date updateTime;
    @Field(type = FieldType.Date, pattern = DatePattern.NORM_DATETIME_PATTERN, store = true)
    private Date activityTime;

    @Field(type = FieldType.Keyword, store = true)
    List<Integer> tagIds;
    @Field(type = FieldType.Keyword, store = true)
    Integer categoryId;

    public static TopicIndex from(Topic topic) {
        TopicIndex topicIndex = BeanUtils.copyPropertiesTo(topic, TopicIndex.class);
        CmtyUser user = topic.getUser();
        if (user != null) {
            topicIndex.setUsername(user.getUsername());
            topicIndex.setPhotoUrl(user.getPhotoUrl());
        }

        return topicIndex;
    }

    public static Topic toTopic(TopicIndex topicIndex) {
        Topic topic = BeanUtils.copyPropertiesTo(topicIndex, Topic.class);
        CmtyUser user = new CmtyUser();
        user.setUsername(topicIndex.getUsername());
        user.setPhotoUrl(topicIndex.getPhotoUrl());
        topic.setUser(user);
        return topic;
    }

    public static List<Topic> toTopicList(List<TopicIndex> topicIndexList) {
        return topicIndexList.stream()
                .map(TopicIndex::toTopic)
                .collect(Collectors.toList());
    }

    public static MyPage<Topic> toTopicPage(MyPage<TopicIndex> topicPage) {
        List<Topic> topicList = toTopicList(topicPage.getDataList());
        return new MyPage<>(topicPage.getTotalCount(),topicList);
    }


}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/model/domain/community/Category.java
================================================
package com.acimage.common.model.domain.community;


import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Category {
    public static final int LABEL_MAX=50;
    public static final int LABEL_MIN =2;
    public static final String LABEL_VALIDATION_MSG ="角色名在"+ LABEL_MIN +"-"+LABEL_MAX+"之间";

    @TableId(type = IdType.AUTO)
    Integer id;
    String label;
    private Date createTime;
    private Date updateTime;
    @TableLogic(delval = "1")
    boolean deleted;

}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/model/domain/community/CmtyUser.java
================================================
package com.acimage.common.model.domain.community;

import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class CmtyUser {
    @TableId
    Long id;
    String username;
    String photoUrl;
    Integer topicCount;
    Integer starCount;
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/model/domain/community/Comment.java
================================================
package com.acimage.common.model.domain.community;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;


@Data
@NoArgsConstructor
public class Comment {
    public static final int CONTENT_MIN=2;
    public static final int CONTENT_MAX=200;
    public static final String CONTENT_VALIDATION_MSG="评论字数在"+CONTENT_MIN+"-"+CONTENT_MAX+"之间";

    @TableId(type= IdType.INPUT)
    private Long id;
    private Long topicId;
    private Long userId;
    private String content;
    @TableLogic
    private boolean deleted;
    private Date createTime;
    private Date updateTime;

    @TableField(exist = false)
    Topic topic;
    @TableField(exist = false)
    CmtyUser user;
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/model/domain/community/HomeCarousel.java
================================================
package com.acimage.common.model.domain.community;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class HomeCarousel {
    public static final int DESC_MIN = 2;
    public static final int DESC_MAX = 30;
    public static final String DESC_INVALID_MSG ="图片描述字数在"+ DESC_MIN +"-"+ DESC_MAX +"之间";

    public static final int LINK_MAX = 100;
    public static final String LINK_INVALID_MSG ="图片描述字数在"+ 0 +"-"+ LINK_MAX +"之间";

    @TableId(type= IdType.AUTO)
    private Integer id;
    private String description;
    private String url;
    private String link;
    private Integer location;
    private Integer size;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date createTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date updateTime;

}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/model/domain/community/Star.java
================================================
package com.acimage.common.model.domain.community;

import com.acimage.common.model.domain.community.Topic;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@NoArgsConstructor
public class Star {
    private Long userId;
    private Long topicId;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    @TableField(exist = false)
    Topic topic;

    public Star(Long userId, Long topicId) {
        this.userId = userId;
        this.topicId = topicId;
    }
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/model/domain/community/Tag.java
================================================
package com.acimage.common.model.domain.community;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Tag {
    @TableId(type = IdType.AUTO)
    Integer id;
    String label;
    private Date createTime;
    private Date updateTime;
    @TableLogic(delval = "1")
    boolean deleted;
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/model/domain/community/TagTopic.java
================================================
package com.acimage.common.model.domain.community;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class TagTopic {

    @TableId(type = IdType.AUTO)
    Long id;
    Long topicId;
    Integer tagId;
    private Date createTime;
    @TableLogic(delval = "1")
    boolean deleted;
}


================================================
FILE: acimage_common/src/main/java/com/acimage/common/model/domain/community/Topic.java
================================================
package com.acimage.common.model.domain.community;


import com.acimage.common.model.domain.user.User;
import com.baomidou.myba
Download .txt
gitextract_r94k4dmb/

├── .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/
│   └── 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.json
│   ├── public/
│   │   ├── table.json
│   │   └── template.xlsx
│   ├── 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
│   │   ├── 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/
│   │   │   │   └── user.vue
│   │   │   └── user.vue
│   │   └── vite-env.d.ts
│   ├── tsconfig.json
│   ├── tsconfig.node.json
│   └── vite.config.ts
└── vue_acimage_web/
    ├── .gitignore
    ├── README.md
    ├── babel.config.js
    ├── jsconfig.json
    ├── mock/
    │   ├── HomeCarousel.js
    │   ├── UserRank.js
    │   ├── index.js
    │   └── topic.js
    ├── package.json
    ├── public/
    │   ├── index.html
    │   ├── static/
    │   │   └── css/
    │   │       └── common.css
    │   └── tinymce/
    │       ├── langs/
    │       │   ├── README.md
    │       │   └── zh-Hans.js
    │       ├── license.txt
    │       ├── plugins/
    │       │   └── emoticons/
    │       │       └── js/
    │       │           ├── emojiimages.js
    │       │           └── emojis.js
    │       └── tinymce.d.ts
    ├── 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
    │   ├── 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
Download .txt
Showing preview only (211K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2192 symbols across 507 files)

FILE: acimage_admin/src/main/java/com/acimage/admin/AdminApplication.java
  class AdminApplication (line 12) | @Slf4j
    method main (line 21) | public static void main(String[] args) {

FILE: acimage_admin/src/main/java/com/acimage/admin/config/WebMvcConfig.java
  class WebMvcConfig (line 11) | @Slf4j
    method addInterceptors (line 16) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/config/mybatis/CommunityDataSourceConfig.java
  class CommunityDataSourceConfig (line 21) | @Deprecated
    method communityDataSource (line 26) | @Bean(name = "communityDataSource")
    method orderSqlSessionFactory (line 33) | @Bean(name = "communitySqlSessionFactory")
    method orderTransactionManager (line 48) | @Bean(name = "communityTransactionManager")
    method memberSqlSessionTemplate (line 54) | @Bean(name = "communitySqlSessionTemplate")

FILE: acimage_admin/src/main/java/com/acimage/admin/config/mybatis/GlobalConfigBean.java
  class GlobalConfigBean (line 10) | @Deprecated
    method globalConfig (line 13) | @Bean

FILE: acimage_admin/src/main/java/com/acimage/admin/config/mybatis/ImageDataSourceConfig.java
  class ImageDataSourceConfig (line 24) | @Deprecated
    method imageDataSource (line 30) | @Bean(name = "imageDataSource")
    method imageSqlSessionFactory (line 45) | @Bean(name = "imageSqlSessionFactory")
    method imageTransactionManager (line 61) | @Bean(name = "imageTransactionManager")
    method memberSqlSessionTemplate (line 67) | @Bean(name = "imageSqlSessionTemplate")

FILE: acimage_admin/src/main/java/com/acimage/admin/dao/community/CategoryDao.java
  type CategoryDao (line 6) | public interface CategoryDao extends BaseMapper<Category> {

FILE: acimage_admin/src/main/java/com/acimage/admin/dao/community/CommentDao.java
  type CommentDao (line 6) | public interface CommentDao extends BaseMapper<Comment> {

FILE: acimage_admin/src/main/java/com/acimage/admin/dao/community/HomeCarouselDao.java
  type HomeCarouselDao (line 11) | public interface HomeCarouselDao extends BaseMapper<HomeCarousel> {
    method getMaxLocation (line 12) | @Select("select coalesce(max(location),0) from tb_home_carousel")
    method count (line 15) | List<HomeCarousel> count();

FILE: acimage_admin/src/main/java/com/acimage/admin/dao/community/TopicDao.java
  type TopicDao (line 6) | public interface TopicDao extends BaseMapper<Topic> {

FILE: acimage_admin/src/main/java/com/acimage/admin/dao/sys/ApiDao.java
  type ApiDao (line 6) | public interface ApiDao extends BaseMapper<Api> {

FILE: acimage_admin/src/main/java/com/acimage/admin/dao/sys/AuthorizeDao.java
  type AuthorizeDao (line 6) | public interface AuthorizeDao extends BaseMapper<Authorize> {

FILE: acimage_admin/src/main/java/com/acimage/admin/dao/sys/PermissionDao.java
  type PermissionDao (line 10) | public interface PermissionDao extends BaseMapper<Permission> {
    method selectTreeByParentId (line 12) | List<Permission> selectTreeByParentId(@Nullable @Param("parentId") Int...
    method selectPermissionsWithParent (line 14) | List<Permission> selectPermissionsWithParent(@Param("startIndex") int ...

FILE: acimage_admin/src/main/java/com/acimage/admin/dao/sys/RoleDao.java
  type RoleDao (line 6) | public interface RoleDao extends BaseMapper<Role> {

FILE: acimage_admin/src/main/java/com/acimage/admin/dao/sys/UserRoleDao.java
  type UserRoleDao (line 7) | public interface UserRoleDao extends BaseMapper<UserRole> {

FILE: acimage_admin/src/main/java/com/acimage/admin/dao/user/UserDao.java
  type UserDao (line 6) | public interface UserDao extends BaseMapper<User> {

FILE: acimage_admin/src/main/java/com/acimage/admin/dao/user/UserPrivacyDao.java
  type UserPrivacyDao (line 6) | public interface UserPrivacyDao extends BaseMapper<UserPrivacy> {

FILE: acimage_admin/src/main/java/com/acimage/admin/global/consts/ModuleConstants.java
  class ModuleConstants (line 3) | public class ModuleConstants {

FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/AdminLoginReq.java
  class AdminLoginReq (line 11) | @Data

FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/ApiAddReq.java
  class ApiAddReq (line 17) | @Data

FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/ApiModifyReq.java
  class ApiModifyReq (line 16) | @Data

FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/ApiQueryReq.java
  class ApiQueryReq (line 10) | @Data

FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/CarouselAddReq.java
  class CarouselAddReq (line 10) | @Data

FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/CarouselModifyReq.java
  class CarouselModifyReq (line 11) | @Data

FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/CommentQueryReq.java
  class CommentQueryReq (line 9) | @Data

FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/PermissionAddReq.java
  class PermissionAddReq (line 10) | @Data

FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/PermissionModifyReq.java
  class PermissionModifyReq (line 11) | @Data

FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/RoleAddReq.java
  class RoleAddReq (line 10) | @Data

FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/RoleModifyReq.java
  class RoleModifyReq (line 10) | @Data

FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/TopicQueryReq.java
  class TopicQueryReq (line 9) | @Data

FILE: acimage_admin/src/main/java/com/acimage/admin/model/request/UserQueryReq.java
  class UserQueryReq (line 7) | @Data

FILE: acimage_admin/src/main/java/com/acimage/admin/model/vo/WebsiteDataVo.java
  class WebsiteDataVo (line 6) | @Data

FILE: acimage_admin/src/main/java/com/acimage/admin/service/api/ApiQueryService.java
  type ApiQueryService (line 7) | public interface ApiQueryService {
    method pageBy (line 8) | MyPage<Api> pageBy(ApiQueryReq apiQueryReq);

FILE: acimage_admin/src/main/java/com/acimage/admin/service/api/ApiWriteService.java
  type ApiWriteService (line 6) | public interface ApiWriteService {
    method save (line 7) | void save(ApiAddReq apiAddReq);
    method update (line 9) | void update(ApiModifyReq apiModifyReq);
    method delete (line 11) | void delete(int id);

FILE: acimage_admin/src/main/java/com/acimage/admin/service/api/impl/ApiQueryServiceImpl.java
  class ApiQueryServiceImpl (line 16) | @Service
    method pageBy (line 22) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/api/impl/ApiWriteServiceImpl.java
  class ApiWriteServiceImpl (line 22) | @Service
    method save (line 30) | @Override
    method update (line 43) | @Override
    method delete (line 56) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/authorize/AuthorizeQueryService.java
  type AuthorizeQueryService (line 7) | public interface AuthorizeQueryService {
    method listAuthorizeByRoleId (line 8) | List<Authorize> listAuthorizeByRoleId(int roleId);

FILE: acimage_admin/src/main/java/com/acimage/admin/service/authorize/AuthorizeWriteService.java
  type AuthorizeWriteService (line 3) | public interface AuthorizeWriteService {
    method save (line 5) | void save(int roleId, int permissionId);
    method remove (line 7) | void remove(int roleId, int permissionId);
    method remove (line 9) | void remove(int permissionId);

FILE: acimage_admin/src/main/java/com/acimage/admin/service/authorize/impl/AuthorizeQueryServiceImpl.java
  class AuthorizeQueryServiceImpl (line 13) | @Service
    method listAuthorizeByRoleId (line 19) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/authorize/impl/AuthorizeWriteServiceImpl.java
  class AuthorizeWriteServiceImpl (line 14) | @Service
    method save (line 22) | @Override
    method remove (line 32) | @Override
    method remove (line 40) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/category/CategoryQueryService.java
  type CategoryQueryService (line 7) | public interface CategoryQueryService {
    method listAll (line 8) | List<Category> listAll();

FILE: acimage_admin/src/main/java/com/acimage/admin/service/category/impl/CategoryQueryServiceImpl.java
  class CategoryQueryServiceImpl (line 13) | @DS(ModuleConstants.COMMUNITY)
    method listAll (line 19) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/comment/CommentQueryService.java
  type CommentQueryService (line 7) | public interface CommentQueryService {
    method pageCommentsBy (line 8) | MyPage<Comment> pageCommentsBy(CommentQueryReq commentQueryReq);

FILE: acimage_admin/src/main/java/com/acimage/admin/service/comment/CommentWriteService.java
  type CommentWriteService (line 3) | public interface CommentWriteService {
    method delete (line 4) | void delete(long id);

FILE: acimage_admin/src/main/java/com/acimage/admin/service/comment/impl/CommentQueryServiceImpl.java
  class CommentQueryServiceImpl (line 17) | @Service
    method pageCommentsBy (line 23) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/comment/impl/CommentWriteServiceImpl.java
  class CommentWriteServiceImpl (line 11) | @Service
    method delete (line 17) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/homecarousel/HomeCarouselQueryService.java
  type HomeCarouselQueryService (line 7) | public interface HomeCarouselQueryService {
    method listCurrent (line 8) | List<HomeCarousel> listCurrent();

FILE: acimage_admin/src/main/java/com/acimage/admin/service/homecarousel/HomeCarouselWriteService.java
  type HomeCarouselWriteService (line 8) | public interface HomeCarouselWriteService {
    method saveHomeCarouselImage (line 9) | @Transactional(rollbackFor = Exception.class)
    method deleteHomeCarouselImage (line 11) | void deleteHomeCarouselImage(long id);
    method updateHomeCarouselImage (line 12) | void updateHomeCarouselImage(CarouselModifyReq modifyReq);
    method coverHomeCarouselImage (line 13) | @Transactional(rollbackFor = Exception.class)

FILE: acimage_admin/src/main/java/com/acimage/admin/service/homecarousel/impl/HomeCarouselQueryServiceImpl.java
  class HomeCarouselQueryServiceImpl (line 14) | @Service
    method listCurrent (line 20) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/homecarousel/impl/HomeCarouselWriteServiceImpl.java
  class HomeCarouselWriteServiceImpl (line 25) | @Slf4j
    method saveHomeCarouselImage (line 34) | @Override
    method deleteHomeCarouselImage (line 60) | @Override
    method updateHomeCarouselImage (line 75) | @Override
    method coverHomeCarouselImage (line 94) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/login/LoginService.java
  type LoginService (line 5) | public interface LoginService {
    method login (line 6) | String login(AdminLoginReq adminLoginReq);

FILE: acimage_admin/src/main/java/com/acimage/admin/service/login/VerifyCodeService.java
  type VerifyCodeService (line 6) | public interface VerifyCodeService {
    method writeCodeImageToResponseAndRecord (line 7) | void writeCodeImageToResponseAndRecord(HttpServletRequest request, Htt...
    method verifyAndRemoveIfSuccess (line 9) | boolean verifyAndRemoveIfSuccess(HttpServletRequest request, String co...

FILE: acimage_admin/src/main/java/com/acimage/admin/service/login/impl/LoginServiceImpl.java
  class LoginServiceImpl (line 21) | @Slf4j
    method login (line 32) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/login/impl/VerifyCodeServiceImpl.java
  class VerifyCodeServiceImpl (line 16) | @Slf4j
    method writeCodeImageToResponseAndRecord (line 23) | @Override
    method verifyAndRemoveIfSuccess (line 45) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/permission/PermissionQueryService.java
  type PermissionQueryService (line 8) | public interface PermissionQueryService {
    method getPermission (line 9) | Permission getPermission(int id);
    method getPermissionTree (line 11) | List<Permission> getPermissionTree();
    method pagePermissionsWithParent (line 13) | MyPage<Permission> pagePermissionsWithParent(int pageNo, int pageSize);
    method listByModule (line 16) | List<Permission> listByModule(boolean isModule);

FILE: acimage_admin/src/main/java/com/acimage/admin/service/permission/PermissionWriteSercice.java
  type PermissionWriteSercice (line 7) | public interface PermissionWriteSercice {
    method save (line 8) | void save(PermissionAddReq permissionAddReq);
    method remove (line 10) | @Transactional
    method update (line 13) | @Transactional

FILE: acimage_admin/src/main/java/com/acimage/admin/service/permission/impl/PermissionQueryServiceImpl.java
  class PermissionQueryServiceImpl (line 15) | @Service
    method getPermission (line 21) | @Override
    method getPermissionTree (line 25) | @Override
    method pagePermissionsWithParent (line 29) | @Override
    method listByModule (line 37) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/permission/impl/PermissionWriteServiceImpl.java
  class PermissionWriteServiceImpl (line 17) | @Service
    method save (line 26) | @Override
    method remove (line 33) | @Override
    method update (line 39) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/role/RoleQueryService.java
  type RoleQueryService (line 7) | public interface RoleQueryService {
    method listAll (line 8) | List<Role> listAll();

FILE: acimage_admin/src/main/java/com/acimage/admin/service/role/RoleWriteService.java
  type RoleWriteService (line 6) | public interface RoleWriteService {
    method save (line 9) | void save(RoleAddReq roleAddReq);
    method remove (line 11) | void remove(long id);
    method update (line 13) | void update(RoleModifyReq roleModifyReq);

FILE: acimage_admin/src/main/java/com/acimage/admin/service/role/impl/RoleQueryServiceImpl.java
  class RoleQueryServiceImpl (line 12) | @Service
    method listAll (line 18) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/role/impl/RoleWriteServiceImpl.java
  class RoleWriteServiceImpl (line 16) | @Service
    method save (line 22) | @Override
    method remove (line 29) | @Override
    method update (line 34) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/topic/TopicQueryService.java
  type TopicQueryService (line 7) | public interface TopicQueryService {
    method listOrderByColumn (line 8) | MyPage<Topic> listOrderByColumn(TopicQueryReq topicQueryReq);
    method getTopicCount (line 10) | Integer getTopicCount();

FILE: acimage_admin/src/main/java/com/acimage/admin/service/topic/TopicWriteService.java
  type TopicWriteService (line 3) | public interface TopicWriteService {
    method remove (line 4) | void remove(long topicId);

FILE: acimage_admin/src/main/java/com/acimage/admin/service/topic/impl/TopicQueryServiceImpl.java
  class TopicQueryServiceImpl (line 21) | @DS(ModuleConstants.COMMUNITY)
    method listOrderByColumn (line 30) | @Override
    method getTopicCount (line 45) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/topic/impl/TopicWriteServiceImpl.java
  class TopicWriteServiceImpl (line 13) | @Slf4j
    method remove (line 21) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/user/UserQueryService.java
  type UserQueryService (line 7) | public interface UserQueryService {
    method listBy (line 8) | MyPage<User> listBy(UserQueryReq userQueryReq);
    method getUser (line 10) | User getUser(long userId);

FILE: acimage_admin/src/main/java/com/acimage/admin/service/user/UserWriteService.java
  type UserWriteService (line 3) | public interface UserWriteService {

FILE: acimage_admin/src/main/java/com/acimage/admin/service/user/impl/UserQueryServiceImpl.java
  class UserQueryServiceImpl (line 24) | @Service
    method listBy (line 32) | @Override
    method getUser (line 63) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/user/impl/UserWriteServiceImpl.java
  class UserWriteServiceImpl (line 7) | @Service

FILE: acimage_admin/src/main/java/com/acimage/admin/service/userrole/UserRoleQueryService.java
  type UserRoleQueryService (line 8) | public interface UserRoleQueryService {
    method listUserIdWithRoleIds (line 9) | Map<Long, List<Integer>> listUserIdWithRoleIds(List<Long> userIds);
    method getUserRole (line 11) | UserRole getUserRole(long userId, int roleId);

FILE: acimage_admin/src/main/java/com/acimage/admin/service/userrole/UserRoleWriteService.java
  type UserRoleWriteService (line 6) | public interface UserRoleWriteService {
    method save (line 7) | void save(long userId, int roleId);
    method remove (line 9) | void remove(long userId, int roleId);

FILE: acimage_admin/src/main/java/com/acimage/admin/service/userrole/impl/UserRoleQueryServiceImpl.java
  class UserRoleQueryServiceImpl (line 17) | @Service
    method listUserIdWithRoleIds (line 24) | @Override
    method getUserRole (line 46) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/userrole/impl/UserRoleWriteServiceImpl.java
  class UserRoleWriteServiceImpl (line 18) | @DS(ModuleConstants.SYS)
    method save (line 29) | @Override
    method remove (line 44) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/service/websitedata/WebsiteDataService.java
  type WebsiteDataService (line 5) | public interface WebsiteDataService {
    method getWebsiteData (line 6) | WebsiteDataVo getWebsiteData();

FILE: acimage_admin/src/main/java/com/acimage/admin/service/websitedata/impl/WebsiteDataServiceImpl.java
  class WebsiteDataServiceImpl (line 10) | @Service
    method getWebsiteData (line 15) | @Override

FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/AdminLoginController.java
  class AdminLoginController (line 19) | @RestController
    method doLogin (line 29) | @RequestLimit(limitTimes = {1}, durations = {2}, penaltyTimes = {-1}, ...
    method getPublicKey (line 40) | @GetMapping("/publicKey")
    method getCommonVerifyCode (line 46) | @GetMapping("/commonCode")

FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/ApiOperateController.java
  class ApiOperateController (line 16) | @RestController
    method addApi (line 24) | @PostMapping
    method modifyApi (line 35) | @PutMapping
    method deleteApi (line 46) | @DeleteMapping("/{id}")

FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/ApiQueryController.java
  class ApiQueryController (line 14) | @RestController
    method queryApisBy (line 22) | @GetMapping("/search")

FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/AuthorizeOperateController.java
  class AuthorizeOperateController (line 13) | @RestController
    method addAuthorize (line 21) | @PostMapping
    method deleteAuthorize (line 28) | @DeleteMapping("/{roleId}/{permissionId}")

FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/AuthorizeQueryController.java
  class AuthorizeQueryController (line 15) | @RestController
    method queryRoleAuthorize (line 23) | @GetMapping("/roleId/{roleId}")

FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/CategoryController.java
  class CategoryController (line 16) | @RestController
    method queryAll (line 24) | @GetMapping("/all")

FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/CommentOperateController.java
  class CommentOperateController (line 17) | @RestController
    method pageCommentsBy (line 25) | @DeleteMapping("/{id}")

FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/CommentQueryController.java
  class CommentQueryController (line 23) | @RestController
    method pageCommentsBy (line 31) | @GetMapping("/by")

FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/HomeCarouselController.java
  class HomeCarouselController (line 22) | @RestController
    method addImage (line 32) | @PostMapping
    method deleteImage (line 45) | @DeleteMapping("/{id}")
    method modifyDescription (line 51) | @PutMapping("/descriptionAndLink")
    method coverImageFile (line 57) | @PostMapping("/cover")
    method queryCurrentHomeCarousel (line 69) | @GetMapping("/current")

FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/PermissionOperateController.java
  class PermissionOperateController (line 15) | @RestController
    method add (line 23) | @PostMapping
    method modify (line 36) | @PutMapping
    method modify (line 42) | @DeleteMapping("/{id}")

FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/PermissionQueryController.java
  class PermissionQueryController (line 20) | @RestController
    method queryPermissionTree (line 28) | @GetMapping("/tree")
    method pagePermissionsWithParent (line 33) | @GetMapping("/page/{pageNo}/{pageSize}")
    method queryModules (line 39) | @GetMapping("/modules")
    method queryNonModules (line 44) | @GetMapping("/nonModules")

FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/RoleController.java
  class RoleController (line 18) | @RestController
    method queryAllRoles (line 28) | @GetMapping("/all")
    method add (line 33) | @PostMapping()
    method delete (line 39) | @DeleteMapping("/{id}")
    method modify (line 45) | @PutMapping()

FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/TopicOperateController.java
  class TopicOperateController (line 16) | @RestController
    method delete (line 24) | @DeleteMapping("/{topicId}")

FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/TopicQueryController.java
  class TopicQueryController (line 16) | @RestController
    method listOrderBy (line 24) | @GetMapping("/orderBy")

FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/UserQueryController.java
  class UserQueryController (line 18) | @RestController
    method queryUsersBy (line 26) | @GetMapping("/search")

FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/UserRoleOperateController.java
  class UserRoleOperateController (line 17) | @RestController
    method addRoleForUser (line 25) | @PostMapping
    method deleteRoleForUser (line 31) | @DeleteMapping("/{userId}/{roleId}")

FILE: acimage_admin/src/main/java/com/acimage/admin/web/controller/WebsiteDataController.java
  class WebsiteDataController (line 14) | @RestController
    method queryWebsiteData (line 22) | @GetMapping("/accessData")

FILE: acimage_admin/src/test/java/com/acimage/admin/AdminApplicationTest.java
  class AdminApplicationTest (line 11) | @SpringBootTest
    method qiniuUtilsTest (line 16) | @Test

FILE: acimage_admin/src/test/java/com/acimage/admin/dao/community/SpDaoTest.java
  class SpDaoTest (line 11) | @SpringBootTest
    method deleteTest (line 16) | @Test
    method getMaxLocationOfHomeCarousel (line 22) | @Test
    method testSelectAll (line 27) | @Test

FILE: acimage_admin/src/test/java/com/acimage/admin/dao/community/TopicDaoTest.java
  class TopicDaoTest (line 8) | @SpringBootTest
    method testSelectAll (line 14) | @Test

FILE: acimage_admin/src/test/java/com/acimage/admin/dao/sys/ApiDaoTest.java
  class ApiDaoTest (line 11) | @SpringBootTest
    method testSelect (line 18) | @Test

FILE: acimage_admin/src/test/java/com/acimage/admin/service/HomeCarouselWriteServiceTest.java
  class HomeCarouselWriteServiceTest (line 8) | @SpringBootTest

FILE: acimage_common/src/main/java/com/acimage/common/CommonMain.java
  class CommonMain (line 4) | public class CommonMain {
    method main (line 5) | public static void main(String[] args) {

FILE: acimage_common/src/main/java/com/acimage/common/config/EsConfig.java
  class EsConfig (line 19) | @Profile(value = {"test","dev","dev2","server"})
    method devRestHighLevelClient (line 24) | @Bean

FILE: acimage_common/src/main/java/com/acimage/common/config/EsProdConfig.java
  class EsProdConfig (line 18) | @Profile("prod")
    method prodRestHighLevelClient (line 26) | @Bean

FILE: acimage_common/src/main/java/com/acimage/common/config/FilterConfig.java
  class FilterConfig (line 9) | @Configuration
    method registerFilter1 (line 16) | @Bean
    method registerFilter2 (line 30) | @Bean

FILE: acimage_common/src/main/java/com/acimage/common/config/JacksonConfig.java
  class JacksonConfig (line 10) | @Configuration
    method jackson2ObjectMapperBuilderCustomizer (line 17) | @Bean

FILE: acimage_common/src/main/java/com/acimage/common/config/PaginationConfig.java
  class PaginationConfig (line 9) | @Configuration
    method mybatisPlusInterceptor (line 11) | @Bean

FILE: acimage_common/src/main/java/com/acimage/common/config/RabbitmqConvertConfig.java
  class RabbitmqConvertConfig (line 14) | @ConditionalOnClass(RabbitTemplate.class)
    method jacksonRabbitTemplate (line 18) | @Bean
    method rabbitListenerContainerFactory (line 26) | @Bean

FILE: acimage_common/src/main/java/com/acimage/common/deprecated/IpInterceptorBak.java
  class IpInterceptorBak (line 21) | @Slf4j
    method preHandle (line 28) | @Override
    method postHandle (line 63) | @Override
    method afterCompletion (line 68) | @Override

FILE: acimage_common/src/main/java/com/acimage/common/deprecated/JwtInterceptorBak.java
  class JwtInterceptorBak (line 25) | public class JwtInterceptorBak implements HandlerInterceptor {
    method preHandle (line 29) | @Override
    method postHandle (line 73) | @Override
    method afterCompletion (line 78) | @Override

FILE: acimage_common/src/main/java/com/acimage/common/deprecated/PermissionInterceptorBak.java
  class PermissionInterceptorBak (line 21) | @Slf4j
    method preHandle (line 23) | @Override
    method postHandle (line 64) | @Override
    method afterCompletion (line 70) | @Override

FILE: acimage_common/src/main/java/com/acimage/common/deprecated/QiniuUtils.java
  class QiniuUtils (line 38) | @Deprecated
    method init (line 55) | @PostConstruct
    method setAccessKey (line 68) | public void setAccessKey(String accessKey) {
    method setSecretKey (line 72) | public void setSecretKey(String secretKey) {
    method setBucket (line 76) | public void setBucket(String bucket) {
    method setDomain (line 80) | public void setDomain(String domain) {
    method upload (line 87) | public void upload(@NotNull MultipartFile multipartFile, String urlWit...
    method upload (line 100) | public void upload(@NotNull File file, String urlWithoutDomain) {
    method cover (line 104) | public void cover(@NotNull MultipartFile multipartFile, String urlWith...
    method refreshFile (line 121) | public void refreshFile(String... urls) {
    method refreshQuery (line 144) | public void refreshQuery(String url) {
    method deleteFile (line 156) | public void deleteFile(String url) {
    method batchDelete (line 166) | public void batchDelete(List<String> urlList) {
    method generateUrl (line 195) | public String generateUrl(String suffix, Date uploadTime, @Nullable St...
    method getTrueUrl (line 202) | public String getTrueUrl(String urlWithoutDomain) {
    method download (line 206) | public void download(String url, String toPath) {
    method putAndLog (line 218) | private void putAndLog(Object inputStreamOrFile, String urlWithoutDoma...

FILE: acimage_common/src/main/java/com/acimage/common/deprecated/QiniuUtilsBak.java
  class QiniuUtilsBak (line 41) | @Slf4j
    method init (line 59) | @PostConstruct
    method setAccessKey (line 68) | public void setAccessKey(String accessKey) {
    method setSecretKey (line 72) | public void setSecretKey(String secretKey) {
    method setBucket (line 76) | public void setBucket(String bucket) {
    method setDomain (line 80) | public void setDomain(String domain) {
    method upload (line 87) | public void upload(@NotNull MultipartFile multipartFile, String urlWit...
    method upload (line 100) | public void upload(@NotNull File file, String urlWithoutDomain) {
    method cover (line 104) | public void cover(@NotNull MultipartFile multipartFile, String urlWith...
    method refreshFile (line 121) | public void refreshFile(String... urls) {
    method refreshQuery (line 144) | public void refreshQuery(String url) {
    method deleteFile (line 156) | public void deleteFile(String url) {
    method batchDelete (line 166) | public void batchDelete(List<String> urlList) {
    method generateUrl (line 195) | public String generateUrl(String suffix, Date uploadTime, @Nullable St...
    method getTrueUrl (line 202) | public String getTrueUrl(String urlWithoutDomain) {
    method download (line 206) | public void download(String url, String toPath) {
    method putAndLog (line 220) | private void putAndLog(Object inputStreamOrFile, String urlWithoutDoma...

FILE: acimage_common/src/main/java/com/acimage/common/deprecated/UserCommunityStatistic.java
  class UserCommunityStatistic (line 11) | @Data

FILE: acimage_common/src/main/java/com/acimage/common/deprecated/annotation/utils/AuthenticationUtils.java
  class AuthenticationUtils (line 8) | public class AuthenticationUtils {
    method getAuthenticationType (line 9) | public static AuthenticationType getAuthenticationType(HandlerMethod h...

FILE: acimage_common/src/main/java/com/acimage/common/deprecated/typehandler/MatchRuleTypeHandler.java
  class MatchRuleTypeHandler (line 17) | public class MatchRuleTypeHandler extends BaseTypeHandler<MatchRule> {
    method setNonNullParameter (line 19) | @Override
    method getNullableResult (line 24) | @Override
    method getNullableResult (line 29) | @Override
    method getNullableResult (line 34) | @Override

FILE: acimage_common/src/main/java/com/acimage/common/global/aop/LogAdvice.java
  class LogAdvice (line 17) | @Aspect
    method controllerPointCut (line 26) | @Pointcut("execution(public * com.acimage..*.*Controller.*(..))")
    method providerPointCut (line 30) | @Pointcut("execution(public * com.acimage..*.*Provider.*(..))")
    method logParametersAndReturnValue (line 37) | @Around("controllerPointCut() || providerPointCut()")

FILE: acimage_common/src/main/java/com/acimage/common/global/consts/EsConstants.java
  class EsConstants (line 3) | public class EsConstants {

FILE: acimage_common/src/main/java/com/acimage/common/global/consts/FileFormatConstants.java
  class FileFormatConstants (line 6) | public class FileFormatConstants {

FILE: acimage_common/src/main/java/com/acimage/common/global/consts/HeaderKeyConstants.java
  class HeaderKeyConstants (line 3) | public class HeaderKeyConstants {

FILE: acimage_common/src/main/java/com/acimage/common/global/consts/JwtConstants.java
  class JwtConstants (line 3) | public class JwtConstants {

FILE: acimage_common/src/main/java/com/acimage/common/global/consts/MqConstants.java
  class MqConstants (line 3) | public class MqConstants {

FILE: acimage_common/src/main/java/com/acimage/common/global/consts/StorePrefixConstants.java
  class StorePrefixConstants (line 3) | public class StorePrefixConstants {

FILE: acimage_common/src/main/java/com/acimage/common/global/consts/SysKeyConstants.java
  class SysKeyConstants (line 3) | public class SysKeyConstants {

FILE: acimage_common/src/main/java/com/acimage/common/global/consts/TimeConstants.java
  class TimeConstants (line 3) | public class TimeConstants {

FILE: acimage_common/src/main/java/com/acimage/common/global/context/UserContext.java
  class UserContext (line 6) | public class UserContext {
    method saveCurrentUserInfo (line 13) | public static void saveCurrentUserInfo(Long userId, String username, S...
    method remove (line 22) | public static void remove() {
    method setTokenStatus (line 30) | public static void setTokenStatus(TokenStatus tokenStatus) {
    method setUserId (line 33) | public static void setUserId(Long userId){
    method setUsername (line 36) | public static void setUsername(String username){
    method setIp (line 40) | public static void setIp(String ip) {
    method getUserId (line 44) | public static Long getUserId() {
    method getUsername (line 48) | public static String getUsername() {
    method getPhotoUrl (line 52) | public static String getPhotoUrl() {
    method getTokenStatus (line 56) | public static TokenStatus getTokenStatus() {
    method getIp (line 60) | public static String getIp() {

FILE: acimage_common/src/main/java/com/acimage/common/global/enums/AuthenticationType.java
  type AuthenticationType (line 3) | public enum AuthenticationType {
    method AuthenticationType (line 9) | AuthenticationType(int key) {
    method getKey (line 13) | public int getKey() {

FILE: acimage_common/src/main/java/com/acimage/common/global/enums/MatchRule.java
  type MatchRule (line 6) | public enum MatchRule {
    method MatchRule (line 18) | MatchRule(int key) {
    method getKey (line 22) | public int getKey() {
    method from (line 26) | public static MatchRule from(int key){

FILE: acimage_common/src/main/java/com/acimage/common/global/enums/MyHttpMethod.java
  type MyHttpMethod (line 5) | public enum MyHttpMethod {
    method from (line 12) | public static MyHttpMethod from(HttpMethod method) {

FILE: acimage_common/src/main/java/com/acimage/common/global/enums/ServiceType.java
  type ServiceType (line 3) | public enum ServiceType {

FILE: acimage_common/src/main/java/com/acimage/common/global/enums/TokenStatus.java
  type TokenStatus (line 3) | public enum TokenStatus {
    method TokenStatus (line 12) | TokenStatus(int key) {
    method getKey (line 16) | public int getKey() {

FILE: acimage_common/src/main/java/com/acimage/common/global/exception/BaseException.java
  class BaseException (line 10) | @Getter
    method asResult (line 18) | public Result asResult(){

FILE: acimage_common/src/main/java/com/acimage/common/global/exception/BusinessException.java
  class BusinessException (line 8) | @Getter
    method BusinessException (line 13) | public BusinessException(String msg){
    method BusinessException (line 18) | public BusinessException(Integer code, String msg) {

FILE: acimage_common/src/main/java/com/acimage/common/global/exception/NullTokenException.java
  class NullTokenException (line 5) | public class NullTokenException extends JWTVerificationException {
    method NullTokenException (line 7) | public NullTokenException(String message){super(message);}

FILE: acimage_common/src/main/java/com/acimage/common/global/exception/SystemException.java
  class SystemException (line 8) | @Getter

FILE: acimage_common/src/main/java/com/acimage/common/model/Index/TopicIndex.java
  class TopicIndex (line 26) | @NoArgsConstructor
    method from (line 75) | public static TopicIndex from(Topic topic) {
    method toTopic (line 86) | public static Topic toTopic(TopicIndex topicIndex) {
    method toTopicList (line 95) | public static List<Topic> toTopicList(List<TopicIndex> topicIndexList) {
    method toTopicPage (line 101) | public static MyPage<Topic> toTopicPage(MyPage<TopicIndex> topicPage) {

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/community/Category.java
  class Category (line 14) | @Data

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/community/CmtyUser.java
  class CmtyUser (line 8) | @Data

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/community/Comment.java
  class Comment (line 14) | @Data

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/community/HomeCarousel.java
  class HomeCarousel (line 12) | @Data

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/community/Star.java
  class Star (line 11) | @Data
    method Star (line 23) | public Star(Long userId, Long topicId) {

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/community/Tag.java
  class Tag (line 13) | @Data

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/community/TagTopic.java
  class TagTopic (line 13) | @Data

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/community/Topic.java
  class Topic (line 17) | @NoArgsConstructor

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/community/TopicHtml.java
  class TopicHtml (line 12) | @NoArgsConstructor

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/image/Image.java
  class Image (line 16) | @NoArgsConstructor
    method Image (line 45) | public Image(Long id, Long topicId, Integer size, String description) {

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/image/ImageHash.java
  class ImageHash (line 12) | @Data
    method ImageHash (line 24) | public ImageHash(Long imageId, Long hashValue, Integer hashSum) {

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/sys/Api.java
  class Api (line 18) | @Data

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/sys/Authorize.java
  class Authorize (line 13) | @Data
    method Authorize (line 24) | public Authorize(Integer roleId, Integer permissionId) {

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/sys/Permission.java
  class Permission (line 14) | @Data

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/sys/Role.java
  class Role (line 12) | @Data

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/sys/UserRole.java
  class UserRole (line 11) | @Data

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/user/CommentMsg.java
  class CommentMsg (line 13) | @Data

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/user/User.java
  class User (line 13) | @Data
    method User (line 29) | public User(Long id, String username) {

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/user/UserMsg.java
  class UserMsg (line 14) | @Data

FILE: acimage_common/src/main/java/com/acimage/common/model/domain/user/UserPrivacy.java
  class UserPrivacy (line 12) | @Data
    method UserPrivacy (line 25) | public UserPrivacy(Long userId, String pwd, String salt, String email) {

FILE: acimage_common/src/main/java/com/acimage/common/model/mq/dto/EsAddDto.java
  class EsAddDto (line 6) | @Getter
    method EsAddDto (line 10) | public EsAddDto(Object obj){
    method toString (line 14) | @Override

FILE: acimage_common/src/main/java/com/acimage/common/model/mq/dto/EsDeleteDto.java
  class EsDeleteDto (line 7) | @Data

FILE: acimage_common/src/main/java/com/acimage/common/model/mq/dto/EsUpdateByIdDto.java
  class EsUpdateByIdDto (line 7) | @Getter
    method toString (line 13) | @Override

FILE: acimage_common/src/main/java/com/acimage/common/model/mq/dto/EsUpdateByTermDto.java
  class EsUpdateByTermDto (line 10) | @Getter
    method toString (line 17) | @Override

FILE: acimage_common/src/main/java/com/acimage/common/model/mq/dto/ImageIdWithUrl.java
  class ImageIdWithUrl (line 7) | @Data

FILE: acimage_common/src/main/java/com/acimage/common/model/mq/dto/ObjectWithClass.java
  class ObjectWithClass (line 11) | @Data
    method with (line 18) | public void with(Object obj){
    method object (line 26) | public Object object(){

FILE: acimage_common/src/main/java/com/acimage/common/model/mq/dto/SyncImagesUpdateDto.java
  class SyncImagesUpdateDto (line 11) | @Builder

FILE: acimage_common/src/main/java/com/acimage/common/model/mq/dto/UserIdWithPhotoUrl.java
  class UserIdWithPhotoUrl (line 7) | @Data

FILE: acimage_common/src/main/java/com/acimage/common/model/mq/dto/UserIdWithUsername.java
  class UserIdWithUsername (line 7) | @Data

FILE: acimage_common/src/main/java/com/acimage/common/model/page/MyPage.java
  class MyPage (line 11) | @Data
    method from (line 18) | public static<T> MyPage<T> from(IPage<T> page){

FILE: acimage_common/src/main/java/com/acimage/common/redis/QueryRedisAdvice.java
  class QueryRedisAdvice (line 26) | @Aspect
    method pointCut (line 35) | @Pointcut(POINT_CUT_PATTERN)
    method around (line 39) | @Around("pointCut()")
    method queryOrProceed (line 79) | private Object queryOrProceed(ProceedingJoinPoint joinPoint, String re...
    method queryOrProceedForHash (line 100) | private Object queryOrProceedForHash(ProceedingJoinPoint joinPoint, St...
    method getActiveExpire (line 123) | private long getActiveExpire(long defaultExpire, List<KeyParam> keyPar...

FILE: acimage_common/src/main/java/com/acimage/common/redis/RequestLimitAdvice.java
  class RequestLimitAdvice (line 29) | @Aspect
    method pointCut (line 39) | @Pointcut(POINT_CUT_PATTERN)
    method around (line 43) | @Around("pointCut()")
    method toSecondsList (line 112) | private List<Long> toSecondsList(long[] times, TimeUnit unit) {
    method toSeconds (line 120) | private long toSeconds(long time, TimeUnit timeUnit) {

FILE: acimage_common/src/main/java/com/acimage/common/redis/enums/DataType.java
  type DataType (line 3) | public enum DataType {

FILE: acimage_common/src/main/java/com/acimage/common/redis/enums/LimitTarget.java
  type LimitTarget (line 3) | public enum LimitTarget {

FILE: acimage_common/src/main/java/com/acimage/common/redis/utils/RedisAnnotationUtils.java
  class RedisAnnotationUtils (line 14) | @Component
    method queryOrProceed (line 22) | private  Object queryOrProceed(ProceedingJoinPoint joinPoint, String r...
    method queryOrProceedForList (line 39) | private Object queryOrProceedForList(ProceedingJoinPoint joinPoint, St...
    method overallKey (line 53) | public static String overallKey(String prefix, ProceedingJoinPoint joi...

FILE: acimage_common/src/main/java/com/acimage/common/result/Code.java
  class Code (line 3) | public class Code {

FILE: acimage_common/src/main/java/com/acimage/common/result/Result.java
  class Result (line 8) | @Data
    method fail (line 15) | public static Result fail(String message){
    method ok (line 18) | public static Result ok(){
    method ok (line 21) | public static <T> Result<T> ok(T data){
    method isOk (line 24) | public static boolean isOk(Result<?> result){
    method isOk (line 28) | public Boolean isOk(){

FILE: acimage_common/src/main/java/com/acimage/common/service/TokenService.java
  type TokenService (line 3) | public interface TokenService {
    method hasRecorded (line 6) | Boolean hasRecorded(String token);
    method createAndRecordToken (line 8) | String createAndRecordToken(long userId, String username, String photo...
    method record (line 10) | void record(String token, int expireDays);
    method invalidate (line 12) | void invalidate(String token);

FILE: acimage_common/src/main/java/com/acimage/common/service/impl/TokenServiceImpl.java
  class TokenServiceImpl (line 13) | @Service
    method createAndRecordToken (line 21) | @Override
    method record (line 30) | @Override
    method hasRecorded (line 35) | @Override
    method invalidate (line 41) | @Override

FILE: acimage_common/src/main/java/com/acimage/common/utils/CookieUtils.java
  class CookieUtils (line 6) | public class CookieUtils {
    method getValueByName (line 8) | public static String getValueByName(Cookie[] cookies,String name){
    method createCookie (line 19) | public static Cookie createCookie(String key,String value){
    method createCookie (line 25) | public static Cookie createCookie(String key,String value,boolean http...
    method createCookie (line 32) | public static Cookie createCookie(String key,String value,String path,...

FILE: acimage_common/src/main/java/com/acimage/common/utils/EsUtils.java
  class EsUtils (line 37) | @Component
    method createIndexIfNotExist (line 44) | public void createIndexIfNotExist(Class<?> entityType) {
    method updateById (line 60) | public void updateById(EsUpdateByIdDto updateDto) {
    method UpdateByTerm (line 82) | public void UpdateByTerm(EsUpdateByTermDto updateDto) {
    method batchUpdateById (line 124) | public <T> void batchUpdateById(List<T> entityList, List<String> colum...
    method save (line 143) | public void save(EsAddDto esAddDto) {
    method remove (line 148) | public void remove(EsDeleteDto esDeleteDto) {
    method termQuery (line 153) | public <T> MyPage<T> termQuery(String column, Object value, Class<T> i...
    method similarQuery (line 168) | public <T> List<T> similarQuery(String id, Class<T> index, List<String...
    method matchQuery (line 179) | public <T> List<T> matchQuery(Class<T> index, String field, Object val...
    method queryBySort (line 193) | public <T> MyPage<T> queryBySort(Class<T> indexClass, int pageNo, int ...
    method indexCoordinatesOf (line 206) | public IndexCoordinates indexCoordinatesOf(Class<?> clz) {
    method toList (line 213) | private <T> List<T> toList(List<SearchHit<T>> searchHits) {
    method createDocument (line 219) | private Document createDocument(Object entity, List<String> columns) {
    method buildScript (line 229) | private String buildScript(Object entity, List<String> columns) {

FILE: acimage_common/src/main/java/com/acimage/common/utils/ExceptionUtils.java
  class ExceptionUtils (line 3) | public class ExceptionUtils {
    method printIfDev (line 5) | public static void printIfDev(Throwable e){

FILE: acimage_common/src/main/java/com/acimage/common/utils/HtmlUtils.java
  class HtmlUtils (line 10) | public class HtmlUtils {
    method html2Text (line 19) | public static String html2Text(String strHtml) {
    method getInnerImageUrls (line 29) | public static List<String> getInnerImageUrls(String html) {

FILE: acimage_common/src/main/java/com/acimage/common/utils/IdGenerator.java
  class IdGenerator (line 5) | public class IdGenerator {
    method getSnowflakeNextId (line 6) | public static long getSnowflakeNextId(){

FILE: acimage_common/src/main/java/com/acimage/common/utils/ImageUtils.java
  class ImageUtils (line 18) | @Slf4j
    method compressAsFixedWebpImage (line 21) | public static InputStream compressAsFixedWebpImage(MultipartFile multi...
    method compressAsWebpImage (line 42) | public static InputStream compressAsWebpImage(MultipartFile multipartF...
    method compressBak (line 79) | public static InputStream compressBak(MultipartFile multipartFile, int...
    method bufferedImage2InputStream (line 114) | public static InputStream bufferedImage2InputStream(BufferedImage imag...

FILE: acimage_common/src/main/java/com/acimage/common/utils/IpUtils.java
  class IpUtils (line 14) | @Slf4j
    method getClientIpAddr (line 18) | public static String getClientIpAddr(HttpServletRequest request) {
    method getUserIp (line 58) | public static String getUserIp(ServerHttpRequest request) {
    method getIp (line 105) | public static String getIp(HttpServletRequest request) {

FILE: acimage_common/src/main/java/com/acimage/common/utils/JwtUtils.java
  class JwtUtils (line 19) | @Component
    method init (line 26) | @PostConstruct
    method createToken (line 32) | public static String createToken(long userId, String username, String ...
    method verifyToken (line 43) | public static void verifyToken(String token) throws JWTVerificationExc...
    method getUserId (line 53) | public static Long getUserId(String token) throws JWTDecodeException {
    method getUsername (line 57) | public static String getUsername(String token) throws JWTDecodeExcepti...
    method getPhotoUrl (line 61) | public static String getPhotoUrl(String token) throws JWTDecodeExcepti...
    method getExpire (line 65) | public static Date getExpire(String token) throws JWTDecodeException {

FILE: acimage_common/src/main/java/com/acimage/common/utils/LambdaUtils.java
  class LambdaUtils (line 14) | @Slf4j
    method underlineColumnNameOf (line 20) | public static <T> String underlineColumnNameOf(SFunction<T, ?> getOrIs) {
    method columnOf (line 25) | public static <T> String columnOf(SFunction<T, ?> getOrIs) {
    method columnsFrom (line 58) | @SafeVarargs

FILE: acimage_common/src/main/java/com/acimage/common/utils/RsaUtils.java
  class RsaUtils (line 6) | public class RsaUtils {
    method decrypt (line 15) | public static String decrypt(String privateKeyBase64,String encryptBas...
    method getPrivateKey (line 20) | public static String getPrivateKey(){
    method getPublicKey (line 23) | public static String getPublicKey(){

FILE: acimage_common/src/main/java/com/acimage/common/utils/SensitiveWordUtils.java
  class SensitiveWordUtils (line 15) | @Component
    method init (line 22) | @PostConstruct
    method readLines (line 32) | private List<String> readLines(InputStream inputStream){
    method filter (line 55) | public static String filter(String str){

FILE: acimage_common/src/main/java/com/acimage/common/utils/SpringContextUtils.java
  class SpringContextUtils (line 8) | @Component
    method setApplicationContext (line 18) | @Override
    method getApplicationContext (line 23) | public static ApplicationContext getApplicationContext(){
    method getBean (line 28) | public static Object getBean(String name) throws BeansException {
    method getBean (line 33) | public static <T> T getBean(Class<T> beanClass) throws BeansException {
    method getProfile (line 41) | public static String getProfile(){
    method isDev (line 45) | public static boolean isDev(){

FILE: acimage_common/src/main/java/com/acimage/common/utils/common/AopUtils.java
  class AopUtils (line 21) | @Slf4j
    method methodOf (line 23) | public static Method methodOf(@NotNull JoinPoint joinPoint) {
    method hasParameters (line 39) | public static boolean hasParameters(@NotNull JoinPoint joinPoint) {
    method annotationFrom (line 44) | public static <T extends Annotation> T annotationFrom(JoinPoint joinPo...
    method paramAnnotationsFrom (line 49) | public static <T extends Annotation> List<T> paramAnnotationsFrom(Join...
    method annotatedArgOrArgFieldOf (line 60) | public static <T extends Annotation, V> V annotatedArgOrArgFieldOf(@No...
    method annotatedArgsFrom (line 90) | public static <T extends Annotation, V> List<V> annotatedArgsFrom(@Not...
    method indexOfFirstAnnotatedParameter (line 105) | private static <T extends Annotation> Integer indexOfFirstAnnotatedPar...

FILE: acimage_common/src/main/java/com/acimage/common/utils/common/ArrayUtils.java
  class ArrayUtils (line 7) | public class ArrayUtils {
    method firstIndexOf (line 9) | public static Integer firstIndexOf(String[] strs, String targetStr){

FILE: acimage_common/src/main/java/com/acimage/common/utils/common/BeanUtils.java
  class BeanUtils (line 12) | public class BeanUtils {
    method beanToFieldJsonMap (line 15) | public static Map<String, String> beanToFieldJsonMap(Object javaBean) {
    method fieldJsonMapToBean (line 28) | public static <T> T fieldJsonMapToBean(Map<String, String> fieldJsonMa...
    method copyPropertiesTo (line 49) | public static <T> T copyPropertiesTo(Object source,Class<T> targetType){

FILE: acimage_common/src/main/java/com/acimage/common/utils/common/FileUtils.java
  class FileUtils (line 18) | @Slf4j
    method packageFiles (line 20) | public static void packageFiles(File[] files, File zipFile) throws IOE...
    method downloadFileForClient (line 39) | public static void downloadFileForClient(File file, HttpServletRespons...
    method formatOf (line 59) | public static String formatOf(String fileName){
    method formatOf (line 63) | public static String formatOf(MultipartFile multipartFile){
    method formatsOf (line 68) | public static List<String> formatsOf(MultipartFile[] multipartFiles){

FILE: acimage_common/src/main/java/com/acimage/common/utils/common/JacksonUtils.java
  class JacksonUtils (line 14) | @Slf4j
    method writeValueAsString (line 22) | public static String writeValueAsString(Object object) {
    method getList (line 34) | public static <T> List<T> getList(@Nullable String json, Class<T> ofTy...
    method convert (line 47) | public static <T> T convert(@Nullable String json, Class<T> targetType) {

FILE: acimage_common/src/main/java/com/acimage/common/utils/common/ListUtils.java
  class ListUtils (line 11) | public class ListUtils {
    method extract (line 12) | public static <T, V> List<V> extract(Function<T, V> attribute, List<T>...
    method extractKeyFrom (line 19) | public static <T, V> List<T> extractKeyFrom(List<Pair<T, V>> pairList) {
    method getListFrom (line 27) | public static <T> List<T> getListFrom(Set<T> set) {
    method differenceSetOf (line 35) | public static List<Long> differenceSetOf(List<Long> list1, List<Long> ...
    method differenceSetOfV2 (line 71) | public static List<String> differenceSetOfV2(List<String> list1, List<...
    method isEmpty (line 107) | public static <T> boolean isEmpty(List<T> list) {
    method convertToLongList (line 111) | public static List<Long> convertToLongList(List<String> list) {
    method getListInDescOrderFrom (line 119) | public static List<Pair<Long, Integer>> getListInDescOrderFrom(Set<ZSe...
    method convertToLongDoublePairFrom (line 129) | public static List<Pair<Long, Double>> convertToLongDoublePairFrom(Lis...
    method convert (line 139) | public static <T, V> List<V> convert(List<T> sourceList, Class<V> targ...
    method removeRepeat (line 153) | public static <T> List<T> removeRepeat(List<T> list){

FILE: acimage_common/src/main/java/com/acimage/common/utils/common/PageUtils.java
  class PageUtils (line 3) | public class PageUtils {
    method startIndexOf (line 4) | public static int startIndexOf(int pageNo, int pageSize) {
    method endIndexOf (line 8) | public static int endIndexOf(int pageNo, int pageSize) {

FILE: acimage_common/src/main/java/com/acimage/common/utils/common/PairUtils.java
  class PairUtils (line 9) | public class PairUtils {
    method combine (line 11) | public static <T, R> List<Pair<T, R>> combine(@NotNull List<T> list1, ...

FILE: acimage_common/src/main/java/com/acimage/common/utils/common/ReflectUtils.java
  class ReflectUtils (line 13) | @Slf4j
    method genericsOfReturnType (line 16) | public static Class<?>[] genericsOfReturnType(Method method) throws Cl...
    method getFieldNames (line 37) | public static List<String> getFieldNames(Class<?> clz){
    method getAnnotatedFiled (line 46) | public static Object getAnnotatedFiled(Object obj,Class<? extends Anno...
    method firstAnnotatedField (line 56) | public static <T extends Annotation> Field firstAnnotatedField(Class<?...

FILE: acimage_common/src/main/java/com/acimage/common/utils/common/StringUtils.java
  class StringUtils (line 9) | public class StringUtils {
    method concatForNotNull (line 11) | public static String concatForNotNull(@Nullable String separator, @Nul...

FILE: acimage_common/src/main/java/com/acimage/common/utils/minio/MinioProperties.java
  class MinioProperties (line 10) | @Configuration
    method setAccessKey (line 19) | public void setAccessKey(String accessKey) {
    method getBucket (line 23) | public String getBucket() {
    method getEndpoint (line 27) | public String getEndpoint() {
    method setSecretKey (line 31) | public void setSecretKey(String secretKey) {
    method setBucket (line 35) | public void setBucket(String bucket) {
    method setEndpoint (line 39) | public void setEndpoint(String endpoint) {
    method minioClient (line 43) | @Bean

FILE: acimage_common/src/main/java/com/acimage/common/utils/minio/MinioUtils.java
  class MinioUtils (line 22) | @Slf4j
    method upload (line 31) | public String upload(MultipartFile multipartFile, String url) {
    method upload (line 58) | public String upload(InputStream is, String url, String contentType) {
    method downloadTo (line 83) | public void downloadTo(String url, String destSrc) {
    method download (line 104) | public void download(String url, String toPath) {
    method deleteFile (line 122) | public void deleteFile(String totalUrl) {
    method deleteFiles (line 142) | public void deleteFiles(List<String> urls) {
    method generateBaseUrl (line 159) | public String generateBaseUrl(@Nullable String prefix, Date uploadTime...

FILE: acimage_common/src/main/java/com/acimage/common/utils/redis/RedisLuaUtils.java
  class RedisLuaUtils (line 17) | @Component
    method init (line 36) | @PostConstruct
    method incrementIfPresent (line 63) | public Long incrementIfPresent(String key, long increment) {
    method getAndCombineAndDelete (line 73) | public Long getAndCombineAndDelete(String keyForIncrement, String fiel...
    method incrementIfPresentForZSet (line 83) | public Long incrementIfPresentForZSet(String key, String value, long i...
    method incrementIfPresentForFieldKey (line 88) | public Long incrementIfPresentForFieldKey(String key, String filedKey,...
    method requestLimitScript (line 93) | public List<Long> requestLimitScript(List<String> keys, List<Long> lim...
    method setIfPresentForFieldKey (line 114) | public Boolean setIfPresentForFieldKey(String key, String filedKey, St...

FILE: acimage_common/src/main/java/com/acimage/common/utils/redis/RedisUtils.java
  class RedisUtils (line 28) | @Component
    method setListAsString (line 43) | @Deprecated
    method getListFromString (line 50) | public <T> List<T> getListFromString(String key, Class<T> type) {
    method getFromString (line 55) | public Object getFromString(String key, Class<?> parameterized, Class<...
    method setObjectJson (line 73) | public void setObjectJson(String key, @NotNull Object obj, long timeou...
    method setObjectJson (line 81) | public void setObjectJson(String key, @NotNull Object obj) {
    method getObjectFromString (line 89) | public <T> T getObjectFromString(String key, Class<T> targetType) {
    method getForString (line 97) | public <T> T getForString(String key, Class<T> targetType) {
    method getForString (line 109) | public String getForString(String key) {
    method multiGetForString (line 113) | public List<String> multiGetForString(List<String> keys) {
    method setAsString (line 117) | public void setAsString(String key, Object value) {
    method setAsString (line 121) | public void setAsString(String key, String value, long timeout, TimeUn...
    method increment (line 125) | public Long increment(String key, long increment) {
    method getAndDeleteForString (line 134) | public String getAndDeleteForString(String key) {
    method getAndExpire (line 138) | public String getAndExpire(String key, long timeout, TimeUnit timeUnit) {
    method setIfPresent (line 142) | public void setIfPresent(String key, String value) {
    method setIfPresent (line 146) | public void setIfPresent(String key, String value, long timeout, TimeU...
    method incrementIfPresent (line 150) | public Long incrementIfPresent(String key, long increment) {
    method setIfPresentForFieldKey (line 154) | public Boolean setIfPresentForFieldKey(String key, String filedKey, St...
    method getAndCombineAndDelete (line 158) | public Long getAndCombineAndDelete(String keyForIncrement, String hash...
    method setObjectForHash (line 162) | public void setObjectForHash(String key, Object javaBean, long timeOut...
    method getObjectForHash (line 171) | public <T> T getObjectForHash(String key, Class<T> targetType) {
    method delete (line 183) | public Boolean delete(String key) {
    method delete (line 187) | public Long delete(List<String> key) {
    method expire (line 191) | public Boolean expire(String key, long timeout, TimeUnit timeUnit) {
    method getExpire (line 195) | public Long getExpire(String key, TimeUnit timeUnit) {
    method addForHyperLogLog (line 199) | public Long addForHyperLogLog(String key, String... values) {
    method deleteForHyperLogLog (line 203) | public void deleteForHyperLogLog(String key) {
    method sizeForHyperLogLog (line 207) | public Long sizeForHyperLogLog(String key) {
    method addForSet (line 212) | public Long addForSet(String key, Object value) {
    method isMemberForSet (line 216) | public Boolean isMemberForSet(String key, String value) {
    method removeForSet (line 220) | public Long removeForSet(String key, String... values) {
    method removeForSet (line 224) | public <T> Long removeForSet(String key, List<T> valueList) {
    method membersForSet (line 232) | public <T> List<T> membersForSet(String key, Class<T> targetType) {
    method addForZSet (line 245) | public Boolean addForZSet(String key, String value, double score) {
    method scoreForZSet (line 249) | public Double scoreForZSet(String key, String value) {
    method sizeForZSet (line 253) | public Long sizeForZSet(String key) {
    method removeForZSet (line 257) | public Long removeForZSet(String key, Object toStringValue) {
    method randomMembersForZSet (line 261) | public List<String> randomMembersForZSet(String key, int count) {
    method incrementIfPresentForZSet (line 292) | public Long incrementIfPresentForZSet(String key, String value, long i...
    method reverseRangeForZSet (line 296) | public Set<String> reverseRangeForZSet(String key, int start, int end) {
    method incrementIfPresentForFieldKey (line 300) | public Long incrementIfPresentForFieldKey(String key, String hashKey, ...
    method reverseRangeWithScoreForZSet (line 305) | public List<Pair<String, Double>> reverseRangeWithScoreForZSet(String ...
    method reverseRangeWithScoreForZSet (line 321) | public <T, V> List<Pair<T, V>> reverseRangeWithScoreForZSet(String key...
    method requestLimitScript (line 343) | public List<Long> requestLimitScript(List<String> keys, List<Long> lim...

FILE: acimage_common/src/main/java/com/acimage/common/web/exceptionhandler/ArgumentValidateExceptionHandler.java
  class ArgumentValidateExceptionHandler (line 21) | @Slf4j
    method doConstraintViolationException (line 27) | @ExceptionHandler(value = {ConstraintViolationException.class})
    method doMethodArgumentNotValidException (line 48) | @ExceptionHandler(value = {MethodArgumentNotValidException.class})
    method doBindException (line 73) | @ExceptionHandler(value = {BindException.class})
    method logWarnMessage (line 101) | private void logWarnMessage(Exception ex, String message) {

FILE: acimage_common/src/main/java/com/acimage/common/web/exceptionhandler/GlobalExceptionHandler.java
  class GlobalExceptionHandler (line 14) | @Slf4j
    method doBusinessException (line 20) | @ExceptionHandler(value={BusinessException.class})
    method doMaxUploadSizeExceededException (line 25) | @ExceptionHandler(value={MaxUploadSizeExceededException.class})
    method doRuntimeException (line 32) | @ExceptionHandler(value={RuntimeException.class})
    method doException (line 39) | @ExceptionHandler(value={Exception.class})

FILE: acimage_common/src/main/java/com/acimage/common/web/exceptionhandler/JwtExceptionHandler.java
  class JwtExceptionHandler (line 14) | @Slf4j
    method doTokenException (line 17) | @ExceptionHandler(value={JWTVerificationException.class})

FILE: acimage_common/src/main/java/com/acimage/common/web/interceptor/AccessInterceptor.java
  class AccessInterceptor (line 17) | @Slf4j
    method preHandle (line 19) | @Override
    method postHandle (line 29) | @Override
    method afterCompletion (line 35) | @Override

FILE: acimage_common/src/main/java/com/acimage/common/web/interceptor/JwtInterceptor.java
  class JwtInterceptor (line 25) | @Slf4j
    method preHandle (line 31) | @Override
    method postHandle (line 65) | @Override
    method afterCompletion (line 70) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/CommunityApplication.java
  class CommunityApplication (line 13) | @Slf4j
    method main (line 22) | public static void main(String[] args) {

FILE: acimage_community/src/main/java/com/acimage/community/dao/CategoryDao.java
  type CategoryDao (line 7) | public interface CategoryDao extends BaseMapper<Category> {

FILE: acimage_community/src/main/java/com/acimage/community/dao/CmtyUserDao.java
  type CmtyUserDao (line 12) | public interface CmtyUserDao extends BaseMapper<CmtyUser> {
    method batchUpdateStarCount (line 17) | Integer batchUpdateStarCount(@Param("userIdAndIncrements") List<Pair<L...
    method batchUpdateTopicCount (line 18) | Integer batchUpdateTopicCount(@Param("userIdAndIncrements") List<Pair<...
    method updateTopicCountByIncrement (line 20) | @Update("update tb_cmty_user set topic_count=topic_count+#{increment} ...
    method updateStarCountByIncrement (line 23) | @Update("update tb_cmty_user set star_count=star_count+#{increment} wh...
    method selectListOrderByColumn (line 26) | @Select("select * from tb_cmty_user order by ${column} desc limit #{st...

FILE: acimage_community/src/main/java/com/acimage/community/dao/CommentDao.java
  type CommentDao (line 12) | public interface CommentDao extends BaseMapper<Comment> {
    method deleteByTopicId (line 14) | @Delete("delete from tb_comment where topic_id=#{topicId}")
    method updateContentById (line 16) | @Update("update tb_comment set content=#{content},update_time=now() wh...
    method selectCommentsWithUserByTopicId (line 19) | List<Comment> selectCommentsWithUserByTopicId(@Param("topicId") long t...
    method countCommentsByTopicId (line 21) | @Select("select count(*) as comment_count from tb_comment where topic_...
    method countCommentsByUserId (line 24) | @Select("select count(*) as count from tb_comment where user_id=#{user...
    method selectCommentsWithUser (line 27) | List<Comment> selectCommentsWithUser(@Param("topicId") long topicId,@P...
    method selectCommentsWithTopicOrderByCreateTime (line 29) | List<Comment> selectCommentsWithTopicOrderByCreateTime(@Param("userId"...

FILE: acimage_community/src/main/java/com/acimage/community/dao/HomeCarrouselDao.java
  type HomeCarrouselDao (line 7) | public interface HomeCarrouselDao extends BaseMapper<HomeCarousel> {

FILE: acimage_community/src/main/java/com/acimage/community/dao/ImageDao.java
  type ImageDao (line 11) | public interface ImageDao extends BaseMapper<Image> {
    method insertList (line 13) | Integer insertList(List<Image> images);
    method updateDescription (line 15) | Integer updateDescription(List<Pair<Long,String>> idAndDescriptions);
    method selectListOrderById (line 17) | @Select("select * from tb_image where topic_id=#{topicId} order by id")
    method selectImagesWithTopic (line 21) | List<Image> selectImagesWithTopic(List<Long> imageIds);

FILE: acimage_community/src/main/java/com/acimage/community/dao/StarDao.java
  type StarDao (line 12) | public interface StarDao extends BaseMapper<Star> {
    method deleteByUserIdAndTopicId (line 14) | @Delete("delete from tb_star where user_id=#{userId} and topic_id=#{to...
    method deleteByTopicId (line 17) | @Delete("delete from tb_star where topic_id=#{topicId}")
    method selectStarsWithTopicOrderByCreateTime (line 23) | List<Star> selectStarsWithTopicOrderByCreateTime(@Param("userId") long...
    method countStarsOwnedBy (line 25) | Integer countStarsOwnedBy(@Param("userId") long userId);
    method countStarsByTopicId (line 27) | @Select("select count(*) as star_count from tb_star where topic_id=#{t...
    method countStarsByUserId (line 30) | @Select("select count(*) as star_count from tb_star where user_id=#{us...

FILE: acimage_community/src/main/java/com/acimage/community/dao/TagDao.java
  type TagDao (line 9) | public interface TagDao extends BaseMapper<Tag> {

FILE: acimage_community/src/main/java/com/acimage/community/dao/TagTopicDao.java
  type TagTopicDao (line 10) | public interface TagTopicDao extends BaseMapper<TagTopic> {
    method insertBatch (line 12) | void insertBatch(List<TagTopic> tagTopicList);
    method selectTagIds (line 14) | @Select("select tag_id from tb_tag_topic where topic_id=#{topicId} and...

FILE: acimage_community/src/main/java/com/acimage/community/dao/TopicDao.java
  type TopicDao (line 15) | public interface TopicDao extends BaseMapper<Topic> {
    method updateTopic (line 17) | @Update("update tb_topic set title=#{title},content=#{content},update_...
    method updatePvByIncrement (line 20) | Integer updatePvByIncrement(@Param("idAndIncrements") List<Pair<Long, ...
    method batchUpdateColumnByIncrement (line 22) | Integer batchUpdateColumnByIncrement(@Param("column") String underline...
    method updateColumnByIncrement (line 24) | @Update("update tb_topic set ${column}=${column}+#{increment} where id...
    method updateActivityTime (line 27) | @Update("update tb_topic set activity_time=#{activityTime} where id=#{...
    method batchUpdateActivityTime (line 30) | Integer batchUpdateActivityTime(@Param("idAndActivityTimes") List<Pair...
    method selectTopicsWithUserOrderByPageView (line 32) | List<Topic> selectTopicsWithUserOrderByPageView(@Param("startTime") St...
    method selectTopicsWithUserOrderBy (line 34) | List<Topic> selectTopicsWithUserOrderBy(@Param("column") String column...
    method selectTopicWithUser (line 36) | Topic selectTopicWithUser(@Param("id") long id);
    method selectTopicsWithUserOrderByCreateTime (line 38) | List<Topic> selectTopicsWithUserOrderByCreateTime(@Param("userId") lon...
    method selectTopicsWithUserByIds (line 40) | List<Topic> selectTopicsWithUserByIds(@Param("ids") List<Long> ids);
    method countTopics (line 42) | @Select("select count(*) from tb_topic where user_id=#{userId} and del...

FILE: acimage_community/src/main/java/com/acimage/community/dao/TopicHtmlDao.java
  type TopicHtmlDao (line 6) | public interface TopicHtmlDao extends BaseMapper<TopicHtml> {

FILE: acimage_community/src/main/java/com/acimage/community/depreted/CmtyUserDaoBak.java
  type CmtyUserDaoBak (line 11) | public interface CmtyUserDaoBak extends BaseMapper<UserCommunityStatisti...
    method batchUpdateStarCount (line 12) | Integer batchUpdateStarCount(@Param("userIdAndIncrements") List<Pair<L...
    method batchUpdateTopicCount (line 13) | Integer batchUpdateTopicCount(@Param("userIdAndIncrements") List<Pair<...
    method updateTopicCountByIncrement (line 15) | @Update("update tb_cmty_user set topic_count=topic_count+#{increment} ...
    method updateStarCountByIncrement (line 18) | @Update("update tb_cmty_user set star_count=star_count+#{increment} wh...
    method selectListOrderByColumn (line 22) | List<UserCommunityStatistic> selectListOrderByColumn(@Param("column") ...

FILE: acimage_community/src/main/java/com/acimage/community/depreted/RabbitmqConvertConfig.java
  class RabbitmqConvertConfig (line 12) | @Deprecated
    method jacksonRabbitTemplate (line 15) | @Bean
    method rabbitListenerContainerFactory (line 23) | @Bean

FILE: acimage_community/src/main/java/com/acimage/community/depreted/UserMixWriteService.java
  type UserMixWriteService (line 5) | public interface UserMixWriteService {
    method addUserBasicAndUserCommunityStatistic (line 6) | void addUserBasicAndUserCommunityStatistic(CmtyUser cmtyUser);

FILE: acimage_community/src/main/java/com/acimage/community/depreted/UserMixWriteServiceImpl.java
  class UserMixWriteServiceImpl (line 10) | public class UserMixWriteServiceImpl implements UserMixWriteService {
    method addUserBasicAndUserCommunityStatistic (line 16) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/depreted/userstatistic/UserCsQueryService.java
  type UserCsQueryService (line 7) | public interface UserCsQueryService {
    method getUserCommunityStatistic (line 8) | @QueryRedis(keyPrefix = KeyConstants.STRINGKP_CMTY_USER,expire = 10L)

FILE: acimage_community/src/main/java/com/acimage/community/depreted/userstatistic/UserCsRankService.java
  type UserCsRankService (line 8) | public interface UserCsRankService {
    method pageUserRankByTopicCount (line 10) | @QueryRedis(keyPrefix = "acimage:community:users:rank:topicCount",expi...
    method pageUserRankByStarCount (line 13) | @QueryRedis(keyPrefix = "acimage:community:users:rank:starCount",expir...

FILE: acimage_community/src/main/java/com/acimage/community/depreted/userstatistic/UserCsWriteService.java
  type UserCsWriteService (line 7) | public interface UserCsWriteService {
    method updateStarCountByIncrements (line 8) | Integer updateStarCountByIncrements(List<Long> userIds, List<Integer> ...
    method updateTopicCountByIncrements (line 10) | Integer updateTopicCountByIncrements(List<Long> userIds, List<Integer>...
    method updateTopicCountByIncrement (line 12) | Integer updateTopicCountByIncrement(long userId, int increment);
    method updateStarCountByIncrement (line 14) | Integer updateStarCountByIncrement(long userId, int increment);
    method save (line 16) | void save(long userId);

FILE: acimage_community/src/main/java/com/acimage/community/depreted/userstatistic/consts/KeyConstants.java
  class KeyConstants (line 3) | public class KeyConstants {

FILE: acimage_community/src/main/java/com/acimage/community/depreted/userstatistic/impl/UserCsQueryServiceImpl.java
  class UserCsQueryServiceImpl (line 12) | public class UserCsQueryServiceImpl implements UserCsQueryService {
    method getUserCommunityStatistic (line 16) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/depreted/userstatistic/impl/UserCsRankServiceImpl.java
  class UserCsRankServiceImpl (line 17) | public class UserCsRankServiceImpl implements UserCsRankService {
    method pageUserRankBy (line 23) | private List<User> pageUserRankBy(SFunction<UserCommunityStatistic, In...
    method pageUserRankByTopicCount (line 41) | @Override
    method pageUserRankByStarCount (line 47) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/depreted/userstatistic/impl/UserCsWriteServiceImpl.java
  class UserCsWriteServiceImpl (line 16) | public class UserCsWriteServiceImpl implements UserCsWriteService {
    method updateStarCountByIncrements (line 22) | @Override
    method updateTopicCountByIncrements (line 31) | @Override
    method updateTopicCountByIncrement (line 40) | @Override
    method updateStarCountByIncrement (line 46) | @Override
    method save (line 52) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/esdao/UserEsDao.java
  type UserEsDao (line 7) | @Repository

FILE: acimage_community/src/main/java/com/acimage/community/global/aop/RecordPageViewAdvice.java
  class RecordPageViewAdvice (line 19) | @Aspect
    method recordPageViewPointCut (line 30) | @Pointcut(POINT_CUT)
    method around (line 34) | @AfterReturning(pointcut = "recordPageViewPointCut()", returning = "re...

FILE: acimage_community/src/main/java/com/acimage/community/global/config/JobFactory.java
  class JobFactory (line 10) | public class JobFactory extends AdaptableJobFactory {
    method createJobInstance (line 14) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/global/config/WebMvcConfig.java
  class WebMvcConfig (line 13) | @Slf4j
    method addInterceptors (line 20) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/global/consts/CommentKeyConstants.java
  class CommentKeyConstants (line 3) | public class CommentKeyConstants {
    method keyOfTopicComments (line 10) | public static String keyOfTopicComments(long topicId, int pageNo) {

FILE: acimage_community/src/main/java/com/acimage/community/global/consts/CoverImageConstants.java
  class CoverImageConstants (line 3) | public class CoverImageConstants {

FILE: acimage_community/src/main/java/com/acimage/community/global/consts/PageSizeConstants.java
  class PageSizeConstants (line 3) | public class PageSizeConstants {

FILE: acimage_community/src/main/java/com/acimage/community/global/consts/StarKeyConstants.java
  class StarKeyConstants (line 3) | public class StarKeyConstants {
    method keyOfIsStar (line 8) | public static String keyOfIsStar(long userId, long topicId) {

FILE: acimage_community/src/main/java/com/acimage/community/global/consts/TopicKeyConstants.java
  class TopicKeyConstants (line 3) | public class TopicKeyConstants {

FILE: acimage_community/src/main/java/com/acimage/community/global/enums/SortMode.java
  type SortMode (line 8) | public enum SortMode {
    method toColumn (line 16) | public String toColumn() {
    method toSortBuilder (line 34) | public FieldSortBuilder toSortBuilder(){
    method toSortBuilder (line 45) | public static FieldSortBuilder toSortBuilder(SortMode sortMode){

FILE: acimage_community/src/main/java/com/acimage/community/global/enums/TopicAttribute.java
  type TopicAttribute (line 11) | public enum TopicAttribute {
    method zSetKey (line 51) | public String zSetKey() {
    method setKeyForRecordingId (line 55) | public String setKeyForRecordingId() {
    method keyPrefix (line 59) | public String keyPrefix() {
    method toUnderlineColumnName (line 63) | public String toUnderlineColumnName() {
    method toFieldName (line 67) | public String toFieldName() {
    method toGetFunction (line 71) | public SFunction<Topic,Object> toGetFunction(){

FILE: acimage_community/src/main/java/com/acimage/community/listener/CommentEventListener.java
  class CommentEventListener (line 8) | @Component
    method onApplicationEvent (line 11) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/listener/PublishTopicEventListener.java
  class PublishTopicEventListener (line 10) | @Component
    method onApplicationEvent (line 15) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/listener/StarEventListener.java
  class StarEventListener (line 11) | @Component
    method onApplicationEvent (line 18) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/listener/event/CommentEvent.java
  class CommentEvent (line 8) | @Getter
    method CommentEvent (line 14) | public CommentEvent(Object source, Long userId, Long topicId) {

FILE: acimage_community/src/main/java/com/acimage/community/listener/event/StarEvent.java
  class StarEvent (line 8) | @Getter
    method StarEvent (line 15) | public StarEvent(Object source,  Long topicId, Long ownerId, Long from...

FILE: acimage_community/src/main/java/com/acimage/community/listener/event/TopicEvent.java
  class TopicEvent (line 8) | @Getter
    method TopicEvent (line 14) | public TopicEvent(Object source, Long userId, Long topicId) {

FILE: acimage_community/src/main/java/com/acimage/community/model/request/CommentAddReq.java
  class CommentAddReq (line 11) | @Data

FILE: acimage_community/src/main/java/com/acimage/community/model/request/CommentModifyReq.java
  class CommentModifyReq (line 11) | @Data

FILE: acimage_community/src/main/java/com/acimage/community/model/request/TopicAddReq.java
  class TopicAddReq (line 13) | @Data

FILE: acimage_community/src/main/java/com/acimage/community/model/request/TopicModifyHtmlReq.java
  class TopicModifyHtmlReq (line 11) | @Data

FILE: acimage_community/src/main/java/com/acimage/community/model/request/TopicQueryByCategoryIdReq.java
  class TopicQueryByCategoryIdReq (line 12) | @Data

FILE: acimage_community/src/main/java/com/acimage/community/model/request/TopicQueryBySortReq.java
  class TopicQueryBySortReq (line 10) | @Data

FILE: acimage_community/src/main/java/com/acimage/community/model/request/TopicQueryByTagIdReq.java
  class TopicQueryByTagIdReq (line 12) | @Data

FILE: acimage_community/src/main/java/com/acimage/community/model/request/TopicSearchReq.java
  class TopicSearchReq (line 14) | @Data

FILE: acimage_community/src/main/java/com/acimage/community/model/request/UserLoginReq.java
  class UserLoginReq (line 7) | @Data

FILE: acimage_community/src/main/java/com/acimage/community/model/request/UserRegisterReq.java
  class UserRegisterReq (line 10) | @Data

FILE: acimage_community/src/main/java/com/acimage/community/model/vo/TopicInfoVo.java
  class TopicInfoVo (line 12) | @Data

FILE: acimage_community/src/main/java/com/acimage/community/mq/config/SyncEsMqConfig.java
  class SyncEsMqConfig (line 9) | @Configuration
    method syncEsQueue (line 14) | @Bean
    method syncEsExchange (line 26) | @Bean
    method bindingSyncEs (line 32) | @Bean
    method createExchangeQueueForSyncEs (line 38) | @Bean

FILE: acimage_community/src/main/java/com/acimage/community/mq/config/SyncImagesMqConfig.java
  class SyncImagesMqConfig (line 9) | @Configuration
    method syncImagesQueue (line 14) | @Bean
    method topicImagesExchange (line 26) | @Bean
    method bindingSyncImages (line 32) | @Bean
    method createExchangeQueueForSyncImages (line 38) | @Bean

FILE: acimage_community/src/main/java/com/acimage/community/mq/config/UserMsgMqConfig.java
  class UserMsgMqConfig (line 9) | @Configuration
    method userMsgQueue (line 14) | @Bean
    method communityUserExchange (line 19) | @Bean
    method bindingUserMsg (line 25) | @Bean
    method createExchangeQueueForUserMsg (line 32) | @Bean

FILE: acimage_community/src/main/java/com/acimage/community/mq/consumer/SyncEsConsumer.java
  class SyncEsConsumer (line 21) | @Slf4j
    method syncAdd (line 29) | @RabbitHandler
    method syncDelete (line 57) | @RabbitHandler
    method syncUpdate (line 84) | @RabbitHandler

FILE: acimage_community/src/main/java/com/acimage/community/mq/consumer/SyncUserConsumer.java
  class SyncUserConsumer (line 27) | @Slf4j
    method syncUsername (line 37) | @RabbitHandler
    method syncPhotoUrl (line 77) | @RabbitHandler
    method addUser (line 115) | @RabbitHandler

FILE: acimage_community/src/main/java/com/acimage/community/mq/producer/SyncEsMqProducer.java
  class SyncEsMqProducer (line 13) | @Component
    method sendAddMessage (line 19) | public void sendAddMessage(Object entity) {
    method sendUpdateMessage (line 24) | public void sendUpdateMessage(Object entity, List<String> columns) {
    method sendDeleteMessage (line 31) | public void sendDeleteMessage(String id,Class<?> type) {

FILE: acimage_community/src/main/java/com/acimage/community/mq/producer/UserMsgMqProducer.java
  class UserMsgMqProducer (line 9) | @Component
    method sendCommentMessage (line 15) | public void sendCommentMessage(CommentMsg commentMsg) {

FILE: acimage_community/src/main/java/com/acimage/community/mq/producer/syncImagesMqProducer.java
  class syncImagesMqProducer (line 10) | @Component
    method sendSyncImagesMessage (line 25) | public void sendSyncImagesMessage(SyncImagesUpdateDto updateDto) {

FILE: acimage_community/src/main/java/com/acimage/community/runner/CreateIndexRunner.java
  class CreateIndexRunner (line 11) | @Slf4j
    method run (line 19) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/runner/PreheatApplicationRunner.java
  class PreheatApplicationRunner (line 13) | @Slf4j
    method run (line 20) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/schedule/UpdateActivityTimeJob.java
  class UpdateActivityTimeJob (line 23) | @Deprecated
    method executeInternal (line 35) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/schedule/UpdateActivityTimeJobConfig.java
  class UpdateActivityTimeJobConfig (line 7) | @Deprecated
    method updateActivityTimeJobDetail (line 12) | @Bean
    method updateActivityTimeJobTrigger (line 21) | @Bean

FILE: acimage_community/src/main/java/com/acimage/community/schedule/UpdateCommentCountJob.java
  class UpdateCommentCountJob (line 19) | @Deprecated
    method executeInternal (line 28) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/schedule/UpdateCommentCountJobConfig.java
  class UpdateCommentCountJobConfig (line 6) | @Deprecated
    method updateCommentCountJobDetail (line 11) | @Bean
    method updateCommentCountJobTrigger (line 20) | @Bean

FILE: acimage_community/src/main/java/com/acimage/community/schedule/UpdatePageViewJob.java
  class UpdatePageViewJob (line 23) | @Component
    method executeInternal (line 39) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/schedule/UpdatePageViewJobConfig.java
  class UpdatePageViewJobConfig (line 8) | @Configuration
    method updatePageViewJobDetail (line 14) | @Bean
    method updatePageViewJobTrigger (line 23) | @Bean

FILE: acimage_community/src/main/java/com/acimage/community/schedule/UpdateStarCountJob.java
  class UpdateStarCountJob (line 19) | @Deprecated
    method executeInternal (line 31) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/schedule/UpdateStarCountJobConfig.java
  class UpdateStarCountJobConfig (line 7) | @Deprecated
    method updateStarCountJobDetail (line 12) | @Bean
    method updateStarCountJobTrigger (line 21) | @Bean

FILE: acimage_community/src/main/java/com/acimage/community/service/categoty/CategoryQueryService.java
  type CategoryQueryService (line 7) | public interface CategoryQueryService {
    method listAll (line 8) | List<Category> listAll();

FILE: acimage_community/src/main/java/com/acimage/community/service/categoty/impl/CategoryQueryServiceImpl.java
  class CategoryQueryServiceImpl (line 11) | @Service
    method listAll (line 17) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/cmtyuser/CmtyUserQueryService.java
  type CmtyUserQueryService (line 8) | public interface CmtyUserQueryService {
    method getCmtyUser (line 9) | @QueryRedis(keyPrefix = KeyConstants.STRINGKP_CMTY_USER, expire = 10L,...

FILE: acimage_community/src/main/java/com/acimage/community/service/cmtyuser/CmtyUserRankService.java
  type CmtyUserRankService (line 9) | public interface CmtyUserRankService {
    method pageUserRankBy (line 10) | MyPage<CmtyUser> pageUserRankBy(String column, int pageNo, int pageSize);
    method pageUserRankByTopicCount (line 12) | @QueryRedis(keyPrefix = "acimage:community:users:rank:topicCount:",exp...
    method pageUserRankByStarCount (line 15) | @QueryRedis(keyPrefix = "acimage:community:users:rank:starCount:",expi...

FILE: acimage_community/src/main/java/com/acimage/community/service/cmtyuser/CmtyUserWriteService.java
  type CmtyUserWriteService (line 8) | public interface CmtyUserWriteService {
    method updateUsername (line 9) | void updateUsername(long userId, String username);
    method updatePhotoUrl (line 11) | void updatePhotoUrl(long userId, String photoUrl);
    method save (line 13) | @Transactional
    method updateStarCountByIncrements (line 16) | Integer updateStarCountByIncrements(List<Long> userIds, List<Integer> ...
    method updateTopicCountByIncrements (line 18) | Integer updateTopicCountByIncrements(List<Long> userIds, List<Integer>...
    method updateTopicCountByIncrement (line 20) | Integer updateTopicCountByIncrement(long userId, int increment);
    method updateStarCountByIncrement (line 22) | Integer updateStarCountByIncrement(long userId, int increment);

FILE: acimage_community/src/main/java/com/acimage/community/service/cmtyuser/impl/CmtyUserQueryServiceImpl.java
  class CmtyUserQueryServiceImpl (line 12) | @Service
    method getCmtyUser (line 17) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/cmtyuser/impl/CmtyUserRankServiceImpl.java
  class CmtyUserRankServiceImpl (line 20) | @Service
    method pageUserRankBy (line 25) | private List<CmtyUser> pageUserRankBy(SFunction<CmtyUser, Integer> att...
    method pageUserRankBy (line 32) | @Override
    method pageUserRankByTopicCount (line 44) | @Override
    method pageUserRankByStarCount (line 50) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/cmtyuser/impl/CmtyUserWriteServiceImpl.java
  class CmtyUserWriteServiceImpl (line 18) | @Service
    method updateUsername (line 25) | @Override
    method updatePhotoUrl (line 34) | @Override
    method save (line 43) | @Override
    method updateStarCountByIncrements (line 49) | @Override
    method updateTopicCountByIncrements (line 58) | @Override
    method updateTopicCountByIncrement (line 67) | @Override
    method updateStarCountByIncrement (line 73) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/comment/CommentInfoQueryService.java
  type CommentInfoQueryService (line 8) | public interface CommentInfoQueryService {
    method pageCommentsWithUser (line 9) | List<Comment> pageCommentsWithUser(long topicId, int pageNo,int pageSi...
    method pageCommentsWithTopicOrderByCreateTime (line 11) | MyPage<Comment> pageCommentsWithTopicOrderByCreateTime(long userId, in...

FILE: acimage_community/src/main/java/com/acimage/community/service/comment/CommentQueryService.java
  type CommentQueryService (line 5) | public interface CommentQueryService {
    method getComment (line 6) | Comment getComment(long commentId);
    method getCommentCount (line 7) | Integer getCommentCount(long topicId);

FILE: acimage_community/src/main/java/com/acimage/community/service/comment/CommentWriteService.java
  type CommentWriteService (line 7) | public interface CommentWriteService {
    method saveComment (line 9) | Integer saveComment(CommentAddReq commentAddReq);
    method removeComment (line 12) | Integer removeComment(long commentId);
    method removeCommentWithoutVerification (line 14) | Integer removeCommentWithoutVerification(long commentId);
    method removeComments (line 16) | Integer removeComments(long topicId);
    method updateComment (line 18) | Integer updateComment(CommentModifyReq commentModifyReq);

FILE: acimage_community/src/main/java/com/acimage/community/service/comment/annotation/Operation.java
  type Operation (line 3) | public enum Operation {

FILE: acimage_community/src/main/java/com/acimage/community/service/comment/impl/CommentInfoQueryServiceImpl.java
  class CommentInfoQueryServiceImpl (line 18) | @Service
    method pageCommentsWithUser (line 24) | @QueryRedis(keyPrefix = CommentKeyConstants.STRINGKP_TOPIC_COMMENTS, e...
    method pageCommentsWithTopicOrderByCreateTime (line 31) | @QueryRedis(keyPrefix = CommentKeyConstants.STRINGKP_USER_COMMENTS, ex...

FILE: acimage_community/src/main/java/com/acimage/community/service/comment/impl/CommentQueryServiceImpl.java
  class CommentQueryServiceImpl (line 16) | @Service
    method getComment (line 20) | @QueryRedis(keyPrefix = "acimage:comments:id:",expire = 5L, unit = Tim...
    method getCommentCount (line 26) | @QueryRedis(keyPrefix = CommentKeyConstants.STRINGKP_COMMENT_COUNT,exp...

FILE: acimage_community/src/main/java/com/acimage/community/service/comment/impl/CommentWriteServiceImpl.java
  class CommentWriteServiceImpl (line 35) | @Service
    method saveComment (line 51) | @Override
    method removeComment (line 102) | @Override
    method removeCommentWithoutVerification (line 127) | @Override
    method removeComments (line 151) | @Override
    method updateComment (line 159) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/homecarousel/HomeCarouselQueryService.java
  type HomeCarouselQueryService (line 7) | public interface HomeCarouselQueryService {
    method listAll (line 9) | List<HomeCarousel> listAll();

FILE: acimage_community/src/main/java/com/acimage/community/service/homecarousel/impl/HomeCarouselQueryServiceImpl.java
  class HomeCarouselQueryServiceImpl (line 15) | @Service
    method listAll (line 21) | @QueryRedis(keyPrefix = STRINGK_HOME_CAROUSEL, expire = 2L )

FILE: acimage_community/src/main/java/com/acimage/community/service/star/StarMixQueryService.java
  type StarMixQueryService (line 6) | public interface StarMixQueryService {
    method pageStarsWithTopic (line 7) | MyPage<Star> pageStarsWithTopic(long userId, int pageNo);

FILE: acimage_community/src/main/java/com/acimage/community/service/star/StarQueryService.java
  type StarQueryService (line 3) | public interface StarQueryService {
    method isStar (line 4) | boolean isStar(long userId,long topicId);
    method getTopicStarCount (line 6) | Integer getTopicStarCount(long topicId);
    method getStarCountOwnedBy (line 8) | Integer getStarCountOwnedBy(long userId);

FILE: acimage_community/src/main/java/com/acimage/community/service/star/StarWriteService.java
  type StarWriteService (line 4) | public interface StarWriteService {
    method saveStar (line 7) | void saveStar(long userId,long topicId);
    method removeStar (line 9) | void removeStar(long userId,long topicId);
    method removeStars (line 11) | void removeStars(long topicId);

FILE: acimage_community/src/main/java/com/acimage/community/service/star/impl/StarMixQueryServiceImpl.java
  class StarMixQueryServiceImpl (line 16) | @Service
    method pageStarsWithTopic (line 20) | @QueryRedis(keyPrefix = "acimage:stars:userId:pageNo:", expire = 30L, ...

FILE: acimage_community/src/main/java/com/acimage/community/service/star/impl/StarQueryServiceImpl.java
  class StarQueryServiceImpl (line 13) | @Service
    method isStar (line 18) | @QueryRedis(keyPrefix = StarKeyConstants.STRINGKP_STAR_USER_TOPIC)
    method getTopicStarCount (line 27) | @QueryRedis(keyPrefix = StarKeyConstants.STRINGKP_TOPIC_STAR_COUNT,exp...
    method getStarCountOwnedBy (line 35) | @QueryRedis(keyPrefix = StarKeyConstants.STRINGKP_USER_STAR_COUNT, exp...

FILE: acimage_community/src/main/java/com/acimage/community/service/star/impl/StarWriteServiceImpl.java
  class StarWriteServiceImpl (line 25) | @Slf4j
    method saveStar (line 42) | @Override
    method removeStar (line 73) | @Override
    method removeStars (line 94) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/tag/TagQueryService.java
  type TagQueryService (line 7) | public interface TagQueryService {
    method listAll (line 8) | List<Tag> listAll();
    method checkAndListTags (line 10) | List<Tag> checkAndListTags(List<Integer> tagIds);

FILE: acimage_community/src/main/java/com/acimage/community/service/tag/TagTopicQueryService.java
  type TagTopicQueryService (line 5) | public interface TagTopicQueryService {
    method listTagIds (line 6) | List<Integer> listTagIds(long topicId);

FILE: acimage_community/src/main/java/com/acimage/community/service/tag/TagTopicWriteService.java
  type TagTopicWriteService (line 5) | public interface TagTopicWriteService {
    method save (line 6) | void save(long topicId, List<Integer> tagIdList);
    method remove (line 8) | void remove(long topicId);

FILE: acimage_community/src/main/java/com/acimage/community/service/tag/TagWriteService.java
  type TagWriteService (line 5) | public interface TagWriteService {

FILE: acimage_community/src/main/java/com/acimage/community/service/tag/impl/TagQueryServiceImpl.java
  class TagQueryServiceImpl (line 17) | @Slf4j
    method listAll (line 23) | @Override
    method checkAndListTags (line 28) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/tag/impl/TagTopicQueryServiceImpl.java
  class TagTopicQueryServiceImpl (line 11) | @Service
    method listTagIds (line 16) | @QueryRedis(keyPrefix = "acimage:community:tags:topicId:")

FILE: acimage_community/src/main/java/com/acimage/community/service/tag/impl/TagTopicWriteServiceImpl.java
  class TagTopicWriteServiceImpl (line 18) | @Slf4j
    method save (line 26) | @Override
    method remove (line 57) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/tag/impl/TagWriteServiceImpl.java
  class TagWriteServiceImpl (line 6) | @Service

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/Impl/TopicEsSearchServiceImpl.java
  class TopicEsSearchServiceImpl (line 39) | @Slf4j
    method searchSimilar (line 51) | @Override
    method searchSimilarByTitle (line 58) | @Override
    method searchByTagId (line 73) | @Override
    method searchBySort (line 89) | @Override
    method searchBySort (line 110) | @Override
    method search (line 123) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/Impl/TopicHtmlQueryServiceImpl.java
  class TopicHtmlQueryServiceImpl (line 12) | @Service
    method getTopicHtml (line 17) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/Impl/TopicHtmlWriteServiceImpl.java
  class TopicHtmlWriteServiceImpl (line 12) | @Service
    method save (line 19) | @Override
    method remove (line 28) | @Override
    method update (line 35) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/Impl/TopicInfoQueryServiceImpl.java
  class TopicInfoQueryServiceImpl (line 31) | @Slf4j
    method getTopicWithUserTagIds (line 54) | @Override
    method getTopicInfoAndFirstCommentPage (line 65) | @Override
    method pageUserTopicsInfoOrderByCreateTime (line 95) | @QueryRedis(keyPrefix = "acimage:community:topics:userId:",expire = 8L...
    method listTopicsInfoSortBy (line 103) | @Override
    method listRandomTopicsInRank (line 129) | @Override
    method pageTopicsInfoRankByActivityTime (line 154) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/Impl/TopicInfoWriteServiceImpl.java
  class TopicInfoWriteServiceImpl (line 45) | @Slf4j
    method saveTopicInfo (line 82) | @Override
    method removeTopicInfo (line 174) | @Override
    method removeTopicInfoWithoutVerification (line 213) | @Override
    method updateHtml (line 245) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/Impl/TopicPreheatServiceImpl.java
  class TopicPreheatServiceImpl (line 18) | @Service
    method preheatTopicsOrderBy (line 28) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/Impl/TopicQueryServiceImpl.java
  class TopicQueryServiceImpl (line 20) | @Slf4j
    method getTopic (line 26) | @QueryRedis(expire = 11L, keyPrefix = TopicKeyConstants.HASHKP_TOPIC, ...
    method listTopicWithUser (line 37) | @Override
    method listTopicsByIds (line 45) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/Impl/TopicRankQueryServiceImpl.java
  class TopicRankQueryServiceImpl (line 16) | @Service
    method listTopicIdsInRank (line 21) | @Override
    method listRandomTopicIdsInRank (line 27) | @Override
    method listTopicIdWithScoresInRank (line 35) | @Override
    method countTopicIdsInRank (line 48) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/Impl/TopicRankWriteServiceImpl.java
  class TopicRankWriteServiceImpl (line 14) | @Service
    method updateRank (line 19) | @Override
    method updateRank (line 31) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/Impl/TopicSpAttrQueryServiceImpl.java
  class TopicSpAttrQueryServiceImpl (line 16) | @Service
    method getPageView (line 23) | @Override
    method getActivityTime (line 40) | @Override
    method getStarCount (line 55) | @Override
    method getCommentCount (line 71) | @Override
    method setAttrIntoTopic (line 87) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/Impl/TopicSpAttrWriteServiceImpl.java
  class TopicSpAttrWriteServiceImpl (line 26) | @Slf4j
    method removeAttributes (line 40) | @Override
    method updateStarCountByIncrement (line 52) | @Override
    method updateCommentCountByIncrement (line 57) | @Override
    method updatePageViewByIncrement (line 62) | @Override
    method batchUpdateByIncrements (line 67) | private void batchUpdateByIncrements(TopicAttribute attr, List<Long> t...
    method updateByIncrement (line 75) | private void updateByIncrement(SFunction<Topic, ?> column, long topicI...
    method updateBatchActivityTime (line 81) | @Override
    method changeActivityTime (line 89) | @Override
    method increaseStarCount (line 108) | @Override
    method increaseCommentCount (line 140) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/Impl/TopicWriteServiceImpl.java
  class TopicWriteServiceImpl (line 25) | @Slf4j
    method save (line 38) | @Override
    method remove (line 44) | @Override
    method update (line 52) | @Override
    method updateTitle (line 74) | @Override
    method updateContent (line 98) | @Deprecated
    method updateContent (line 118) | @Override

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/TopicEsSearchService.java
  type TopicEsSearchService (line 12) | public interface TopicEsSearchService {
    method searchSimilar (line 13) | List<Topic> searchSimilar(long topicId, int size);
    method searchSimilarByTitle (line 15) | List<Topic> searchSimilarByTitle(long topicId,String title, int size);
    method searchByTagId (line 16) | MyPage<Topic> searchByTagId(TopicQueryByTagIdReq queryReq);
    method searchBySort (line 17) | MyPage<Topic> searchBySort(TopicQueryByCategoryIdReq queryReq);
    method searchBySort (line 19) | MyPage<Topic> searchBySort(TopicQueryBySortReq queryReq);
    method search (line 21) | MyPage<Topic> search(TopicSearchReq topicSearchReq);

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/TopicHtmlQueryService.java
  type TopicHtmlQueryService (line 5) | public interface TopicHtmlQueryService {
    method getTopicHtml (line 7) | TopicHtml getTopicHtml(long topicId);

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/TopicHtmlWriteService.java
  type TopicHtmlWriteService (line 5) | public interface TopicHtmlWriteService {
    method save (line 6) | TopicHtml save(long topicId, String html);
    method remove (line 8) | void remove(long topicId);
    method update (line 10) | void update(long topicId, String html);

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/TopicInfoQueryService.java
  type TopicInfoQueryService (line 10) | public interface TopicInfoQueryService {
    method getTopicWithUserTagIds (line 11) | Topic getTopicWithUserTagIds(long topicId);
    method getTopicInfoAndFirstCommentPage (line 12) | TopicInfoVo getTopicInfoAndFirstCommentPage(long topicId);
    method pageUserTopicsInfoOrderByCreateTime (line 13) | MyPage<Topic> pageUserTopicsInfoOrderByCreateTime(long userId, int pag...
    method listTopicsInfoSortBy (line 14) | List<Topic> listTopicsInfoSortBy(TopicAttribute attribute, int pageNo,...
    method listRandomTopicsInRank (line 16) | List<Topic> listRandomTopicsInRank(int size);
    method pageTopicsInfoRankByActivityTime (line 18) | MyPage<Topic> pageTopicsInfoRankByActivityTime(int pageNo, int pageSize);

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/TopicInfoWriteService.java
  type TopicInfoWriteService (line 12) | public interface TopicInfoWriteService {
    method saveTopicInfo (line 14) | @Transactional(rollbackFor = {Exception.class})
    method removeTopicInfo (line 17) | @Transactional(rollbackFor = {Exception.class})
    method removeTopicInfoWithoutVerification (line 20) | @Transactional(rollbackFor = {Exception.class})
    method updateHtml (line 23) | @Transactional

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/TopicPreheatService.java
  type TopicPreheatService (line 7) | public interface TopicPreheatService {
    method preheatTopicsOrderBy (line 8) | void preheatTopicsOrderBy(TopicAttribute attr, int rankSize, int cache...

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/TopicQueryService.java
  type TopicQueryService (line 7) | public interface TopicQueryService {
    method getTopic (line 8) | Topic getTopic(long id);
    method listTopicWithUser (line 9) | List<Topic> listTopicWithUser(List<Long> ids);
    method listTopicsByIds (line 10) | List<Topic> listTopicsByIds(List<Long> ids);

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/TopicRankQueryService.java
  type TopicRankQueryService (line 12) | public interface TopicRankQueryService {
    method listTopicIdsInRank (line 14) | List<Long> listTopicIdsInRank(TopicAttribute topicAttribute, int pageN...
    method listRandomTopicIdsInRank (line 16) | List<Long> listRandomTopicIdsInRank(TopicAttribute topicAttribute, int...
    method listTopicIdWithScoresInRank (line 18) | List<Pair<Long, Double>> listTopicIdWithScoresInRank(TopicAttribute to...
    method countTopicIdsInRank (line 19) | Integer countTopicIdsInRank(TopicAttribute topicAttribute);

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/TopicRankWriteService.java
  type TopicRankWriteService (line 8) | public interface TopicRankWriteService {
    method updateRank (line 10) | void updateRank(TopicAttribute attr, long topicId, double newScore);
    method updateRank (line 12) | void updateRank(TopicAttribute attr, @NotNull Topic topic);

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/TopicSpAttrQueryService.java
  type TopicSpAttrQueryService (line 8) | public interface TopicSpAttrQueryService {
    method getPageView (line 9) | Integer getPageView(long topicId);
    method getActivityTime (line 10) | Date getActivityTime(long topicId);
    method getStarCount (line 11) | Integer getStarCount(long topicId);
    method getCommentCount (line 12) | Integer getCommentCount(long topicId);
    method setAttrIntoTopic (line 13) | void setAttrIntoTopic(Topic topic, TopicAttribute... attrs);

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/TopicSpAttrWriteService.java
  type TopicSpAttrWriteService (line 6) | public interface TopicSpAttrWriteService {
    method removeAttributes (line 7) | void removeAttributes(long topicId);
    method updateStarCountByIncrement (line 8) | void updateStarCountByIncrement(List<Long> topicIds,List<Integer> incr...
    method updateCommentCountByIncrement (line 9) | void updateCommentCountByIncrement(List<Long> topicIds,List<Integer> i...
    method updatePageViewByIncrement (line 10) | void updatePageViewByIncrement(List<Long> topicIds,List<Integer> incre...
    method updateBatchActivityTime (line 11) | void updateBatchActivityTime(List<Long> topicIds, List<Date> activityT...
    method changeActivityTime (line 12) | void changeActivityTime(long topicId, Date date);
    method increaseStarCount (line 14) | void increaseStarCount(long topicId, int increment);
    method increaseCommentCount (line 15) | void increaseCommentCount(long topicId, int increment);

FILE: acimage_community/src/main/java/com/acimage/community/service/topic/TopicWriteService.java
  type TopicWriteService (line 6) | public interface TopicWriteService {
    method save (line 7) | void save(Topic topic);
    method remove (line 8) | void remove(long id);
    method update (line 9) | void update(long id,String title,String content);
    method updateTitle (line 11) | void updateTitle(long id, String title);
    method updateContent (line 13) | void updateContent(TopicModifyHtmlReq topicModifyHtmlReq);
    method updateContent (line 15) | void updateContent(long id, String content);

FILE: acimage_community/src/main/java/com/acimage/community/utils/RsaUtils.java
  class RsaUtils (line 6) | public class RsaUtils {
    method decrypt (line 15) | public static String decrypt(String privateKeyBase64,String encryptBas...
    method getPrivateKey (line 20) | public static String getPrivateKey(){
    method getPublicKey (line 23) | public static String getPublicKey(){

FILE: acimage_community/src/main/java/com/acimage/community/web/controller/CategoryQueryController.java
  class CategoryQueryController (line 17) | @RestController
    method queryAllCategories (line 25) | @GetMapping("/all")

FILE: acimage_community/src/main/java/com/acimage/community/web/controller/CommentOperateController.java
  class CommentOperateController (line 20) | @RestController
    method addComment (line 28) | @RequestLimit(limitTimes = {1,20},
    method modifyComment (line 44) | @RequestLimit(limitTimes = {1,20},
    method deleteComment (line 60) | @RequestLimit(limitTimes = {1,20},

FILE: acimage_community/src/main/java/com/acimage/community/web/controller/CommentQueryController.java
  class CommentQueryController (line 19) | @RestController
    method pageTopicComments (line 27) | @GetMapping("/topicComments")
    method pageMyComments (line 34) | @GetMapping("/mine/{pageNo}")

FILE: acimage_community/src/main/java/com/acimage/community/web/controller/HomeCarouselQueryController.java
  class HomeCarouselQueryController (line 17) | @RestController
    method queryHomeCarousel (line 26) | @GetMapping("/list")

FILE: acimage_community/src/main/java/com/acimage/community/web/controller/StarOperateController.java
  class StarOperateController (line 21) | @RestController
    method addStar (line 34) | @RequestLimit(limitTimes = {1},
    method deleteStar (line 44) | @RequestLimit(limitTimes = {1},

FILE: acimage_community/src/main/java/com/acimage/community/web/controller/StarQueryController.java
  class StarQueryController (line 16) | @RestController
    method pageMyStars (line 27) | @GetMapping("/mine/{pageNo}")
    method isStar (line 32) | @GetMapping("/isStar/{topicId}")

FILE: acimage_community/src/main/java/com/acimage/community/web/controller/TagQueryController.java
  class TagQueryController (line 16) | @RestController
    method queryAllTags (line 24) | @GetMapping("/all")

FILE: acimage_community/src/main/java/com/acimage/community/web/controller/TopicOperateController.java
  class TopicOperateController (line 28) | @RestController
    method addTopic (line 40) | @RequestLimit(limitTimes = {1, 10}, durations = {3, TimeConstants.DAY_...
    method modifyTitle (line 66) | @RequestLimit(limitTimes = {1, 20}, durations = {3, TimeConstants.DAY_...
    method modifyHtml (line 78) | @RequestLimit(limitTimes = {1, 15}, durations = {3, TimeConstants.DAY_...
    method deleteTopic (line 85) | @RequestLimit(limitTimes = {1, 15}, durations = {3, TimeConstants.DAY_...

FILE: acimage_community/src/main/java/com/acimage/community/web/controller/TopicQueryController.java
  class TopicQueryController (line 33) | @RestController
    method queryTopicAndFirstCommentPage (line 44) | @RequestLimit(limitTimes = {15}, durations = {5}, penaltyTimes = {-1},...
    method pageByTagId (line 52) | @RequestLimit(limitTimes = {15}, durations = {5}, penaltyTimes = {-1},...
    method pageByCategoryId (line 58) | @RequestLimit(limitTimes = {20}, durations = {5}, penaltyTimes = {-1},...
    method pageTopicsBySort (line 64) | @RequestLimit(limitTimes = {15}, durations = {5}, penaltyTimes = {-1},...
    method combineHotTopics (line 73) | @RequestLimit(limitTimes = {15}, durations = {5}, penaltyTimes = {-1},...
    method queryRecentHotTopics (line 83) | @RequestLimit(limitTimes = {15}, durations = {5}, penaltyTimes = {-1},...
    method queryRecommendedTopics (line 91) | @RequestLimit(limitTimes = {15}, durations = {5}, penaltyTimes = {-1},...
    method queryMostCommentCountTopics (line 98) | @RequestLimit(limitTimes = {15}, durations = {5}, penaltyTimes = {-1},...
    method pageActiveTopics (line 106) | @RequestLimit(limitTimes = {15}, durations = {5}, penaltyTimes = {-1},...
    method queryMyTopics (line 113) | @RequestLimit(limitTimes = {15}, durations = {5}, penaltyTimes = {-1},...

FILE: acimage_community/src/main/java/com/acimage/community/web/controller/TopicSearchController.java
  class TopicSearchController (line 16) | @RestController
    method searchTopics (line 25) | @RequestLimit(limitTimes = {2}, durations = {1}, penaltyTimes = {-1}, ...

FILE: acimage_community/src/main/java/com/acimage/community/web/controller/UserRankController.java
  class UserRankController (line 21) | @RestController
    method rankByTopicCount (line 30) | @RequestLimit(limitTimes = {15}, durations = {5}, penaltyTimes = {-1},...

FILE: acimage_community/src/main/java/com/acimage/community/web/provider/CmtyUserProvider.java
  class CmtyUserProvider (line 16) | @RestController
    method queryCmtyUser (line 24) | @GetMapping("/userId/{userId}")

FILE: acimage_community/src/main/java/com/acimage/community/web/provider/CommentProvider.java
  class CommentProvider (line 19) | @RestController
    method deleteComment (line 29) | @RequestLimit(limitTimes = {1},durations = {3},penaltyTimes = {1},targ...

FILE: acimage_community/src/main/java/com/acimage/community/web/provider/TopicProvider.java
  class TopicProvider (line 15) | @RestController
    method queryTopics (line 26) | @GetMapping("/ids")
    method delete (line 31) | @DeleteMapping("/{topicId}")

FILE: acimage_community/src/test/java/com/acimage/community/CasualTest.java
  class CasualTest (line 16) | @SpringBootTest
    method testGetSnowflakeId (line 20) | @Test
    method testMd5 (line 32) | @Test
    method testUUID (line 38) | @Test
    method testPatternMatch (line 44) | @Test
    method testDateNow (line 51) | @Test
    method testSubAfter (line 60) | @Test
    method testListUtils (line 68) | @Test

FILE: acimage_community/src/test/java/com/acimage/community/CommunityApplicationTests.java
  class CommunityApplicationTests (line 6) | @SpringBootTest
    method contextLoads (line 9) | @Test

FILE: acimage_community/src/test/java/com/acimage/community/dao/CommentDaoTest.java
  class CommentDaoTest (line 11) | @SpringBootTest
    method testSelectList (line 15) | @Test
    method testCountComments (line 25) | @Test
    method testSelectCommentsWithTopicOrderByCreateTime (line 31) | @Test

FILE: acimage_community/src/test/java/com/acimage/community/dao/ImageDaoTest.java
  class ImageDaoTest (line 11) | @SpringBootTest
    method selectImagesWithTopic (line 16) | @Test

FILE: acimage_community/src/test/java/com/acimage/community/dao/StarDaoTest.java
  class StarDaoTest (line 11) | @SpringBootTest
    method countStarsByUserId (line 17) | @Test
    method countSelectStarsWithTopic (line 27) | @Test

FILE: acimage_community/src/test/java/com/acimage/community/dao/TopicDaoTest.java
  class TopicDaoTest (line 12) | @SpringBootTest
    method selectTopicWithUserImagesComments (line 18) | @Test
    method selectTopicsOrderByScan (line 23) | @Test
    method getTopicCount (line 30) | @Test
    method testSelectTopicCount (line 35) | @Test
    method testSelectTopicsWithUserOrderBy (line 42) | @Test

FILE: acimage_community/src/test/java/com/acimage/community/service/CommentWriteServiceTest.java
  class CommentWriteServiceTest (line 11) | @SpringBootTest

FILE: acimage_community/src/test/java/com/acimage/community/service/TopicEsSearchServiceTest.java
  class TopicEsSearchServiceTest (line 8) | @SpringBootTest

FILE: acimage_community/src/test/java/com/acimage/community/utils/RedisTest.java
  class RedisTest (line 21) | @SpringBootTest
    method testStringRedisTemplate (line 34) | @Test
    method testOpsForList (line 40) | @Test
    method testOpsForValue (line 48) | @Test
    method testRedisUtilsForList (line 72) | @Test
    method testRedisUtilsForObject (line 92) | @Test
    method testZSet (line 107) | @Test
    method testAddForZSet (line 131) | @Test
    method testRedisTransaction (line 139) | @Test
    method testHyperLogLog (line 149) | @Test
    method testSet (line 159) | @Test
    method testExpire (line 165) | @Test
    method testHash (line 175) | @Test
    method testLuaScriptIncrementIfPresent (line 181) | @Test

FILE: acimage_feign/src/main/java/com/acimage/feign/FeignMain.java
  class FeignMain (line 7) | public class FeignMain
    method main (line 9) | public static void main( String[] args ) {

FILE: acimage_feign/src/main/java/com/acimage/feign/client/CmtyUserClient.java
  type CmtyUserClient (line 11) | @FeignClient(value="community-service/community/cmtyUsers",fallbackFacto...
    method queryCmtyUser (line 14) | @GetMapping("/userId/{userId}")

FILE: acimage_feign/src/main/java/com/acimage/feign/client/CommentClient.java
  type CommentClient (line 13) | @FeignClient(value="community-service/community/comments",fallbackFactor...
    method delete (line 16) | @DeleteMapping("/{id}")

FILE: acimage_feign/src/main/java/com/acimage/feign/client/TopicClient.java
  type TopicClient (line 15) | @FeignClient(value="community-service/community/topics",fallbackFactory ...
    method queryTopics (line 18) | @GetMapping("/ids")
    method delete (line 21) | @DeleteMapping("/{topicId}")

FILE: acimage_feign/src/main/java/com/acimage/feign/client/UserClient.java
  type UserClient (line 10) | @FeignClient(value="user-service/user/users",fallbackFactory = UserClien...
    method queryUser (line 12) | @GetMapping("/id/{id}")
    method modifyPhotoUrl (line 15) | @PutMapping("/photoUrl")

FILE: acimage_feign/src/main/java/com/acimage/feign/config/FallbackFactoryBean.java
  class FallbackFactoryBean (line 10) | public class FallbackFactoryBean {
    method imageClientFallbackFactory (line 12) | @Bean
    method userClientFallbackFactory (line 17) | @Bean

FILE: acimage_feign/src/main/java/com/acimage/feign/config/FeignMultipartSupportConfig.java
  class FeignMultipartSupportConfig (line 11) | @Configuration
    method feignFormEncoder (line 14) | @Bean

FILE: acimage_feign/src/main/java/com/acimage/feign/config/FeignRequestInterceptorConfig.java
  class FeignRequestInterceptorConfig (line 16) | @Slf4j
    method apply (line 20) | @Override

FILE: acimage_feign/src/main/java/com/acimage/feign/depreted/FileClient.java
  type FileClient (line 11) | @FeignClient(value="image-service/api/image/hashImages")
    method sayHello (line 13) | @GetMapping("sayHello")
    method deleteImageHashes (line 16) | @DeleteMapping
    method storeImageFiles (line 25) | @Deprecated
    method storePhotoFiles (line 29) | @PostMapping(value = "/uploadPhoto",produces = {MediaType.APPLICATION_...

FILE: acimage_feign/src/main/java/com/acimage/feign/depreted/ImageClient.java
  type ImageClient (line 15) | @FeignClient(value="image-service/image/images",fallbackFactory = ImageC...
    method queryImagesWithTopic (line 17) | @GetMapping("/imageIds")
    method queryTopicImages (line 20) | @GetMapping("/topicId/{topicId}")
    method updateTopicIdAndReturnFirstImageUrl (line 24) | @GetMapping("/preparedTopicImages")

FILE: acimage_feign/src/main/java/com/acimage/feign/fallback/CmtyUserClientFallbackFactory.java
  class CmtyUserClientFallbackFactory (line 11) | @Component
    method create (line 14) | @Override

FILE: acimage_feign/src/main/java/com/acimage/feign/fallback/CommentClientFallbackFactory.java
  class CommentClientFallbackFactory (line 16) | @Slf4j
    method create (line 19) | @Override

FILE: acimage_feign/src/main/java/com/acimage/feign/fallback/ImageClientFallbackFactory.java
  class ImageClientFallbackFactory (line 16) | @Component
    method create (line 20) | @Override

FILE: acimage_feign/src/main/java/com/acimage/feign/fallback/TopicClientFallbackFactory.java
  class TopicClientFallbackFactory (line 16) | @Slf4j
    method create (line 19) | @Override

FILE: acimage_feign/src/main/java/com/acimage/feign/fallback/UserClientFallbackFactory.java
  class UserClientFallbackFactory (line 12) | @Component
    method create (line 15) | @Override

FILE: acimage_gateway/src/main/java/com/acimage/gateway/GatewayApplication.java
  class GatewayApplication (line 13) | @Slf4j
    method main (line 20) | public static void main(String[] args) {

FILE: acimage_gateway/src/main/java/com/acimage/gateway/apitree/ApiTree.java
  class ApiTree (line 13) | @NoArgsConstructor

FILE: acimage_gateway/src/main/java/com/acimage/gateway/apitree/ApiTreeFactory.java
  class ApiTreeFactory (line 7) | @Component

FILE: acimage_gateway/src/main/java/com/acimage/gateway/apitree/ApiTreeUtils.java
  class ApiTreeUtils (line 14) | @Slf4j
    method getMatchApi (line 17) | public static Api getMatchApi(ApiTree apiTree, String path, HttpMethod...
    method recursiveMatch (line 36) | private static Api recursiveMatch(ApiTree apiTree, List<String> splits...
    method buildApiTreeFrom (line 104) | public static ApiTree buildApiTreeFrom(List<Api> apiList) {
    method comparator (line 147) | private static int comparator(Api next, Api cur) {
    method orderOf (line 166) | private static int orderOf(String s) {

FILE: acimage_gateway/src/main/java/com/acimage/gateway/apitree/InitApiTreeApplicationRunner.java
  class InitApiTreeApplicationRunner (line 13) | @Slf4j
    method run (line 23) | @Override

FILE: acimage_gateway/src/main/java/com/acimage/gateway/config/KeySolverConfig.java
  class KeySolverConfig (line 13) | @Slf4j
    method ipKeyResolver (line 17) | @Bean

FILE: acimage_gateway/src/main/java/com/acimage/gateway/config/RoleConfig.java
  class RoleConfig (line 7) | @Configuration

FILE: acimage_gateway/src/main/java/com/acimage/gateway/dao/ApiDao.java
  type ApiDao (line 6) | public interface ApiDao extends BaseMapper<Api> {

FILE: acimage_gateway/src/main/java/com/acimage/gateway/dao/AuthorizeDao.java
  type AuthorizeDao (line 6) | public interface AuthorizeDao extends BaseMapper<Authorize> {

FILE: acimage_gateway/src/main/java/com/acimage/gateway/dao/PermissionDao.java
  type PermissionDao (line 10) | public interface PermissionDao extends BaseMapper<Permission> {
    method selectTreeByParentId (line 12) | List<Permission> selectTreeByParentId(@Nullable @Param("parentId") Int...
    method selectPermissionsWithParent (line 14) | List<Permission> selectPermissionsWithParent(@Param("startIndex") int ...

FILE: acimage_gateway/src/main/java/com/acimage/gateway/dao/RoleDao.java
  type RoleDao (line 6) | public interface RoleDao extends BaseMapper<Role> {

FILE: acimage_gateway/src/main/java/com/acimage/gateway/dao/UserRoleDao.java
  type UserRoleDao (line 7) | public interface UserRoleDao extends BaseMapper<UserRole> {

FILE: acimage_gateway/src/main/java/com/acimage/gateway/global/consts/NotationConstants.java
  class NotationConstants (line 3) | public class NotationConstants {

FILE: acimage_gateway/src/main/java/com/acimage/gateway/globalfilter/AuthenticationFilter.java
  class AuthenticationFilter (line 27) | @Slf4j
    method filter (line 36) | @Override
    method hasRecorded (line 89) | private boolean hasRecorded(String token) {

FILE: acimage_gateway/src/main/java/com/acimage/gateway/globalfilter/CustomWebsocketRoutingFilter.java
  class CustomWebsocketRoutingFilter (line 32) | @Component
    method CustomWebsocketRoutingFilter (line 42) | public CustomWebsocketRoutingFilter(WebSocketClient webSocketClient, W...
    method convertHttpToWs (line 48) | static String convertHttpToWs(String scheme) {
    method getOrder (line 53) | @Override
    method filter (line 58) | @Override
    method getProtocols (line 75) | List<String> getProtocols(HttpHeaders headers) {
    method getHeadersFilters (line 91) | List<HttpHeadersFilter> getHeadersFilters() {
    method changeSchemeIfIsWebSocketUpgrade (line 124) | static void changeSchemeIfIsWebSocketUpgrade(ServerWebExchange exchang...
    class ProxyWebSocketHandler (line 140) | private static class ProxyWebSocketHandler implements WebSocketHandler {
      method ProxyWebSocketHandler (line 146) | ProxyWebSocketHandler(URI url, WebSocketClient client, HttpHeaders h...
      method getSubProtocols (line 158) | @Override
      method handle (line 163) | @Override

FILE: acimage_gateway/src/main/java/com/acimage/gateway/globalfilter/PermissionFilter.java
  class PermissionFilter (line 28) | @Slf4j
    method filter (line 41) | @Override

FILE: acimage_gateway/src/main/java/com/acimage/gateway/globalfilter/RemoveContextFilter.java
  class RemoveContextFilter (line 12) | @Slf4j
    method filter (line 16) | @Override

FILE: acimage_gateway/src/main/java/com/acimage/gateway/globalfilter/RequestLimitFilter.java
  class RequestLimitFilter (line 19) | @Slf4j
    method filter (line 29) | @Override

FILE: acimage_gateway/src/main/java/com/acimage/gateway/schedule/RefreshApiTreeSchedule.java
  class RefreshApiTreeSchedule (line 13) | @Slf4j
    method refreshApiTree (line 27) | @Scheduled(cron ="0 */10 * * * ?")

FILE: acimage_gateway/src/main/java/com/acimage/gateway/serivce/ApiQueryService.java
  type ApiQueryService (line 7) | public interface ApiQueryService {
    method listEnableApis (line 8) | List<Api> listEnableApis();

FILE: acimage_gateway/src/main/java/com/acimage/gateway/serivce/AuthorizeQueryService.java
  type AuthorizeQueryService (line 8) | public interface AuthorizeQueryService {
    method getRolePermissionIdsMap (line 11) | Map<Integer, List<Integer>> getRolePermissionIdsMap();
    method listPermissionIds (line 13) | List<Integer> listPermissionIds(Integer roleId);
    method listAll (line 15) | List<Authorize> listAll();

FILE: acimage_gateway/src/main/java/com/acimage/gateway/serivce/RoleQueryService.java
  type RoleQueryService (line 5) | public interface RoleQueryService {
    method listAllIds (line 6) | List<Integer> listAllIds();

FILE: acimage_gateway/src/main/java/com/acimage/gateway/serivce/UserRoleQueryService.java
  type UserRoleQueryService (line 5) | public interface UserRoleQueryService {
    method listRoleIds (line 6) | List<Integer> listRoleIds(long userId);

FILE: acimage_gateway/src/main/java/com/acimage/gateway/serivce/impl/ApiQueryQueryServiceImpl.java
  class ApiQueryQueryServiceImpl (line 14) | @Service
    method listEnableApis (line 19) | @Override

FILE: acimage_gateway/src/main/java/com/acimage/gateway/serivce/impl/AuthorizeQueryServiceImpl.java
  class AuthorizeQueryServiceImpl (line 20) | @Service
    method getRolePermissionIdsMap (line 26) | @Override
    method listPermissionIds (line 31) | @Override
    method listAll (line 39) | @Override
    method refreshRoleIdToPermissionIdsMap (line 44) | @Scheduled(fixedRate = 5L, timeUnit = TimeUnit.MINUTES)

FILE: acimage_gateway/src/main/java/com/acimage/gateway/serivce/impl/RoleQueryServiceImpl.java
  class RoleQueryServiceImpl (line 13) | @Service
    method listAllIds (line 18) | @Override

FILE: acimage_gateway/src/main/java/com/acimage/gateway/serivce/impl/UserRoleQueryQueryServiceImpl.java
  class UserRoleQueryQueryServiceImpl (line 14) | @Service
    method listRoleIds (line 19) | @QueryRedis(keyPrefix = "acimage:gateway:permissionIds:userId:",expire...

FILE: acimage_gateway/src/test/java/com/acimage/gateway/GatewayApplicationTest.java
  class GatewayApplicationTest (line 16) | @SpringBootTest

FILE: acimage_gateway/src/test/java/com/acimage/gateway/apitree/ApiTreeTest.java
  class ApiTreeTest (line 13) | @SpringBootTest
    method testApiTree (line 19) | @Test
    method testApiTree2 (line 32) | @Test

FILE: acimage_image/src/main/java/com/acimage/image/ImageApplication.java
  class ImageApplication (line 12) | @Slf4j
    method main (line 21) | public static void main(String[] args) {

FILE: acimage_image/src/main/java/com/acimage/image/dao/ImageDao.java
  type ImageDao (line 11) | public interface ImageDao extends BaseMapper<Image> {
    method insertList (line 13) | Integer insertList(List<Image> images);
    method updateDescription (line 15) | Integer updateDescription(List<Pair<Long,String>> idAndDescriptions);
    method selectListOrderById (line 17) | @Select("select * from tb_image where topic_id=#{topicId} order by id")

FILE: acimage_image/src/main/java/com/acimage/image/dao/ImageHashDao.java
  type ImageHashDao (line 6) | public interface ImageHashDao extends BaseMapper<ImageHash> {

FILE: acimage_image/src/main/java/com/acimage/image/global/consts/MyFileConstants.java
  class MyFileConstants (line 3) | public class MyFileConstants {

FILE: acimage_image/src/main/java/com/acimage/image/global/consts/TopicImageKeyConstants.java
  class TopicImageKeyConstants (line 3) | public class TopicImageKeyConstants {

FILE: acimage_image/src/main/java/com/acimage/image/global/context/DirectoryContext.java
  class DirectoryContext (line 9) | public class DirectoryContext {
    method init (line 19) | @PostConstruct

FILE: acimage_image/src/main/java/com/acimage/image/mq/consumer/SyncImagesConsumer.java
  class SyncImagesConsumer (line 22) | @Slf4j
    method syncImages (line 29) | @RabbitHandler

FILE: acimage_image/src/main/java/com/acimage/image/service/config/DhashTaskPoolConfig.java
  class DhashTaskPoolConfig (line 11) | @Deprecated
    method imageDhashExecutor (line 16) | @Bean(name = DHASH_TASK_POOL)

FILE: acimage_image/src/main/java/com/acimage/image/service/image/ImageMixWriteService.java
  type ImageMixWriteService (line 9) | public interface ImageMixWriteService {
    method saveImage (line 12) | String saveImage(MultipartFile imageFile);
    method removeTopicPartialImages (line 14) | void removeTopicPartialImages(long topicId, List<String> imageUrls);
    method removeTopicImages (line 16) | void removeTopicImages(long topicId);
    method updateImageAndHash (line 18) | void updateImageAndHash(SyncImagesUpdateDto updateDto);

FILE: acimage_image/src/main/java/com/acimage/image/service/image/ImageQueryService.java
  type ImageQueryService (line 7) | public interface ImageQueryService {
    method listImagesOrderById (line 8) | List<Image> listImagesOrderById(long topicId);
    method listImagesByIds (line 10) | List<Image> listImagesByIds(List<Long> imageIds);
    method listImageIds (line 12) | List<Long> listImageIds(long topicId, List<String> imageUrls);
    method listImageIds (line 14) | List<Long> listImageIds(long topicId);
    method listImagesForHavingNullTopicId (line 16) | List<Image> listImagesForHavingNullTopicId(List<String> imageUrls);

FILE: acimage_image/src/main/java/com/acimage/image/service/image/ImageWriteService.java
  type ImageWriteService (line 12) | public interface ImageWriteService extends IService<Image> {
    method saveImages (line 14) | @Deprecated
    method saveImage (line 16) | Image saveImage(String url,int size,String fileName);
    method removeImages (line 17) | void removeImages(long topicId);
    method removeImages (line 19) | int removeImages(long topicId, List<String> imageUrls);
    method updateTopicId (line 21) | void updateTopicId(List<Long> imageIds,long topicId);
    method updateTopicIdForHavingNullTopicId (line 23) | void updateTopicIdForHavingNullTopicId(List<Long> imageIds, long topic...

FILE: acimage_image/src/main/java/com/acimage/image/service/image/impl/ImageMixWriteServiceImpl.java
  class ImageMixWriteServiceImpl (line 29) | @Slf4j
    method init (line 35) | @PostConstruct
    method saveImage (line 56) | @Override
    method removeTopicPartialImages (line 82) | @Override
    method removeTopicImages (line 95) | @Override
    method updateImageAndHash (line 106) | @Override

FILE: acimage_image/src/main/java/com/acimage/image/service/image/impl/ImageQueryServiceImpl.java
  class ImageQueryServiceImpl (line 18) | @Service
    method listImagesOrderById (line 23) | @QueryRedis(keyPrefix = TopicImageKeyConstants.STRINGKP_TOPIC_IMAGES, ...
    method listImagesByIds (line 33) | @Override
    method listImageIds (line 57) | @Override
    method listImageIds (line 72) | @Override
    method listImagesForHavingNullTopicId (line 82) | @Override

FILE: acimage_image/src/main/java/com/acimage/image/service/image/impl/ImageWriteServiceImpl.java
  class ImageWriteServiceImpl (line 34) | @Slf4j
    method saveImages (line 49) | @Override
    method saveImage (line 57) | @Override
    method removeImages (line 74) | @Override
    method removeImages (line 83) | @Override
    method updateTopicId (line 91) | @Override
    method updateTopicIdForHavingNullTopicId (line 102) | @Override

FILE: acimage_image/src/main/java/com/acimage/image/service/imagehash/ImageHashWriteService.java
  type ImageHashWriteService (line 6) | public interface ImageHashWriteService {
    method removeImageHashes (line 8) | void removeImageHashes(List<Long> imageIds);
    method HashImagesByDhash (line 10) | void HashImagesByDhash(InputStream imageInputStream, long imageId) ;

FILE: acimage_image/src/main/java/com/acimage/image/service/imagehash/SearchImageService.java
  type SearchImageService (line 9) | public interface SearchImageService {
    method processImagesHashForNotProcessedImages (line 10) | @Deprecated
    method hashImageByDhashAlgorithm (line 13) | void hashImageByDhashAlgorithm(InputStream imageInputStream, long imag...
    method searchMostSimilarImages (line 15) | List<Image> searchMostSimilarImages(MultipartFile imageFile);
    method removeImageHashes (line 17) | void removeImageHashes(List<Long> imageIds);

FILE: acimage_image/src/main/java/com/acimage/image/service/imagehash/impl/ImageHashWriteServiceImpl.java
  class ImageHashWriteServiceImpl (line 19) | @Service
    method removeImageHashes (line 25) | @Override
    method HashImagesByDhash (line 33) | @Override

FILE: acimage_image/src/main/java/com/acimage/image/service/imagehash/impl/SearchImageServiceImpl.java
  class SearchImageServiceImpl (line 32) | @Slf4j
    method processImagesHashForNotProcessedImages (line 46) | @Override
    method hashImageByDhashAlgorithm (line 92) | @Override
    method searchMostSimilarImages (line 111) | @Override
    method removeImageHashes (line 185) | @Override

FILE: acimage_image/src/main/java/com/acimage/image/service/photo/PhotoService.java
  type PhotoService (line 5) | public interface PhotoService {
    method uploadPhotoAndUpdatePhotoUrl (line 6) | String uploadPhotoAndUpdatePhotoUrl(MultipartFile photoFile);

FILE: acimage_image/src/main/java/com/acimage/image/service/photo/impl/PhotoServiceImpl.java
  class PhotoServiceImpl (line 19) | @Service
    method uploadPhotoAndUpdatePhotoUrl (line 29) | @Override

FILE: acimage_image/src/main/java/com/acimage/image/utils/BitUtils.java
  class BitUtils (line 3) | public class BitUtils {
    method getBit (line 4) | public static int getBit(long value, int index) {
    method str64ToLong (line 29) | public static long str64ToLong(String str64){
    method longToStr64 (line 55) | public static  String longToStr64(long value){
    method sumOfBits (line 63) | public static int sumOfBits(long value){

FILE: acimage_image/src/main/java/com/acimage/image/utils/DhashUtils.java
  class DhashUtils (line 15) | public class DhashUtils {
    method getImageDhashFrom (line 16) | public static long getImageDhashFrom(@NotNull InputStream inputStream)...
    method distanceBetween (line 42) | public static int distanceBetween(@NotNull InputStream inputStream1, @...
    method distanceBetween (line 48) | public static int distanceBetween(long hashValue1, long hashValue2) {
    method hammingDistanceBetween (line 54) | private static int hammingDistanceBetween(@NotNull String str1, @NotNu...

FILE: acimage_image/src/main/java/com/acimage/image/utils/ImageFileUtils.java
  class ImageFileUtils (line 8) | public class ImageFileUtils {
    method imageIdToImagePath (line 9) | public static String imageIdToImagePath(@NotNull Long imageId){

FILE: acimage_image/src/main/java/com/acimage/image/utils/ImageUtils.java
  class ImageUtils (line 3) | public class ImageUtils {
    method rgb2Gray (line 4) | public static int rgb2Gray(int r, int g, int b) {

FILE: acimage_image/src/main/java/com/acimage/image/web/config/WebMvcConfig.java
  class WebMvcConfig (line 18) | @Slf4j
    method addInterceptors (line 25) | @Override

FILE: acimage_image/src/main/java/com/acimage/image/web/controller/ImageOperateController.java
  class ImageOperateController (line 21) | @RestController
    method uploadTopicImage (line 30) | @RequestLimit(limitTimes = {1, 20},

FILE: acimage_image/src/main/java/com/acimage/image/web/controller/PhotoOperateController.java
  class PhotoOperateController (line 20) | @RestController
    method uploadPhoto (line 29) | @RequestLimit(limitTimes = {1,3},

FILE: acimage_image/src/main/java/com/acimage/image/web/controller/SearchImageController.java
  class SearchImageController (line 18) | @RestController
    method searchImageWithTopicByImage (line 28) | @RequestLimit(limitTimes = {1,10}, durations = {3,1}, penaltyTimes = {...

FILE: acimage_image/src/main/java/com/acimage/image/web/provider/ImageProvider.java
  class ImageProvider (line 18) | @RestController
    method queryTopicImages (line 28) | @GetMapping("/topicId/{topicId}")

FILE: acimage_image/src/test/java/com/acimage/image/CasualTest.java
  class CasualTest (line 22) | @SpringBootTest
    method testGetSnowflakeId (line 25) | @Test
    method testMd5 (line 35) | @Test
    method testUUID (line 41) | @Test
    method testPatternMatch (line 47) | @Test
    method testDateNow (line 54) | @Test
    method testSubAfter (line 64) | @Test
    method testTh (line 72) | @Test
    method testGetImageDhashFrom (line 91) | @Test
    method testImageScale (line 105) | @Test
    method testBitUtils (line 120) | @Test
    method test89 (line 129) | @Test

FILE: acimage_image/src/test/java/com/acimage/image/ImageApplicationTests.java
  class ImageApplicationTests (line 6) | @SpringBootTest
    method contextLoads (line 9) | @Test

FILE: acimage_image/src/test/java/com/acimage/image/dao/ImageDaoTest.java
  class ImageDaoTest (line 12) | @SpringBootTest
    method testSelectAll (line 17) | @Test

FILE: acimage_image/src/test/java/com/acimage/image/dao/ImageHashDaoDaoTest.java
  class ImageHashDaoDaoTest (line 11) | @SpringBootTest
    method testSelectAll (line 16) | @Test

FILE: acimage_image/src/test/java/com/acimage/image/service/FileServiceTest.java
  class FileServiceTest (line 16) | @SpringBootTest
    method searchMostSimilarImagesTest (line 24) | @Test

FILE: acimage_image/src/test/java/com/acimage/image/service/SearchImageServiceTest.java
  class SearchImageServiceTest (line 15) | @SpringBootTest
    method processImagesHashForNotProcessedImagesTest (line 21) | @Test

FILE: acimage_image/src/test/java/com/acimage/image/utils/ImageHashDaoUtilsTest.java
  class ImageHashDaoUtilsTest (line 18) | @SpringBootTest
    method scaleImageTest (line 21) | @Test
    method getImageDhashFromTest (line 40) | @Test
    method imageDistanceTest (line 54) | @Test
    method bitUtilsTest (line 69) | @Test

FILE: acimage_user/src/main/java/com/acimage/user/UserApplication.java
  class UserApplication (line 13) | @Slf4j
    method main (line 22) | public static void main(String[] args) {

FILE: acimage_user/src/main/java/com/acimage/user/dao/CommentMsgDao.java
  type CommentMsgDao (line 9) | public interface CommentMsgDao extends BaseMapper<CommentMsg> {
    method selectCommentMsgsWithUser (line 11) | List<CommentMsg> selectCommentMsgsWithUser(@Param("toUserId") long toU...

FILE: acimage_user/src/main/java/com/acimage/user/dao/UserDao.java
  type UserDao (line 7) | public interface UserDao extends BaseMapper<User> {

FILE: acimage_user/src/main/java/com/acimage/user/dao/UserMsgDao.java
  type UserMsgDao (line 8) | public interface UserMsgDao extends BaseMapper<UserMsg> {
    method increaseColumn (line 10) | @Update("update tb_user_msg set ${column}=${column}+#{increment} where...

FILE: acimage_user/src/main/java/com/acimage/user/dao/UserPrivacyDao.java
  type UserPrivacyDao (line 9) | public interface UserPrivacyDao extends BaseMapper<UserPrivacy> {

FILE: acimage_user/src/main/java/com/acimage/user/global/config/WebMvcConfig.java
  class WebMvcConfig (line 17) | @Slf4j
    method addInterceptors (line 24) | @Override

FILE: acimage_user/src/main/java/com/acimage/user/global/config/WebSocketConfig.java
  class WebSocketConfig (line 11) | @Configuration
    method serverEndpointExporter (line 16) | @Bean
    method registerWebSocketHandlers (line 27) | @Override

FILE: acimage_user/src/main/java/com/acimage/user/global/consts/PageSizeConsts.java
  class PageSizeConsts (line 3) | public class PageSizeConsts {

FILE: acimage_user/src/main/java/com/acimage/user/global/consts/StorePrefixConst.java
  class StorePrefixConst (line 3) | public class StorePrefixConst {

FILE: acimage_user/src/main/java/com/acimage/user/global/consts/WebSocketSessionConstants.java
  class WebSocketSessionConstants (line 3) | public class WebSocketSessionConstants {

FILE: acimage_user/src/main/java/com/acimage/user/model/request/UserLoginReq.java
  class UserLoginReq (line 9) | @Data

FILE: acimage_user/src/main/java/com/acimage/user/model/request/UserRegisterReq.java
  class UserRegisterReq (line 10) | @Data

FILE: acimage_user/src/main/java/com/acimage/user/model/vo/ProfileVo.java
  class ProfileVo (line 9) | @Data

FILE: acimage_user/src/main/java/com/acimage/user/mq/config/SyncUserMqConfig.java
  class SyncUserMqConfig (line 10) | @Configuration
    method syncUserQueue (line 15) | @Bean
    method syncUserExchange (line 27) | @Bean
    method syncUserBinding (line 33) | @Bean
    method createExchangeQueueForSyncUser (line 39) | @Bean

FILE: acimage_user/src/main/java/com/acimage/user/mq/consumer/UserMsgConsumer.java
  class UserMsgConsumer (line 25) | @Slf4j
    method commentMsg (line 37) | @RabbitHandler

FILE: acimage_user/src/main/java/com/acimage/user/mq/producer/SyncUserMqProducer.java
  class SyncUserMqProducer (line 11) | @Component
    method sendSyncUsernameMessage (line 17) | public void sendSyncUsernameMessage(UserIdWithUsername userIdWithUsern...
    method sendSyncUserPhotoUrlMessage (line 21) | public void sendSyncUserPhotoUrlMessage(UserIdWithPhotoUrl userIdWithP...
    method sendAddUserMessage (line 25) | public void sendAddUserMessage(CmtyUser cmtyUser){

FILE: acimage_user/src/main/java/com/acimage/user/service/commentmsg/CommentMsgQueryService.java
  type CommentMsgQueryService (line 6) | public interface CommentMsgQueryService {
    method pageMyCommentMsg (line 7) | MyPage<CommentMsg> pageMyCommentMsg(long userId, int pageNo, int pageS...

FILE: acimage_user/src/main/java/com/acimage/user/service/commentmsg/CommentMsgWriteService.java
  type CommentMsgWriteService (line 5) | public interface CommentMsgWriteService {
    method insert (line 6) | void insert(CommentMsg commentMsg);

FILE: acimage_user/src/main/java/com/acimage/user/service/commentmsg/impl/CommentMsgQueryServiceImpl.java
  class CommentMsgQueryServiceImpl (line 16) | @Service
    method pageMyCommentMsg (line 21) | @Override

FILE: acimage_user/src/main/java/com/acimage/user/service/commentmsg/impl/CommentMsgWriteServiceImpl.java
  class CommentMsgWriteServiceImpl (line 9) | @Service
    method insert (line 14) | @Override

FILE: acimage_user/src/main/java/com/acimage/user/service/mail/MainService.java
  type MainService (line 5) | public interface MainService {
    method sendTextMailMessage (line 6) | void sendTextMailMessage(String to, String subject, String text);
    method sendVerifyCodeMailMessage (line 8) | void sendVerifyCodeMailMessage(String to, String code, int timeoutMinu...

FILE: acimage_user/src/main/java/com/acimage/user/service/mail/impl/MailServiceImpl.java
  class MailServiceImpl (line 14) | @Service
    method sendTextMailMessage (line 29) | @Override
    method sendVerifyCodeMailMessage (line 59) | @Override

FILE: acimage_user/src/main/java/com/acimage/user/service/user/LoginService.java
  type LoginService (line 13) | public interface LoginService {
    method getPublicKey (line 15) | String getPublicKey();
    method registerUser (line 17) | @Transactional
    method login (line 20) | @Transactional
    method logout (line 24) | void logout(HttpServletRequest request);
    method checkAndSendCodeToEmail (line 26) | void checkAndSendCodeToEmail(String email);

FILE: acimage_user/src/main/java/com/acimage/user/service/user/UserInfoService.java
  type UserInfoService (line 8) | public interface UserInfoService {
    method getProfile (line 9) | ProfileVo getProfile();

FILE: acimage_user/src/main/java/com/acimage/user/service/user/UserQueryService.java
  type UserQueryService (line 6) | public interface UserQueryService {
    method getUser (line 7) | User getUser(long userId);
    method isUsernameExist (line 8) | Boolean isUsernameExist(String username);

FILE: acimage_user/src/main/java/com/acimage/user/service/user/UserRankService.java
  type UserRankService (line 7) | public interface UserRankService {
    method pageUsersRankByStarCount (line 9) | List<User> pageUsersRankByStarCount();

FILE: acimage_user/src/main/java/com/acimage/user/service/user/UserWriteService.java
  type UserWriteService (line 8) | public interface UserWriteService {
    method updateUsername (line 9) | @Transactional
    method uploadPhotoAndUpdatePhotoUrl (line 12) | @Deprecated
    method updatePhotoUrl (line 17) | String updatePhotoUrl(String newPhotoUrl);

FILE: acimage_user/src/main/java/com/acimage/user/service/user/consts/KeyConstants.java
  class KeyConstants (line 3) | public class KeyConstants {

FILE: acimage_user/src/main/java/com/acimage/user/service/user/impl/LoginServiceImpl.java
  class LoginServiceImpl (line 36) | @Slf4j
    method getPublicKey (line 58) | @Override
    method registerUser (line 63) | @Override
    method login (line 126) | @Override
    method logout (line 161) | @Override
    method checkAndSendCodeToEmail (line 168) | @Override

FILE: acimage_user/src/main/java/com/acimage/user/service/user/impl/UserInfoServiceImpl.java
  class UserInfoServiceImpl (line 22) | @Service
    method getProfile (line 34) | @QueryRedis(keyPrefix = "acimage:users:profile:userId:", expire = 2L, ...

FILE: acimage_user/src/main/java/com/acimage/user/service/user/impl/UserQueryServiceImpl.java
  class UserQueryServiceImpl (line 19) | @Slf4j
    method getUser (line 25) | @QueryRedis(keyPrefix = KeyConstants.STRINGKP_USER, expire = 37L)
    method isUsernameExist (line 36) | @QueryRedis(keyPrefix = KeyConstants.STRINGKP_USERNAME, expire = 17L, ...

FILE: acimage_user/src/main/java/com/acimage/user/service/user/impl/UserRankServiceImpl.java
  class UserRankServiceImpl (line 9) | public class UserRankServiceImpl implements UserRankService {
    method pageUsersRankByStarCount (line 10) | @Override

FILE: acimage_user/src/main/java/com/acimage/user/service/user/impl/UserWriteServiceImpl.java
  class UserWriteServiceImpl (line 32) | @Slf4j
    method updateUsername (line 47) | @Override
    method uploadPhotoAndUpdatePhotoUrl (line 68) | @Override
    method updatePhotoUrl (line 101) | @Override

FILE: acimage_user/src/main/java/com/acimage/user/service/usermsg/UserMsgQueryService.java
  type UserMsgQueryService (line 6) | public interface UserMsgQueryService {
    method getMsgCount (line 8) | Integer getMsgCount(long userId);

FILE: acimage_user/src/main/java/com/acimage/user/service/usermsg/UserMsgWriteService.java
  type UserMsgWriteService (line 6) | public interface UserMsgWriteService {
    method insert (line 8) | void insert(long userId);
    method increaseMsg (line 10) | void increaseMsg(long userId, SFunction<UserMsg, ?> column, int increm...
    method resetMsgCount (line 12) | void resetMsgCount(long userId, SFunction<UserMsg, ?> column);

FILE: acimage_user/src/main/java/com/acimage/user/service/usermsg/impl/UserMsgQueryServiceImpl.java
  class UserMsgQueryServiceImpl (line 11) | @Service
    method getMsgCount (line 16) | @Override

FILE: acimage_user/src/main/java/com/acimage/user/service/usermsg/impl/UserMsgWriteServiceImpl.java
  class UserMsgWriteServiceImpl (line 12) | @Service
    method insert (line 17) | @Override
    method increaseMsg (line 24) | @Override
    method resetMsgCount (line 30) | @Override

FILE: acimage_user/src/main/java/com/acimage/user/service/verify/VerifyCodeService.java
  type VerifyCodeService (line 6) | public interface VerifyCodeService {
    method writeCodeImageToResponseAndRecord (line 7) | void writeCodeImageToResponseAndRecord(HttpServletRequest request, Htt...
    method verifyAndRemoveIfSuccess (line 9) | boolean verifyAndRemoveIfSuccess(HttpServletRequest request, String co...
    method sendVerifyCodeToEmail (line 11) | void sendVerifyCodeToEmail(String email,int length);
    method verifyEmailByVerifyCode (line 13) | boolean verifyEmailByVerifyCode(String email, String code);

FILE: acimage_user/src/main/java/com/acimage/user/service/verify/impl/VerifyCodeServiceImpl.java
  class VerifyCodeServiceImpl (line 20) | @Slf4j
    method writeCodeImageToResponseAndRecord (line 30) | @Override
    method verifyAndRemoveIfSuccess (line 62) | @Override
    method sendVerifyCodeToEmail (line 79) | @Override
    method verifyEmailByVerifyCode (line 88) | @Override

FILE: acimage_user/src/main/java/com/acimage/user/web/controller/LoginController.java
  class LoginController (line 25) | @Slf4j
    method isUsernameExist (line 39) | @RequestLimit(limitTimes = {1}, durations = {1}, penaltyTimes = {-1}, ...
    method getPublicKey (line 46) | @GetMapping("/getPublicKey")
    method sendVerifyCodeToEmail (line 51) | @RequestLimit(limitTimes = {1,5}, durations = {2,1}, penaltyTimes = {-...
    method register (line 59) | @RequestLimit(limitTimes = {1}, durations = {2}, penaltyTimes = {-1}, ...
    method login (line 85) | @RequestLimit(limitTimes = {1}, durations = {2}, penaltyTimes = {-1}, ...
    method logout (line 98) | @PostMapping("/logout")

FILE: acimage_user/src/main/java/com/acimage/user/web/controller/MessageController.java
  class MessageController (line 19) | @Slf4j
    method pageCommentMessages (line 29) | @GetMapping("/comments/page/{pageNo}/{pageSize}")

FILE: acimage_user/src/main/java/com/acimage/user/web/controller/UserOperateController.java
  class UserOperateController (line 21) | @Slf4j
    method modifyUsername (line 30) | @RequestLimit(limitTimes = {1}, durations = {2}, penaltyTimes = {-1}, ...

FILE: acimage_user/src/main/java/com/acimage/user/web/controller/UserQueryController.java
  class UserQueryController (line 21) | @Slf4j
    method me (line 30) | @RequestLimit(limitTimes = {15}, durations = {5}, penaltyTimes = {-1},...

FILE: acimage_user/src/main/java/com/acimage/user/web/controller/VerifyCodeController.java
  class VerifyCodeController (line 15) | @Slf4j
    method getCommonVerifyCode (line 24) | @GetMapping("/commonCode")

FILE: acimage_user/src/main/java/com/acimage/user/web/provider/UserProvider.java
  class UserProvider (line 19) | @Slf4j
    method queryUser (line 29) | @GetMapping("/id/{id}")
    method modifyPhotoUrl (line 35) | @PutMapping("/photoUrl")

FILE: acimage_user/src/main/java/com/acimage/user/web/websocket/MyHandshakeInterceptor.java
  class MyHandshakeInterceptor (line 23) | @Slf4j
    method beforeHandshake (line 34) | @Override
    method afterHandshake (line 70) | @Override

FILE: acimage_user/src/main/java/com/acimage/user/web/websocket/MyWebSocketHandler.java
  class MyWebSocketHandler (line 21) | @Slf4j
    method afterConnectionEstablished (line 32) | @Override
    method afterConnectionClosed (line 43) | @Override
    method getUserId (line 53) | private long getUserId(WebSocketSession session) {
    method sendMessage (line 57) | public void sendMessage(long userId, int msgNum) {
    method sendMsgCount (line 71) | public void sendMsgCount(long userId) {
    method handleMessage (line 78) | @Override

FILE: acimage_user/src/test/java/com/acimage/user/AppTest.java
  class AppTest (line 7) | @SpringBootTest
    method testApp (line 10) | @Test

FILE: doc/sql/acimage_community.sql
  type `tb_category` (line 25) | CREATE TABLE `tb_category` (
  type `tb_cmty_user` (line 53) | CREATE TABLE `tb_cmty_user` (
  type `tb_comment` (line 82) | CREATE TABLE `tb_comment` (
  type `tb_home_carousel` (line 114) | CREATE TABLE `tb_home_carousel` (
  type `tb_star` (line 143) | CREATE TABLE `tb_star` (
  type `tb_tag` (line 168) | CREATE TABLE `tb_tag` (
  type `tb_tag_topic` (line 196) | CREATE TABLE `tb_tag_topic` (
  type `tb_topic` (line 226) | CREATE TABLE `tb_topic` (
  type `tb_topic_html` (line 264) | CREATE TABLE `tb_topic_html` (

FILE: doc/sql/acimage_image.sql
  type `tb_image` (line 25) | CREATE TABLE `tb_image` (
  type `tb_image_hash` (line 56) | CREATE TABLE `tb_image_hash` (

FILE: doc/sql/acimage_sys.sql
  type `tb_api` (line 25) | CREATE TABLE `tb_api` (
  type `tb_authorize` (line 58) | CREATE TABLE `tb_authorize` (
  type `tb_permission` (line 88) | CREATE TABLE `tb_permission` (
  type `tb_role` (line 120) | CREATE TABLE `tb_role` (
  type `tb_user_role` (line 148) | CREATE TABLE `tb_user_role` (

FILE: doc/sql/acimage_user.sql
  type `tb_user` (line 25) | CREATE TABLE `tb_user` (
  type `tb_user_msg` (line 52) | CREATE TABLE `tb_user_msg` (
  type `tb_user_privacy` (line 79) | CREATE TABLE `tb_user_privacy` (

FILE: vue-manage-system/components.d.ts
  type GlobalComponents (line 9) | interface GlobalComponents {

FILE: vue-manage-system/src/api/HomeCarousel.ts
  function add (line 27) | function add(formData) {
  function deleteById (line 32) | function deleteById(id) {
  function modifyDescription (line 36) | function modifyDescription(params) {
  function coverImage (line 41) | function coverImage(reqData) {
  function queryCurrent (line 45) | function queryCurrent() {

FILE: vue-manage-system/src/api/UserRole.ts
  function addRoleForUser (line 4) | function addRoleForUser(userId, roleId) {
  function deleteRoleForUser (line 10) | function deleteRoleForUser(userId, roleId) {

FILE: vue-manage-system/src/api/WebsiteData.ts
  function queryWebsiteData (line 4) | function queryWebsiteData() {

FILE: vue-manage-system/src/api/api.ts
  function searchApis (line 3) | function searchApis(params) {
  function addApi (line 8) | function addApi(data) {
  function modifyApi (line 12) | function modifyApi(data) {
  function deleteApi (line 16) | function deleteApi(id) {

FILE: vue-manage-system/src/api/authorize.ts
  function queryRoleAuthorize (line 4) | function queryRoleAuthorize(roleId) {
  function addAuthorize (line 9) | function addAuthorize(formData) {
  function deleteAuthorize (line 14) | function deleteAuthorize(roleId,permissionId) {

FILE: vue-manage-system/src/api/category.ts
  function queryAllCategories (line 4) | function queryAllCategories() {

FILE: vue-manage-system/src/api/comment.ts
  function queryCommentsBy (line 4) | function queryCommentsBy(params) {
  function deleteComment (line 9) | function deleteComment(commentId) {

FILE: vue-manage-system/src/api/login.ts
  function getPublicKey (line 3) | function getPublicKey(){
  function doLogin (line 7) | function doLogin(data){

FILE: vue-manage-system/src/api/permission.ts
  function queryPermissionTree (line 4) | function queryPermissionTree() {
  function pagePermission (line 8) | function pagePermission(pageNo,pageSize) {
  function queryModules (line 12) | function queryModules() {
  function queryNonModules (line 16) | function queryNonModules() {
  function addPermission (line 21) | function addPermission(data) {
  function modifyPermission (line 25) | function modifyPermission(data) {
  function deletePermission (line 29) | function deletePermission(id) {

FILE: vue-manage-system/src/api/role.ts
  function queryAllRoles (line 4) | function queryAllRoles() {
  function addRole (line 8) | function addRole(data) {
  function deleteRole (line 12) | function deleteRole(id) {
  function modifyRole (line 16) | function modifyRole(data) {

FILE: vue-manage-system/src/api/topic.ts
  function queryTopicsOrderBy (line 4) | function queryTopicsOrderBy(params) {
  function deleteTopic (line 9) | function deleteTopic(topicId) {

FILE: vue-manage-system/src/api/user.ts
  function queryUsers (line 4) | function queryUsers(params) {

FILE: vue-manage-system/src/main.ts
  method mounted (line 21) | mounted(el, binding) {

FILE: vue-manage-system/src/store/permiss.ts
  type ObjectList (line 3) | interface ObjectList {
  method handleSet (line 20) | handleSet(val: string[]) {

FILE: vue-manage-system/src/store/sidebar.ts
  method handleCollapse (line 11) | handleCollapse() {

FILE: vue-manage-system/src/store/store.ts
  type Category (line 6) | interface Category {
  method categoryLabel (line 24) | categoryLabel(state) {
  method roleName (line 34) | roleName(state) {
  method init (line 47) | init() {
  method setToken (line 64) | setToken(token){
  method removeToken (line 67) | removeToken(){

FILE: vue-manage-system/src/store/tags.ts
  type ListItem (line 3) | interface ListItem {
  method delTagsItem (line 24) | delTagsItem(index: number) {
  method setTagsItem (line 27) | setTagsItem(data: ListItem) {
  method clearTags (line 30) | clearTags() {
  method closeTagsOther (line 33) | closeTagsOther(data: ListItem[]) {
  method closeCurrentTag (line 36) | closeCurrentTag(data: any) {

FILE: vue-manage-system/src/utils/CommonUtils.ts
  method isEmpty (line 4) | isEmpty(object) {
  method popMsgAndRefreshIfOk (line 11) | popMsgAndRefreshIfOk(request, msg, delaySeconds: void) {
  method popMsgIfOk (line 22) | popMsgIfOk(request, msg) {
  method delayRefresh (line 26) | delayRefresh(delaySeconds) {
  method getUrlParams (line 32) | getUrlParams(url) {

FILE: vue-manage-system/src/utils/MessageUtils.ts
  method notice (line 6) | notice(msg,durationSeconds){
  method success (line 15) | success(msg,durationSeconds){
  method confirm (line 24) | confirm(msg){

FILE: vue-manage-system/src/utils/StringUtils.ts
  method html2Text (line 2) | html2Text(htmlString) {

FILE: vue_acimage_web/public/tinymce/tinymce.d.ts
  type StringPathBookmark (line 1) | interface StringPathBookmark {
  type RangeBookmark (line 6) | interface RangeBookmark {
  type IdBookmark (line 10) | interface IdBookmark {
  type IndexBookmark (line 15) | interface IndexBookmark {
  type PathBookmark (line 19) | interface PathBookmark {
  type Bookmark (line 25) | type Bookmark = StringPathBookmark | RangeBookmark | IdBookmark | IndexB...
  type NormalizedEvent (line 26) | type NormalizedEvent<E, T = any> = E & {
  type MappedEvent (line 36) | type MappedEvent<T extends {}, K extends string> = K extends keyof T ? T...
  type NativeEventMap (line 37) | interface NativeEventMap {
  type EditorEvent (line 79) | type EditorEvent<T> = NormalizedEvent<T>;
  type EventDispatcherSettings (line 80) | interface EventDispatcherSettings {
  type EventDispatcherConstructor (line 85) | interface EventDispatcherConstructor<T extends {}> {
  class EventDispatcher (line 90) | class EventDispatcher<T extends {}> {
  type UndoLevelType (line 104) | const enum UndoLevelType {
  type BaseUndoLevel (line 108) | interface BaseUndoLevel {
  type FragmentedUndoLevel (line 113) | interface FragmentedUndoLevel extends BaseUndoLevel {
  type CompleteUndoLevel (line 118) | interface CompleteUndoLevel extends BaseUndoLevel {
  type NewUndoLevel (line 123) | type NewUndoLevel = CompleteUndoLevel | FragmentedUndoLevel;
  type UndoLevel (line 124) | type UndoLevel = NewUndoLevel & {
  type UndoManager (line 127) | interface UndoManager {
  type SchemaType (line 143) | type SchemaType = 'html4' | 'html5' | 'html5-strict';
  type ElementSettings (line 144) | interface ElementSettings {
  type SchemaSettings (line 156) | interface SchemaSettings extends ElementSettings {
  type Attribute (line 169) | interface Attribute {
  type DefaultAttribute (line 175) | interface DefaultAttribute {
  type AttributePattern (line 179) | interface AttributePattern extends Attribute {
  type ElementRule (line 182) | interface ElementRule {
  type SchemaElement (line 194) | interface SchemaElement extends ElementRule {
  type SchemaMap (line 199) | interface SchemaMap {
  type SchemaRegExpMap (line 202) | interface SchemaRegExpMap {
  type Schema (line 205) | interface Schema {
  type Attributes$1 (line 232) | type Attributes$1 = Array<{
  type AstNodeConstructor (line 238) | interface AstNodeConstructor {
  class AstNode (line 243) | class AstNode {
  type Content (line 272) | type Content = string | AstNode;
  type ContentFormat (line 273) | type ContentFormat = 'raw' | 'text' | 'html' | 'tree';
  type GetContentArgs (line 274) | interface GetContentArgs {
  type SetContentArgs (line 283) | interface SetContentArgs {
  type GetSelectionContentArgs (line 294) | interface GetSelectionContentArgs extends GetContentArgs {
  type SetSelectionContentArgs (line 298) | interface SetSelectionContentArgs extends SetContentArgs {
  type BlobInfoData (line 302) | interface BlobInfoData {
  type BlobInfo (line 311) | interface BlobInfo {
  type BlobCache (line 320) | interface BlobCache {
  type BlobInfoImagePair (line 333) | interface BlobInfoImagePair {
  class NodeChange (line 337) | class NodeChange {
  type SelectionOverrides (line 344) | interface SelectionOverrides {
  type Quirks (line 350) | interface Quirks {
  type DecoratorData (line 354) | type DecoratorData = Record<string, any>;
  type Decorator (line 355) | type Decorator = (uid: string, data: DecoratorData) => {
  type AnnotationListener (line 359) | type AnnotationListener = (state: boolean, name: string, data?: {
  type AnnotationListenerApi (line 363) | type AnnotationListenerApi = AnnotationListener;
  type AnnotatorSettings (line 364) | interface AnnotatorSettings {
  type Annotator (line 368) | interface Annotator {
  type GeomRect (line 376) | interface GeomRect {
  type Rect (line 382) | interface Rect {
  type NotificationManagerImpl (line 391) | interface NotificationManagerImpl {
  type NotificationSpec (line 396) | interface NotificationSpec {
  type NotificationApi (line 404) | interface NotificationApi {
  type NotificationManager (line 414) | interface NotificationManager {
  type UploadFailure (line 419) | interface UploadFailure {
  type ProgressFn (line 423) | type ProgressFn = (percent: number) => void;
  type UploadHandler (line 424) | type UploadHandler = (blobInfo: BlobInfo, progress: ProgressFn) => Promi...
  type UploadResult$2 (line 425) | interface UploadResult$2 {
  type RawPattern (line 431) | interface RawPattern {
  type InlineBasePattern (line 439) | interface InlineBasePattern {
  type InlineFormatPattern (line 443) | interface InlineFormatPattern extends InlineBasePattern {
  type InlineCmdPattern (line 447) | interface InlineCmdPattern extends InlineBasePattern {
  type InlinePattern (line 452) | type InlinePattern = InlineFormatPattern | InlineCmdPattern;
  type BlockBasePattern (line 453) | interface BlockBasePattern {
  type BlockFormatPattern (line 456) | interface BlockFormatPattern extends BlockBasePattern {
  type BlockCmdPattern (line 460) | interface BlockCmdPattern extends BlockBasePattern {
  type BlockPattern (line 465) | type BlockPattern = BlockFormatPattern | BlockCmdPattern;
  type Pattern (line 466) | type Pattern = InlinePattern | BlockPattern;
  type DynamicPatternContext (line 467) | interface DynamicPatternContext {
  type DynamicPatternsLookup (line 471) | type DynamicPatternsLookup = (ctx: DynamicPatternContext) => Pattern[];
  type RawDynamicPatternsLookup (line 472) | type RawDynamicPatternsLookup = (ctx: DynamicPatternContext) => RawPatte...
  type AlertBannerSpec (line 473) | interface AlertBannerSpec {
  type ButtonSpec (line 480) | interface ButtonSpec {
  type FormComponentSpec (line 490) | interface FormComponentSpec {
  type FormComponentWithLabelSpec (line 494) | interface FormComponentWithLabelSpec extends FormComponentSpec {
  type CheckboxSpec (line 497) | interface CheckboxSpec extends FormComponentSpec {
  type CollectionSpec (line 502) | interface CollectionSpec extends FormComponentWithLabelSpec {
  type CollectionItem (line 505) | interface CollectionItem {
  type ColorInputSpec (line 510) | interface ColorInputSpec extends FormComponentWithLabelSpec {
  type ColorPickerSpec (line 514) | interface ColorPickerSpec extends FormComponentWithLabelSpec {
  type CustomEditorInit (line 517) | interface CustomEditorInit {
  type CustomEditorInitFn (line 522) | type CustomEditorInitFn = (elm: HTMLElement, settings: any) => Promise<C...
  type CustomEditorOldSpec (line 523) | interface CustomEditorOldSpec extends FormComponentSpec {
  type CustomEditorNewSpec (line 528) | interface CustomEditorNewSpec extends FormComponentSpec {
  type CustomEditorSpec (line 535) | type CustomEditorSpec = CustomEditorOldSpec | CustomEditorNewSpec;
  type DropZoneSpec (line 536) | interface DropZoneSpec extends FormComponentWithLabelSpec {
  type GridSpec (line 539) | interface GridSpec {
  type HtmlPanelSpec (line 544) | interface HtmlPanelSpec {
  type IframeSpec (line 549) | interface IframeSpec extends FormComponentWithLabelSpec {
  type ImagePreviewSpec (line 554) | interface ImagePreviewSpec extends FormComponentSpec {
  type InputSpec (line 558) | interface InputSpec extends FormComponentWithLabelSpec {
  type LabelSpec (line 565) | interface LabelSpec {
  type ListBoxSingleItemSpec (line 570) | interface ListBoxSingleItemSpec {
  type ListBoxNestedItemSpec (line 574) | interface ListBoxNestedItemSpec {
  type ListBoxItemSpec (line 578) | type ListBoxItemSpec = ListBoxNestedItemSpec | ListBoxSingleItemSpec;
  type ListBoxSpec (line 579) | interface ListBoxSpec extends FormComponentWithLabelSpec {
  type PanelSpec (line 584) | interface PanelSpec {
  type SelectBoxItemSpec (line 589) | interface SelectBoxItemSpec {
  type SelectBoxSpec (line 593) | interface SelectBoxSpec extends FormComponentWithLabelSpec {
  type SizeInputSpec (line 599) | interface SizeInputSpec extends FormComponentWithLabelSpec {
  type SliderSpec (line 604) | interface SliderSpec extends FormComponentSpec {
  type TableSpec (line 610) | interface TableSpec {
  type TextAreaSpec (line 615) | interface TextAreaSpec extends FormComponentWithLabelSpec {
  type UrlInputSpec (line 621) | interface UrlInputSpec extends FormComponentWithLabelSpec {
  type UrlInputData (line 626) | interface UrlInputData {
  type BodyComponentSpec (line 632) | type BodyComponentSpec = BarSpec | ButtonSpec | CheckboxSpec | TextAreaS...
  type BarSpec (line 633) | interface BarSpec {
  type CommonMenuItemSpec (line 637) | interface CommonMenuItemSpec {
  type CommonMenuItemInstanceApi (line 644) | interface CommonMenuItemInstanceApi {
  type DialogToggleMenuItemSpec (line 648) | interface DialogToggleMenuItemSpec extends CommonMenuItemSpec {
  type DialogFooterMenuButtonItemSpec (line 652) | type DialogFooterMenuButtonItemSpec = DialogToggleMenuItemSpec;
  type BaseDialogFooterButtonSpec (line 653) | interface BaseDialogFooterButtonSpec {
  type DialogFooterNormalButtonSpec (line 661) | interface DialogFooterNormalButtonSpec extends BaseDialogFooterButtonSpec {
  type DialogFooterMenuButtonSpec (line 665) | interface DialogFooterMenuButtonSpec extends BaseDialogFooterButtonSpec {
  type DialogFooterButtonSpec (line 672) | type DialogFooterButtonSpec = DialogFooterNormalButtonSpec | DialogFoote...
  type TabSpec (line 673) | interface TabSpec {
  type TabPanelSpec (line 678) | interface TabPanelSpec {
  type DialogDataItem (line 682) | type DialogDataItem = any;
  type DialogData (line 683) | type DialogData = Record<string, DialogDataItem>;
  type DialogInstanceApi (line 684) | interface DialogInstanceApi<T extends DialogData> {
  type DialogActionDetails (line 695) | interface DialogActionDetails {
  type DialogChangeDetails (line 699) | interface DialogChangeDetails<T> {
  type DialogTabChangeDetails (line 702) | interface DialogTabChangeDetails {
  type DialogActionHandler (line 706) | type DialogActionHandler<T extends DialogData> = (api: DialogInstanceApi...
  type DialogChangeHandler (line 707) | type DialogChangeHandler<T extends DialogData> = (api: DialogInstanceApi...
  type DialogSubmitHandler (line 708) | type DialogSubmitHandler<T extends DialogData> = (api: DialogInstanceApi...
  type DialogCloseHandler (line 709) | type DialogCloseHandler = () => void;
  type DialogCancelHandler (line 710) | type DialogCancelHandler<T extends DialogData> = (api: DialogInstanceApi...
  type DialogTabChangeHandler (line 711) | type DialogTabChangeHandler<T extends DialogData> = (api: DialogInstance...
  type DialogSize (line 712) | type DialogSize = 'normal' | 'medium' | 'large';
  type DialogSpec (line 713) | interface DialogSpec<T extends DialogData> {
  type UrlDialogInstanceApi (line 726) | interface UrlDialogInstanceApi {
  type UrlDialogActionDetails (line 732) | interface UrlDialogActionDetails {
  type UrlDialogMessage (line 736) | interface UrlDialogMessage {
  type UrlDialogActionHandler (line 740) | type UrlDialogActionHandler = (api: UrlDialogInstanceApi, actions: UrlDi...
  type UrlDialogCloseHandler (line 741) | type UrlDialogCloseHandler = () => void;
  type UrlDialogCancelHandler (line 742) | type UrlDialogCancelHandler = (api: UrlDialogInstanceApi) => void;
  type UrlDialogMessageHandler (line 743) | type UrlDialogMessageHandler = (api: UrlDialogInstanceApi, message: UrlD...
  type UrlDialogFooterButtonSpec (line 744) | interface UrlDialogFooterButtonSpec extends DialogFooterNormalButtonSpec {
  type UrlDialogSpec (line 747) | interface UrlDialogSpec {
  type CardContainerDirection (line 758) | type CardContainerDirection = 'vertical' | 'horizontal';
  type CardContainerAlign (line 759) | type CardContainerAlign = 'left' | 'right';
  type CardContainerValign (line 760) | type CardContainerValign = 'top' | 'middle' | 'bottom';
  type CardContainerSpec (line 761) | interface CardContainerSpec {
  type CardImageSpec (line 768) | interface CardImageSpec {
  type CardTextSpec (line 774) | interface CardTextSpec {
  type CardItemSpec (line 780) | type CardItemSpec = CardContainerSpec | CardImageSpec | CardTextSpec;
  type CardMenuItemInstanceApi (line 781) | interface CardMenuItemInstanceApi extends CommonMenuItemInstanceApi {
  type CardMenuItemSpec (line 783) | interface CardMenuItemSpec extends Omit<CommonMenuItemSpec, 'text' | 'sh...
  type SeparatorMenuItemSpec (line 790) | interface SeparatorMenuItemSpec {
  type ColumnTypes$1 (line 794) | type ColumnTypes$1 = number | 'auto';
  type SeparatorItemSpec (line 795) | type SeparatorItemSpec = SeparatorMenuItemSpec;
  type AutocompleterItemSpec (line 796) | interface AutocompleterItemSpec {
  type AutocompleterContents (line 803) | type AutocompleterContents = SeparatorItemSpec | AutocompleterItemSpec |...
  type AutocompleterSpec (line 804) | interface AutocompleterSpec {
  type AutocompleterInstanceApi (line 816) | interface AutocompleterInstanceApi {
  type ContextPosition (line 820) | type ContextPosition = 'node' | 'selection' | 'line';
  type ContextScope (line 821) | type ContextScope = 'node' | 'editor';
  type ContextBarSpec (line 822) | interface ContextBarSpec {
  type BaseToolbarButtonSpec (line 827) | interface BaseToolbarButtonSpec<I extends BaseToolbarButtonInstanceApi> {
  type BaseToolbarButtonInstanceApi (line 834) | interface BaseToolbarButtonInstanceApi {
  type ToolbarButtonSpec (line 838) | interface ToolbarButtonSpec extends BaseToolbarButtonSpec<ToolbarButtonI...
  type ToolbarButtonInstanceApi (line 842) | interface ToolbarButtonInstanceApi extends BaseToolbarButtonInstanceApi {
  type BaseToolbarToggleButtonSpec (line 844) | interface BaseToolbarToggleButtonSpec<I extends BaseToolbarButtonInstanc...
  type BaseToolbarToggleButtonInstanceApi (line 847) | interface BaseToolbarToggleButtonInstanceApi extends BaseToolbarButtonIn...
  type ToolbarToggleButtonSpec (line 851) | interface ToolbarToggleButtonSpec extends BaseToolbarToggleButtonSpec<To...
  type ToolbarToggleButtonInstanceApi (line 855) | interface ToolbarToggleButtonInstanceApi extends BaseToolbarToggleButton...
  type ContextFormLaunchButtonApi (line 857) | interface ContextFormLaunchButtonApi extends BaseToolbarButtonSpec<BaseT...
  type ContextFormLaunchToggleButtonSpec (line 860) | interface ContextFormLaunchToggleButtonSpec extends BaseToolbarToggleBut...
  type ContextFormButtonInstanceApi (line 863) | interface ContextFormButtonInstanceApi extends BaseToolbarButtonInstance...
  type ContextFormToggleButtonInstanceApi (line 865) | interface ContextFormToggleButtonInstanceApi extends BaseToolbarToggleBu...
  type ContextFormButtonSpec (line 867) | interface ContextFormButtonSpec extends BaseToolbarButtonSpec<ContextFor...
  type ContextFormToggleButtonSpec (line 872) | interface ContextFormToggleButtonSpec extends BaseToolbarToggleButtonSpe...
  type ContextFormInstanceApi (line 877) | interface ContextFormInstanceApi {
  type ContextFormSpec (line 881) | interface ContextFormSpec extends ContextBarSpec {
  type ContextToolbarSpec (line 888) | interface ContextToolbarSpec extends ContextBarSpec {
  type ChoiceMenuItemSpec (line 892) | interface ChoiceMenuItemSpec extends CommonMenuItemSpec {
  type ChoiceMenuItemInstanceApi (line 896) | interface ChoiceMenuItemInstanceApi extends CommonMenuItemInstanceApi {
  type ContextMenuItem (line 900) | interface ContextMenuItem extends CommonMenuItemSpec {
  type ContextSubMenu (line 906) | interface ContextSubMenu extends CommonMenuItemSpec {
  type ContextMenuContents (line 912) | type ContextMenuContents = string | ContextMenuItem | SeparatorMenuItemS...
  type ContextMenuApi (line 913) | interface ContextMenuApi {
  type FancyActionArgsMap (line 916) | interface FancyActionArgsMap {
  type BaseFancyMenuItemSpec (line 925) | interface BaseFancyMenuItemSpec<T extends keyof FancyActionArgsMap> {
  type InsertTableMenuItemSpec (line 931) | interface InsertTableMenuItemSpec extends BaseFancyMenuItemSpec<'insertt...
  type ColorSwatchMenuItemSpec (line 935) | interface ColorSwatchMenuItemSpec extends BaseFancyMenuItemSpec<'colorsw...
  type FancyMenuItemSpec (line 943) | type FancyMenuItemSpec = InsertTableMenuItemSpec | ColorSwatchMenuItemSpec;
  type MenuItemSpec (line 944) | interface MenuItemSpec extends CommonMenuItemSpec {
  type MenuItemInstanceApi (line 950) | interface MenuItemInstanceApi extends CommonMenuItemInstanceApi {
  type NestedMenuItemContents (line 952) | type NestedMenuItemContents = string | MenuItemSpec | NestedMenuItemSpec...
  type NestedMenuItemSpec (line 953) | interface NestedMenuItemSpec extends CommonMenuItemSpec {
  type NestedMenuItemInstanceApi (line 959) | interface NestedMenuItemInstanceApi extends CommonMenuItemInstanceApi {
  type ToggleMenuItemSpec (line 961) | interface ToggleMenuItemSpec extends CommonMenuItemSpec {
  type ToggleMenuItemInstanceApi (line 968) | interface ToggleMenuItemInstanceApi extends CommonMenuItemInstanceApi {
  type PublicDialog_d_AlertBannerSpec (line 972) | type PublicDialog_d_AlertBannerSpec = AlertBannerSpec;
  type PublicDialog_d_BarSpec (line 973) | type PublicDialog_d_BarSpec = BarSpec;
  type PublicDialog_d_BodyComponentSpec (line 974) | type PublicDialog_d_BodyComponentSpec = BodyComponentSpec;
  type PublicDialog_d_ButtonSpec (line 975) | type PublicDialog_d_ButtonSpec = ButtonSpec;
  type PublicDialog_d_CheckboxSpec (line 976) | type PublicDialog_d_CheckboxSpec = CheckboxSpec;
  type PublicDialog_d_CollectionItem (line 977) | type PublicDialog_d_CollectionItem = CollectionItem;
  type PublicDialog_d_CollectionSpec (line 978) | type PublicDialog_d_CollectionSpec = CollectionSpec;
  type PublicDialog_d_ColorInputSpec (line 979) | type PublicDialog_d_ColorInputSpec = ColorInputSpec;
  type PublicDialog_d_ColorPickerSpec (line 980) | type PublicDialog_d_ColorPickerSpec = ColorPickerSpec;
  type PublicDialog_d_CustomEditorSpec (line 981) | type PublicDialog_d_CustomEditorSpec = CustomEditorSpec;
  type PublicDialog_d_CustomEditorInit (line 982) | type PublicDialog_d_CustomEditorInit = CustomEditorInit;
  type PublicDialog_d_CustomEditorInitFn (line 983) | type PublicDialog_d_CustomEditorInitFn = CustomEditorInitFn;
  type PublicDialog_d_DialogData (line 984) | type PublicDialog_d_DialogData = DialogData;
  type PublicDialog_d_DialogSize (line 985) | type PublicDialog_d_DialogSize = DialogSize;
  type PublicDialog_d_DialogSpec (line 986) | type PublicDialog_d_DialogSpec<T extends DialogData> = DialogSpec<T>;
  type PublicDialog_d_DialogInstanceApi (line 987) | type PublicDialog_d_DialogInstanceApi<T extends DialogData> = DialogInst...
  type PublicDialog_d_DialogFooterButtonSpec (line 988) | type PublicDialog_d_DialogFooterButtonSpec = DialogFooterButtonSpec;
  type PublicDialog_d_DialogActionDetails (line 989) | type PublicDialog_d_DialogActionDetails = DialogActionDetails;
  type PublicDialog_d_DialogChangeDetails (line 990) | type PublicDialog_d_DialogChangeDetails<T> = DialogChangeDetails<T>;
  type PublicDialog_d_DialogTabChangeDetails (line 991) | type PublicDialog_d_DialogTabChangeDetails = DialogTabChangeDetails;
  type PublicDialog_d_DropZoneSpec (line 992) | type PublicDialog_d_DropZoneSpec = DropZoneSpec;
  type PublicDialog_d_GridSpec (line 993) | type PublicDialog_d_GridSpec = GridSpec;
  type PublicDialog_d_HtmlPanelSpec (line 994) | type PublicDialog_d_HtmlPanelSpec = HtmlPanelSpec;
  type PublicDialog_d_IframeSpec (line 995) | type PublicDialog_d_IframeSpec = IframeSpec;
  type PublicDialog_d_ImagePreviewSpec (line 996) | type PublicDialog_d_ImagePreviewSpec = ImagePreviewSpec;
  type PublicDialog_d_InputSpec (line 997) | type PublicDialog_d_InputSpec = InputSpec;
  type PublicDialog_d_LabelSpec (line 998) | type PublicDialog_d_LabelSpec = LabelSpec;
  type PublicDialog_d_ListBoxSpec (line 999) | type PublicDialog_d_ListBoxSpec = ListBoxSpec;
  type PublicDialog_d_ListBoxItemSpec (line 1000) | type PublicDialog_d_ListBoxItemSpec = ListBoxItemSpec;
  type PublicDialog_d_ListBoxNestedItemSpec (line 1001) | type PublicDialog_d_ListBoxNestedItemSpec = ListBoxNestedItemSpec;
  type PublicDialog_d_ListBoxSingleItemSpec (line 1002) | type PublicDialog_d_ListBoxSingleItemSpec = ListBoxSingleItemSpec;
  type PublicDialog_d_PanelSpec (line 1003) | type PublicDialog_d_PanelSpec = PanelSpec;
  type PublicDialog_d_SelectBoxSpec (line 1004) | type PublicDialog_d_SelectBoxSpec = SelectBoxSpec;
  type PublicDialog_d_SelectBoxItemSpec (line 1005) | type PublicDialog_d_SelectBoxItemSpec = SelectBoxItemSpec;
  type PublicDialog_d_SizeInputSpec (line 1006) | type PublicDialog_d_SizeInputSpec = SizeInputSpec;
  type PublicDialog_d_SliderSpec (line 1007) | type PublicDialog_d_SliderSpec = SliderSpec;
  type PublicDialog_d_TableSpec (line 1008) | type PublicDialog_d_TableSpec = TableSpec;
  type PublicDialog_d_TabSpec (line 1009) | type PublicDialog_d_TabSpec = TabSpec;
  type PublicDialog_d_TabPanelSpec (line 1010) | type PublicDialog_d_TabPanelSpec = TabPanelSpec;
  type PublicDialog_d_TextAreaSpec (line 1011) | type PublicDialog_d_TextAreaSpec = TextAreaSpec;
  type PublicDialog_d_UrlInputData (line 1012) | type PublicDialog_d_UrlInputData = UrlInputData;
  type PublicDialog_d_UrlInputSpec (line 1013) | type PublicDialog_d_UrlInputSpec = UrlInputSpec;
  type PublicDialog_d_UrlDialogSpec (line 1014) | type PublicDialog_d_UrlDialogSpec = UrlDialogSpec;
  type PublicDialog_d_UrlDialogFooterButtonSpec (line 1015) | type PublicDialog_d_UrlDialogFooterButtonSpec = UrlDialogFooterButtonSpec;
  type PublicDialog_d_UrlDialogInstanceApi (line 1016) | type PublicDialog_d_UrlDialogInstanceApi = UrlDialogInstanceApi;
  type PublicDialog_d_UrlDialogActionDetails (line 1017) | type PublicDialog_d_UrlDialogActionDetails = UrlDialogActionDetails;
  type PublicDialog_d_UrlDialogMessage (line 1018) | type PublicDialog_d_UrlDialogMessage = UrlDialogMessage;
  type PublicInlineContent_d_AutocompleterSpec (line 1022) | type PublicInlineContent_d_AutocompleterSpec = AutocompleterSpec;
  type PublicInlineContent_d_AutocompleterItemSpec (line 1023) | type PublicInlineContent_d_AutocompleterItemSpec = AutocompleterItemSpec;
  type PublicInlineContent_d_AutocompleterContents (line 1024) | type PublicInlineContent_d_AutocompleterContents = AutocompleterContents;
  type PublicInlineContent_d_AutocompleterInstanceApi (line 1025) | type PublicInlineContent_d_AutocompleterInstanceApi = AutocompleterInsta...
  type PublicInlineContent_d_ContextPosition (line 1026) | type PublicInlineContent_d_ContextPosition = ContextPosition;
  type PublicInlineContent_d_ContextScope (line 1027) | type PublicInlineContent_d_ContextScope = ContextScope;
  type PublicInlineContent_d_ContextFormSpec (line 1028) | type PublicInlineContent_d_ContextFormSpec = ContextFormSpec;
  type PublicInlineContent_d_ContextFormInstanceApi (line 1029) | type PublicInlineContent_d_ContextFormInstanceApi = ContextFormInstanceApi;
  type PublicInlineContent_d_ContextFormButtonSpec (line 1030) | type PublicInlineContent_d_ContextFormButtonSpec = ContextFormButtonSpec;
  type PublicInlineContent_d_ContextFormButtonInstanceApi (line 1031) | type PublicInlineContent_d_ContextFormButtonInstanceApi = ContextFormBut...
  type PublicInlineContent_d_ContextFormToggleButtonSpec (line 1032) | type PublicInlineContent_d_ContextFormToggleButtonSpec = ContextFormTogg...
  type PublicInlineContent_d_ContextFormToggleButtonInstanceApi (line 1033) | type PublicInlineContent_d_ContextFormToggleButtonInstanceApi = ContextF...
  type PublicInlineContent_d_ContextToolbarSpec (line 1034) | type PublicInlineContent_d_ContextToolbarSpec = ContextToolbarSpec;
  type PublicInlineContent_d_SeparatorItemSpec (line 1035) | type PublicInlineContent_d_SeparatorItemSpec = SeparatorItemSpec;
  type PublicMenu_d_MenuItemSpec (line 1039) | type PublicMenu_d_MenuItemSpec = MenuItemSpec;
  type PublicMenu_d_MenuItemInstanceApi (line 1040) | type PublicMenu_d_MenuItemInstanceApi = MenuItemInstanceApi;
  type PublicMenu_d_NestedMenuItemContents (line 1041) | type PublicMenu_d_NestedMenuItemContents = NestedMenuItemContents;
  type PublicMenu_d_NestedMenuItemSpec (line 1042) | type PublicMenu_d_NestedMenuItemSpec = NestedMenuItemSpec;
  type PublicMenu_d_NestedMenuItemInstanceApi (line 1043) | type PublicMenu_d_NestedMenuItemInstanceApi = NestedMenuItemInstanceApi;
  type PublicMenu_d_FancyMenuItemSpec (line 1044) | type PublicMenu_d_FancyMenuItemSpec = FancyMenuItemSpec;
  type PublicMenu_d_ColorSwatchMenuItemSpec (line 1045) | type PublicMenu_d_ColorSwatchMenuItemSpec = ColorSwatchMenuItemSpec;
  type PublicMenu_d_InsertTableMenuItemSpec (line 1046) | type PublicMenu_d_InsertTableMenuItemSpec = InsertTableMenuItemSpec;
  type PublicMenu_d_ToggleMenuItemSpec (line 1047) | type PublicMenu_d_ToggleMenuItemSpec = ToggleMenuItemSpec;
  type PublicMenu_d_ToggleMenuItemInstanceApi (line 1048) | type PublicMenu_d_ToggleMenuItemInstanceApi = ToggleMenuItemInstanceApi;
  type PublicMenu_d_ChoiceMenuItemSpec (line 1049) | type PublicMenu_d_ChoiceMenuItemSpec = ChoiceMenuItemSpec;
  type PublicMenu_d_ChoiceMenuItemInstanceApi (line 1050) | type PublicMenu_d_ChoiceMenuItemInstanceApi = ChoiceMenuItemInstanceApi;
  type PublicMenu_d_SeparatorMenuItemSpec (line 1051) | type PublicMenu_d_SeparatorMenuItemSpec = SeparatorMenuItemSpec;
  type PublicMenu_d_ContextMenuApi (line 1052) | type PublicMenu_d_ContextMenuApi = ContextMenuApi;
  type PublicMenu_d_ContextMenuContents (line 1053) | type PublicMenu_d_ContextMenuContents = ContextMenuContents;
  type PublicMenu_d_ContextMenuItem (line 1054) | type PublicMenu_d_ContextMenuItem = ContextMenuItem;
  type PublicMenu_d_ContextSubMenu (line 1055) | type PublicMenu_d_ContextSubMenu = ContextSubMenu;
  type PublicMenu_d_CardMenuItemSpec (line 1056) | type PublicMenu_d_CardMenuItemSpec = CardMenuItemSpec;
  type PublicMenu_d_CardMenuItemInstanceApi (line 1057) | type PublicMenu_d_CardMenuItemInstanceApi = CardMenuItemInstanceApi;
  type PublicMenu_d_CardItemSpec (line 1058) | type PublicMenu_d_CardItemSpec = CardItemSpec;
  type PublicMenu_d_CardContainerSpec (line 1059) | type PublicMenu_d_CardContainerSpec = CardContainerSpec;
  type PublicMenu_d_CardImageSpec (line 1060) | type PublicMenu_d_CardImageSpec = CardImageSpec;
  type PublicMenu_d_CardTextSpec (line 1061) | type PublicMenu_d_CardTextSpec = CardTextSpec;
  type SidebarInstanceApi (line 1065) | interface SidebarInstanceApi {
  type SidebarSpec (line 1068) | interface SidebarSpec {
  type PublicSidebar_d_SidebarSpec (line 1075) | type PublicSidebar_d_SidebarSpec = SidebarSpec;
  type PublicSidebar_d_SidebarInstanceApi (line 1076) | type PublicSidebar_d_SidebarInstanceApi = SidebarInstanceApi;
  type ToolbarGroupSetting (line 1080) | interface ToolbarGroupSetting {
  type ToolbarConfig (line 1084) | type ToolbarConfig = string | ToolbarGroupSetting[];
  type GroupToolbarButtonInstanceApi (line 1085) | interface GroupToolbarButtonInstanceApi extends BaseToolbarButtonInstanc...
  type GroupToolbarButtonSpec (line 1087) | interface GroupToolbarButtonSpec extends BaseToolbarButtonSpec<GroupTool...
  type MenuButtonItemTypes (line 1091) | type MenuButtonItemTypes = NestedMenuItemContents;
  type SuccessCallback$1 (line 1092) | type SuccessCallback$1 = (menu: string | MenuButtonItemTypes[]) => void;
  type MenuButtonFetchContext (line 1093) | interface MenuButtonFetchContext {
  type BaseMenuButtonSpec (line 1096) | interface BaseMenuButtonSpec {
  type BaseMenuButtonInstanceApi (line 1106) | interface BaseMenuButtonInstanceApi {
  type ToolbarMenuButtonSpec (line 1112) | interface ToolbarMenuButtonSpec extends BaseMenuButtonSpec {
  type ToolbarMenuButtonInstanceApi (line 1116) | interface ToolbarMenuButtonInstanceApi extends BaseMenuButtonInstanceApi {
  type ToolbarSplitButtonItemTypes (line 1118) | type ToolbarSplitButtonItemTypes = ChoiceMenuItemSpec | SeparatorMenuIte...
  type SuccessCallback (line 1119) | type SuccessCallback = (menu: ToolbarSplitButtonItemTypes[]) => void;
  type SelectPredicate (line 1120) | type SelectPredicate = (value: string) => boolean;
  type PresetTypes (line 1121) | type PresetTypes = 'color' | 'normal' | 'listpreview';
  type ColumnTypes (line 1122) | type ColumnTypes = number | 'auto';
  type ToolbarSplitButtonSpec (line 1123) | interface ToolbarSplitButtonSpec {
  type ToolbarSplitButtonInstanceApi (line 1136) | interface ToolbarSplitButtonInstanceApi {
  type PublicToolbar_d_ToolbarButtonSpec (line 1143) | type PublicToolbar_d_ToolbarButtonSpec = ToolbarButtonSpec;
  type PublicToolbar_d_ToolbarButtonInstanceApi (line 1144) | type PublicToolbar_d_ToolbarButtonInstanceApi = ToolbarButtonInstanceApi;
  type PublicToolbar_d_ToolbarSplitButtonSpec (line 1145) | type PublicToolbar_d_ToolbarSplitButtonSpec = ToolbarSplitButtonSpec;
  type PublicToolbar_d_ToolbarSplitButtonInstanceApi (line 1146) | type PublicToolbar_d_ToolbarSplitButtonInstanceApi = ToolbarSplitButtonI...
  type PublicToolbar_d_ToolbarMenuButtonSpec (line 1147) | type PublicToolbar_d_ToolbarMenuButtonSpec = ToolbarMenuButtonSpec;
  type PublicToolbar_d_ToolbarMenuButtonInstanceApi (line 1148) | type PublicToolbar_d_ToolbarMenuButtonInstanceApi = ToolbarMenuButtonIns...
  type PublicToolbar_d_ToolbarToggleButtonSpec (line 1149) | type PublicToolbar_d_ToolbarToggleButtonSpec = ToolbarToggleButtonSpec;
  type PublicToolbar_d_ToolbarToggleButtonInstanceApi (line 1150) | type PublicToolbar_d_ToolbarToggleButtonInstanceApi = ToolbarToggleButto...
  type PublicToolbar_d_GroupToolbarButtonSpec (line 1151) | type PublicToolbar_d_GroupToolbarButtonSpec = GroupToolbarButtonSpec;
  type PublicToolbar_d_GroupToolbarButtonInstanceApi (line 1152) | type PublicToolbar_d_GroupToolbarButtonInstanceApi = GroupToolbarButtonI...
  type ViewNormalButtonSpec (line 1156) | interface ViewNormalButtonSpec {
  type ViewButtonSpec (line 1162) | type ViewButtonSpec = ViewNormalButtonSpec;
  type ViewInstanceApi (line 1163) | interface ViewInstanceApi {
  type ViewSpec (line 1166) | interface ViewSpec {
  type PublicView_d_ViewSpec (line 1171) | type PublicView_d_ViewSpec = ViewSpec;
  type PublicView_d_ViewInstanceApi (line 1172) | type PublicView_d_ViewInstanceApi = ViewInstanceApi;
  type Registry$1 (line 1176) | interface Registry$1 {
  type AutocompleteLookupData (line 1203) | interface AutocompleteLookupData {
  type AutocompleterEventArgs (line 1210) | interface AutocompleterEventArgs {
  type RangeLikeObject (line 1213) | interface RangeLikeObject {
  type ApplyFormat (line 1219) | type ApplyFormat = BlockFormat | InlineFormat | SelectorFormat;
  type RemoveFormat (line 1220) | type RemoveFormat = RemoveBlockFormat | RemoveInlineFormat | RemoveSelec...
  type Format (line 1221) | type Format = ApplyFormat | RemoveFormat;
  type Formats (line 1222) | type Formats = Record<string, Format | Format[]>;
  type FormatAttrOrStyleValue (line 1223) | type FormatAttrOrStyleValue = string | ((vars?: FormatVars) => string | ...
  type FormatVars (line 1224) | type FormatVars = Record<string, string | null>;
  type BaseFormat (line 1225) | interface BaseFormat<T> {
  type Block (line 1241) | interface Block {
  type Inline (line 1246) | interface Inline {
  type Selector (line 1249) | interface Selector {
  type CommonFormat (line 1253) | interface CommonFormat<T> extends BaseFormat<T> {
  type BlockFormat (line 1263) | interface BlockFormat extends Block, CommonFormat<BlockFormat> {
  type InlineFormat (line 1265) | interface InlineFormat extends Inline, CommonFormat<InlineFormat> {
  type SelectorFormat (line 1267) | interface SelectorFormat extends Selector, CommonFormat<SelectorFormat> {
  type CommonRemoveFormat (line 1269) | interface CommonRemoveFormat<T> extends BaseFormat<T> {
  type RemoveBlockFormat (line 1273) | interface RemoveBlockFormat extends Block, CommonRemoveFormat<RemoveBloc...
  type RemoveInlineFormat (line 1275) | interface RemoveInlineFormat extends Inline, CommonRemoveFormat<RemoveIn...
  type RemoveSelectorFormat (line 1277) | interface RemoveSelectorFormat extends Selector, CommonRemoveFormat<Remo...
  type Filter (line 1279) | interface Filter<C extends Function> {
  type ParserArgs (line 1283) | interface ParserArgs {
  type ParserFilterCallback (line 1293) | type ParserFilterCallback = (nodes: AstNode[], name: string, args: Parse...
  type ParserFilter (line 1294) | interface ParserFilter extends Filter<ParserFilterCallback> {
  type DomParserSettings (line 1296) | interface DomParserSettings {
  type DomParser (line 1316) | interface DomParser {
  type StyleSheetLoaderSettings (line 1326) | interface StyleSheetLoaderSettings {
  type StyleSheetLoader (line 1331) | interface StyleSheetLoader {
  type Registry (line 1339) | type Registry = Registry$1;
  type EditorUiApi (line 1340) | interface EditorUiApi {
  type EditorUi (line 1346) | interface EditorUi extends EditorUiApi {
  type Ui_d_Registry (line 1350) | type Ui_d_Registry = Registry;
  type Ui_d_EditorUiApi (line 1351) | type Ui_d_EditorUiApi = EditorUiApi;
  type Ui_d_EditorUi (line 1352) | type Ui_d_EditorUi = EditorUi;
  type WindowParams (line 1356) | interface WindowParams {
  type InstanceApi (line 1360) | type InstanceApi<T extends DialogData> = UrlDialogInstanceApi | DialogIn...
  type WindowManagerImpl (line 1361) | interface WindowManagerImpl {
  type WindowManager (line 1368) | interface WindowManager {
  type ExecCommandEvent (line 1375) | interface ExecCommandEvent {
  type BeforeGetContentEvent (line 1380) | interface BeforeGetContentEvent extends GetContentArgs {
  type GetContentEvent (line 1383) | interface GetContentEvent extends BeforeGetContentEvent {
  type BeforeSetContentEvent (line 1386) | interface BeforeSetContentEvent extends SetContentArgs {
  type SetContentEvent (line 1390) | interface SetContentEvent extends BeforeSetContentEvent {
  type SaveContentEvent (line 1393) | interface SaveContentEvent extends GetContentEvent {
  type NewBlockEvent (line 1396) | interface NewBlockEvent {
  type NodeChangeEvent (line 1399) | interface NodeChangeEvent {
  type FormatEvent (line 1405) | interface FormatEvent {
  type ObjectResizeEvent (line 1410) | interface ObjectResizeEvent {
  type ObjectSelectedEvent (line 1416) | interface ObjectSelectedEvent {
  type ScrollIntoViewEvent (line 1420) | interface ScrollIntoViewEvent {
  type SetSelectionRangeEvent (line 1424) | interface SetSelectionRangeEvent {
  type ShowCaretEvent (line 1428) | interface ShowCaretEvent {
  type SwitchModeEvent (line 1433) | interface SwitchModeEvent {
  type ChangeEvent (line 1436) | interface ChangeEvent {
  type AddUndoEvent (line 1440) | interface AddUndoEvent extends ChangeEvent {
  type UndoRedoEvent (line 1443) | interface UndoRedoEvent {
  type WindowEvent (line 1446) | interface WindowEvent<T extends DialogData> {
  type ProgressStateEvent (line 1449) | interface ProgressStateEvent {
  type AfterProgressStateEvent (line 1453) | interface AfterProgressStateEvent {
  type PlaceholderToggleEvent (line 1456) | interface PlaceholderToggleEvent {
  type LoadErrorEvent (line 1459) | interface LoadErrorEvent {
  type PreProcessEvent (line 1462) | interface PreProcessEvent extends ParserArgs {
  type PostProcessEvent (line 1465) | interface PostProcessEvent extends ParserArgs {
  type PastePlainTextToggleEvent (line 1468) | interface PastePlainTextToggleEvent {
  type PastePreProcessEvent (line 1471) | interface PastePreProcessEvent {
  type PastePostProcessEvent (line 1475) | interface PastePostProcessEvent {
  type NewTableRowEvent (line 1479) | interface NewTableRowEvent {
  type NewTableCellEvent (line 1482) | interface NewTableCellEvent {
  type TableEventData (line 1485) | interface TableEventData {
  type TableModifiedEvent (line 1489) | interface TableModifiedEvent extends TableEventData {
  type BeforeOpenNotificationEvent (line 1492) | interface BeforeOpenNotificationEvent {
  type OpenNotificationEvent (line 1495) | interface OpenNotificationEvent {
  type EditorEventMap (line 1498) | interface EditorEventMap extends Omit<NativeEventMap, 'blur' | 'focus'> {
  type EditorManagerEventMap (line 1593) | interface EditorManagerEventMap {
  type EventTypes_d_ExecCommandEvent (line 1604) | type EventTypes_d_ExecCommandEvent = ExecCommandEvent;
  type EventTypes_d_BeforeGetContentEvent (line 1605) | type EventTypes_d_BeforeGetContentEvent = BeforeGetContentEvent;
  type EventTypes_d_GetContentEvent (line 1606) | type EventTypes_d_GetContentEvent = GetContentEvent;
  type EventTypes_d_BeforeSetContentEvent (line 1607) | type EventTypes_d_BeforeSetContentEvent = BeforeSetContentEvent;
  type EventTypes_d_SetContentEvent (line 1608) | type EventTypes_d_SetContentEvent = SetContentEvent;
  type EventTypes_d_SaveContentEvent (line 1609) | type EventTypes_d_SaveContentEvent = SaveContentEvent;
  type EventTypes_d_NewBlockEvent (line 1610) | type EventTypes_d_NewBlockEvent = NewBlockEvent;
  type EventTypes_d_NodeChangeEvent (line 1611) | type EventTypes_d_NodeChangeEvent = NodeChangeEvent;
  type EventTypes_d_FormatEvent (line 1612) | type EventTypes_d_FormatEvent = FormatEvent;
  type EventTypes_d_ObjectResizeEvent (line 1613) | type EventTypes_d_ObjectResizeEvent = ObjectResizeEvent;
  type EventTypes_d_ObjectSelectedEvent (line 1614) | type EventTypes_d_ObjectSelectedEvent = ObjectSelectedEvent;
  type EventTypes_d_ScrollIntoViewEvent (line 1615) | type EventTypes_d_ScrollIntoViewEvent = ScrollIntoViewEvent;
  type EventTypes_d_SetSelectionRangeEvent (line 1616) | type EventTypes_d_SetSelectionRangeEvent = SetSelectionRangeEvent;
  type EventTypes_d_ShowCaretEvent (line 1617) | type EventTypes_d_ShowCaretEvent = ShowCaretEvent;
  type EventTypes_d_SwitchModeEvent (line 1618) | type EventTypes_d_SwitchModeEvent = SwitchModeEvent;
  type EventTypes_d_ChangeEvent (line 1619) | type EventTypes_d_ChangeEvent = ChangeEvent;
  type EventTypes_d_AddUndoEvent (line 1620) | type EventTypes_d_AddUndoEvent = AddUndoEvent;
  type EventTypes_d_UndoRedoEvent (line 1621) | type EventTypes_d_UndoRedoEvent = UndoRedoEvent;
  type EventTypes_d_WindowEvent (line 1622) | type EventTypes_d_WindowEvent<T extends DialogData> = WindowEvent<T>;
  type EventTypes_d_ProgressStateEvent (line 1623) | type EventTypes_d_ProgressStateEvent = ProgressStateEvent;
  type EventTypes_d_AfterProgressStateEvent (line 1624) | type EventTypes_d_AfterProgressStateEvent = AfterProgressStateEvent;
  type EventTypes_d_PlaceholderToggleEvent (line 1625) | type EventTypes_d_PlaceholderToggleEvent = PlaceholderToggleEvent;
  type EventTypes_d_LoadErrorEvent (line 1626) | type EventTypes_d_LoadErrorEvent = LoadErrorEvent;
  type EventTypes_d_PreProcessEvent (line 1627) | type EventTypes_d_PreProcessEvent = PreProcessEvent;
  type EventTypes_d_PostProcessEvent (line 1628) | type EventTypes_d_PostProcessEvent = PostProcessEvent;
  type EventTypes_d_PastePlainTextToggleEvent (line 1629) | type EventTypes_d_PastePlainTextToggleEvent = PastePlainTextToggleEvent;
  type EventTypes_d_PastePreProcessEvent (line 1630) | type EventTypes_d_PastePreProcessEvent = PastePreProcessEvent;
  type EventTypes_d_PastePostProcessEvent (line 1631) | type EventTypes_d_PastePostProcessEvent = PastePostProcessEvent;
  type EventTypes_d_NewTableRowEvent (line 1632) | type EventTypes_d_NewTableRowEvent = NewTableRowEvent;
  type EventTypes_d_NewTableCellEvent (line 1633) | type EventTypes_d_NewTableCellEvent = NewTableCellEvent;
  type EventTypes_d_TableEventData (line 1634) | type EventTypes_d_TableEventData = TableEventData;
  type EventTypes_d_TableModifiedEvent (line 1635) | type EventTypes_d_TableModifiedEvent = TableModifiedEvent;
  type EventTypes_d_BeforeOpenNotificationEvent (line 1636) | type EventTypes_d_BeforeOpenNotificationEvent = BeforeOpenNotificationEv...
  type EventTypes_d_OpenNotificationEvent (line 1637) | type EventTypes_d_OpenNotificationEvent = OpenNotificationEvent;
  type EventTypes_d_EditorEventMap (line 1638) | type EventTypes_d_EditorEventMap = EditorEventMap;
  type EventTypes_d_EditorManagerEventMap (line 1639) | type EventTypes_d_EditorManagerEventMap = EditorManagerEventMap;
  type Format_d_Formats (line 1643) | type Format_d_Formats = Formats;
  type Format_d_Format (line 1644) | type Format_d_Format = Format;
  type Format_d_ApplyFormat (line 1645) | type Format_d_ApplyFormat = ApplyFormat;
  type Format_d_BlockFormat (line 1646) | type Format_d_BlockFormat = BlockFormat;
  type Format_d_InlineFormat (line 1647) | type Format_d_InlineFormat = InlineFormat;
  type Format_d_SelectorFormat (line 1648) | type Format_d_SelectorFormat = SelectorFormat;
  type Format_d_RemoveFormat (line 1649) | type Format_d_RemoveFormat = RemoveFormat;
  type Format_d_RemoveBlockFormat (line 1650) | type Format_d_RemoveBlockFormat = RemoveBlockFormat;
  type Format_d_RemoveInlineFormat (line 1651) | type Format_d_RemoveInlineFormat = RemoveInlineFormat;
  type Format_d_RemoveSelectorFormat (line 1652) | type Format_d_RemoveSelectorFormat = RemoveSelectorFormat;
  type StyleFormat (line 1656) | type StyleFormat = BlockStyleFormat | InlineStyleFormat | SelectorStyleF...
  type AllowedFormat (line 1657) | type AllowedFormat = Separator | FormatReference | StyleFormat | NestedF...
  type Separator (line 1658) | interface Separator {
  type FormatReference (line 1661) | interface FormatReference {
  type NestedFormatting (line 1666) | interface NestedFormatting {
  type CommonStyleFormat (line 1670) | interface CommonStyleFormat {
  type BlockStyleFormat (line 1675) | interface BlockStyleFormat extends BlockFormat, CommonStyleFormat {
  type InlineStyleFormat (line 1677) | interface InlineStyleFormat extends InlineFormat, CommonStyleFormat {
  type SelectorStyleFormat (line 1679) | interface SelectorStyleFormat extends SelectorFormat, CommonStyleFormat {
  type EntityEncoding (line 1681) | type EntityEncoding = 'named' | 'numeric' | 'raw' | 'named,numeric' | 'n...
  type ContentLanguage (line 1682) | interface ContentLanguage {
  type ThemeInitFunc (line 1687) | type ThemeInitFunc = (editor: Editor, elm: HTMLElement) => {
  type SetupCallback (line 1694) | type SetupCallback = (editor: Editor) => void;
  type FilePickerCallback (line 1695) | type FilePickerCallback = (callback: (value: string, meta?: Record<strin...
  type FilePickerValidationStatus (line 1696) | type FilePickerValidationStatus = 'valid' | 'unknown' | 'invalid' | 'none';
  type FilePickerValidationCallback (line 1697) | type FilePickerValidationCallback = (info: {
  type PastePreProcessFn (line 1704) | type PastePreProcessFn = (editor: Editor, args: PastePreProcessEvent) =>...
  type PastePostProcessFn (line 1705) | type PastePostProcessFn = (editor: Editor, args: PastePostProcessEvent) ...
  type URLConverter (line 1706) | type URLConverter = (url: string, name: string, elm?: string | Element) ...
  type URLConverterCallback (line 1707) | type URLConverterCallback = (url: string, node: Node | string | undefine...
  type ToolbarGroup (line 1708) | interface ToolbarGroup {
  type ToolbarMode (line 1712) | type ToolbarMode = 'floating' | 'sliding' | 'scrolling' | 'wrap';
  type ToolbarLocation (line 1713) | type ToolbarLocation = 'top' | 'bottom' | 'auto';
  type BaseEditorOptions (line 1714) | interface BaseEditorOptions {
  type RawEditorOptions (line 1913) | interface RawEditorOptions extends BaseEditorOptions {
  type NormalizedEditorOptions (line 1918) | interface NormalizedEditorOptions extends BaseEditorOptions {
  type EditorOptions (line 1923) | interface EditorOptions exte
Condensed preview — 718 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,040K chars).
[
  {
    "path": ".gitignore",
    "chars": 185,
    "preview": "/.idea\ntarget\n\n/temp\n\napplication-dev?.yml\napplication-prod.yml\napplication-prod?.yml\napplication-server.yml\napplication"
  },
  {
    "path": "README.md",
    "chars": 5373,
    "preview": "# 次元印象\n\n<p align=\"center\">\n<img widht=\"240px\" height=\"240px\" src=\"./doc/images/website-icon.jpg\" ></img>\n</p>\n<p align=\""
  },
  {
    "path": "acimage_admin/.gitignore",
    "chars": 9,
    "preview": "/target/\n"
  },
  {
    "path": "acimage_admin/pom.xml",
    "chars": 2770,
    "preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:sc"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/AdminApplication.java",
    "chars": 904,
    "preview": "package com.acimage.admin;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.mybatis.spring.annotation.MapperScan;\nimport or"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/config/WebMvcConfig.java",
    "chars": 727,
    "preview": "package com.acimage.admin.config;\n\nimport com.acimage.common.web.interceptor.AccessInterceptor;\nimport com.acimage.commo"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/config/mybatis/CommunityDataSourceConfig.java",
    "chars": 2671,
    "preview": "package com.acimage.admin.config.mybatis;\n\n\nimport com.baomidou.mybatisplus.core.config.GlobalConfig;\nimport com.baomido"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/config/mybatis/GlobalConfigBean.java",
    "chars": 566,
    "preview": "package com.acimage.admin.config.mybatis;\n\nimport com.baomidou.mybatisplus.core.MybatisConfiguration;\nimport com.baomido"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/config/mybatis/ImageDataSourceConfig.java",
    "chars": 2995,
    "preview": "package com.acimage.admin.config.mybatis;\n\n\nimport com.alibaba.druid.pool.DruidDataSource;\nimport com.baomidou.mybatispl"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/dao/community/CategoryDao.java",
    "chars": 220,
    "preview": "package com.acimage.admin.dao.community;\n\nimport com.acimage.common.model.domain.community.Category;\nimport com.baomidou"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/dao/community/CommentDao.java",
    "chars": 217,
    "preview": "package com.acimage.admin.dao.community;\n\nimport com.acimage.common.model.domain.community.Comment;\nimport com.baomidou."
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/dao/community/HomeCarouselDao.java",
    "chars": 436,
    "preview": "package com.acimage.admin.dao.community;\n\n\nimport com.acimage.common.model.domain.community.HomeCarousel;\nimport com.bao"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/dao/community/TopicDao.java",
    "chars": 211,
    "preview": "package com.acimage.admin.dao.community;\n\nimport com.acimage.common.model.domain.community.Topic;\nimport com.baomidou.my"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/dao/sys/ApiDao.java",
    "chars": 193,
    "preview": "package com.acimage.admin.dao.sys;\n\nimport com.acimage.common.model.domain.sys.Api;\nimport com.baomidou.mybatisplus.core"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/dao/sys/AuthorizeDao.java",
    "chars": 213,
    "preview": "package com.acimage.admin.dao.sys;\n\nimport com.acimage.common.model.domain.sys.Authorize;\nimport com.baomidou.mybatisplu"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/dao/sys/PermissionDao.java",
    "chars": 537,
    "preview": "package com.acimage.admin.dao.sys;\n\nimport com.acimage.common.model.domain.sys.Permission;\nimport com.baomidou.mybatispl"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/dao/sys/RoleDao.java",
    "chars": 196,
    "preview": "package com.acimage.admin.dao.sys;\n\nimport com.acimage.common.model.domain.sys.Role;\nimport com.baomidou.mybatisplus.cor"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/dao/sys/UserRoleDao.java",
    "chars": 209,
    "preview": "package com.acimage.admin.dao.sys;\n\n\nimport com.acimage.common.model.domain.sys.UserRole;\nimport com.baomidou.mybatisplu"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/dao/user/UserDao.java",
    "chars": 198,
    "preview": "package com.acimage.admin.dao.user;\n\nimport com.acimage.common.model.domain.user.User;\nimport com.baomidou.mybatisplus.c"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/dao/user/UserPrivacyDao.java",
    "chars": 219,
    "preview": "package com.acimage.admin.dao.user;\n\nimport com.acimage.common.model.domain.user.UserPrivacy;\nimport com.baomidou.mybati"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/global/consts/ModuleConstants.java",
    "chars": 263,
    "preview": "package com.acimage.admin.global.consts;\n\npublic class ModuleConstants {\n    public static final String COMMUNITY=\"commu"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/model/request/AdminLoginReq.java",
    "chars": 538,
    "preview": "package com.acimage.admin.model.request;\n\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsCon"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/model/request/ApiAddReq.java",
    "chars": 1034,
    "preview": "package com.acimage.admin.model.request;\n\nimport com.acimage.common.global.enums.MatchRule;\nimport com.acimage.common.gl"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/model/request/ApiModifyReq.java",
    "chars": 1004,
    "preview": "package com.acimage.admin.model.request;\n\nimport com.acimage.common.global.enums.MatchRule;\nimport com.acimage.common.gl"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/model/request/ApiQueryReq.java",
    "chars": 386,
    "preview": "package com.acimage.admin.model.request;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsCons"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/model/request/CarouselAddReq.java",
    "chars": 557,
    "preview": "package com.acimage.admin.model.request;\n\nimport com.acimage.common.model.domain.community.HomeCarousel;\nimport lombok.D"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/model/request/CarouselModifyReq.java",
    "chars": 657,
    "preview": "package com.acimage.admin.model.request;\n\nimport com.acimage.common.model.domain.community.HomeCarousel;\nimport lombok.D"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/model/request/CommentQueryReq.java",
    "chars": 367,
    "preview": "package com.acimage.admin.model.request;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.hibernate.vali"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/model/request/PermissionAddReq.java",
    "chars": 652,
    "preview": "package com.acimage.admin.model.request;\n\nimport com.acimage.common.model.domain.sys.Permission;\nimport lombok.Data;\nimp"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/model/request/PermissionModifyReq.java",
    "chars": 697,
    "preview": "package com.acimage.admin.model.request;\n\nimport com.acimage.common.model.domain.sys.Permission;\nimport lombok.Data;\nimp"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/model/request/RoleAddReq.java",
    "chars": 442,
    "preview": "package com.acimage.admin.model.request;\n\n\nimport com.acimage.common.model.domain.sys.Role;\nimport lombok.Data;\nimport l"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/model/request/RoleModifyReq.java",
    "chars": 522,
    "preview": "package com.acimage.admin.model.request;\n\nimport com.acimage.common.model.domain.sys.Role;\nimport lombok.Data;\nimport lo"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/model/request/TopicQueryReq.java",
    "chars": 369,
    "preview": "package com.acimage.admin.model.request;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport org.hibernate.vali"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/model/request/UserQueryReq.java",
    "chars": 254,
    "preview": "package com.acimage.admin.model.request;\n\nimport lombok.Data;\n\nimport javax.validation.constraints.*;\n\n@Data\npublic clas"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/model/vo/WebsiteDataVo.java",
    "chars": 213,
    "preview": "package com.acimage.admin.model.vo;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n@Data\n@NoArgsConstructor\npubl"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/api/ApiQueryService.java",
    "chars": 272,
    "preview": "package com.acimage.admin.service.api;\n\nimport com.acimage.admin.model.request.ApiQueryReq;\nimport com.acimage.common.mo"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/api/ApiWriteService.java",
    "chars": 288,
    "preview": "package com.acimage.admin.service.api;\n\nimport com.acimage.admin.model.request.ApiAddReq;\nimport com.acimage.admin.model"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/api/impl/ApiQueryServiceImpl.java",
    "chars": 1337,
    "preview": "package com.acimage.admin.service.api.impl;\n\nimport com.acimage.admin.dao.sys.ApiDao;\nimport com.acimage.admin.global.co"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/api/impl/ApiWriteServiceImpl.java",
    "chars": 2229,
    "preview": "package com.acimage.admin.service.api.impl;\n\n\nimport com.acimage.admin.dao.sys.ApiDao;\nimport com.acimage.admin.global.c"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/authorize/AuthorizeQueryService.java",
    "chars": 223,
    "preview": "package com.acimage.admin.service.authorize;\n\nimport com.acimage.common.model.domain.sys.Authorize;\n\nimport java.util.Li"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/authorize/AuthorizeWriteService.java",
    "chars": 219,
    "preview": "package com.acimage.admin.service.authorize;\n\npublic interface AuthorizeWriteService {\n\n    void save(int roleId, int pe"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/authorize/impl/AuthorizeQueryServiceImpl.java",
    "chars": 863,
    "preview": "package com.acimage.admin.service.authorize.impl;\n\nimport com.acimage.admin.dao.sys.AuthorizeDao;\nimport com.acimage.adm"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/authorize/impl/AuthorizeWriteServiceImpl.java",
    "chars": 1731,
    "preview": "package com.acimage.admin.service.authorize.impl;\n\nimport com.acimage.admin.dao.sys.AuthorizeDao;\nimport com.acimage.adm"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/category/CategoryQueryService.java",
    "chars": 201,
    "preview": "package com.acimage.admin.service.category;\n\nimport com.acimage.common.model.domain.community.Category;\n\nimport java.uti"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/category/impl/CategoryQueryServiceImpl.java",
    "chars": 731,
    "preview": "package com.acimage.admin.service.category.impl;\n\nimport com.acimage.admin.dao.community.CategoryDao;\nimport com.acimage"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/comment/CommentQueryService.java",
    "chars": 314,
    "preview": "package com.acimage.admin.service.comment;\n\nimport com.acimage.admin.model.request.CommentQueryReq;\nimport com.acimage.c"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/comment/CommentWriteService.java",
    "chars": 111,
    "preview": "package com.acimage.admin.service.comment;\n\npublic interface CommentWriteService {\n    void delete(long id);\n}\n"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/comment/impl/CommentQueryServiceImpl.java",
    "chars": 1713,
    "preview": "package com.acimage.admin.service.comment.impl;\n\nimport cn.hutool.core.util.StrUtil;\nimport com.acimage.admin.dao.commun"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/comment/impl/CommentWriteServiceImpl.java",
    "chars": 622,
    "preview": "package com.acimage.admin.service.comment.impl;\n\n\nimport com.acimage.admin.global.consts.ModuleConstants;\nimport com.aci"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/homecarousel/HomeCarouselQueryService.java",
    "chars": 221,
    "preview": "package com.acimage.admin.service.homecarousel;\n\nimport com.acimage.common.model.domain.community.HomeCarousel;\n\nimport "
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/homecarousel/HomeCarouselWriteService.java",
    "chars": 701,
    "preview": "package com.acimage.admin.service.homecarousel;\n\nimport com.acimage.admin.model.request.CarouselAddReq;\nimport com.acima"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/homecarousel/impl/HomeCarouselQueryServiceImpl.java",
    "chars": 976,
    "preview": "package com.acimage.admin.service.homecarousel.impl;\n\nimport com.acimage.admin.dao.community.HomeCarouselDao;\nimport com"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/homecarousel/impl/HomeCarouselWriteServiceImpl.java",
    "chars": 4919,
    "preview": "package com.acimage.admin.service.homecarousel.impl;\n\nimport cn.hutool.core.util.RandomUtil;\nimport com.acimage.admin.da"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/login/LoginService.java",
    "chars": 178,
    "preview": "package com.acimage.admin.service.login;\n\nimport com.acimage.admin.model.request.AdminLoginReq;\n\npublic interface LoginS"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/login/VerifyCodeService.java",
    "chars": 358,
    "preview": "package com.acimage.admin.service.login;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpSe"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/login/impl/LoginServiceImpl.java",
    "chars": 2451,
    "preview": "package com.acimage.admin.service.login.impl;\n\nimport cn.hutool.crypto.digest.DigestUtil;\nimport com.acimage.admin.dao.u"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/login/impl/VerifyCodeServiceImpl.java",
    "chars": 2057,
    "preview": "package com.acimage.admin.service.login.impl;\n\nimport cn.hutool.captcha.CaptchaUtil;\nimport cn.hutool.captcha.ShearCaptc"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/permission/PermissionQueryService.java",
    "chars": 429,
    "preview": "package com.acimage.admin.service.permission;\n\nimport com.acimage.common.model.domain.sys.Permission;\nimport com.acimage"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/permission/PermissionWriteSercice.java",
    "chars": 447,
    "preview": "package com.acimage.admin.service.permission;\n\nimport com.acimage.admin.model.request.PermissionAddReq;\nimport com.acima"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/permission/impl/PermissionQueryServiceImpl.java",
    "chars": 1616,
    "preview": "package com.acimage.admin.service.permission.impl;\n\nimport com.acimage.admin.dao.sys.PermissionDao;\nimport com.acimage.a"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/permission/impl/PermissionWriteServiceImpl.java",
    "chars": 1567,
    "preview": "package com.acimage.admin.service.permission.impl;\n\nimport cn.hutool.core.bean.BeanUtil;\nimport com.acimage.admin.dao.sy"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/role/RoleQueryService.java",
    "chars": 179,
    "preview": "package com.acimage.admin.service.role;\n\nimport com.acimage.common.model.domain.sys.Role;\n\nimport java.util.List;\n\npubli"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/role/RoleWriteService.java",
    "chars": 299,
    "preview": "package com.acimage.admin.service.role;\n\nimport com.acimage.admin.model.request.RoleAddReq;\nimport com.acimage.admin.mod"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/role/impl/RoleQueryServiceImpl.java",
    "chars": 599,
    "preview": "package com.acimage.admin.service.role.impl;\n\nimport com.acimage.admin.dao.sys.RoleDao;\nimport com.acimage.admin.service"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/role/impl/RoleWriteServiceImpl.java",
    "chars": 1406,
    "preview": "package com.acimage.admin.service.role.impl;\n\nimport cn.hutool.core.bean.BeanUtil;\nimport com.acimage.admin.dao.sys.Role"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/topic/TopicQueryService.java",
    "chars": 333,
    "preview": "package com.acimage.admin.service.topic;\n\nimport com.acimage.admin.model.request.TopicQueryReq;\nimport com.acimage.commo"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/topic/TopicWriteService.java",
    "chars": 112,
    "preview": "package com.acimage.admin.service.topic;\n\npublic interface TopicWriteService {\n    void remove(long topicId);\n}\n"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/topic/impl/TopicQueryServiceImpl.java",
    "chars": 2334,
    "preview": "package com.acimage.admin.service.topic.impl;\n\nimport com.acimage.admin.dao.community.TopicDao;\nimport com.acimage.admin"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/topic/impl/TopicWriteServiceImpl.java",
    "chars": 917,
    "preview": "package com.acimage.admin.service.topic.impl;\n\nimport com.acimage.admin.global.consts.ModuleConstants;\nimport com.acimag"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/user/UserQueryService.java",
    "chars": 312,
    "preview": "package com.acimage.admin.service.user;\n\nimport com.acimage.admin.model.request.UserQueryReq;\nimport com.acimage.common."
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/user/UserWriteService.java",
    "chars": 79,
    "preview": "package com.acimage.admin.service.user;\n\npublic interface UserWriteService {\n}\n"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/user/impl/UserQueryServiceImpl.java",
    "chars": 2394,
    "preview": "package com.acimage.admin.service.user.impl;\n\n\nimport com.acimage.admin.dao.user.UserDao;\nimport com.acimage.admin.globa"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/user/impl/UserWriteServiceImpl.java",
    "chars": 277,
    "preview": "package com.acimage.admin.service.user.impl;\n\nimport com.acimage.admin.global.consts.ModuleConstants;\nimport com.baomido"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/userrole/UserRoleQueryService.java",
    "chars": 311,
    "preview": "package com.acimage.admin.service.userrole;\n\nimport com.acimage.common.model.domain.sys.UserRole;\n\nimport java.util.List"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/userrole/UserRoleWriteService.java",
    "chars": 216,
    "preview": "package com.acimage.admin.service.userrole;\n\nimport java.util.List;\nimport java.util.Map;\n\npublic interface UserRoleWrit"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/userrole/impl/UserRoleQueryServiceImpl.java",
    "chars": 1823,
    "preview": "package com.acimage.admin.service.userrole.impl;\n\nimport com.acimage.admin.dao.sys.UserRoleDao;\nimport com.acimage.admin"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/userrole/impl/UserRoleWriteServiceImpl.java",
    "chars": 1777,
    "preview": "package com.acimage.admin.service.userrole.impl;\n\nimport com.acimage.admin.dao.sys.UserRoleDao;\nimport com.acimage.admin"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/websitedata/WebsiteDataService.java",
    "chars": 174,
    "preview": "package com.acimage.admin.service.websitedata;\n\nimport com.acimage.admin.model.vo.WebsiteDataVo;\n\npublic interface Websi"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/service/websitedata/impl/WebsiteDataServiceImpl.java",
    "chars": 1033,
    "preview": "package com.acimage.admin.service.websitedata.impl;\n\nimport com.acimage.admin.model.vo.WebsiteDataVo;\nimport com.acimage"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/web/controller/AdminLoginController.java",
    "chars": 1833,
    "preview": "package com.acimage.admin.web.controller;\n\n\nimport com.acimage.admin.model.request.AdminLoginReq;\nimport com.acimage.adm"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/web/controller/ApiOperateController.java",
    "chars": 1566,
    "preview": "package com.acimage.admin.web.controller;\n\n\nimport com.acimage.admin.model.request.ApiAddReq;\nimport com.acimage.admin.m"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/web/controller/ApiQueryController.java",
    "chars": 848,
    "preview": "package com.acimage.admin.web.controller;\n\n\nimport com.acimage.admin.model.request.ApiQueryReq;\nimport com.acimage.admin"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/web/controller/AuthorizeOperateController.java",
    "chars": 1153,
    "preview": "package com.acimage.admin.web.controller;\n\n\nimport com.acimage.admin.service.authorize.AuthorizeWriteService;\nimport com"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/web/controller/AuthorizeQueryController.java",
    "chars": 882,
    "preview": "package com.acimage.admin.web.controller;\n\n\nimport com.acimage.admin.service.authorize.AuthorizeQueryService;\nimport com"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/web/controller/CategoryController.java",
    "chars": 884,
    "preview": "package com.acimage.admin.web.controller;\n\n\nimport com.acimage.admin.service.category.CategoryQueryService;\nimport com.a"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/web/controller/CommentOperateController.java",
    "chars": 980,
    "preview": "package com.acimage.admin.web.controller;\n\n\nimport com.acimage.admin.model.request.CommentQueryReq;\nimport com.acimage.a"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/web/controller/CommentQueryController.java",
    "chars": 1336,
    "preview": "package com.acimage.admin.web.controller;\n\n\nimport com.acimage.admin.model.request.CommentQueryReq;\nimport com.acimage.a"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/web/controller/HomeCarouselController.java",
    "chars": 2952,
    "preview": "package com.acimage.admin.web.controller;\n\n\nimport cn.hutool.core.util.StrUtil;\nimport com.acimage.admin.model.request.C"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/web/controller/PermissionOperateController.java",
    "chars": 1601,
    "preview": "package com.acimage.admin.web.controller;\n\nimport cn.hutool.core.util.StrUtil;\nimport com.acimage.admin.model.request.Pe"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/web/controller/PermissionQueryController.java",
    "chars": 1788,
    "preview": "package com.acimage.admin.web.controller;\n\n\nimport com.acimage.admin.service.permission.PermissionQueryService;\nimport c"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/web/controller/RoleController.java",
    "chars": 1489,
    "preview": "package com.acimage.admin.web.controller;\n\n\nimport com.acimage.admin.model.request.RoleAddReq;\nimport com.acimage.admin."
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/web/controller/TopicOperateController.java",
    "chars": 950,
    "preview": "package com.acimage.admin.web.controller;\n\n\nimport com.acimage.admin.service.topic.TopicWriteService;\nimport com.acimage"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/web/controller/TopicQueryController.java",
    "chars": 1186,
    "preview": "package com.acimage.admin.web.controller;\n\n\nimport com.acimage.admin.model.request.TopicQueryReq;\nimport com.acimage.adm"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/web/controller/UserQueryController.java",
    "chars": 1363,
    "preview": "package com.acimage.admin.web.controller;\n\n\nimport com.acimage.admin.model.request.UserQueryReq;\nimport com.acimage.admi"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/web/controller/UserRoleOperateController.java",
    "chars": 1256,
    "preview": "package com.acimage.admin.web.controller;\n\n\nimport com.acimage.admin.model.request.UserQueryReq;\nimport com.acimage.admi"
  },
  {
    "path": "acimage_admin/src/main/java/com/acimage/admin/web/controller/WebsiteDataController.java",
    "chars": 867,
    "preview": "package com.acimage.admin.web.controller;\n\n\nimport com.acimage.admin.model.vo.WebsiteDataVo;\nimport com.acimage.admin.se"
  },
  {
    "path": "acimage_admin/src/main/resources/application-dev.yml",
    "chars": 2099,
    "preview": "server:\n  port: 8060\n\nspring:\n  config:\n    activate:\n      on-profile:\n        - dev\n#  datasource:\n#    community:\n#  "
  },
  {
    "path": "acimage_admin/src/main/resources/application.yml",
    "chars": 816,
    "preview": "\nspring:\n  profiles:\n    include: common,common-secret\n    active: dev2\n  application:\n    name: admin-service #服务名称\n  s"
  },
  {
    "path": "acimage_admin/src/main/resources/logback-spring.xml",
    "chars": 4344,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<!-- 配置文件修改时重新加载,默认true -->\n<configuration scan=\"true\">\n\n    <!--定义日志文件的存储地址 勿在 "
  },
  {
    "path": "acimage_admin/src/main/resources/mapper/community/TopicMapper.xml",
    "chars": 996,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper\n        PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"ht"
  },
  {
    "path": "acimage_admin/src/main/resources/mapper/image/HomeCarouselMapper.xml",
    "chars": 336,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper\n        PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"ht"
  },
  {
    "path": "acimage_admin/src/main/resources/mapper/sys/ApiMapper.xml",
    "chars": 1168,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper\n        PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"ht"
  },
  {
    "path": "acimage_admin/src/main/resources/mapper/sys/PermissionMapper.xml",
    "chars": 2073,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper\n        PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"ht"
  },
  {
    "path": "acimage_admin/src/main/resources/mapper/user/TopicMapper.xml",
    "chars": 1084,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<!DOCTYPE mapper\n        PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"ht"
  },
  {
    "path": "acimage_admin/src/test/java/com/acimage/admin/AdminApplicationTest.java",
    "chars": 480,
    "preview": "package com.acimage.admin;\n\n\nimport com.acimage.common.deprecated.QiniuUtils;\nimport org.junit.jupiter.api.Test;\nimport "
  },
  {
    "path": "acimage_admin/src/test/java/com/acimage/admin/dao/community/SpDaoTest.java",
    "chars": 790,
    "preview": "package com.acimage.admin.dao.community;\n\n\nimport com.acimage.common.model.domain.community.HomeCarousel;\nimport org.jun"
  },
  {
    "path": "acimage_admin/src/test/java/com/acimage/admin/dao/community/TopicDaoTest.java",
    "chars": 387,
    "preview": "package com.acimage.admin.dao.community;\n\n\nimport org.junit.jupiter.api.Test;\nimport org.springframework.beans.factory.a"
  },
  {
    "path": "acimage_admin/src/test/java/com/acimage/admin/dao/sys/ApiDaoTest.java",
    "chars": 512,
    "preview": "package com.acimage.admin.dao.sys;\n\n\nimport com.acimage.common.global.enums.MatchRule;\nimport com.acimage.common.model.d"
  },
  {
    "path": "acimage_admin/src/test/java/com/acimage/admin/service/HomeCarouselWriteServiceTest.java",
    "chars": 403,
    "preview": "package com.acimage.admin.service;\n\nimport com.acimage.admin.service.homecarousel.HomeCarouselWriteService;\nimport org.j"
  },
  {
    "path": "acimage_common/.gitignore",
    "chars": 49,
    "preview": "/.idea\n/src/main/resources/application-qiniu.yml\n"
  },
  {
    "path": "acimage_common/pom.xml",
    "chars": 7025,
    "preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n         xsi:sc"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/CommonMain.java",
    "chars": 103,
    "preview": "package com.acimage.common;\n\n\npublic class CommonMain {\n\tpublic static void main(String[] args) {\n\t}\n}\n"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/config/EsConfig.java",
    "chars": 1309,
    "preview": "package com.acimage.common.config;\n\nimport org.apache.http.auth.AuthScope;\nimport org.apache.http.auth.UsernamePasswordC"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/config/EsProdConfig.java",
    "chars": 1649,
    "preview": "package com.acimage.common.config;\n\nimport org.apache.http.auth.AuthScope;\nimport org.apache.http.auth.UsernamePasswordC"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/config/FilterConfig.java",
    "chars": 1363,
    "preview": "package com.acimage.common.config;\n\nimport org.springframework.boot.web.servlet.FilterRegistrationBean;\nimport org.sprin"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/config/JacksonConfig.java",
    "chars": 920,
    "preview": "package com.acimage.common.config;\n\n\nimport cn.hutool.core.date.DatePattern;\nimport com.fasterxml.jackson.databind.ser.s"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/config/PaginationConfig.java",
    "chars": 892,
    "preview": "package com.acimage.common.config;\n\nimport com.baomidou.mybatisplus.annotation.DbType;\nimport com.baomidou.mybatisplus.e"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/config/RabbitmqConvertConfig.java",
    "chars": 1514,
    "preview": "package com.acimage.common.config;\n\n\nimport org.springframework.amqp.core.AcknowledgeMode;\nimport org.springframework.am"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/deprecated/IpInterceptorBak.java",
    "chars": 2534,
    "preview": "package com.acimage.common.deprecated;\n\nimport com.acimage.common.global.context.UserContext;\nimport com.acimage.common."
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/deprecated/JwtInterceptorBak.java",
    "chars": 3225,
    "preview": "package com.acimage.common.deprecated;\n\nimport com.acimage.common.global.exception.NullTokenException;\nimport com.acimag"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/deprecated/PermissionInterceptorBak.java",
    "chars": 3116,
    "preview": "package com.acimage.common.deprecated;\n\nimport com.acimage.common.deprecated.annotation.utils.AuthenticationUtils;\nimpor"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/deprecated/QiniuUtils.java",
    "chars": 8866,
    "preview": "package com.acimage.common.deprecated;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport cn.hutool.http.HttpUtil;"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/deprecated/QiniuUtilsBak.java",
    "chars": 8899,
    "preview": "package com.acimage.common.deprecated;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport cn.hutool.http.HttpUtil;"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/deprecated/UserCommunityStatistic.java",
    "chars": 523,
    "preview": "package com.acimage.common.deprecated;\n\nimport com.acimage.common.model.domain.community.CmtyUser;\nimport com.baomidou.m"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/deprecated/annotation/Authentication.java",
    "chars": 499,
    "preview": "package com.acimage.common.deprecated.annotation;\n\nimport com.acimage.common.global.enums.AuthenticationType;\n\nimport ja"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/deprecated/annotation/utils/AuthenticationUtils.java",
    "chars": 934,
    "preview": "package com.acimage.common.deprecated.annotation.utils;\n\nimport com.acimage.common.deprecated.annotation.Authentication;"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/deprecated/typehandler/MatchRuleTypeHandler.java",
    "chars": 1300,
    "preview": "package com.acimage.common.deprecated.typehandler;\n\n\nimport com.acimage.common.global.enums.MatchRule;\nimport org.apache"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/global/aop/LogAdvice.java",
    "chars": 2626,
    "preview": "package com.acimage.common.global.aop;\n\n\nimport com.acimage.common.utils.common.AopUtils;\nimport lombok.extern.slf4j.Slf"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/global/consts/EsConstants.java",
    "chars": 182,
    "preview": "package com.acimage.common.global.consts;\n\npublic class EsConstants {\n    public static final String IK_SMART=\"ik_smart\""
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/global/consts/FileFormatConstants.java",
    "chars": 532,
    "preview": "package com.acimage.common.global.consts;\n\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class FileFormatConst"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/global/consts/HeaderKeyConstants.java",
    "chars": 290,
    "preview": "package com.acimage.common.global.consts;\n\npublic class HeaderKeyConstants {\n    public static final String AUTHORIZATIO"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/global/consts/JwtConstants.java",
    "chars": 342,
    "preview": "package com.acimage.common.global.consts;\n\npublic class JwtConstants {\n\n    public static final int USER_EXPIRE_DAYS = 2"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/global/consts/MqConstants.java",
    "chars": 1159,
    "preview": "package com.acimage.common.global.consts;\n\npublic class MqConstants {\n    public static final String HASH_IMAGE_QUEUE = "
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/global/consts/StorePrefixConstants.java",
    "chars": 311,
    "preview": "package com.acimage.common.global.consts;\n\npublic class StorePrefixConstants {\n    public final static String TOPIC_IMAG"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/global/consts/SysKeyConstants.java",
    "chars": 534,
    "preview": "package com.acimage.common.global.consts;\n\npublic class SysKeyConstants {\n\n    /**\n     * 记录网站浏览量\n     */\n    public sta"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/global/consts/TimeConstants.java",
    "chars": 126,
    "preview": "package com.acimage.common.global.consts;\n\npublic class TimeConstants {\n\n    public static final long DAY_SECONDS=24*60*"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/global/context/UserContext.java",
    "chars": 1760,
    "preview": "package com.acimage.common.global.context;\n\nimport com.acimage.common.global.enums.TokenStatus;\n\n\npublic class UserConte"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/global/enums/AuthenticationType.java",
    "chars": 277,
    "preview": "package com.acimage.common.global.enums;\n\npublic enum AuthenticationType {\n    NONE(0),\n    TOKEN_REQUIRED(1),\n    ADMIN"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/global/enums/MatchRule.java",
    "chars": 545,
    "preview": "package com.acimage.common.global.enums;\n\n/**\n * interface表中匹配规则\n */\npublic enum MatchRule {\n    /**\n     * 精确匹配\n     */"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/global/enums/MyHttpMethod.java",
    "chars": 385,
    "preview": "package com.acimage.common.global.enums;\n\nimport org.springframework.http.HttpMethod;\n\npublic enum MyHttpMethod {\n    GE"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/global/enums/ServiceType.java",
    "chars": 102,
    "preview": "package com.acimage.common.global.enums;\n\npublic enum ServiceType {\n    ADD,\n    DELETE,\n    UPDATE\n}\n"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/global/enums/TokenStatus.java",
    "chars": 317,
    "preview": "package com.acimage.common.global.enums;\n\npublic enum TokenStatus {\n    PASS_TOKEN_VERIFY(0),\n    NULL(1),\n    EXPIRE(2)"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/global/exception/BaseException.java",
    "chars": 432,
    "preview": "package com.acimage.common.global.exception;\n\nimport com.acimage.common.result.Result;\nimport lombok.AllArgsConstructor;"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/global/exception/BusinessException.java",
    "chars": 446,
    "preview": "package com.acimage.common.global.exception;\n\nimport com.acimage.common.result.Code;\nimport lombok.AllArgsConstructor;\ni"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/global/exception/NullTokenException.java",
    "chars": 238,
    "preview": "package com.acimage.common.global.exception;\n\nimport com.auth0.jwt.exceptions.JWTVerificationException;\n\npublic class Nu"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/global/exception/SystemException.java",
    "chars": 217,
    "preview": "package com.acimage.common.global.exception;\n\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\nimport lombok.Set"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/Index/TopicIndex.java",
    "chars": 3619,
    "preview": "package com.acimage.common.model.Index;\n\n\nimport cn.hutool.core.date.DatePattern;\nimport com.acimage.common.global.const"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/community/Category.java",
    "chars": 800,
    "preview": "package com.acimage.common.model.domain.community;\n\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomi"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/community/CmtyUser.java",
    "chars": 378,
    "preview": "package com.acimage.common.model.domain.community;\n\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport lombok.Al"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/community/Comment.java",
    "chars": 966,
    "preview": "package com.acimage.common.model.domain.community;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomid"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/community/HomeCarousel.java",
    "chars": 1088,
    "preview": "package com.acimage.common.model.domain.community;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomid"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/community/Star.java",
    "chars": 633,
    "preview": "package com.acimage.common.model.domain.community;\n\nimport com.acimage.common.model.domain.community.Topic;\nimport com.b"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/community/Tag.java",
    "chars": 587,
    "preview": "package com.acimage.common.model.domain.community;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomid"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/community/TagTopic.java",
    "chars": 589,
    "preview": "package com.acimage.common.model.domain.community;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomid"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/community/Topic.java",
    "chars": 1988,
    "preview": "package com.acimage.common.model.domain.community;\n\n\nimport com.acimage.common.model.domain.user.User;\nimport com.baomid"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/community/TopicHtml.java",
    "chars": 904,
    "preview": "package com.acimage.common.model.domain.community;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomid"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/image/Image.java",
    "chars": 1671,
    "preview": "package com.acimage.common.model.domain.image;\n\nimport com.acimage.common.model.domain.community.Topic;\nimport com.baomi"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/image/ImageHash.java",
    "chars": 733,
    "preview": "package com.acimage.common.model.domain.image;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.m"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/sys/Api.java",
    "chars": 1191,
    "preview": "package com.acimage.common.model.domain.sys;\n\nimport com.acimage.common.global.enums.MatchRule;\nimport com.acimage.commo"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/sys/Authorize.java",
    "chars": 718,
    "preview": "package com.acimage.common.model.domain.sys;\n\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.my"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/sys/Permission.java",
    "chars": 1205,
    "preview": "package com.acimage.common.model.domain.sys;\n\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.my"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/sys/Role.java",
    "chars": 925,
    "preview": "package com.acimage.common.model.domain.sys;\n\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.my"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/sys/UserRole.java",
    "chars": 469,
    "preview": "package com.acimage.common.model.domain.sys;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.myb"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/user/CommentMsg.java",
    "chars": 644,
    "preview": "package com.acimage.common.model.domain.user;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.my"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/user/User.java",
    "chars": 788,
    "preview": "package com.acimage.common.model.domain.user;\n\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.m"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/user/UserMsg.java",
    "chars": 607,
    "preview": "package com.acimage.common.model.domain.user;\n\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.m"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/domain/user/UserPrivacy.java",
    "chars": 764,
    "preview": "package com.acimage.common.model.domain.user;\n\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.m"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/mq/dto/EsAddDto.java",
    "chars": 294,
    "preview": "package com.acimage.common.model.mq.dto;\n\nimport lombok.*;\n\n\n@Getter\n@Setter\n@NoArgsConstructor\npublic class EsAddDto ex"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/mq/dto/EsDeleteDto.java",
    "chars": 238,
    "preview": "package com.acimage.common.model.mq.dto;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsCons"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/mq/dto/EsUpdateByIdDto.java",
    "chars": 347,
    "preview": "package com.acimage.common.model.mq.dto;\n\nimport lombok.*;\n\nimport java.util.List;\n\n@Getter\n@Setter\n@NoArgsConstructor\np"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/mq/dto/EsUpdateByTermDto.java",
    "chars": 528,
    "preview": "package com.acimage.common.model.mq.dto;\n\nimport lombok.Data;\nimport lombok.Getter;\nimport lombok.NoArgsConstructor;\nimp"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/mq/dto/ImageIdWithUrl.java",
    "chars": 257,
    "preview": "package com.acimage.common.model.mq.dto;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsCons"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/mq/dto/ObjectWithClass.java",
    "chars": 605,
    "preview": "package com.acimage.common.model.mq.dto;\n\nimport com.acimage.common.utils.common.JacksonUtils;\nimport lombok.AllArgsCons"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/mq/dto/SyncImagesUpdateDto.java",
    "chars": 533,
    "preview": "package com.acimage.common.model.mq.dto;\n\nimport com.acimage.common.global.enums.ServiceType;\nimport lombok.AllArgsConst"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/mq/dto/UserIdWithPhotoUrl.java",
    "chars": 265,
    "preview": "package com.acimage.common.model.mq.dto;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsCons"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/mq/dto/UserIdWithUsername.java",
    "chars": 265,
    "preview": "package com.acimage.common.model.mq.dto;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsCons"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/model/page/MyPage.java",
    "chars": 448,
    "preview": "package com.acimage.common.model.page;\n\n\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport lombok.AllArgsConst"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/redis/QueryRedisAdvice.java",
    "chars": 5341,
    "preview": "package com.acimage.common.redis;\n\n\nimport com.acimage.common.redis.annotation.KeyParam;\nimport com.acimage.common.redis"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/redis/RequestLimitAdvice.java",
    "chars": 5278,
    "preview": "package com.acimage.common.redis;\n\n\n\nimport com.acimage.common.global.context.UserContext;\nimport com.acimage.common.red"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/redis/annotation/KeyParam.java",
    "chars": 563,
    "preview": "package com.acimage.common.redis.annotation;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Reten"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/redis/annotation/QueryRedis.java",
    "chars": 617,
    "preview": "package com.acimage.common.redis.annotation;\n\nimport com.acimage.common.redis.enums.DataType;\n\nimport java.lang.annotati"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/redis/annotation/RequestLimit.java",
    "chars": 552,
    "preview": "package com.acimage.common.redis.annotation;\n\n\nimport com.acimage.common.redis.enums.LimitTarget;\n\nimport java.lang.anno"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/redis/enums/DataType.java",
    "chars": 88,
    "preview": "package com.acimage.common.redis.enums;\n\npublic enum DataType {\n    STRING,\n    HASH;\n}\n"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/redis/enums/LimitTarget.java",
    "chars": 96,
    "preview": "package com.acimage.common.redis.enums;\n\npublic enum LimitTarget {\n    USER,\n    IP,\n    ALL,\n}\n"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/redis/utils/RedisAnnotationUtils.java",
    "chars": 2145,
    "preview": "package com.acimage.common.redis.utils;\n\nimport com.acimage.common.redis.annotation.KeyParam;\nimport com.acimage.common."
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/result/Code.java",
    "chars": 454,
    "preview": "package com.acimage.common.result;\n\npublic class Code {\n    public static final Integer SAVE_ERR=20010;\n\n    public stat"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/result/Result.java",
    "chars": 722,
    "preview": "package com.acimage.common.result;\n\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstruct"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/service/TokenService.java",
    "chars": 293,
    "preview": "package com.acimage.common.service;\n\npublic interface TokenService {\n\n\n    Boolean hasRecorded(String token);\n\n    Strin"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/service/impl/TokenServiceImpl.java",
    "chars": 1361,
    "preview": "package com.acimage.common.service.impl;\n\nimport com.acimage.common.global.consts.JwtConstants;\nimport com.acimage.commo"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/utils/CookieUtils.java",
    "chars": 1172,
    "preview": "package com.acimage.common.utils;\n\nimport javax.servlet.http.Cookie;\nimport javax.servlet.http.HttpServletResponse;\n\npub"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/utils/EsUtils.java",
    "chars": 9785,
    "preview": "package com.acimage.common.utils;\n\n\nimport cn.hutool.core.bean.BeanUtil;\nimport cn.hutool.core.collection.CollectionUtil"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/utils/ExceptionUtils.java",
    "chars": 205,
    "preview": "package com.acimage.common.utils;\n\npublic class ExceptionUtils {\n\n    public static void printIfDev(Throwable e){\n      "
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/utils/HtmlUtils.java",
    "chars": 1344,
    "preview": "package com.acimage.common.utils;\n\nimport com.acimage.common.utils.common.ListUtils;\n\nimport java.util.ArrayList;\nimport"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/utils/IdGenerator.java",
    "chars": 195,
    "preview": "package com.acimage.common.utils;\n\nimport cn.hutool.core.util.IdUtil;\n\npublic class IdGenerator {\n    public static long"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/utils/ImageUtils.java",
    "chars": 5344,
    "preview": "package com.acimage.common.utils;\n\nimport com.acimage.common.global.exception.BusinessException;\nimport com.acimage.comm"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/utils/IpUtils.java",
    "chars": 4277,
    "preview": "package com.acimage.common.utils;\n\nimport cn.hutool.core.util.StrUtil;\nimport com.acimage.common.global.consts.HeaderKey"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/utils/JwtUtils.java",
    "chars": 2325,
    "preview": "package com.acimage.common.utils;\n\nimport cn.hutool.core.date.DateUtil;\nimport cn.hutool.core.util.StrUtil;\nimport com.a"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/utils/LambdaUtils.java",
    "chars": 2409,
    "preview": "package com.acimage.common.utils;\n\nimport cn.hutool.core.util.ReflectUtil;\nimport com.baomidou.mybatisplus.core.toolkit."
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/utils/RsaUtils.java",
    "chars": 722,
    "preview": "package com.acimage.common.utils;\n\nimport cn.hutool.crypto.asymmetric.KeyType;\nimport cn.hutool.crypto.asymmetric.RSA;\n\n"
  },
  {
    "path": "acimage_common/src/main/java/com/acimage/common/utils/SensitiveWordUtils.java",
    "chars": 1771,
    "preview": "package com.acimage.common.utils;\n\nimport cn.hutool.core.io.file.FileReader;\nimport cn.hutool.core.io.resource.ClassPath"
  }
]

// ... and 518 more files (download for full content)

About this extraction

This page contains the full source code of the ggggborn/SpringCloud-acimage GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 718 files (1.7 MB), approximately 515.9k tokens, and a symbol index with 2192 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!