├── .github └── workflows │ └── stale.yml ├── .gitignore ├── LICENSE ├── README-EN.md ├── README.md ├── SPONSORS.md ├── blossom-backend ├── .gitignore ├── Dockerfile ├── README.md ├── backend │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── com │ │ │ └── blossom │ │ │ └── backend │ │ │ ├── APP.java │ │ │ ├── base │ │ │ ├── auth │ │ │ │ ├── AbstractAuthService.java │ │ │ │ ├── AuthConstant.java │ │ │ │ ├── AuthContext.java │ │ │ │ ├── AuthController.java │ │ │ │ ├── AuthProperties.java │ │ │ │ ├── AuthService.java │ │ │ │ ├── TokenUtil.java │ │ │ │ ├── annotation │ │ │ │ │ ├── AssignUser.java │ │ │ │ │ ├── AuthIgnore.java │ │ │ │ │ ├── AuthUserType.java │ │ │ │ │ └── PermCheck.java │ │ │ │ ├── caffeine │ │ │ │ │ ├── CaffeineTokenAuthFilterProxy.java │ │ │ │ │ ├── CaffeineTokenEncoder.java │ │ │ │ │ ├── CaffeineTokenExpireResetFilter.java │ │ │ │ │ ├── CaffeineTokenRepository.java │ │ │ │ │ ├── CaffeineTokenUniqueFilter.java │ │ │ │ │ └── CaffeineTokenValidateFilter.java │ │ │ │ ├── enums │ │ │ │ │ ├── AuthTypeEnum.java │ │ │ │ │ ├── GrantTypeEnum.java │ │ │ │ │ ├── LogTypeEnum.java │ │ │ │ │ └── PasswordEncoderEnum.java │ │ │ │ ├── exception │ │ │ │ │ ├── AuthException.java │ │ │ │ │ ├── AuthRCode.java │ │ │ │ │ └── ExceptionAdviceByAuth.java │ │ │ │ ├── filters │ │ │ │ │ ├── AuthFilterProxy.java │ │ │ │ │ ├── HttpFirewall.java │ │ │ │ │ ├── RequestBodyReaderWrapper.java │ │ │ │ │ ├── RequestLogFilter.java │ │ │ │ │ ├── RequestWrapperFilter.java │ │ │ │ │ └── WhiteListFilter.java │ │ │ │ ├── interceptor │ │ │ │ │ └── UserTypeInterceptor.java │ │ │ │ ├── jwt │ │ │ │ │ ├── JWTAuthFilterProxy.java │ │ │ │ │ ├── JWTTokenEncoder.java │ │ │ │ │ ├── JWTTokenRepository.java │ │ │ │ │ └── JWTValidateFilter.java │ │ │ │ ├── pojo │ │ │ │ │ ├── AccessToken.java │ │ │ │ │ ├── KickOutReq.java │ │ │ │ │ ├── LoginDTO.java │ │ │ │ │ ├── LoginEvent.java │ │ │ │ │ └── LoginReq.java │ │ │ │ ├── redis │ │ │ │ │ ├── RedisTokenAuthFilterProxy.java │ │ │ │ │ ├── RedisTokenEncoder.java │ │ │ │ │ ├── RedisTokenExpireResetFilter.java │ │ │ │ │ ├── RedisTokenRepository.java │ │ │ │ │ ├── RedisTokenUniqueFilter.java │ │ │ │ │ └── RedisTokenValidateFilter.java │ │ │ │ ├── repo │ │ │ │ │ └── TokenRepository.java │ │ │ │ ├── security │ │ │ │ │ ├── PasswordEncoder.java │ │ │ │ │ ├── PasswordEncoderBCrypt.java │ │ │ │ │ ├── PasswordEncoderMD5.java │ │ │ │ │ ├── PasswordEncoderSHA256.java │ │ │ │ │ └── PasswordManager.java │ │ │ │ └── token │ │ │ │ │ └── TokenEncoder.java │ │ │ ├── param │ │ │ │ ├── ParamEnum.java │ │ │ │ ├── ParamMapper.java │ │ │ │ ├── ParamService.java │ │ │ │ └── pojo │ │ │ │ │ ├── ParamEntity.java │ │ │ │ │ ├── ParamPageReq.java │ │ │ │ │ └── ParamUpdReq.java │ │ │ ├── paramu │ │ │ │ ├── UserParamController.java │ │ │ │ ├── UserParamEnum.java │ │ │ │ ├── UserParamMapper.java │ │ │ │ ├── UserParamService.java │ │ │ │ └── pojo │ │ │ │ │ ├── UserParamEntity.java │ │ │ │ │ └── UserParamUpdReq.java │ │ │ ├── search │ │ │ │ ├── EnableIndex.java │ │ │ │ ├── IndexAspect.java │ │ │ │ ├── IndexObserver.java │ │ │ │ ├── SearchController.java │ │ │ │ ├── SearchProperties.java │ │ │ │ ├── SearchRes.java │ │ │ │ ├── Searcher.java │ │ │ │ ├── message │ │ │ │ │ ├── ArticleIndexMsg.java │ │ │ │ │ ├── IndexMsg.java │ │ │ │ │ ├── IndexMsgTypeEnum.java │ │ │ │ │ └── consumer │ │ │ │ │ │ ├── BatchIndexMsgConsumer.java │ │ │ │ │ │ └── IndexMsgConsumer.java │ │ │ │ └── queue │ │ │ │ │ └── IndexMsgQueue.java │ │ │ ├── sys │ │ │ │ ├── SysController.java │ │ │ │ ├── SysService.java │ │ │ │ └── os │ │ │ │ │ └── OSRes.java │ │ │ └── user │ │ │ │ ├── UserController.java │ │ │ │ ├── UserMapper.java │ │ │ │ ├── UserService.java │ │ │ │ ├── UserTypeEnum.java │ │ │ │ └── pojo │ │ │ │ ├── BlossomUserRes.java │ │ │ │ ├── UserAddReq.java │ │ │ │ ├── UserDeleteReq.java │ │ │ │ ├── UserDisabledReq.java │ │ │ │ ├── UserEntity.java │ │ │ │ ├── UserListRes.java │ │ │ │ ├── UserUpdAdminReq.java │ │ │ │ ├── UserUpdPwdReq.java │ │ │ │ └── UserUpdReq.java │ │ │ ├── config │ │ │ ├── BlConstants.java │ │ │ ├── PropertiesCheckListener.java │ │ │ ├── Test.java │ │ │ └── WebConfigurer.java │ │ │ ├── server │ │ │ ├── article │ │ │ │ ├── TagEnum.java │ │ │ │ ├── backup │ │ │ │ │ ├── ArticleBackupController.java │ │ │ │ │ ├── ArticleBackupJob.java │ │ │ │ │ ├── ArticleBackupService.java │ │ │ │ │ ├── BackupTypeEnum.java │ │ │ │ │ └── pojo │ │ │ │ │ │ ├── BackupFile.java │ │ │ │ │ │ └── DownloadReq.java │ │ │ │ ├── draft │ │ │ │ │ ├── ArticleController.java │ │ │ │ │ ├── ArticleMapper.java │ │ │ │ │ ├── ArticleService.java │ │ │ │ │ ├── ArticleTempVisitService.java │ │ │ │ │ ├── ImportManager.java │ │ │ │ │ └── pojo │ │ │ │ │ │ ├── ArticleAddReq.java │ │ │ │ │ │ ├── ArticleEntity.java │ │ │ │ │ │ ├── ArticleInfoRes.java │ │ │ │ │ │ ├── ArticleInfoSimpleRes.java │ │ │ │ │ │ ├── ArticleQueryReq.java │ │ │ │ │ │ ├── ArticleStarReq.java │ │ │ │ │ │ ├── ArticleStatRes.java │ │ │ │ │ │ ├── ArticleUpdContentReq.java │ │ │ │ │ │ ├── ArticleUpdContentRes.java │ │ │ │ │ │ ├── ArticleUpdNameReq.java │ │ │ │ │ │ ├── ArticleUpdReq.java │ │ │ │ │ │ └── ArticleUpdTagReq.java │ │ │ │ ├── log │ │ │ │ │ ├── ArticleLogController.java │ │ │ │ │ ├── ArticleLogMapper.java │ │ │ │ │ ├── ArticleLogService.java │ │ │ │ │ └── pojo │ │ │ │ │ │ ├── ArticleLogEntity.java │ │ │ │ │ │ └── ArticleLogRes.java │ │ │ │ ├── open │ │ │ │ │ ├── ArticleOpenController.java │ │ │ │ │ ├── ArticleOpenMapper.java │ │ │ │ │ ├── ArticleOpenService.java │ │ │ │ │ └── pojo │ │ │ │ │ │ ├── ArticleBatchOpenReq.java │ │ │ │ │ │ ├── ArticleOpenEntity.java │ │ │ │ │ │ ├── ArticleOpenReq.java │ │ │ │ │ │ ├── ArticleOpenRes.java │ │ │ │ │ │ └── ArticleOpenSyncReq.java │ │ │ │ ├── recycle │ │ │ │ │ ├── ArticleRecycleController.java │ │ │ │ │ ├── ArticleRecycleMapper.java │ │ │ │ │ ├── ArticleRecycleService.java │ │ │ │ │ └── pojo │ │ │ │ │ │ ├── ArticleRecycleEntity.java │ │ │ │ │ │ ├── ArticleRecycleListRes.java │ │ │ │ │ │ └── ArticleRecycleRestoreReq.java │ │ │ │ ├── reference │ │ │ │ │ ├── ArticleReferenceController.java │ │ │ │ │ ├── ArticleReferenceEnum.java │ │ │ │ │ ├── ArticleReferenceMapper.java │ │ │ │ │ ├── ArticleReferenceService.java │ │ │ │ │ └── pojo │ │ │ │ │ │ ├── ArticleReferenceEntity.java │ │ │ │ │ │ └── ArticleReferenceReq.java │ │ │ │ ├── stat │ │ │ │ │ ├── ArticleStatController.java │ │ │ │ │ ├── ArticleStatJob.java │ │ │ │ │ ├── ArticleStatMapper.java │ │ │ │ │ ├── ArticleStatService.java │ │ │ │ │ ├── ArticleStatTypeEnum.java │ │ │ │ │ └── pojo │ │ │ │ │ │ ├── ArticleHeatmapRes.java │ │ │ │ │ │ ├── ArticleLineRes.java │ │ │ │ │ │ ├── ArticleStatEntity.java │ │ │ │ │ │ ├── ArticleWordsRes.java │ │ │ │ │ │ └── ArticleWordsSaveReq.java │ │ │ │ └── view │ │ │ │ │ ├── ArticleViewMapper.java │ │ │ │ │ ├── ArticleViewService.java │ │ │ │ │ ├── ArticleViewTypeEnum.java │ │ │ │ │ └── pojo │ │ │ │ │ └── ArticleViewEntity.java │ │ │ ├── doc │ │ │ │ ├── DocController.java │ │ │ │ ├── DocMapper.java │ │ │ │ ├── DocService.java │ │ │ │ ├── DocSortChecker.java │ │ │ │ ├── DocTypeEnum.java │ │ │ │ └── pojo │ │ │ │ │ ├── DocTreeReq.java │ │ │ │ │ ├── DocTreeRes.java │ │ │ │ │ └── DocTreeUpdSortReq.java │ │ │ ├── folder │ │ │ │ ├── FolderController.java │ │ │ │ ├── FolderMapper.java │ │ │ │ ├── FolderService.java │ │ │ │ ├── FolderTypeEnum.java │ │ │ │ └── pojo │ │ │ │ │ ├── FolderAddReq.java │ │ │ │ │ ├── FolderEntity.java │ │ │ │ │ ├── FolderOpenCloseReq.java │ │ │ │ │ ├── FolderQueryReq.java │ │ │ │ │ ├── FolderRes.java │ │ │ │ │ ├── FolderStarReq.java │ │ │ │ │ ├── FolderSubjectRes.java │ │ │ │ │ ├── FolderUpdNameReq.java │ │ │ │ │ ├── FolderUpdReq.java │ │ │ │ │ └── FolderUpdTagReq.java │ │ │ ├── note │ │ │ │ ├── NoteController.java │ │ │ │ ├── NoteMapper.java │ │ │ │ ├── NoteService.java │ │ │ │ └── pojo │ │ │ │ │ ├── NoteEntity.java │ │ │ │ │ ├── NoteSaveReq.java │ │ │ │ │ ├── NoteTopReq.java │ │ │ │ │ └── NoteUpdReq.java │ │ │ ├── picture │ │ │ │ ├── PictureBlosController.java │ │ │ │ ├── PictureController.java │ │ │ │ ├── PictureMapper.java │ │ │ │ ├── PictureService.java │ │ │ │ └── pojo │ │ │ │ │ ├── PictureDelBatchReq.java │ │ │ │ │ ├── PictureDelBatchRes.java │ │ │ │ │ ├── PictureDelReq.java │ │ │ │ │ ├── PictureEntity.java │ │ │ │ │ ├── PicturePageReq.java │ │ │ │ │ ├── PictureRes.java │ │ │ │ │ ├── PictureStarReq.java │ │ │ │ │ ├── PictureStatRes.java │ │ │ │ │ └── PictureTransferReq.java │ │ │ ├── plan │ │ │ │ ├── PlanController.java │ │ │ │ ├── PlanMapper.java │ │ │ │ ├── PlanPositionEnum.java │ │ │ │ ├── PlanService.java │ │ │ │ ├── PlanTypeEnum.java │ │ │ │ └── pojo │ │ │ │ │ ├── PlanDailyAddReq.java │ │ │ │ │ ├── PlanDailyRes.java │ │ │ │ │ ├── PlanDayAddReq.java │ │ │ │ │ ├── PlanDayRes.java │ │ │ │ │ ├── PlanDayUpdReq.java │ │ │ │ │ ├── PlanDelReq.java │ │ │ │ │ └── PlanEntity.java │ │ │ ├── todo │ │ │ │ ├── TaskController.java │ │ │ │ ├── TaskStatusEnum.java │ │ │ │ ├── TodoController.java │ │ │ │ ├── TodoMapper.java │ │ │ │ ├── TodoService.java │ │ │ │ ├── TodoStatusEnum.java │ │ │ │ ├── TodoTypeEnum.java │ │ │ │ └── pojo │ │ │ │ │ ├── TaskAddReq.java │ │ │ │ │ ├── TaskDelReq.java │ │ │ │ │ ├── TaskInfoRes.java │ │ │ │ │ ├── TaskRes.java │ │ │ │ │ ├── TaskStatisticRes.java │ │ │ │ │ ├── TaskTransferReq.java │ │ │ │ │ ├── TaskUpdReq.java │ │ │ │ │ ├── TaskUpdStatusReq.java │ │ │ │ │ ├── TodoEntity.java │ │ │ │ │ ├── TodoExportReq.java │ │ │ │ │ ├── TodoGroupRes.java │ │ │ │ │ ├── TodoPhasedAddReq.java │ │ │ │ │ ├── TodoPhasedCompletedReq.java │ │ │ │ │ ├── TodoPhasedUpdReq.java │ │ │ │ │ └── TodoStatisticRes.java │ │ │ ├── utils │ │ │ │ ├── ArticleUtil.java │ │ │ │ ├── DocUtil.java │ │ │ │ ├── DownloadUtil.java │ │ │ │ ├── PictureUtil.java │ │ │ │ ├── PlanUtil.java │ │ │ │ └── TodoUtil.java │ │ │ └── web │ │ │ │ ├── WebController.java │ │ │ │ ├── WebMapper.java │ │ │ │ ├── WebService.java │ │ │ │ └── pojo │ │ │ │ ├── WebEntity.java │ │ │ │ └── WebSaveReq.java │ │ │ └── thirdparty │ │ │ ├── ThirdPartyScheduled.java │ │ │ ├── gitee │ │ │ ├── GiteeManager.java │ │ │ └── pojo │ │ │ │ ├── Events.java │ │ │ │ └── HeatmapRes.java │ │ │ └── hefeng │ │ │ ├── HeCondCode.java │ │ │ ├── WeatherController.java │ │ │ ├── WeatherHeEntity.java │ │ │ ├── WeatherManager.java │ │ │ └── pojo │ │ │ ├── CityRes.java │ │ │ ├── DailyRes.java │ │ │ ├── HourlyRes.java │ │ │ ├── NowRes.java │ │ │ └── WeatherRes.java │ │ └── resources │ │ ├── application.yml │ │ ├── banner.txt │ │ ├── config │ │ ├── application-dev.yml │ │ ├── application-prod.yml │ │ └── application-test.yml │ │ ├── exportTemplate.html │ │ ├── logback-spring.xml │ │ ├── mapper │ │ ├── ArticleLogMapper.xml │ │ ├── ArticleMapper.xml │ │ ├── ArticleOpenMapper.xml │ │ ├── ArticleRecycleMapper.xml │ │ ├── ArticleReferenceMapper.xml │ │ ├── ArticleViewMapper.xml │ │ ├── DocMapper.xml │ │ ├── FolderMapper.xml │ │ ├── NoteMapper.xml │ │ ├── ParamMapper.xml │ │ ├── PictureMapper.xml │ │ ├── PlanMapper.xml │ │ ├── StatMapper.xml │ │ ├── TodoMapper.xml │ │ ├── UserMapper.xml │ │ ├── UserParamMapper.xml │ │ └── WebMapper.xml │ │ ├── schema-mysql.sql │ │ ├── sentinel.properties │ │ └── static │ │ ├── blog │ │ └── README.md │ │ ├── editor │ │ └── README.md │ │ └── favicon.png ├── common │ ├── common-base │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── com │ │ │ │ └── blossom │ │ │ │ └── common │ │ │ │ └── base │ │ │ │ ├── BaseConfig.java │ │ │ │ ├── BaseConstants.java │ │ │ │ ├── BaseProperties.java │ │ │ │ ├── config │ │ │ │ ├── JacksonConfig.java │ │ │ │ └── WebMvcConfig.java │ │ │ │ ├── enums │ │ │ │ ├── ExFormat.java │ │ │ │ ├── ExStackTrace.java │ │ │ │ ├── FrameworkEnum.java │ │ │ │ └── YesNo.java │ │ │ │ ├── exception │ │ │ │ ├── AbstractExceptionAdvice.java │ │ │ │ ├── ExceptionAdviceByGlobal.java │ │ │ │ ├── ExceptionAdviceByXz.java │ │ │ │ ├── XzAbstractException.java │ │ │ │ ├── XzException.java │ │ │ │ ├── XzException400.java │ │ │ │ ├── XzException400HTTP.java │ │ │ │ ├── XzException404.java │ │ │ │ └── XzException500.java │ │ │ │ ├── log │ │ │ │ ├── CustomLogbackColor.java │ │ │ │ ├── DynamicLogRepository.java │ │ │ │ ├── DynamicLogRepositoryCaffeine.java │ │ │ │ ├── HostNameConfig.java │ │ │ │ ├── LogDownloadUtil.java │ │ │ │ ├── LogIpConfig.java │ │ │ │ └── pojo │ │ │ │ │ └── DynamicLog.java │ │ │ │ ├── pojo │ │ │ │ ├── AbstractEntity.java │ │ │ │ ├── AbstractPOJO.java │ │ │ │ ├── DelReq.java │ │ │ │ ├── IRCode.java │ │ │ │ ├── PageRes.java │ │ │ │ ├── R.java │ │ │ │ └── RCode.java │ │ │ │ └── util │ │ │ │ ├── BeanUtil.java │ │ │ │ ├── DateUtils.java │ │ │ │ ├── ExceptionUtil.java │ │ │ │ ├── PrimaryKeyUtil.java │ │ │ │ ├── ProxyUtils.java │ │ │ │ ├── ServletUtil.java │ │ │ │ ├── SortUtil.java │ │ │ │ ├── SystemUtil.java │ │ │ │ ├── TimeUtil.java │ │ │ │ ├── json │ │ │ │ └── JsonUtil.java │ │ │ │ ├── okhttp │ │ │ │ ├── HttpUtil.java │ │ │ │ └── OkHttpInterceptor.java │ │ │ │ ├── security │ │ │ │ ├── BCrypt.java │ │ │ │ ├── BCryptPasswordEncoder.java │ │ │ │ ├── BCryptUtil.java │ │ │ │ ├── Base64Util.java │ │ │ │ ├── RSAUtil.java │ │ │ │ ├── SHA256Util.java │ │ │ │ └── SaltUtil.java │ │ │ │ ├── spi │ │ │ │ └── ServiceLoaderUtil.java │ │ │ │ ├── spring │ │ │ │ ├── AntPathMatcherUtil.java │ │ │ │ └── SpringUtil.java │ │ │ │ ├── thread │ │ │ │ └── NamedThreadFactory.java │ │ │ │ └── threadlocal │ │ │ │ ├── InternalThread.java │ │ │ │ ├── InternalThreadLocal.java │ │ │ │ ├── InternalThreadLocalMap.java │ │ │ │ └── NamedInternalThreadFactory.java │ │ │ └── resources │ │ │ └── META-INF │ │ │ ├── spring-configuration-metadata.json │ │ │ └── spring.factories │ ├── common-cache │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── com │ │ │ │ └── blossom │ │ │ │ └── common │ │ │ │ └── cache │ │ │ │ ├── CommonCacheProperties.java │ │ │ │ ├── caffeine │ │ │ │ ├── CaffeineCacheConfig.java │ │ │ │ ├── DynamicExpiry.java │ │ │ │ └── Test.java │ │ │ │ └── redis │ │ │ │ ├── DynamicLogRepositoryRedis.java │ │ │ │ ├── RedisCacheConfig.java │ │ │ │ ├── RedisConfiguration.java │ │ │ │ ├── RedisConstant.java │ │ │ │ ├── RedisProperties.java │ │ │ │ └── SimpleLock.java │ │ │ └── resources │ │ │ └── META-INF │ │ │ └── spring.factories │ ├── common-db │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── com │ │ │ │ └── blossom │ │ │ │ └── common │ │ │ │ └── db │ │ │ │ ├── AddColumnUtil.java │ │ │ │ ├── DBProperties.java │ │ │ │ ├── aspect │ │ │ │ ├── PageAspect.java │ │ │ │ └── Pages.java │ │ │ │ ├── exception │ │ │ │ └── ExceptionAdviceByDB.java │ │ │ │ ├── interceptor │ │ │ │ └── SlowSQLInterceptor.java │ │ │ │ └── pojo │ │ │ │ └── PageReq.java │ │ │ └── resources │ │ │ └── META-INF │ │ │ └── spring.factories │ ├── common-iaas │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── com │ │ │ │ └── blossom │ │ │ │ └── common │ │ │ │ └── iaas │ │ │ │ ├── AbstractOSManager.java │ │ │ │ ├── IaasConfiguration.java │ │ │ │ ├── IaasEnum.java │ │ │ │ ├── IaasProperties.java │ │ │ │ ├── OSManager.java │ │ │ │ ├── blos │ │ │ │ └── BLOSManager.java │ │ │ │ ├── cos │ │ │ │ └── COSManager.java │ │ │ │ ├── kodo │ │ │ │ └── KODOManager.java │ │ │ │ ├── obs │ │ │ │ └── OBSManager.java │ │ │ │ └── oss │ │ │ │ ├── OSSManager.java │ │ │ │ └── WaterMarkParam.java │ │ │ └── resources │ │ │ └── META-INF │ │ │ └── spring.factories │ └── pom.xml ├── expand-sentinel │ ├── expand-sentinel-metric │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── com │ │ │ │ └── blossom │ │ │ │ └── expand │ │ │ │ └── sentinel │ │ │ │ └── metric │ │ │ │ ├── config │ │ │ │ └── SentinelMetricConfiguration.java │ │ │ │ ├── controller │ │ │ │ ├── AbstractSentinelController.java │ │ │ │ └── SentinelMetricController.java │ │ │ │ ├── pojo │ │ │ │ ├── MetricLineRes.java │ │ │ │ ├── MetricRes.java │ │ │ │ ├── OneLineMetric.java │ │ │ │ ├── ResourceAggsRes.java │ │ │ │ └── ResourcesRes.java │ │ │ │ └── util │ │ │ │ └── SentinelUtil.java │ │ │ └── resources │ │ │ └── META-INF │ │ │ └── spring.factories │ ├── expand-sentinel-springmvc │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── com │ │ │ │ └── blossom │ │ │ │ └── expand │ │ │ │ └── sentinel │ │ │ │ └── mvc │ │ │ │ ├── AbstractSentinelInterceptor.java │ │ │ │ ├── SentinelWebInterceptor.java │ │ │ │ ├── SentinelWebTotalInterceptor.java │ │ │ │ ├── SpringInterceptorUtil.java │ │ │ │ ├── callback │ │ │ │ ├── BlockExceptionHandler.java │ │ │ │ ├── DefaultBlockExceptionHandler.java │ │ │ │ ├── RequestOriginParser.java │ │ │ │ └── UrlCleaner.java │ │ │ │ └── config │ │ │ │ ├── BaseWebMvcConfig.java │ │ │ │ ├── SentinelInterceptorConfig.java │ │ │ │ ├── SentinelWebMvcConfig.java │ │ │ │ └── SentinelWebMvcTotalConfig.java │ │ │ └── resources │ │ │ └── META-INF │ │ │ └── spring.factories │ └── pom.xml ├── expand-tracker │ ├── expand-tracker-core │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── com │ │ │ │ └── blossom │ │ │ │ └── expand │ │ │ │ └── tracker │ │ │ │ └── core │ │ │ │ ├── SpanContext.java │ │ │ │ ├── SpanNode.java │ │ │ │ ├── Tracker.java │ │ │ │ ├── TrackerConfiguration.java │ │ │ │ ├── TrackerMDCLog.java │ │ │ │ ├── TrackerProperties.java │ │ │ │ ├── TrackerUtil.java │ │ │ │ ├── adapter │ │ │ │ ├── aspect │ │ │ │ │ ├── TrackerStart.java │ │ │ │ │ └── TrackerStartAspect.java │ │ │ │ ├── mysql │ │ │ │ │ ├── TrackerMysqlConfiguration.java │ │ │ │ │ └── TrackerMysqlInterceptor.java │ │ │ │ ├── okhttp │ │ │ │ │ └── TrackerInterceptor.java │ │ │ │ ├── redis │ │ │ │ │ ├── RedisConnectionFactoryProxy.java │ │ │ │ │ ├── RedisFactoryBeanPostProcessor.java │ │ │ │ │ ├── TrackerRedisConfiguration.java │ │ │ │ │ └── TrackerRedisProperties.java │ │ │ │ └── spring │ │ │ │ │ ├── TrackerFilter.java │ │ │ │ │ ├── TrackerSpringConfiguration.java │ │ │ │ │ └── TrackerTaskDecorator.java │ │ │ │ ├── collector │ │ │ │ ├── TrackerCollector.java │ │ │ │ └── TrackerLocalCacheCollector.java │ │ │ │ ├── common │ │ │ │ └── TrackerConstants.java │ │ │ │ ├── id │ │ │ │ ├── TraceIdGenerator.java │ │ │ │ ├── TraceIdGeneratorUUID.java │ │ │ │ └── TraceIdGeneratorUtil.java │ │ │ │ └── repository │ │ │ │ ├── LocalDiskFileRepository.java │ │ │ │ ├── TrackerFileWriter.java │ │ │ │ └── TrackerRepository.java │ │ │ └── resources │ │ │ └── META-INF │ │ │ ├── spring-configuration-metadata.json │ │ │ └── spring.factories │ └── pom.xml ├── pom.xml └── script │ └── restart-springboot.sh ├── blossom-editor ├── .editorconfig ├── .eslintignore ├── .eslintrc.cjs ├── .gitignore ├── .npmrc ├── .prettierignore ├── .prettierrc.yaml ├── README.md ├── build │ ├── entitlements.mac.plist │ ├── icon.icns │ ├── icon.ico │ ├── icon.png │ └── notarize.js ├── dev-app-update.yml ├── electron-builder.yml ├── electron.vite.config.ts ├── package-lock.json ├── package.json ├── resources │ ├── imgs │ │ ├── guardcat_logo.jpg │ │ ├── icon.ico │ │ ├── icon.png │ │ └── iconBigSur.png │ └── screenshot │ │ ├── PrScrn.dll │ │ ├── PrintScr.exe │ │ └── README.md ├── src │ ├── env │ │ ├── .env │ │ └── .env.tryuse │ ├── main │ │ ├── index.ts │ │ ├── printScreen.ts │ │ └── shortcut.ts │ ├── preload │ │ ├── index.d.ts │ │ └── index.ts │ └── renderer │ │ ├── index.html │ │ ├── public │ │ └── favicon.png │ │ └── src │ │ ├── App.vue │ │ ├── api │ │ ├── auth.ts │ │ ├── blossom.ts │ │ ├── note.ts │ │ ├── plan.ts │ │ ├── request.ts │ │ ├── sentinel.ts │ │ ├── todo.ts │ │ ├── weather.ts │ │ └── web.ts │ │ ├── assets │ │ ├── constants │ │ │ ├── keymaps.ts │ │ │ └── system.ts │ │ ├── css │ │ │ ├── main.css │ │ │ └── theme.css │ │ ├── fonts │ │ │ ├── JetBrainsMono-Bold.woff2 │ │ │ ├── JetBrainsMono-ExtraLight.woff2 │ │ │ ├── JetBrainsMono-Light.woff2 │ │ │ ├── JetBrainsMono-Medium.woff2 │ │ │ ├── JetBrainsMono-Regular.woff2 │ │ │ ├── JetBrainsMono-SemiBold.woff2 │ │ │ ├── JetBrainsMono-Thin.woff2 │ │ │ └── config.scss │ │ ├── iconfont │ │ │ ├── blossom │ │ │ │ ├── iconfont.css │ │ │ │ ├── iconfont.js │ │ │ │ ├── iconfont.json │ │ │ │ ├── iconfont.ttf │ │ │ │ ├── iconfont.woff │ │ │ │ └── iconfont.woff2 │ │ │ ├── weather │ │ │ │ ├── iconfont.css │ │ │ │ ├── iconfont.js │ │ │ │ ├── iconfont.json │ │ │ │ ├── iconfont.ttf │ │ │ │ ├── iconfont.woff │ │ │ │ └── iconfont.woff2 │ │ │ └── weblogo │ │ │ │ ├── iconfont.css │ │ │ │ ├── iconfont.js │ │ │ │ ├── iconfont.json │ │ │ │ ├── iconfont.ttf │ │ │ │ ├── iconfont.woff │ │ │ │ └── iconfont.woff2 │ │ ├── imgs │ │ │ ├── blossom_logo.png │ │ │ ├── blossom_logo_dark.png │ │ │ ├── default_user_avatar.jpg │ │ │ ├── docs │ │ │ │ └── tryuse.png │ │ │ ├── img_error.png │ │ │ ├── note │ │ │ │ ├── cd.png │ │ │ │ ├── dustbin.png │ │ │ │ ├── note.png │ │ │ │ ├── pin.png │ │ │ │ └── plane.png │ │ │ ├── pe │ │ │ │ ├── headset.png │ │ │ │ ├── phone.png │ │ │ │ ├── sound.png │ │ │ │ └── watch.png │ │ │ ├── plan │ │ │ │ ├── base-awesome.png │ │ │ │ ├── base-celebrate.png │ │ │ │ ├── base-cool.png │ │ │ │ ├── base-learning.png │ │ │ │ ├── beer.png │ │ │ │ ├── cat-kiss.png │ │ │ │ ├── cat-nice.png │ │ │ │ ├── cat-smile.png │ │ │ │ ├── cat.png │ │ │ │ ├── coffee.png │ │ │ │ └── juice.png │ │ │ ├── plant │ │ │ │ ├── 02.png │ │ │ │ ├── 08.png │ │ │ │ └── cactus.png │ │ │ ├── transparent.png │ │ │ └── weather │ │ │ │ ├── feng-s.png │ │ │ │ ├── feng.png │ │ │ │ ├── qing-moon.png │ │ │ │ ├── qing-s.png │ │ │ │ ├── qing.png │ │ │ │ ├── wu-s.png │ │ │ │ ├── wu.png │ │ │ │ ├── xue-s.png │ │ │ │ ├── xue.png │ │ │ │ ├── yin-s.png │ │ │ │ ├── yin.png │ │ │ │ ├── yu-s.png │ │ │ │ ├── yu.png │ │ │ │ ├── zhongyu-s.png │ │ │ │ └── zhongyu.png │ │ ├── styles │ │ │ ├── bl-checkbox.scss │ │ │ ├── bl-common.scss │ │ │ ├── bl-dialog-info.scss │ │ │ ├── bl-dialog.scss │ │ │ ├── bl-dropdown.scss │ │ │ ├── bl-image.scss │ │ │ ├── bl-loading-spinner.scss │ │ │ ├── bl-message.scss │ │ │ ├── bl-notification.scss │ │ │ ├── bl-popper.scss │ │ │ ├── bl-resize-divider.scss │ │ │ ├── bl-tip.scss │ │ │ ├── bl-tree.scss │ │ │ ├── chartTheme.ts │ │ │ ├── config.scss │ │ │ ├── index.scss │ │ │ └── utils.scss │ │ └── utils │ │ │ ├── color.ts │ │ │ ├── electron.ts │ │ │ ├── format-table.ts │ │ │ ├── obj.ts │ │ │ ├── storage.ts │ │ │ ├── test.ts │ │ │ └── util.ts │ │ ├── components │ │ ├── AppHeader.vue │ │ ├── BLCol.vue │ │ ├── BLRow.vue │ │ ├── BLTag.vue │ │ ├── DateLine.vue │ │ ├── IconList.vue │ │ ├── Laptop.vue │ │ ├── Logo.vue │ │ ├── Template.vue │ │ ├── UserAvatar.vue │ │ ├── Versions.vue │ │ ├── WaveFooter.vue │ │ ├── Weather.vue │ │ └── WebCollect.vue │ │ ├── declaration.d.ts │ │ ├── env.d.ts │ │ ├── i18n │ │ ├── en.ts │ │ ├── plugin.ts │ │ ├── types.ts │ │ ├── useI18n.ts │ │ └── zh-cn.ts │ │ ├── main.ts │ │ ├── router │ │ ├── index.ts │ │ └── route-init.ts │ │ ├── scripts │ │ ├── draggable.ts │ │ ├── env.ts │ │ ├── global-theme.ts │ │ ├── lifecycle.ts │ │ ├── notify.ts │ │ ├── resize-devider-vertical.ts │ │ └── shortcut-register.ts │ │ ├── stores │ │ ├── config.ts │ │ ├── server.ts │ │ ├── store-config.ts │ │ ├── theme.ts │ │ └── user.ts │ │ └── views │ │ ├── Index.vue │ │ ├── article │ │ ├── ArticleBackup.vue │ │ ├── ArticleCustomTempVisit.vue │ │ ├── ArticleHistory.vue │ │ ├── ArticleImport.vue │ │ ├── ArticleIndex.vue │ │ ├── ArticleIndexNew.vue │ │ ├── ArticleIndexOld.vue │ │ ├── ArticleIndexPlaceholder.vue │ │ ├── ArticleInfo.vue │ │ ├── ArticleQrCode.vue │ │ ├── ArticleRecycle.vue │ │ ├── ArticleReferenceChartGraph.vue │ │ ├── ArticleSearch.vue │ │ ├── ArticleTreeDocs.vue │ │ ├── ArticleTreeWorkbench.vue │ │ ├── ArticleViewWindow.vue │ │ ├── EditorStatus.vue │ │ ├── EditorTools.vue │ │ ├── ShortcutkeyDesc.vue │ │ ├── scripts │ │ │ ├── article-html-event.ts │ │ │ ├── article-import.ts │ │ │ ├── article.ts │ │ │ ├── codemirror.ts │ │ │ ├── editor-preview-scroll.ts │ │ │ ├── editor-tools.ts │ │ │ └── markedjs.ts │ │ └── styles │ │ │ ├── article-backtop.scss │ │ │ ├── article-index.scss │ │ │ ├── article-view-absolute.scss │ │ │ ├── bl-preview-toc.scss │ │ │ ├── bl-preview.css │ │ │ └── editor-right-menu.scss │ │ ├── doc │ │ ├── doc-tree-detail.scss │ │ ├── doc-tree-detail.ts │ │ ├── doc-tree-right-menu.scss │ │ ├── doc-tree.scss │ │ ├── doc-tree.ts │ │ ├── doc.ts │ │ ├── tree-workbench.scss │ │ └── type.d.ts │ │ ├── home │ │ ├── ArticleStars.vue │ │ ├── ArticleSubjects.vue │ │ ├── ChartHeatmap.vue │ │ ├── ChartLineWords.vue │ │ ├── Home.vue │ │ ├── StatisticCard.vue │ │ ├── WordsInfo.vue │ │ ├── scripts │ │ │ └── chart-line-words.ts │ │ └── styles │ │ │ └── container.scss │ │ ├── index │ │ ├── AsideSetting.vue │ │ ├── AsideUpload.vue │ │ ├── AsideUser.vue │ │ ├── IndexAside.vue │ │ ├── SettingAbout.vue │ │ ├── SettingConfig.vue │ │ ├── SettingConfigAddUser.vue │ │ ├── SettingConfigBlog.vue │ │ ├── SettingConfigClient.vue │ │ ├── SettingConfigServer.vue │ │ ├── SettingConfigUpdPwd.vue │ │ ├── SettingConfigUserinfo.vue │ │ ├── SettingIndex.vue │ │ ├── SettingLogin.vue │ │ ├── setting │ │ │ ├── QuickSetting.vue │ │ │ ├── ThemeSetting.vue │ │ │ ├── TryUse.vue │ │ │ ├── UserInfoSetting.vue │ │ │ └── UserListSetting.vue │ │ └── styles │ │ │ ├── config-root.scss │ │ │ └── user-setting.scss │ │ ├── note │ │ ├── NoteEditor.vue │ │ └── NoteIndex.vue │ │ ├── picture │ │ ├── PictureBatchDel.vue │ │ ├── PictureIndex.vue │ │ ├── PictureInfo.vue │ │ ├── PictureTransfer.vue │ │ ├── PictureTreeDocs.vue │ │ ├── PictureTreeWorkbench.vue │ │ ├── PictureUpload.vue │ │ ├── PictureViewerInfo.vue │ │ ├── scripts │ │ │ └── picture.ts │ │ └── styles │ │ │ └── picture-index.scss │ │ ├── plan │ │ ├── PlanColor.scss │ │ ├── PlanDaily.vue │ │ ├── PlanDailyInfo.vue │ │ ├── PlanDayInfo.vue │ │ └── PlanIndex.vue │ │ ├── statistic │ │ ├── SentinelChartLine.vue │ │ └── SentinelResources.vue │ │ ├── todo │ │ ├── TaskInfo.vue │ │ ├── TaskProgress.vue │ │ ├── TaskProgressSimple.vue │ │ ├── TodoChartCompleted.vue │ │ ├── TodoIndex.vue │ │ ├── TodoStat.vue │ │ ├── scripts │ │ │ └── types.ts │ │ └── styles │ │ │ ├── task-item.scss │ │ │ ├── task-progress.scss │ │ │ └── todo-stat.scss │ │ └── tool │ │ └── IndexTool.vue ├── tsconfig.json ├── tsconfig.node.json └── tsconfig.web.json ├── blossom-web ├── .gitignore ├── .prettierrc.yaml ├── README.md ├── declaration.d.ts ├── doc │ └── imgs │ │ └── blog_home.jpg ├── env │ ├── .env.spring │ └── env.d.ts ├── global.d.ts ├── index.html ├── package-lock.json ├── package.json ├── public │ ├── blog-logo.png │ ├── config.js │ └── favicon.png ├── src │ ├── App.vue │ ├── api │ │ ├── auth.ts │ │ ├── blossom.ts │ │ ├── note.ts │ │ ├── plan.ts │ │ ├── request.ts │ │ └── todo.ts │ ├── assets │ │ ├── constants │ │ │ └── blossom.ts │ │ ├── fonts │ │ │ ├── JetBrainsMono-Regular.woff2 │ │ │ └── config.scss │ │ ├── imgs │ │ │ ├── common │ │ │ │ └── gong_wang_an_bei_img.png │ │ │ └── note │ │ │ │ ├── dustbin.png │ │ │ │ └── pin.png │ │ ├── styles │ │ │ ├── common.scss │ │ │ ├── config.scss │ │ │ ├── css │ │ │ │ ├── main.css │ │ │ │ └── theme.css │ │ │ ├── element │ │ │ │ ├── dialog.scss │ │ │ │ ├── drawer.scss │ │ │ │ ├── menu.scss │ │ │ │ ├── message.scss │ │ │ │ └── popper.scss │ │ │ ├── iconfont.scss │ │ │ ├── iconfont │ │ │ │ ├── blossom │ │ │ │ │ ├── iconfont.css │ │ │ │ │ ├── iconfont.ttf │ │ │ │ │ ├── iconfont.woff │ │ │ │ │ └── iconfont.woff2 │ │ │ │ └── weblogo │ │ │ │ │ └── iconfont.js │ │ │ └── mixin-fuc.scss │ │ └── utils │ │ │ ├── obj.ts │ │ │ ├── storage.ts │ │ │ └── util.ts │ ├── components │ │ ├── BLCol.vue │ │ ├── BLRow.vue │ │ ├── BLTag.vue │ │ ├── NotFound.vue │ │ └── Template.vue │ ├── main.ts │ ├── router │ │ ├── index.ts │ │ └── route-init.ts │ ├── scripts │ │ ├── auth.ts │ │ ├── env.ts │ │ └── lifecycle.ts │ ├── stores │ │ ├── store-config.ts │ │ └── user.ts │ └── views │ │ ├── Index.vue │ │ ├── article │ │ ├── ArticleSetting.vue │ │ ├── Articles.vue │ │ ├── index.d.ts │ │ ├── scripts │ │ │ ├── article-setting.ts │ │ │ ├── doc-content-event-dispatch.ts │ │ │ ├── doc-toc.ts │ │ │ └── doc-tree-detail.ts │ │ └── styles │ │ │ ├── doc-content.scss │ │ │ ├── doc-toc.scss │ │ │ ├── doc-tree-detail.scss │ │ │ └── doc-tree.scss │ │ ├── index │ │ ├── ChartHeatmap.vue │ │ ├── ChartLineWords.vue │ │ ├── Home.vue │ │ ├── HomeSubject.vue │ │ ├── HomeUserInfo.vue │ │ ├── IndexHeader.vue │ │ └── Login.vue │ │ ├── note │ │ └── NoteIndex.vue │ │ ├── plan │ │ ├── PlanColor.scss │ │ ├── PlanDayInfo.vue │ │ └── PlanIndex.vue │ │ └── todo │ │ ├── TodoIndex.vue │ │ └── scripts │ │ └── types.ts ├── tsconfig.config.json ├── tsconfig.json └── vite.config.mts ├── doc ├── backend-api │ ├── AllInOne.css │ ├── font.css │ ├── highlight.min.js │ ├── index.html │ ├── jquery.min.js │ ├── search.js │ └── xt256.min.css └── imgs │ ├── article.png │ ├── article_reference.png │ ├── blog_article.png │ ├── blog_home_m.png │ ├── blog_home_pc.png │ ├── blossom.png │ ├── blossom_name.png │ ├── device.png │ ├── note.png │ ├── picture.png │ ├── plan.png │ ├── qq1.png │ ├── qq2.png │ ├── qq3.png │ ├── sponsors │ ├── aifadian.png │ ├── ali.png │ └── wechat.png │ └── todo.png └── docker ├── README.md ├── build └── Dockerfile └── compose └── blossom-mysql8.yaml /.github/workflows/stale.yml: -------------------------------------------------------------------------------- 1 | name: "Close inactive issues" 2 | on: 3 | schedule: 4 | - cron: "10 15 * * *" 5 | 6 | permissions: 7 | issues: write 8 | 9 | jobs: 10 | stale: 11 | runs-on: ubuntu-latest 12 | permissions: 13 | issues: write 14 | pull-requests: write 15 | 16 | steps: 17 | - uses: actions/stale@v5 18 | with: 19 | debug-only: false 20 | repo-token: ${{ secrets.GITHUB_TOKEN }} 21 | days-before-issue-stale: 30 22 | days-before-issue-close: 7 23 | stale-issue-label: "stale" 24 | stale-issue-message: "This issue has been open 30 days with no activity. This will be closed in 7 days." 25 | close-issue-message: "This issue has been automatically marked as stale because it hasn't had any recent activity." 26 | days-before-pr-stale: -1 27 | days-before-pr-close: -1 28 | exempt-issue-labels: bug,enhancement 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/** 5 | !**/src/test/** 6 | stats.html 7 | 8 | ### STS ### 9 | .apt_generated 10 | .classpath 11 | .factorypath 12 | .project 13 | .settings 14 | .springBeans 15 | .sts4-cache 16 | .DS_Store 17 | 18 | ### IntelliJ IDEA ### 19 | .idea 20 | *.iws 21 | *.iml 22 | *.ipr 23 | 24 | ### NetBeans ### 25 | /nbproject/private/ 26 | /nbbuild/ 27 | /dist/ 28 | /nbdist/ 29 | /.nb-gradle/ 30 | /build/ 31 | /lucene/ 32 | 33 | ### VS Code ### 34 | .vscode/ 35 | /logs/ 36 | -------------------------------------------------------------------------------- /SPONSORS.md: -------------------------------------------------------------------------------- 1 |

Blossom 的赞助者 / Sponsors

2 | 3 | 感谢每一个位赞助者对 Blossom 的大力支持,Blossom 因为你们变得更好。 4 | 5 |

6 | 7 | sponsors 8 | 9 |

-------------------------------------------------------------------------------- /blossom-backend/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | #!**/src/main/** 5 | !**/src/test/** 6 | /smart-doc-2.6.7/ 7 | 8 | ### static ### 9 | /backend/src/main/resources/static/blog/** 10 | !/backend/src/main/resources/static/blog/README.md 11 | 12 | /backend/src/main/resources/static/editor/** 13 | !/backend/src/main/resources/static/editor/README.md 14 | 15 | ### STS ### 16 | .apt_generated 17 | .classpath 18 | .factorypath 19 | .project 20 | .settings 21 | .springBeans 22 | .sts4-cache 23 | 24 | ### IntelliJ IDEA ### 25 | .idea 26 | *.iws 27 | *.iml 28 | *.ipr 29 | 30 | ### NetBeans ### 31 | /nbproject/private/ 32 | /nbbuild/ 33 | /dist/ 34 | /nbdist/ 35 | /.nb-gradle/ 36 | build/ 37 | 38 | ### VS Code ### 39 | .vscode/ 40 | /logs/ 41 | -------------------------------------------------------------------------------- /blossom-backend/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM eclipse-temurin:8-jre as builder 2 | WORKDIR application 3 | ARG JAR_FILE=backend/target/*.jar 4 | COPY ${JAR_FILE} application.jar 5 | RUN java -Djarmode=layertools -jar application.jar extract 6 | 7 | ########################################################### 8 | 9 | FROM eclipse-temurin:8-jre 10 | MAINTAINER li-guohao 11 | WORKDIR application 12 | COPY --from=builder application/dependencies/ ./ 13 | COPY --from=builder application/spring-boot-loader/ ./ 14 | COPY --from=builder application/snapshot-dependencies/ ./ 15 | COPY --from=builder application/application/ ./ 16 | 17 | ENV JVM_OPTS="-Xmx256m -Xms256m" \ 18 | BLOSSOM_WORK_DIR="/home/bl" \ 19 | SPRING_CONFIG_LOCATION="optional:classpath:/;optional:classpath:/config/;optional:file:/home/bl/" \ 20 | TZ=Asia/Shanghai 21 | 22 | RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime \ 23 | && echo $TZ > /etc/timezone 24 | 25 | EXPOSE 9999 26 | 27 | ENTRYPOINT ["sh", "-c", "java ${JVM_OPTS} org.springframework.boot.loader.JarLauncher ${0} ${@}"] 28 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/auth/annotation/AssignUser.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.auth.annotation; 2 | 3 | import java.lang.annotation.*; 4 | 5 | /** 6 | * 拦截器中为接口参数添加用户ID 7 | */ 8 | @Documented 9 | @Target(ElementType.METHOD) 10 | @Retention(RetentionPolicy.RUNTIME) 11 | public @interface AssignUser { 12 | } 13 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/auth/annotation/AuthIgnore.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.auth.annotation; 2 | 3 | import java.lang.annotation.*; 4 | 5 | /** 6 | * 白名单注解标识 7 | * 8 | * @author xzzz 9 | */ 10 | @Documented 11 | @Target(ElementType.METHOD) 12 | @Retention(RetentionPolicy.RUNTIME) 13 | public @interface AuthIgnore { 14 | } 15 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/auth/annotation/AuthUserType.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.auth.annotation; 2 | 3 | import com.blossom.backend.base.user.UserTypeEnum; 4 | 5 | import java.lang.annotation.*; 6 | 7 | /** 8 | * 接口校验用户类型 9 | */ 10 | @Documented 11 | @Target(ElementType.METHOD) 12 | @Retention(RetentionPolicy.RUNTIME) 13 | public @interface AuthUserType { 14 | 15 | /** 16 | * 用户的类型, 接口只允许该类型用户调用 17 | */ 18 | UserTypeEnum value(); 19 | } 20 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/auth/annotation/PermCheck.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.auth.annotation; 2 | 3 | import java.lang.annotation.*; 4 | 5 | /** 6 | * 权限校验 7 | * 8 | * @author xzzz 9 | * @since 0.0.1 10 | */ 11 | @Target({ElementType.METHOD, ElementType.TYPE}) 12 | @Retention(RetentionPolicy.RUNTIME) 13 | @Inherited 14 | @Documented 15 | public @interface PermCheck { 16 | 17 | /* 18 | 所需要的授权 19 | */ 20 | String value(); 21 | } 22 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/auth/caffeine/CaffeineTokenEncoder.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.auth.caffeine; 2 | 3 | import cn.hutool.core.lang.UUID; 4 | import com.blossom.backend.base.auth.pojo.AccessToken; 5 | import com.blossom.backend.base.auth.token.TokenEncoder; 6 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 7 | import org.springframework.stereotype.Component; 8 | 9 | /** 10 | * token 编解码器, 简单生成一个 UUID token, 与 token 信息无加解密, 编解码关系 11 | * 12 | * @author xzzz 13 | * @since 1.3.0 14 | */ 15 | @Component 16 | @ConditionalOnProperty(value = "project.auth.type", havingValue = "caffeine") 17 | public class CaffeineTokenEncoder implements TokenEncoder { 18 | 19 | /** 20 | * 生成一个 uuid 作为 token 21 | * 22 | * @param accessToken token 23 | * @return uuid 24 | */ 25 | @Override 26 | public String encode(AccessToken accessToken) { 27 | return UUID.randomUUID().toString(true); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/auth/enums/AuthTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.auth.enums; 2 | 3 | /** 4 | * 授权类型 5 | * 6 | * @author xzzz 7 | */ 8 | public enum AuthTypeEnum { 9 | /** 10 | * 有状态的授权方式, Token 按自定义逻辑生成, 并存储在 Redis 中, 该种授权可以退出和主动删除 11 | */ 12 | redis, 13 | 14 | /** 15 | * 有状态的授权方式, Token 按自定义逻辑生成, 并存储在 Caffeine 中, 该种授权可以退出和主动删除, 但目前仅支持一种 clientId 16 | */ 17 | caffeine, 18 | 19 | /** 20 | * 无状态的授权方式, Token 使用 JWT 21 | */ 22 | jwt 23 | } 24 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/auth/enums/GrantTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.auth.enums; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * 授权方式 7 | * 8 | * @author xzzz 9 | */ 10 | public enum GrantTypeEnum { 11 | 12 | /** 13 | * 暂时只支持 password 14 | */ 15 | PASSWORD("password", "密码登录, 需要传入用户名和密码"); 16 | 17 | @Getter 18 | private final String type; 19 | 20 | @Getter 21 | private final String desc; 22 | 23 | GrantTypeEnum(String type, String desc) { 24 | this.type = type; 25 | this.desc = desc; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/auth/enums/LogTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.auth.enums; 2 | 3 | /** 4 | * 打印请求日志的类型 5 | * 6 | * @author xzzz 7 | */ 8 | public enum LogTypeEnum { 9 | /** 10 | * 不打印请求日志 11 | */ 12 | none, 13 | /** 14 | * 打印简单的请求日志, 只有请求地址 15 | */ 16 | simple, 17 | /** 18 | * 答应详细的请求日志, 包含请求头, 请求参数, application/json 类型的请求体 19 | */ 20 | detail; 21 | } 22 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/auth/enums/PasswordEncoderEnum.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.auth.enums; 2 | 3 | /** 4 | * 密码加密方式 5 | * 6 | * @author xzzz 7 | */ 8 | public enum PasswordEncoderEnum { 9 | /** 10 | * md5 与 sha256 为匹配 hash 值. 11 | */ 12 | md5, 13 | /** 14 | * md5 与 sha256 为匹配 hash 值. 15 | */ 16 | sha256, 17 | /** 18 | * bcrypt 安全性最高, 但加解密最慢. 19 | */ 20 | bcrypt; 21 | } 22 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/auth/pojo/KickOutReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.auth.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotNull; 6 | 7 | /** 8 | * 踢出用户 9 | */ 10 | @Data 11 | public class KickOutReq { 12 | 13 | /** 14 | * 用户ID 15 | */ 16 | @NotNull(message = "userId 为必填项") 17 | private Long userId; 18 | } 19 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/auth/pojo/LoginDTO.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.auth.pojo; 2 | 3 | import lombok.Data; 4 | import lombok.EqualsAndHashCode; 5 | 6 | /** 7 | * 登录信息 8 | * 9 | * @author xzzz 10 | */ 11 | @Data 12 | @EqualsAndHashCode(callSuper = true) 13 | public class LoginDTO extends LoginReq { 14 | 15 | /** 16 | * 用户ID 17 | */ 18 | private Long userId; 19 | /** 20 | * userAgent 21 | */ 22 | private String userAgent; 23 | /** 24 | * ip 25 | */ 26 | private String ip; 27 | /** 28 | * 登录时间 29 | */ 30 | private String loginTime; 31 | /** 32 | * token 快照 33 | */ 34 | private String accessTokenSnapshot; 35 | } 36 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/auth/pojo/LoginEvent.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.auth.pojo; 2 | 3 | import org.springframework.context.ApplicationEvent; 4 | 5 | /** 6 | * 登录事件 7 | * 8 | * @author xzzz 9 | */ 10 | public class LoginEvent extends ApplicationEvent { 11 | 12 | public LoginEvent(LoginDTO source) { 13 | super(source); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/auth/security/PasswordEncoderMD5.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.auth.security; 2 | 3 | import cn.hutool.crypto.SecureUtil; 4 | 5 | /** 6 | * md5 加解密匹配 7 | * 8 | * @author xzzz 9 | */ 10 | public class PasswordEncoderMD5 implements PasswordEncoder { 11 | 12 | @Override 13 | public String encode(CharSequence rawPassword) { 14 | return SecureUtil.md5(rawPassword.toString()); 15 | } 16 | 17 | @Override 18 | public boolean matches(CharSequence rawPassword, String encodedPassword) { 19 | return SecureUtil.md5(rawPassword.toString()).equals(encodedPassword); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/auth/security/PasswordEncoderSHA256.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.auth.security; 2 | 3 | import com.blossom.common.base.util.security.SHA256Util; 4 | 5 | /** 6 | * sha256 加解密匹配 7 | * 8 | * @author xzzz 9 | */ 10 | public class PasswordEncoderSHA256 implements PasswordEncoder{ 11 | 12 | @Override 13 | public String encode(CharSequence rawPassword) { 14 | return SHA256Util.encode(String.valueOf(rawPassword)); 15 | } 16 | 17 | @Override 18 | public boolean matches(CharSequence rawPassword, String encodedPassword) { 19 | return SHA256Util.encode(String.valueOf(rawPassword)).equals(encodedPassword); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/auth/token/TokenEncoder.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.auth.token; 2 | 3 | import com.blossom.backend.base.auth.pojo.AccessToken; 4 | 5 | /** 6 | * token 编解码器 7 | * 8 | * @author xzzz 9 | */ 10 | public interface TokenEncoder { 11 | 12 | /** 13 | * token 编码成字符串 14 | * 15 | * @param accessToken token 16 | * @return 字符串 17 | */ 18 | String encode(AccessToken accessToken); 19 | 20 | /** 21 | * token 解码 22 | * 23 | * @param string token 字符串 24 | * @return token 25 | */ 26 | default AccessToken decode(String string) { 27 | return null; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/param/ParamMapper.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.param; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.blossom.backend.base.param.pojo.ParamEntity; 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.apache.ibatis.annotations.Param; 7 | 8 | /** 9 | * 系统参数信息的持久化层 10 | * 11 | * @author xzzz 12 | */ 13 | @Mapper 14 | public interface ParamMapper extends BaseMapper { 15 | 16 | /** 17 | * 修改系统参数 18 | * 19 | * @param paramName 参数名称 20 | * @param paramValue 参数值 21 | */ 22 | void updByParamName(@Param("paramName") String paramName, @Param("paramValue") String paramValue); 23 | } -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/param/pojo/ParamPageReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.param.pojo; 2 | 3 | import com.blossom.common.db.pojo.PageReq; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | import java.io.Serializable; 8 | import java.util.Date; 9 | 10 | /** 11 | * 系统参数分页请求类 12 | * 13 | * @author xzzz 14 | */ 15 | @Data 16 | @EqualsAndHashCode(callSuper = true) 17 | public class ParamPageReq extends PageReq implements Serializable { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | /** 参数ID */ 22 | private Long id; 23 | /** 参数名称 */ 24 | private String paramName; 25 | /** 参数值 */ 26 | private String paramValue; 27 | /** 参数说明 */ 28 | private String paramDesc; 29 | /** 创建时间 */ 30 | private Date creTime; 31 | /** 修改时间 */ 32 | private Date updTime; 33 | } 34 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/param/pojo/ParamUpdReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.param.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | 7 | /** 8 | * 修改参数 9 | */ 10 | @Data 11 | public class ParamUpdReq { 12 | 13 | /** 14 | * 参数名称 15 | */ 16 | @NotBlank(message = "参数名称为必填项") 17 | private String paramName; 18 | 19 | /** 20 | * 参数值 21 | */ 22 | @NotBlank(message = "参数值为必填项") 23 | private String paramValue; 24 | } 25 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/paramu/pojo/UserParamEntity.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.paramu.pojo; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.Data; 7 | 8 | import java.util.Date; 9 | 10 | /** 11 | * 用户参数 12 | * 13 | * @since 1.12.0 14 | */ 15 | @Data 16 | @TableName("base_user_param") 17 | public class UserParamEntity { 18 | /** 19 | * ID 20 | */ 21 | @TableId(type = IdType.AUTO) 22 | private Long id; 23 | /** 24 | * 用户ID 25 | */ 26 | private Long userId; 27 | /** 28 | * 参数名称 29 | */ 30 | private String paramName; 31 | /** 32 | * 参数值 33 | */ 34 | private String paramValue; 35 | /** 36 | * 修改时间 37 | */ 38 | private Date updTime; 39 | } 40 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/paramu/pojo/UserParamUpdReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.paramu.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | import javax.validation.constraints.NotNull; 7 | 8 | /** 9 | * 修改参数 10 | * 11 | * @since 1.12.0 12 | */ 13 | @Data 14 | public class UserParamUpdReq { 15 | 16 | /** 17 | * 参数名称 18 | */ 19 | @NotBlank(message = "参数名称为必填项") 20 | private String paramName; 21 | 22 | /** 23 | * 参数值 24 | */ 25 | @NotNull(message = "参数值为必填项") 26 | private String paramValue; 27 | 28 | /** 29 | * 用户ID 30 | */ 31 | private Long userId; 32 | } 33 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/search/EnableIndex.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.search; 2 | 3 | import com.blossom.backend.base.search.message.IndexMsgTypeEnum; 4 | 5 | import java.lang.annotation.Documented; 6 | import java.lang.annotation.ElementType; 7 | import java.lang.annotation.Retention; 8 | import java.lang.annotation.RetentionPolicy; 9 | import java.lang.annotation.Target; 10 | 11 | 12 | @Documented 13 | @Retention(RetentionPolicy.RUNTIME) 14 | @Target(ElementType.METHOD) 15 | public @interface EnableIndex { 16 | 17 | /** 18 | * 索引操作类型, 默认值为追加 19 | */ 20 | IndexMsgTypeEnum type(); 21 | 22 | /** 23 | * ID 字段表达式 24 | */ 25 | String id(); 26 | 27 | } 28 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/search/SearchProperties.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.search; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | import java.io.File; 6 | import java.nio.file.Path; 7 | 8 | /** 9 | * 全文搜索配置项 10 | */ 11 | @Component 12 | public class SearchProperties { 13 | 14 | private static final String USER_HOME = "user.dir"; 15 | 16 | /** 17 | * 根据用户ID, 获取对应索引库 Path 18 | * 19 | * @param userId 用户ID 20 | */ 21 | public Path getUserIndexDirectory(Long userId) { 22 | File file = new File(addSeparator("/lucene/" + userId)); 23 | return file.toPath(); 24 | } 25 | 26 | public static String addSeparator(String dir) { 27 | if (!dir.endsWith(File.separator)) { 28 | dir += File.separator; 29 | } 30 | return System.getProperty(USER_HOME) + dir; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/search/SearchRes.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.search; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * 全文搜索结果 9 | */ 10 | @Data 11 | public class SearchRes { 12 | 13 | /** 14 | * 命中总数 15 | */ 16 | private Long totalHit; 17 | 18 | /** 19 | * 命中数据 20 | */ 21 | private List hits; 22 | 23 | /** 24 | * 命中数据 25 | */ 26 | @Data 27 | public static class Hit { 28 | /** 29 | * 主键 30 | */ 31 | private Long id; 32 | /** 33 | * 文章名称 34 | */ 35 | private String name; 36 | /** 37 | * 源文章名称 38 | */ 39 | private String originName; 40 | /** 41 | * 标签 42 | */ 43 | private List tags; 44 | /** 45 | * 正文 46 | */ 47 | private String markdown; 48 | /** 49 | * 命中分数 50 | */ 51 | private Float score; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/IndexMsg.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.search.message; 2 | 3 | import org.apache.lucene.document.Document; 4 | 5 | /** 6 | * 索引消息接口 7 | */ 8 | public interface IndexMsg { 9 | 10 | /** 11 | * 消息操作类型 12 | */ 13 | IndexMsgTypeEnum getType(); 14 | 15 | /** 16 | * 主键 ID 17 | */ 18 | Long getId(); 19 | 20 | /** 21 | * 为批量 reload 提供的提前构造数据的接口, 避免多次查询数据库 22 | */ 23 | Document getDoc(); 24 | 25 | /** 26 | * 消息对应用户 ID 27 | */ 28 | Long getUserId(); 29 | 30 | } 31 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/IndexMsgTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.search.message; 2 | 3 | /** 4 | * 索引动作类型 5 | */ 6 | public enum IndexMsgTypeEnum { 7 | 8 | /** 9 | * 新增文档 10 | */ 11 | ADD, 12 | /** 13 | * 删除文档 14 | */ 15 | DELETE 16 | 17 | } 18 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/sys/SysService.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.sys; 2 | 3 | import com.blossom.backend.base.sys.os.OSRes; 4 | import com.blossom.common.iaas.IaasProperties; 5 | import com.blossom.common.iaas.OSManager; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | * 系统 11 | * 12 | * @author xzzz 13 | */ 14 | @Service 15 | public class SysService { 16 | 17 | @Autowired 18 | private OSManager osManager; 19 | 20 | /** 21 | * 对象存储的配置信息 22 | */ 23 | public OSRes getOsConfig() { 24 | IaasProperties props = osManager.getProp(); 25 | OSRes res = new OSRes(); 26 | res.setOsType(props.getOsType()); 27 | // TODO 目前只有 BLOS 一种 28 | res.setBucketName(""); 29 | res.setDefaultPath(props.getBlos().getDefaultPath()); 30 | res.setDomain(props.getBlos().getDomain()); 31 | return res; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/sys/os/OSRes.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.sys.os; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 对象存储配置 7 | * 8 | * @author xzzz 9 | */ 10 | @Data 11 | public class OSRes { 12 | 13 | /** 14 | * 对象存储类型 15 | */ 16 | private String osType; 17 | /** 18 | * bucket 名称 19 | */ 20 | private String bucketName; 21 | /** 22 | * 请求域名 23 | */ 24 | private String domain; 25 | /** 26 | * 保存路径 27 | */ 28 | private String defaultPath; 29 | } 30 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/user/UserMapper.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.user; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.blossom.backend.base.user.pojo.UserEntity; 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.apache.ibatis.annotations.Param; 7 | 8 | /** 9 | * 用户 10 | * 11 | * @author xzzz 12 | */ 13 | @Mapper 14 | public interface UserMapper extends BaseMapper { 15 | 16 | /** 17 | * 新增用户 18 | */ 19 | void insertUser(UserEntity user); 20 | 21 | /** 22 | * 修改用户信息 23 | */ 24 | void updById(UserEntity user); 25 | 26 | /** 27 | * 删除用户 28 | * 29 | * @param userId 用户ID 30 | */ 31 | void delById(@Param("userId") Long userId); 32 | 33 | /** 34 | * 修改密码 35 | * 36 | * @param userId 用户ID 37 | * @param password 新密码 38 | */ 39 | void updPwd(@Param("userId") Long userId, @Param("password") String password); 40 | } 41 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/user/UserTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.user; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * 用户类型 7 | * 8 | * @author xzzz 9 | */ 10 | public enum UserTypeEnum { 11 | /** 12 | * 管理员 13 | */ 14 | ADMIN(1,"管理员"), 15 | /** 16 | * 普通用户 17 | */ 18 | NORMAL(2,"普通用户"), 19 | /** 20 | * 只读用户 21 | */ 22 | READONLY(3,"只读用户"), 23 | ; 24 | 25 | @Getter 26 | private final Integer type; 27 | 28 | @Getter 29 | private final String desc; 30 | 31 | UserTypeEnum(Integer type, String desc) { 32 | this.type = type; 33 | this.desc = desc; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/user/pojo/UserAddReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.user.pojo; 2 | 3 | import com.blossom.backend.base.user.UserTypeEnum; 4 | import com.blossom.common.base.pojo.AbstractPOJO; 5 | import lombok.Data; 6 | import lombok.EqualsAndHashCode; 7 | 8 | import javax.validation.constraints.NotBlank; 9 | import javax.validation.constraints.NotNull; 10 | 11 | /** 12 | * 新增用户 13 | */ 14 | @Data 15 | @EqualsAndHashCode(callSuper = true) 16 | public class UserAddReq extends AbstractPOJO { 17 | 18 | /** 19 | * 用户名 20 | */ 21 | @NotBlank(message = "用户名为必填项") 22 | private String username; 23 | 24 | /** 25 | * 密码 26 | */ 27 | @NotBlank(message = "密码为必填项") 28 | private String password; 29 | 30 | /** 31 | * 用户类型 {@link UserTypeEnum} 32 | */ 33 | @NotNull(message = "用户类型为必填项") 34 | private Integer type; 35 | } 36 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/user/pojo/UserDeleteReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.user.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotNull; 6 | 7 | /** 8 | * 删除用户 9 | */ 10 | @Data 11 | public class UserDeleteReq { 12 | /** 13 | * 用户ID 14 | */ 15 | @NotNull(message = "用户ID为必填项") 16 | private Long id; 17 | } 18 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/user/pojo/UserDisabledReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.user.pojo; 2 | 3 | import com.blossom.common.base.pojo.AbstractPOJO; 4 | import lombok.Data; 5 | 6 | import javax.validation.constraints.NotNull; 7 | 8 | @Data 9 | public class UserDisabledReq extends AbstractPOJO { 10 | 11 | /** 12 | * 用户ID 13 | */ 14 | @NotNull(message = "用户ID为必填项") 15 | private Long id; 16 | /** 17 | * 禁用状态 18 | */ 19 | private Long delTime; 20 | } 21 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/user/pojo/UserListRes.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.user.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.Date; 6 | 7 | @Data 8 | public class UserListRes { 9 | /** 10 | * 用户ID 11 | */ 12 | private Long id; 13 | /** 14 | * 用户头像 15 | */ 16 | private String avatar; 17 | /** 18 | * 用户名 19 | */ 20 | private String username; 21 | /** 22 | * 昵称 23 | */ 24 | private String nickName; 25 | /** 26 | * 用户类型 27 | */ 28 | private Integer type; 29 | /** 30 | * 创建日期 31 | */ 32 | private Date creTime; 33 | /** 34 | * 逻辑删除, 目前用于禁用用户, 而不是删除 35 | */ 36 | private Long delTime; 37 | } 38 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/user/pojo/UserUpdAdminReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.user.pojo; 2 | 3 | import com.blossom.common.base.pojo.AbstractEntity; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | /** 8 | * 用户请求 9 | * 10 | * @author xzzz 11 | */ 12 | @Data 13 | @EqualsAndHashCode(callSuper = true) 14 | public class UserUpdAdminReq extends AbstractEntity { 15 | /** 16 | * 用户ID 17 | */ 18 | private Long id; 19 | /** 20 | * 和风天气的位置 21 | */ 22 | private String location; 23 | /** 24 | * 类型 25 | */ 26 | private Integer type; 27 | } 28 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/user/pojo/UserUpdPwdReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.user.pojo; 2 | 3 | import com.blossom.common.base.pojo.AbstractPOJO; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | import javax.validation.constraints.NotBlank; 8 | 9 | /** 10 | * 修改密码 11 | * 12 | * @author xzzz 13 | */ 14 | @Data 15 | @EqualsAndHashCode(callSuper = true) 16 | public class UserUpdPwdReq extends AbstractPOJO { 17 | 18 | /** 19 | * 非必填, 自动填充 20 | */ 21 | private Long userId; 22 | 23 | /** 24 | * 旧密码 25 | */ 26 | @NotBlank(message = "旧密码为必填项") 27 | private String password; 28 | 29 | /** 30 | * 新密码 31 | */ 32 | @NotBlank(message = "新密码为必填项") 33 | private String newPassword; 34 | 35 | /** 36 | * 确认密码 37 | */ 38 | @NotBlank(message = "确认密码为必填项") 39 | private String confirmPassword; 40 | } 41 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/base/user/pojo/UserUpdReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.base.user.pojo; 2 | 3 | import com.blossom.common.base.pojo.AbstractEntity; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | import javax.validation.constraints.NotBlank; 8 | 9 | /** 10 | * 用户请求 11 | * 12 | * @author xzzz 13 | */ 14 | @Data 15 | @EqualsAndHashCode(callSuper = true) 16 | public class UserUpdReq extends AbstractEntity { 17 | 18 | /** 19 | * 用户名 20 | */ 21 | @NotBlank(message = "用户名为必填项") 22 | private String username; 23 | /** 24 | * 昵称 25 | */ 26 | @NotBlank(message = "昵称为必填项") 27 | private String nickName; 28 | /** 29 | * 说明 30 | */ 31 | @NotBlank(message = "说明为必填项") 32 | private String remark; 33 | /** 34 | * 和风天气的位置 35 | */ 36 | private String location; 37 | /** 38 | * 用户头像 39 | */ 40 | private String avatar; 41 | } 42 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/config/BlConstants.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.config; 2 | 3 | public class BlConstants { 4 | 5 | public static final String REQ_HEADER_USERID = "Blossom-User-Id"; 6 | } 7 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/config/Test.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.config; 2 | 3 | import com.blossom.backend.server.folder.pojo.FolderEntity; 4 | import lombok.extern.slf4j.Slf4j; 5 | 6 | import java.util.Arrays; 7 | import java.util.HashSet; 8 | import java.util.Set; 9 | 10 | @Slf4j 11 | public class Test { 12 | public static void main(String[] args) { 13 | 14 | Set set = new HashSet<>(); 15 | 16 | FolderEntity f1 = new FolderEntity(); 17 | f1.setId(1L); 18 | f1.setName("1"); 19 | 20 | 21 | FolderEntity f2 = new FolderEntity(); 22 | f2.setId(1L); 23 | f2.setName("2"); 24 | 25 | set.add(f1); 26 | set.add(f2); 27 | 28 | System.out.println(set.size()); 29 | System.out.println(Arrays.toString(set.toArray())); 30 | 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/TagEnum.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | 5 | /** 6 | * 文档中有特殊意义的标签 7 | * 8 | * @author xzzz 9 | */ 10 | public enum TagEnum { 11 | /** 12 | * 标识该文件夹是个专题 13 | */ 14 | subject, 15 | /** 16 | * 标识该文章是个目录 17 | */ 18 | toc, 19 | ; 20 | 21 | public static boolean isSubject(String tags) { 22 | if (StrUtil.isBlank(tags)) { 23 | return false; 24 | } 25 | return tags.toLowerCase().contains(TagEnum.subject.name()); 26 | } 27 | 28 | public static boolean isToc(String tags) { 29 | if (StrUtil.isBlank(tags)) { 30 | return false; 31 | } 32 | return tags.toLowerCase().contains(TagEnum.toc.name()); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/backup/BackupTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.backup; 2 | 3 | /** 4 | * 备份类型 5 | */ 6 | public enum BackupTypeEnum { 7 | /** 8 | * 备份 markdown 9 | */ 10 | MARKDOWN, 11 | /** 12 | * 备份 html 13 | */ 14 | HTML; 15 | } 16 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/backup/pojo/DownloadReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.backup.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | 7 | @Data 8 | public class DownloadReq { 9 | 10 | /** 11 | * 12 | */ 13 | @NotBlank(message = "文件名必填项") 14 | private String filename; 15 | } 16 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/pojo/ArticleQueryReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.draft.pojo; 2 | 3 | import com.blossom.common.base.enums.YesNo; 4 | import com.blossom.common.db.pojo.PageReq; 5 | import lombok.Data; 6 | import lombok.EqualsAndHashCode; 7 | 8 | import java.io.Serializable; 9 | import java.util.List; 10 | 11 | /** 12 | * 文章查询请求 13 | * 14 | * @author xzzz 15 | */ 16 | @Data 17 | @EqualsAndHashCode(callSuper = true) 18 | public class ArticleQueryReq extends PageReq implements Serializable { 19 | 20 | private static final long serialVersionUID = 1L; 21 | /** 22 | * 文章ID 23 | */ 24 | private Long id; 25 | /** 26 | * 上级ID集合 27 | */ 28 | private List pids; 29 | /** 30 | * star状态 {@link YesNo} 31 | */ 32 | private Integer starStatus; 33 | /** 34 | * 公开状态 {@link YesNo} 35 | */ 36 | private Integer openStatus; 37 | /** 38 | * 用户ID 39 | */ 40 | private Long userId; 41 | } 42 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/pojo/ArticleStatRes.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.draft.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * 文章统计对象 9 | * 10 | * @author xzzz 11 | */ 12 | @Data 13 | public class ArticleStatRes implements Serializable { 14 | 15 | private static final long serialVersionUID = 1L; 16 | 17 | /** 18 | * 文章数 19 | */ 20 | private Integer articleCount; 21 | /** 22 | * 字数 23 | */ 24 | private Integer articleWords; 25 | } 26 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/pojo/ArticleUpdNameReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.draft.pojo; 2 | 3 | import com.blossom.common.base.pojo.AbstractPOJO; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | import javax.validation.constraints.Min; 8 | import javax.validation.constraints.NotBlank; 9 | import javax.validation.constraints.NotNull; 10 | 11 | /** 12 | * 修改文章名称 13 | * 14 | * @since 1.10.0 15 | */ 16 | @Data 17 | @EqualsAndHashCode(callSuper = true) 18 | public class ArticleUpdNameReq extends AbstractPOJO { 19 | 20 | /** 21 | * ID 22 | */ 23 | @Min(value = 0, message = "[文章ID] 不能小于0") 24 | @NotNull(message = "[文章ID] 为必填项") 25 | private Long id; 26 | /** 27 | * 名称 28 | */ 29 | @NotBlank(message = "文章名称为必填项") 30 | private String name; 31 | } 32 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/pojo/ArticleUpdTagReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.draft.pojo; 2 | 3 | import com.blossom.common.base.pojo.AbstractPOJO; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | import javax.validation.constraints.Min; 8 | import javax.validation.constraints.NotBlank; 9 | import javax.validation.constraints.NotNull; 10 | 11 | /** 12 | * 添加,取消标签 13 | * 14 | * @since 1.10.0 15 | */ 16 | @Data 17 | @EqualsAndHashCode(callSuper = true) 18 | public class ArticleUpdTagReq extends AbstractPOJO { 19 | 20 | /** 21 | * ID 22 | */ 23 | @Min(value = 0, message = "[文章ID] 不能小于0") 24 | @NotNull(message = "[文章ID] 为必填项") 25 | private Long id; 26 | /** 27 | * 标签, toc 标签因为具有特殊意义, 必须小写 28 | */ 29 | @NotBlank(message = "标签为必填项") 30 | private String tag; 31 | } 32 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/log/ArticleLogMapper.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.log; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.blossom.backend.server.article.log.pojo.ArticleLogEntity; 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.apache.ibatis.annotations.Param; 7 | 8 | import java.util.List; 9 | 10 | 11 | /** 12 | * 文章记录 13 | */ 14 | @Mapper 15 | public interface ArticleLogMapper extends BaseMapper { 16 | 17 | /** 18 | * 查询文章记录 19 | * 20 | * @param articleId 文章ID 21 | */ 22 | List listAll(@Param("articleId") Long articleId); 23 | 24 | /** 25 | * 删除文章的记录 26 | * 27 | * @param articleIds 文章ID集合 28 | */ 29 | Long delByIds(@Param("articleIds") List articleIds); 30 | } -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/log/pojo/ArticleLogEntity.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.log.pojo; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableId; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.blossom.common.base.pojo.AbstractPOJO; 6 | import lombok.Data; 7 | import lombok.EqualsAndHashCode; 8 | 9 | import java.util.*; 10 | import java.io.Serializable; 11 | 12 | /** 13 | * 文章记录 14 | */ 15 | @Data 16 | @TableName("blossom_article_log") 17 | @EqualsAndHashCode(callSuper = true) 18 | public class ArticleLogEntity extends AbstractPOJO implements Serializable { 19 | 20 | private static final long serialVersionUID = 1L; 21 | 22 | /** ID */ 23 | @TableId 24 | private Long id; 25 | /** 文章ID */ 26 | private Long articleId; 27 | /** 版本 */ 28 | private Integer version; 29 | /** 文章内容 */ 30 | private String markdown; 31 | /** 修改日期 */ 32 | private Date creTime; 33 | } 34 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/log/pojo/ArticleLogRes.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.log.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.Date; 6 | 7 | /** 8 | * 文章记录 9 | */ 10 | @Data 11 | public class ArticleLogRes { 12 | /** 13 | * ID 14 | */ 15 | private Long i; 16 | /** 17 | * 日期 18 | */ 19 | private Date dt; 20 | } 21 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/open/ArticleOpenMapper.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.open; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.blossom.backend.server.article.open.pojo.ArticleOpenEntity; 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.apache.ibatis.annotations.Param; 7 | 8 | /** 9 | * 公开文章 10 | * 11 | * @author xzzz 12 | */ 13 | @Mapper 14 | public interface ArticleOpenMapper extends BaseMapper { 15 | 16 | /** 17 | * 公开文章 18 | * 19 | * @param id 公开文章的ID 20 | */ 21 | void open(Long id); 22 | 23 | /** 24 | * 删除公开文章 25 | * 26 | * @param id 关闭公开文章的ID 27 | */ 28 | void delById(Long id); 29 | 30 | /** 31 | * 同步公开 32 | * 33 | * @param id 公开文章的ID 34 | */ 35 | void sync(Long id); 36 | 37 | /** 38 | * 删除公开文章 39 | */ 40 | void delByUserId(@Param("userId") Long userId); 41 | } 42 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/open/pojo/ArticleOpenSyncReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.open.pojo; 2 | 3 | 4 | import com.blossom.common.base.pojo.AbstractPOJO; 5 | import lombok.Data; 6 | import lombok.EqualsAndHashCode; 7 | 8 | import javax.validation.constraints.Min; 9 | import javax.validation.constraints.NotNull; 10 | 11 | /** 12 | * 公开文章同步 13 | * 14 | * @author xzzz 15 | */ 16 | @Data 17 | @EqualsAndHashCode(callSuper = true) 18 | public class ArticleOpenSyncReq extends AbstractPOJO { 19 | 20 | /** 21 | * 文章ID 22 | */ 23 | @Min(value = 0, message = "[文章ID] 不能小于0") 24 | @NotNull(message = "[文章ID] 为必填项") 25 | private Long id; 26 | } 27 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/recycle/pojo/ArticleRecycleListRes.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.recycle.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.Date; 6 | 7 | /** 8 | * 回收站列表 9 | * 10 | * @since 1.10.0 11 | */ 12 | @Data 13 | public class ArticleRecycleListRes { 14 | /** 15 | * 文章ID 16 | */ 17 | private Long id; 18 | /** 19 | * 文章名称 20 | */ 21 | private String name; 22 | /** 23 | * 删除时间 24 | */ 25 | private Date delTime; 26 | } 27 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/recycle/pojo/ArticleRecycleRestoreReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.recycle.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.Min; 6 | import javax.validation.constraints.NotNull; 7 | 8 | /** 9 | * 回收站列表 10 | * 11 | * @since 1.10.0 12 | */ 13 | @Data 14 | public class ArticleRecycleRestoreReq { 15 | /** 16 | * 文章ID 17 | */ 18 | @Min(value = 0, message = "[文章ID] 不能小于0") 19 | @NotNull(message = "[文章ID] 为必填项") 20 | private Long id; 21 | } 22 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/reference/ArticleReferenceEnum.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.reference; 2 | 3 | import lombok.Getter; 4 | 5 | public enum ArticleReferenceEnum { 6 | /** 7 | * 图片 8 | */ 9 | FILE(10), 10 | /** 11 | * 内部文章 12 | */ 13 | INNER(11), 14 | /** 15 | * 未知内部文章 16 | */ 17 | INNER_UNKNOWN(12), 18 | 19 | /** 20 | * 外部文章 21 | */ 22 | OUTSIDE(21); 23 | 24 | @Getter 25 | private final Integer type; 26 | 27 | ArticleReferenceEnum(Integer type) { 28 | this.type = type; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/reference/pojo/ArticleReferenceReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.reference.pojo; 2 | 3 | import com.blossom.common.base.pojo.AbstractPOJO; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | 8 | /** 9 | * @author xzzz 10 | */ 11 | @Data 12 | @EqualsAndHashCode(callSuper = true) 13 | public class ArticleReferenceReq extends AbstractPOJO { 14 | /** 15 | * 引用ID 16 | */ 17 | private Long targetId; 18 | /** 19 | * 引用名称, 链接名称或图片名称 20 | */ 21 | private String targetName; 22 | /** 23 | * 引用地址, 链接的地址或图片地址 24 | */ 25 | private String targetUrl; 26 | /** 27 | * 类型 [暂无] 28 | */ 29 | private Integer type; 30 | } 31 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/stat/ArticleStatMapper.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.stat; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.blossom.backend.server.article.stat.pojo.ArticleStatEntity; 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.apache.ibatis.annotations.Param; 7 | 8 | /** 9 | * 文章统计 10 | * 11 | * @author xzzz 12 | */ 13 | @Mapper 14 | public interface ArticleStatMapper extends BaseMapper { 15 | 16 | /** 17 | * 删除统计信息 18 | */ 19 | void delByUserId(@Param("userId") Long userId); 20 | } 21 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/stat/ArticleStatTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.stat; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * 文章统计类型 7 | * 8 | * @author xzzz 9 | */ 10 | public enum ArticleStatTypeEnum { 11 | 12 | /** 13 | * 文章每日编辑数, 按热力图显示 14 | */ 15 | ARTICLE_HEATMAP(1), 16 | 17 | /** 18 | * 截止当月文章总字数, 按折线图显示 19 | */ 20 | ARTICLE_WORDS(2); 21 | 22 | @Getter 23 | private final Integer type; 24 | 25 | ArticleStatTypeEnum(Integer type) { 26 | this.type = type; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/stat/pojo/ArticleHeatmapRes.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.stat.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | import java.util.List; 7 | 8 | /** 9 | * 文章编辑热力图统计 10 | * 11 | * @author xzzz 12 | */ 13 | @Data 14 | public class ArticleHeatmapRes implements Serializable { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | /** 19 | * [ 20 | * [日期,值], 21 | * [日期,值] 22 | * ] 23 | */ 24 | private List data; 25 | /** 26 | * 最大修改数据 27 | */ 28 | private Integer maxStatValues; 29 | /** 30 | * 开始时间 31 | */ 32 | private String dateBegin; 33 | /** 34 | * 结束时间 35 | */ 36 | private String dateEnd; 37 | } 38 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/stat/pojo/ArticleLineRes.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.stat.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | import java.util.List; 7 | 8 | /** 9 | * 文章字数折线图统计 10 | * 11 | * @author xzzz 12 | */ 13 | @Data 14 | public class ArticleLineRes implements Serializable { 15 | 16 | private static final long serialVersionUID = 1L; 17 | 18 | /** 19 | * 日期集合 20 | */ 21 | List statDates; 22 | /** 23 | * 对应日期的统计值 24 | */ 25 | List statValues; 26 | } 27 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/stat/pojo/ArticleWordsRes.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.stat.pojo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 新增字数响应 7 | * 8 | * @since 1.8.0 9 | */ 10 | @Data 11 | public class ArticleWordsRes { 12 | /** 13 | * 日期 14 | */ 15 | private String date; 16 | /** 17 | * 统计值 18 | */ 19 | private Integer value; 20 | } 21 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/stat/pojo/ArticleWordsSaveReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.stat.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * 新增字数请求 9 | * 10 | * @since 1.8.0 11 | */ 12 | @Data 13 | public class ArticleWordsSaveReq { 14 | 15 | /** 16 | * 字数统计集合 17 | */ 18 | private List wordsList; 19 | } 20 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/view/ArticleViewMapper.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.view; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.blossom.backend.server.article.view.pojo.ArticleViewEntity; 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.apache.ibatis.annotations.Param; 7 | 8 | import java.util.List; 9 | 10 | 11 | /** 12 | * 文章访问记录 [@A#View] 13 | * 14 | * @author xzzz 15 | */ 16 | @Mapper 17 | public interface ArticleViewMapper extends BaseMapper { 18 | 19 | /** 20 | * 检查文章的UV 21 | * 22 | * @param today 日期 23 | * @param ip ip 24 | * @param articleId 文章ID 25 | */ 26 | Long checkUv(@Param("today") String today, @Param("ip") String ip, @Param("articleId") Long articleId); 27 | 28 | /** 29 | * 删除文章的访问记录 30 | * 31 | * @param articleIds 文章ID集合 32 | */ 33 | void delByIds(@Param("articleIds") List articleIds); 34 | } -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/article/view/ArticleViewTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.article.view; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * 文章记录的类型 7 | * 8 | * @author xzzz 9 | */ 10 | public enum ArticleViewTypeEnum { 11 | 12 | /** 13 | * UV, 每个IP,每天,每个文章唯一 14 | */ 15 | UV(1), 16 | /** 17 | * 点赞, 每个IP,每个文章唯一 18 | */ 19 | LIKE(2); 20 | 21 | @Getter 22 | private Integer type; 23 | 24 | ArticleViewTypeEnum(Integer type) { 25 | this.type = type; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/DocMapper.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.doc; 2 | 3 | import org.apache.ibatis.annotations.Mapper; 4 | import org.apache.ibatis.annotations.Param; 5 | 6 | @Mapper 7 | public interface DocMapper { 8 | 9 | /** 10 | * 查询 PID 下的最小排序 11 | * 12 | * @param pid PID 13 | * @return 最小排序 14 | */ 15 | Integer selectMaxSortByPid(@Param("pid") Long pid, @Param("userId") Long userId, @Param("type") Integer type); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/DocTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.doc; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * 文档的类型 7 | * 8 | * @author xzzz 9 | */ 10 | public enum DocTypeEnum { 11 | 12 | /** 13 | * folder article 文章文件夹 14 | */ 15 | FA(1,"文章文件夹"), 16 | /** 17 | * folder picture 图片文件夹 18 | */ 19 | FP(2,"图片文件夹"), 20 | /** 21 | * article 文章 22 | */ 23 | A(3,"文章"); 24 | 25 | @Getter 26 | private final Integer type; 27 | 28 | @Getter 29 | private final String desc; 30 | 31 | DocTypeEnum(Integer type, String desc) { 32 | this.type = type; 33 | this.desc = desc; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.folder; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * 文件夹类型, 不同的文件夹具有不同的字段要素, 例如图片文件夹不需要公开 7 | * 8 | * @author xzzz 9 | */ 10 | public enum FolderTypeEnum { 11 | /** 12 | * 文章文件夹 13 | */ 14 | ARTICLE(1, "文章文件夹"), 15 | 16 | /** 17 | * 图片文件夹 18 | */ 19 | PICTURE(2, "图片文件夹"); 20 | 21 | @Getter 22 | private final Integer type; 23 | 24 | @Getter 25 | private final String desc; 26 | 27 | FolderTypeEnum(Integer type, String desc) { 28 | this.type = type; 29 | this.desc = desc; 30 | } 31 | 32 | public static FolderTypeEnum getType(Integer type) { 33 | for (FolderTypeEnum value : FolderTypeEnum.values()) { 34 | if (value.getType().equals(type)) { 35 | return value; 36 | } 37 | } 38 | return null; 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderQueryReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.folder.pojo; 2 | 3 | import com.blossom.common.db.pojo.PageReq; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | import java.io.Serializable; 8 | 9 | /** 10 | * 文件夹查询请求 11 | * 12 | * @author xzzz 13 | */ 14 | @Data 15 | @EqualsAndHashCode(callSuper = true) 16 | public class FolderQueryReq extends PageReq implements Serializable { 17 | 18 | private static final long serialVersionUID = 1L; 19 | /** 20 | * star状态 21 | */ 22 | private Integer starStatus; 23 | 24 | private String tags; 25 | 26 | private Integer type; 27 | 28 | private Long userId; 29 | } 30 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderUpdNameReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.folder.pojo; 2 | 3 | import com.blossom.common.base.pojo.AbstractPOJO; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | import javax.validation.constraints.Min; 8 | import javax.validation.constraints.NotBlank; 9 | import javax.validation.constraints.NotNull; 10 | 11 | /** 12 | * 修改文章名称 13 | * 14 | * @since 1.10.0 15 | */ 16 | @Data 17 | @EqualsAndHashCode(callSuper = true) 18 | public class FolderUpdNameReq extends AbstractPOJO { 19 | 20 | /** 21 | * ID 22 | */ 23 | @Min(value = 0, message = "[文件夹ID] 不能小于0") 24 | @NotNull(message = "[文件夹ID] 为必填项") 25 | private Long id; 26 | /** 27 | * 名称 28 | */ 29 | @NotBlank(message = "文件夹名称为必填项") 30 | private String name; 31 | } 32 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderUpdTagReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.folder.pojo; 2 | 3 | import com.blossom.common.base.pojo.AbstractPOJO; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | import javax.validation.constraints.Min; 8 | import javax.validation.constraints.NotBlank; 9 | import javax.validation.constraints.NotNull; 10 | 11 | /** 12 | * 添加,取消标签 13 | * 14 | * @since 1.10.0 15 | */ 16 | @Data 17 | @EqualsAndHashCode(callSuper = true) 18 | public class FolderUpdTagReq extends AbstractPOJO { 19 | 20 | /** 21 | * ID 22 | */ 23 | @Min(value = 0, message = "[文章ID] 不能小于0") 24 | @NotNull(message = "[文章ID] 为必填项") 25 | private Long id; 26 | /** 27 | * 标签, subject 标签因为具有特殊意义, 必须小写 28 | */ 29 | @NotBlank(message = "标签为必填项") 30 | private String tag; 31 | } 32 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/note/NoteMapper.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.note; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.blossom.backend.server.note.pojo.NoteEntity; 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.apache.ibatis.annotations.Param; 7 | 8 | /** 9 | * 便签 10 | * 11 | * @author xzzz 12 | */ 13 | @Mapper 14 | public interface NoteMapper extends BaseMapper { 15 | 16 | /** 17 | * 置顶/取消置顶 18 | * 19 | * @param id 便签ID 20 | * @param top 是否置顶 21 | */ 22 | void top(@Param("id") Long id, @Param("top") Integer top); 23 | 24 | /** 25 | * 根据ID修改 26 | * 27 | * @param id ID 28 | * @param userId 用户ID 29 | */ 30 | void updById(@Param("id") Long id, @Param("userId") Long userId, @Param("content") String content); 31 | 32 | /** 33 | * 删除便签 34 | */ 35 | void delByUserId(@Param("userId") Long userId); 36 | } 37 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/note/pojo/NoteSaveReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.note.pojo; 2 | 3 | import com.blossom.common.base.pojo.AbstractPOJO; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | import javax.validation.constraints.NotBlank; 8 | 9 | /** 10 | * 保存便签 11 | * 12 | * @author xzzz 13 | */ 14 | @Data 15 | @EqualsAndHashCode(callSuper = true) 16 | public class NoteSaveReq extends AbstractPOJO { 17 | 18 | /** 19 | * 便签内容 20 | */ 21 | @NotBlank(message = "不能保存空的便签") 22 | private String content; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/note/pojo/NoteTopReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.note.pojo; 2 | 3 | import com.blossom.common.base.enums.YesNo; 4 | import com.blossom.common.base.pojo.AbstractPOJO; 5 | import lombok.Data; 6 | import lombok.EqualsAndHashCode; 7 | 8 | import javax.validation.constraints.NotNull; 9 | 10 | /** 11 | * 便签置顶 12 | * 13 | * @author xzzz 14 | */ 15 | @Data 16 | @EqualsAndHashCode(callSuper = true) 17 | public class NoteTopReq extends AbstractPOJO { 18 | 19 | /** 20 | * ID 21 | */ 22 | @NotNull(message = "便签ID为必填项") 23 | private Long id; 24 | 25 | /** 26 | * 是否置顶 {@link YesNo} 27 | */ 28 | @NotNull(message = "是否指定为必填项") 29 | private Integer top; 30 | } 31 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/note/pojo/NoteUpdReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.note.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.Min; 6 | import javax.validation.constraints.NotBlank; 7 | import javax.validation.constraints.NotNull; 8 | 9 | /** 10 | * 修改便签 11 | * 12 | * @since 1.9.0 13 | */ 14 | @Data 15 | public class NoteUpdReq { 16 | 17 | /** 18 | * ID 19 | */ 20 | @NotNull(message = "便签ID为必填项") 21 | @Min(value = 0) 22 | private Long id; 23 | 24 | /** 25 | * 用户ID 26 | */ 27 | private Long userId; 28 | 29 | /** 30 | * 便签内容 31 | */ 32 | @NotBlank(message = "不能保存空的便签") 33 | private String content; 34 | } 35 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/picture/pojo/PictureDelBatchReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.picture.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotNull; 6 | import java.util.List; 7 | 8 | /** 9 | * 批量删除图片 10 | * 11 | * @since 1.10.0 12 | */ 13 | @Data 14 | public class PictureDelBatchReq { 15 | 16 | /** 17 | * ID 18 | */ 19 | @NotNull(message = "ID为必填项") 20 | private List ids; 21 | 22 | /** 23 | * 忽略图片引用检查, 强制进行删除 24 | */ 25 | private Boolean ignoreCheck; 26 | } 27 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/picture/pojo/PictureDelReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.picture.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.Min; 6 | import javax.validation.constraints.NotNull; 7 | 8 | /** 9 | * 删除图片 10 | * 11 | * @since 1.6.0 增加忽略图片引用参数 12 | */ 13 | @Data 14 | public class PictureDelReq { 15 | 16 | /** 17 | * ID 18 | */ 19 | @NotNull(message = "ID为必填项") 20 | @Min(value = 0, message = "ID不能小于0") 21 | private Long id; 22 | 23 | /** 24 | * 忽略图片引用检查, 强制进行删除 25 | */ 26 | private Boolean ignoreCheck; 27 | } 28 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/picture/pojo/PicturePageReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.picture.pojo; 2 | 3 | import com.blossom.common.base.enums.YesNo; 4 | import com.blossom.common.db.pojo.PageReq; 5 | import lombok.Data; 6 | import lombok.EqualsAndHashCode; 7 | 8 | import java.io.Serializable; 9 | 10 | /** 11 | * 图片查询请求 12 | * 13 | * @author xzzz 14 | */ 15 | @Data 16 | @EqualsAndHashCode(callSuper = true) 17 | public class PicturePageReq extends PageReq implements Serializable { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | /** 22 | * 文件夹ID 23 | */ 24 | private Long pid; 25 | /** 26 | * 原文件名 27 | */ 28 | private String sourceName; 29 | /** 30 | * 文件名 31 | */ 32 | private String name; 33 | /** 34 | * 文件路径 35 | */ 36 | private String pathName; 37 | 38 | /** 39 | * 是否收藏 {@link YesNo} 40 | */ 41 | private Integer starStatus; 42 | } 43 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/picture/pojo/PictureStarReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.picture.pojo; 2 | 3 | 4 | import com.blossom.common.base.pojo.AbstractPOJO; 5 | import lombok.Data; 6 | import lombok.EqualsAndHashCode; 7 | 8 | import javax.validation.constraints.Max; 9 | import javax.validation.constraints.Min; 10 | import javax.validation.constraints.NotNull; 11 | 12 | /** 13 | * 图片 star 14 | * 15 | * @author xzzz 16 | */ 17 | @Data 18 | @EqualsAndHashCode(callSuper = true) 19 | public class PictureStarReq extends AbstractPOJO { 20 | 21 | /** 22 | * 文章ID 23 | */ 24 | @Min(value = 0, message = "[文章ID] 不能小于0") 25 | @NotNull(message = "[图片ID] 为必填项") 26 | private Long id; 27 | 28 | /** 29 | * 是否收藏 {@link YesNo} 30 | */ 31 | @Min(value = 0, message = "[star 状态] 不能小于0") 32 | @Max(value = 1, message = "[star 状态] 不能大于1") 33 | @NotNull(message = "[star 状态] 为必填项") 34 | private Integer starStatus; 35 | } 36 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/picture/pojo/PictureStatRes.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.picture.pojo; 2 | 3 | import com.blossom.common.base.pojo.AbstractPOJO; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | import java.io.Serializable; 8 | 9 | /** 10 | * 图片统计 11 | * 12 | * @author xzzz 13 | */ 14 | @Data 15 | @EqualsAndHashCode(callSuper = true) 16 | public class PictureStatRes extends AbstractPOJO implements Serializable { 17 | 18 | private static final long serialVersionUID = 1L; 19 | 20 | /** 21 | * 图片个数 22 | */ 23 | private Long pictureCount; 24 | /** 25 | * 图片大小 byte 26 | */ 27 | private Long pictureSize; 28 | } 29 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/picture/pojo/PictureTransferReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.picture.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotNull; 6 | import java.util.List; 7 | 8 | /** 9 | * 移动图片 10 | * 11 | * @since 1.10.0 12 | */ 13 | @Data 14 | public class PictureTransferReq { 15 | 16 | /** 17 | * ID 18 | */ 19 | @NotNull(message = "ID为必填项") 20 | private List ids; 21 | 22 | /** 23 | * 文件夹ID 24 | */ 25 | @NotNull(message = "文件夹ID为必填项") 26 | private Long pid; 27 | } 28 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/plan/PlanPositionEnum.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.plan; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * 计划位置, 用于前端处理不同样式 7 | * 8 | * @author xzzz 9 | */ 10 | public enum PlanPositionEnum { 11 | /** 12 | * 每日计划的第一天 13 | */ 14 | HEAD("head"), 15 | /** 16 | * 每日计划的中间日 17 | */ 18 | MID("mid"), 19 | /** 20 | * 每日计划的最后一天 21 | */ 22 | TAIL("tail"), 23 | /** 24 | * 仅有一天的计划 25 | */ 26 | ALL("all") 27 | ; 28 | 29 | @Getter 30 | private final String position; 31 | 32 | PlanPositionEnum(String position) { 33 | this.position = position; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/plan/PlanTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.plan; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * 计划类型 7 | * 8 | * @author xzzz 9 | */ 10 | public enum PlanTypeEnum { 11 | /** 12 | * 每日计划 13 | */ 14 | DAY(1), 15 | /** 16 | * 日常计划 17 | */ 18 | DAILY(2), 19 | ; 20 | 21 | @Getter 22 | private final Integer type; 23 | 24 | PlanTypeEnum(Integer type) { 25 | this.type = type; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/plan/pojo/PlanDailyAddReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.plan.pojo; 2 | 3 | import com.blossom.common.base.pojo.AbstractPOJO; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | import javax.validation.constraints.NotBlank; 8 | 9 | /** 10 | * 新增日常计划 11 | * 12 | * @author xzzz 13 | */ 14 | @EqualsAndHashCode(callSuper = true) 15 | @Data 16 | public class PlanDailyAddReq extends AbstractPOJO { 17 | 18 | /** 19 | * 内容 20 | */ 21 | private String content; 22 | /** 23 | * 开始时间 24 | */ 25 | @NotBlank(message = "开始时间为必填项") 26 | private String planStartTime; 27 | /** 28 | * 结束日期 29 | */ 30 | @NotBlank(message = "结束时间为必填项") 31 | private String planEndTime; 32 | /** 33 | * 图片 34 | */ 35 | private String img; 36 | 37 | /** 38 | * 用户ID 39 | */ 40 | private Long userId; 41 | 42 | } 43 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/plan/pojo/PlanDailyRes.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.plan.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * 日常计划响应 9 | * 10 | * @author xzzz 11 | */ 12 | @Data 13 | public class PlanDailyRes implements Serializable { 14 | 15 | private static final long serialVersionUID = 1L; 16 | 17 | /** 18 | * ID 19 | */ 20 | private Long id; 21 | /** 22 | * 内容 23 | */ 24 | private String content; 25 | /** 26 | * 开始时间 27 | */ 28 | private String planStartTime; 29 | /** 30 | * 结束日期 31 | */ 32 | private String planEndTime; 33 | /** 34 | * 图片 35 | */ 36 | private String img; 37 | /** 38 | * 是否当前计划 39 | */ 40 | private Boolean current; 41 | } 42 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/plan/pojo/PlanDayUpdReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.plan.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.Min; 6 | import javax.validation.constraints.NotBlank; 7 | import javax.validation.constraints.NotNull; 8 | 9 | /** 10 | * 修改计划信息 11 | * @since 1.9.0 12 | */ 13 | @Data 14 | public class PlanDayUpdReq { 15 | 16 | /** 17 | * 分组ID 18 | */ 19 | @NotNull(message = "分组ID为必填项") 20 | @Min(value = 0) 21 | private Long groupId; 22 | /** 23 | * 标题 24 | */ 25 | @NotBlank(message = "标题为必填项") 26 | private String title; 27 | /** 28 | * 内容 29 | */ 30 | private String content; 31 | /** 32 | * 用户ID 33 | */ 34 | private Long userId; 35 | } 36 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/plan/pojo/PlanDelReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.plan.pojo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 删除计划 7 | * 8 | * @author xzzz 9 | */ 10 | @Data 11 | public class PlanDelReq { 12 | 13 | /** 14 | * 计划ID 15 | */ 16 | private Long id; 17 | 18 | /** 19 | * 计划组ID 20 | */ 21 | private Long groupId; 22 | } 23 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/todo/TaskStatusEnum.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.todo; 2 | 3 | /** 4 | * 任务状态 5 | * 6 | * @since 1.4.0 7 | */ 8 | public enum TaskStatusEnum { 9 | /** 10 | * 待办 11 | */ 12 | WAITING, 13 | /** 14 | * 进行中 15 | */ 16 | PROCESSING, 17 | /** 18 | * 已完成 19 | */ 20 | COMPLETED; 21 | } 22 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/todo/TodoStatusEnum.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.todo; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * 待办事项状态 7 | * 8 | * @since 1.4.0 9 | */ 10 | public enum TodoStatusEnum { 11 | /** 12 | * 正常 13 | */ 14 | OPEN(1), 15 | /** 16 | * 完成 17 | */ 18 | COMPLETED(2); 19 | 20 | @Getter 21 | private final Integer type; 22 | 23 | TodoStatusEnum(Integer type) { 24 | this.type = type; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/todo/TodoTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.todo; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * 待办事项类型 7 | * 8 | * @since 1.4.0 9 | */ 10 | public enum TodoTypeEnum { 11 | 12 | /** 13 | * 每日待办事项 14 | */ 15 | DAY(10), 16 | /** 17 | * 阶段性事项 18 | */ 19 | PHASED(20), 20 | /** 21 | * 中午12点, 用于在任务列表中进行分割 22 | */ 23 | NOON_AM_12(99); 24 | 25 | @Getter 26 | private final Integer type; 27 | 28 | TodoTypeEnum(Integer type) { 29 | this.type = type; 30 | } 31 | 32 | public static TodoTypeEnum getByType(Integer type) { 33 | for (TodoTypeEnum value : TodoTypeEnum.values()) { 34 | if (value.getType().equals(type)) { 35 | return value; 36 | } 37 | } 38 | return null; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/todo/pojo/TaskAddReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.todo.pojo; 2 | 3 | import com.blossom.common.base.pojo.AbstractPOJO; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | import javax.validation.constraints.NotBlank; 8 | import java.util.List; 9 | 10 | /** 11 | * 任务新增 12 | * 13 | * @since 1.4.0 14 | */ 15 | @Data 16 | @EqualsAndHashCode(callSuper = true) 17 | public class TaskAddReq extends AbstractPOJO { 18 | 19 | /** 20 | * todoId 21 | */ 22 | @NotBlank(message = "事项ID为必填项") 23 | private String todoId; 24 | /** 25 | * 任务名称 26 | */ 27 | private String taskName; 28 | /** 29 | * 任务内容 30 | */ 31 | private String taskContent; 32 | /** 33 | * 截止日期 34 | */ 35 | private String deadLine; 36 | /** 37 | * 颜色 38 | */ 39 | private String color; 40 | /** 41 | * 标签集合 42 | */ 43 | private List taskTags; 44 | } 45 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/todo/pojo/TaskDelReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.todo.pojo; 2 | 3 | import lombok.Data; 4 | import lombok.EqualsAndHashCode; 5 | 6 | /** 7 | * 任务删除 8 | * 9 | * @since 1.4.0 10 | */ 11 | @Data 12 | @EqualsAndHashCode(callSuper = true) 13 | public class TaskDelReq extends TaskUpdStatusReq { 14 | } 15 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/todo/pojo/TaskRes.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.todo.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | /** 9 | * 任务列表 10 | * 11 | * @since 1.4.0 12 | */ 13 | @Data 14 | public class TaskRes { 15 | /** 16 | * 代办事项 17 | */ 18 | private List waiting; 19 | /** 20 | * 进行中事项 21 | */ 22 | private List processing; 23 | /** 24 | * 已完成事项 25 | */ 26 | private List completed; 27 | 28 | public static TaskRes build() { 29 | TaskRes res = new TaskRes(); 30 | res.setWaiting(new ArrayList<>()); 31 | res.setProcessing(new ArrayList<>()); 32 | res.setCompleted(new ArrayList<>()); 33 | return res; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/todo/pojo/TaskTransferReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.todo.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | import java.util.List; 7 | 8 | /** 9 | * 任务转移 10 | * 11 | * @since 1.8.0 12 | */ 13 | @Data 14 | public class TaskTransferReq { 15 | 16 | /** 17 | * 任务ID集合 18 | */ 19 | private List taskIds; 20 | 21 | /** 22 | * 被转移的各项任务所在的待办事项ID 23 | */ 24 | @NotBlank(message = "被转移任务所在的待办事项ID为必填项") 25 | private String curTodoId; 26 | 27 | /** 28 | * 转移到的事项ID 29 | */ 30 | @NotBlank(message = "待办事项ID为必填项") 31 | private String todoId; 32 | 33 | /** 34 | * 是否删除原事项 35 | */ 36 | private Boolean delSource; 37 | } 38 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/todo/pojo/TaskUpdStatusReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.todo.pojo; 2 | 3 | import com.blossom.common.base.pojo.AbstractPOJO; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | import javax.validation.constraints.NotBlank; 8 | import javax.validation.constraints.NotNull; 9 | 10 | /** 11 | * 任务状态修改 12 | * 13 | * @since 1.4.0 14 | */ 15 | @Data 16 | @EqualsAndHashCode(callSuper = true) 17 | public class TaskUpdStatusReq extends AbstractPOJO { 18 | 19 | /** 20 | * ID 21 | */ 22 | @NotNull(message = "任务ID为必填项") 23 | private Long id; 24 | /** 25 | * todoId 26 | */ 27 | @NotBlank(message = "事项ID为必填项") 28 | private String todoId; 29 | } 30 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/todo/pojo/TodoExportReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.todo.pojo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 待办事项导出 7 | * 8 | * @since 1.4.0 9 | */ 10 | @Data 11 | public class TodoExportReq { 12 | 13 | /** 14 | * 阶段性事项ID 15 | */ 16 | private String todoId; 17 | /** 18 | * 每日事项开始日期 19 | */ 20 | private String beginTodoId; 21 | /** 22 | * 每日事项结束日期 23 | */ 24 | private String endTodoId; 25 | /** 26 | * 是否导出日期 27 | */ 28 | private Boolean exportDate; 29 | /** 30 | * 是否导出进度 31 | */ 32 | private Boolean exportProcess; 33 | } 34 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/todo/pojo/TodoPhasedAddReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.todo.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | 7 | /** 8 | * 新增阶段性事项 9 | * 10 | * @since 1.4.0 11 | */ 12 | @Data 13 | public class TodoPhasedAddReq { 14 | /** 15 | * 阶段性事项名称 16 | */ 17 | @NotBlank(message = "阶段性事项名称为必填项") 18 | private String todoName; 19 | } 20 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/todo/pojo/TodoPhasedCompletedReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.todo.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | 7 | /** 8 | * 阶段性事项完成 9 | * 10 | * @since 1.4.0 11 | */ 12 | @Data 13 | public class TodoPhasedCompletedReq { 14 | 15 | /** 16 | * 阶段性事项ID 17 | */ 18 | @NotBlank(message = "阶段性事项ID为必填项") 19 | private String todoId; 20 | } 21 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/todo/pojo/TodoPhasedUpdReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.todo.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | 7 | /** 8 | * 修改阶段性事项的名称 9 | * 10 | * @since 1.4.0 11 | */ 12 | @Data 13 | public class TodoPhasedUpdReq { 14 | 15 | /** 16 | * 阶段性事项ID 17 | */ 18 | @NotBlank(message = "阶段性事项ID为必填项") 19 | private String todoId; 20 | /** 21 | * 阶段性事项名称 22 | */ 23 | @NotBlank(message = "阶段性事项名称为必填项") 24 | private String todoName; 25 | } 26 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/server/web/WebMapper.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.server.web; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.blossom.backend.server.web.pojo.WebEntity; 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.apache.ibatis.annotations.Param; 7 | 8 | /** 9 | * 网站收藏 10 | * 11 | * @author xzzz 12 | */ 13 | @Mapper 14 | public interface WebMapper extends BaseMapper { 15 | 16 | /** 17 | * 删除文章 18 | */ 19 | void delByUserId(@Param("userId") Long userId); 20 | } -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/thirdparty/gitee/pojo/Events.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.thirdparty.gitee.pojo; 2 | 3 | /** 4 | * gitee events 5 | * 6 | * @author xzzz 7 | */ 8 | public class Events { 9 | private Integer id; 10 | private String created_at; 11 | 12 | public Integer getId() { 13 | return id; 14 | } 15 | 16 | public void setId(Integer id) { 17 | this.id = id; 18 | } 19 | 20 | public String getCreated_at() { 21 | return created_at; 22 | } 23 | 24 | public void setCreated_at(String created_at) { 25 | this.created_at = created_at; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/thirdparty/gitee/pojo/HeatmapRes.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.thirdparty.gitee.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * 热力图响应 9 | * 10 | * @author xzzz 11 | */ 12 | @Data 13 | public class HeatmapRes { 14 | /** 15 | * 最大修改数据 16 | */ 17 | private Integer maxUpdateNum; 18 | /** 19 | * 开始时间 20 | */ 21 | private String dateBegin; 22 | /** 23 | * 结束时间 24 | */ 25 | private String dateEnd; 26 | /** 27 | * 从开始时间到结束的数据 28 | */ 29 | private List data; 30 | } 31 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/thirdparty/hefeng/WeatherHeEntity.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.thirdparty.hefeng; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @author xzzz 7 | */ 8 | @Data 9 | public class WeatherHeEntity { 10 | 11 | private String locationId; 12 | private String locationEName; 13 | private String locationCName; 14 | private String countryCode; 15 | private String countryEName; 16 | private String countryCName; 17 | private String adm1EName; 18 | private String adm1CName; 19 | private String adm2EName; 20 | private String adm2CName; 21 | private String lat; 22 | private String lng; 23 | private String adCode; 24 | 25 | } 26 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/thirdparty/hefeng/pojo/CityRes.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.thirdparty.hefeng.pojo; 2 | 3 | import com.fasterxml.jackson.annotation.JsonInclude; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * 城市信息 10 | */ 11 | @Data 12 | public class CityRes { 13 | 14 | private String code; 15 | 16 | private List location; 17 | 18 | @Data 19 | @JsonInclude(JsonInclude.Include.NON_NULL) 20 | public static class Location { 21 | String name; 22 | String id; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/thirdparty/hefeng/pojo/HourlyRes.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.thirdparty.hefeng.pojo; 2 | 3 | import com.fasterxml.jackson.annotation.JsonInclude; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | 8 | @Data 9 | public class HourlyRes { 10 | 11 | private String code; 12 | 13 | private List hourly; 14 | 15 | /** 16 | * 逐小时预报 17 | */ 18 | @Data 19 | @JsonInclude(JsonInclude.Include.NON_NULL) 20 | public static class Hourly { 21 | /** 22 | * 逐小时预报时间 23 | */ 24 | private String fxTime; 25 | /** 26 | * 逐小时预报温度 27 | */ 28 | private String temp; 29 | /** 30 | * 逐小时预报天气状况图标代码 31 | */ 32 | private String icon; 33 | /** 34 | * 图标 35 | */ 36 | private String iconValue; 37 | /** 38 | * 逐小时预报天气状况文字描述 39 | */ 40 | private String text; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/java/com/blossom/backend/thirdparty/hefeng/pojo/WeatherRes.java: -------------------------------------------------------------------------------- 1 | package com.blossom.backend.thirdparty.hefeng.pojo; 2 | 3 | import com.fasterxml.jackson.annotation.JsonInclude; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * 天气信息 10 | * 11 | * @author xzzz 12 | */ 13 | @Data 14 | @JsonInclude(JsonInclude.Include.NON_NULL) 15 | public class WeatherRes { 16 | private CityRes.Location location; 17 | private NowRes.Now now; 18 | private List hourly; 19 | private List daily; 20 | } 21 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | ${AnsiColor.MAGENTA} 2 | ██████╗ ██╗ ██████╗ ███████╗ ███████╗ ██████╗ ███╗ ███╗ 3 | ██╔══██╗ ██║ ██╔═══██╗ ██╔════╝ ██╔════╝ ██╔═══██╗ ████╗ ████║ 4 | ██████╔╝ ██║ ██║ ██║ ███████╗ ███████╗ ██║ ██║ ██╔████╔██║ 5 | ██╔══██╗ ██║ ██║ ██║ ╚════██║ ╚════██║ ██║ ██║ ██║╚██╔╝██║ 6 | ██████╔╝ ███████╗ ╚██████╔╝ ███████║ ███████║ ╚██████╔╝ ██║ ╚═╝ ██║ 7 | ╚═════╝ ╚══════╝ ╚═════╝ ╚══════╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ 8 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/resources/mapper/ArticleLogMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | 13 | delete from blossom_article_log 14 | where article_id in #{item} 15 | 16 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/resources/mapper/ArticleViewMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 11 | 12 | 13 | delete from blossom_article_view 14 | where article_id in #{item} 15 | 16 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/resources/mapper/DocMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 13 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/resources/mapper/NoteMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | update blossom_note 8 | 9 | set top = 0, 10 | top_time = null 11 | 12 | 13 | set top = 1, 14 | top_time = now() 15 | 16 | where id = #{id} 17 | 18 | 19 | 20 | update blossom_note 21 | set content = #{content} 22 | where id = #{id} 23 | and user_id = #{userId} 24 | 25 | 26 | 27 | delete from blossom_note where user_id = #{userId} 28 | 29 | 30 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/resources/mapper/ParamMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | update base_sys_param 7 | set param_value = #{paramValue} 8 | where param_name = #{paramName} 9 | 10 | 11 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/resources/mapper/StatMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | delete from blossom_stat where user_id = #{userId} 7 | 8 | 9 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/resources/mapper/WebMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | delete from blossom_web where user_id = #{userId} 7 | 8 | 9 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/resources/sentinel.properties: -------------------------------------------------------------------------------- 1 | project.name=blossom-backend 2 | 3 | 4 | csp.sentinel.log.dir=logs/csp 5 | 6 | csp.sentinel.metric.file.single.size=20971520 7 | csp.sentinel.metric.file.total.count=30 8 | -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/resources/static/blog/README.md: -------------------------------------------------------------------------------- 1 | 博客静态文件放置位置,若在 blossom-web 项目中打包,需使用: 2 | 3 | ```bash 4 | npm run build:spring 5 | ``` 6 | 7 | 会自动将打包产物打包至该位置。 -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/resources/static/editor/README.md: -------------------------------------------------------------------------------- 1 | 客户端静态文件放置位置。 2 | 3 | 在 blossom-editor 工程下执行如下语句, 打包成网页后复制到后台 static/editor 资源目录下 4 | 5 | ``` 6 | npm run build 7 | ``` -------------------------------------------------------------------------------- /blossom-backend/backend/src/main/resources/static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-backend/backend/src/main/resources/static/favicon.png -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/BaseConfig.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | 5 | /** 6 | * core 模块公共配置 7 | * 8 | * @author xzzz 9 | */ 10 | @Configuration 11 | public class BaseConfig { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/enums/ExFormat.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.enums; 2 | 3 | import com.blossom.common.base.exception.AbstractExceptionAdvice; 4 | 5 | /** 6 | * {@link AbstractExceptionAdvice} 中是否将异常信息进行格式化打印; 7 | *

如果是 line, 则异常堆栈信息按照一行记录在日志中; 8 | *

如果是 format, 则异常堆栈信息按照格式化方式记录在日志中 9 | * 10 | * @author xzzz 11 | */ 12 | public enum ExFormat { 13 | /** 14 | * 则异常堆栈信息按照一行记录在日志中, 通常可以方便进行日志收集, 例如有结构化的数据, 可以避免使用某分隔符进行分割, 以提升效率 15 | */ 16 | line, 17 | /** 18 | * 异常堆栈信息按照格式化方式记录在日志中 19 | */ 20 | format 21 | } 22 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/enums/ExStackTrace.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.enums; 2 | 3 | import com.blossom.common.base.exception.AbstractExceptionAdvice; 4 | import com.blossom.common.base.util.ExceptionUtil; 5 | 6 | /** 7 | * {@link AbstractExceptionAdvice} 中记录异常堆栈信息的内容; 8 | *

如果是 all ,则记录全部堆栈信息; 9 | *

如果是 project, 堆栈信息只包含项目包下的类; 10 | * 11 | * @author xzzz 12 | */ 13 | public enum ExStackTrace { 14 | 15 | /** 16 | * 打印全部堆栈异常 17 | */ 18 | all, 19 | 20 | /** 21 | * 只显式指定包下的堆栈信息, {@link ExceptionUtil#FILTER_PACKAGE} 22 | */ 23 | project 24 | } 25 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/exception/XzAbstractException.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.exception; 2 | 3 | import com.blossom.common.base.pojo.IRCode; 4 | 5 | /** 6 | * 异常抽象类 7 | * 8 | * @author xzzz 9 | */ 10 | public abstract class XzAbstractException extends RuntimeException { 11 | 12 | /** 13 | * 响应码 14 | */ 15 | private final String code; 16 | 17 | /** 18 | * 自定义响应码和响应信息 19 | * 20 | * @param code 响应码 21 | * @param msg 响应信息 22 | */ 23 | public XzAbstractException(String code, String msg) { 24 | super(msg); 25 | this.code = code; 26 | } 27 | 28 | /** 29 | * 直接返回响应码枚举 30 | */ 31 | public XzAbstractException(IRCode irCode) { 32 | super(irCode.getMsg()); 33 | this.code = irCode.getCode(); 34 | } 35 | 36 | public String getCode() { 37 | return code; 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/exception/XzException.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.exception; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import com.blossom.common.base.pojo.IRCode; 5 | 6 | /** 7 | * 异常, 通常不使用该异常 8 | * 9 | * @author xzzz 10 | */ 11 | public class XzException extends XzAbstractException { 12 | 13 | public XzException(IRCode code) { 14 | super(code.getCode(), code.getMsg()); 15 | } 16 | 17 | public XzException(String code, String msg) { 18 | super(code, msg); 19 | } 20 | 21 | public static void throwBy(boolean expression, String code, String msg) { 22 | if (expression) { 23 | if (StrUtil.isBlank(msg)) { 24 | msg = ""; 25 | } 26 | throw new XzException(code, msg); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/exception/XzException400.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.exception; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import com.blossom.common.base.pojo.RCode; 5 | 6 | /** 7 | * @author xzzz 8 | */ 9 | public class XzException400 extends XzAbstractException { 10 | 11 | public XzException400(String message) { 12 | super(RCode.BAD_REQUEST.getCode(), message); 13 | } 14 | 15 | public XzException400(String message, String... args) { 16 | super(RCode.BAD_REQUEST.getCode(), String.format(message, args)); 17 | } 18 | 19 | public static void throwBy(boolean expression, String msg) { 20 | if (expression) { 21 | if (StrUtil.isBlank(msg)) { 22 | msg = RCode.BAD_REQUEST.getMsg(); 23 | } 24 | throw new XzException400(msg); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/exception/XzException400HTTP.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.exception; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import com.blossom.common.base.pojo.RCode; 5 | 6 | /** 7 | * 抛出异常, 如果是 Rest 接口, 则 Http 响应码为 404 8 | * 9 | * @author xzzz 10 | */ 11 | public class XzException400HTTP extends XzAbstractException { 12 | 13 | public XzException400HTTP(String message) { 14 | super(RCode.BAD_REQUEST.getCode(), message); 15 | } 16 | 17 | public static void throwBy(boolean expression, String msg) { 18 | if (expression) { 19 | if (StrUtil.isBlank(msg)) { 20 | msg = RCode.BAD_REQUEST.getMsg(); 21 | } 22 | throw new XzException400HTTP(msg); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/exception/XzException404.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.exception; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import com.blossom.common.base.pojo.RCode; 5 | 6 | /** 7 | * @author xzzz 8 | */ 9 | public class XzException404 extends XzAbstractException { 10 | 11 | public XzException404(String message) { 12 | super(RCode.NOT_FOUND.getCode(), message); 13 | } 14 | 15 | public static void throwBy(boolean expression, String msg) { 16 | if (expression) { 17 | if (StrUtil.isBlank(msg)) { 18 | msg = RCode.NOT_FOUND.getMsg(); 19 | } 20 | throw new XzException404(msg); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/exception/XzException500.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.exception; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import com.blossom.common.base.pojo.RCode; 5 | 6 | /** 7 | * @author xzzz 8 | */ 9 | public class XzException500 extends XzAbstractException { 10 | 11 | public XzException500(String message) { 12 | super(RCode.INTERNAL_SERVER_ERROR.getCode(), message); 13 | } 14 | 15 | public static void throwBy(boolean expression, String msg) { 16 | if (expression) { 17 | if (StrUtil.isBlank(msg)) { 18 | msg = RCode.INTERNAL_SERVER_ERROR.getMsg(); 19 | } 20 | throw new XzException404(msg); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/log/DynamicLogRepository.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.log; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 动态日志级别的存储方式 7 | * 8 | * @author xzzz 9 | */ 10 | public interface DynamicLogRepository { 11 | 12 | /** 13 | * 保存日志级别 14 | * 15 | * @param levelWrapper 日志封装 16 | */ 17 | void save(LevelWrapper levelWrapper); 18 | 19 | 20 | @Data 21 | class LevelWrapper { 22 | /** 23 | * 日志路径 24 | */ 25 | private String path; 26 | /** 27 | * 过期时间 28 | */ 29 | private Long expire; 30 | /** 31 | * 该路径所要执行的日志级别 32 | */ 33 | private String level; 34 | 35 | public LevelWrapper() { 36 | } 37 | 38 | public LevelWrapper(String path, String level, Long expire) { 39 | this.path = path; 40 | this.expire = expire; 41 | this.level = level; 42 | } 43 | 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/log/HostNameConfig.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.log; 2 | 3 | import ch.qos.logback.core.PropertyDefinerBase; 4 | import com.blossom.common.base.util.SystemUtil; 5 | 6 | /** 7 | * 使用在 logback-spring.xml 中, 作为日志收集时的机器名 8 | * 9 | * @author xzzz 10 | */ 11 | public class HostNameConfig extends PropertyDefinerBase { 12 | 13 | private static final String HOST_NAME; 14 | 15 | static { 16 | HOST_NAME = SystemUtil.getHostName(); 17 | } 18 | 19 | @Override 20 | public String getPropertyValue() { 21 | return HOST_NAME; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/log/LogIpConfig.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.log; 2 | 3 | import ch.qos.logback.core.PropertyDefinerBase; 4 | import com.blossom.common.base.util.SystemUtil; 5 | 6 | /** 7 | * 使用在 logback-spring.xml 中, 作为日志收集时的机器IP 8 | * 9 | * @author xzzz 10 | */ 11 | public class LogIpConfig extends PropertyDefinerBase { 12 | 13 | private static final String IP; 14 | 15 | static { 16 | IP = SystemUtil.getIp(); 17 | } 18 | 19 | @Override 20 | public String getPropertyValue() { 21 | return IP; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/log/pojo/DynamicLog.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.log.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotEmpty; 6 | 7 | /** 8 | * 动态日志级别 9 | * 10 | * @author xzzz 11 | */ 12 | @Data 13 | public class DynamicLog { 14 | 15 | /** 16 | * 日志路径 17 | */ 18 | @NotEmpty(message = "日志路径为必填项") 19 | private String path; 20 | 21 | /** 22 | * 日志级别 23 | */ 24 | @NotEmpty(message = "日志级别为必填项") 25 | private String level; 26 | } 27 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/pojo/AbstractEntity.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.pojo; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.Date; 6 | 7 | /** 8 | * 抽象 entity 9 | * 10 | * @author xzzz 11 | */ 12 | @Data 13 | public class AbstractEntity extends AbstractPOJO { 14 | /** 15 | * 创建名称,创建人ID 16 | */ 17 | private String creBy; 18 | /** 19 | * 创建时间 20 | */ 21 | private Date creTime; 22 | /** 23 | * 修改人名称,修改人ID 24 | */ 25 | private String updBy; 26 | /** 27 | * 修改时间 28 | */ 29 | private Date updTime; 30 | /** 31 | * 删除人名称,删除人ID 32 | */ 33 | private String delBy; 34 | /** 35 | * 删除时间,0 为未删除,非 0 为已删除 36 | */ 37 | private Long delTime; 38 | } 39 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/pojo/AbstractPOJO.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.pojo; 2 | 3 | import com.blossom.common.base.util.BeanUtil; 4 | 5 | /** 6 | * @author xzzz 7 | */ 8 | public class AbstractPOJO { 9 | 10 | public T to(Class clazz) { 11 | return BeanUtil.toObj(this, clazz); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/pojo/DelReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.pojo; 2 | 3 | import lombok.Data; 4 | import lombok.EqualsAndHashCode; 5 | 6 | import javax.validation.constraints.Min; 7 | import javax.validation.constraints.NotNull; 8 | 9 | /** 10 | * 删除参数 11 | * 12 | * @author xzzz 13 | */ 14 | @Data 15 | @EqualsAndHashCode(callSuper = true) 16 | public class DelReq extends AbstractPOJO { 17 | 18 | /** 19 | * ID 20 | */ 21 | @NotNull(message = "ID为必填项") 22 | @Min(value = 0, message = "ID不能小于0") 23 | private Long id; 24 | } 25 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/pojo/IRCode.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.pojo; 2 | 3 | /** 4 | * 响应码 5 | * 6 | * @author xzzz 7 | */ 8 | public interface IRCode { 9 | 10 | /** 11 | * 响应码 12 | * 13 | * @return 响应码 14 | */ 15 | String getCode(); 16 | 17 | /** 18 | * 响应码信息 19 | * 20 | * @return 响应码信息 21 | */ 22 | String getMsg(); 23 | } 24 | 25 | 26 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/pojo/PageRes.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.pojo; 2 | 3 | import com.fasterxml.jackson.annotation.JsonInclude; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * 共用分页对象 11 | * 12 | * @author xzzz 13 | */ 14 | @Getter 15 | @Setter 16 | public class PageRes { 17 | 18 | /** 19 | * 页码,0或1均表示第一页 20 | */ 21 | private int pageNum; 22 | /** 23 | * 每页结果数 24 | */ 25 | private int pageSize; 26 | /** 27 | * 总页数 28 | */ 29 | private int totalPage; 30 | /** 31 | * 总行数 32 | */ 33 | private long total; 34 | /** 35 | * 是否有下一页 36 | */ 37 | private Boolean hasNextPage; 38 | /** 39 | * 分页数据 40 | */ 41 | @JsonInclude(JsonInclude.Include.NON_NULL) 42 | private List datas; 43 | 44 | 45 | public PageRes() { 46 | } 47 | 48 | public PageRes(List datas) { 49 | this.datas = datas; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/util/ProxyUtils.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.util; 2 | 3 | import org.aopalliance.intercept.MethodInterceptor; 4 | import org.springframework.aop.framework.ProxyFactory; 5 | 6 | /** 7 | * 代理辅助方法 8 | * 9 | * @author xzzz 10 | */ 11 | public final class ProxyUtils { 12 | 13 | /** 14 | * 创建指定对象的代理类 15 | * 16 | * @param obj 对象 17 | * @param interceptor 代理方法 18 | * @return 代理类 19 | */ 20 | public static Object getProxy(Object obj, MethodInterceptor interceptor) { 21 | ProxyFactory proxy = new ProxyFactory(obj); 22 | proxy.setProxyTargetClass(true); 23 | proxy.addAdvice(interceptor); 24 | return proxy.getProxy(); 25 | } 26 | } -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/util/TimeUtil.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.util; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | /** 6 | * Provides millisecond-level time of OS. 7 | * 8 | * @author xzzz 9 | */ 10 | public final class TimeUtil { 11 | 12 | private static volatile long currentTimeMillis; 13 | 14 | static { 15 | currentTimeMillis = System.currentTimeMillis(); 16 | Thread daemon = new Thread(() -> { 17 | while (true) { 18 | currentTimeMillis = System.currentTimeMillis(); 19 | try { 20 | TimeUnit.MILLISECONDS.sleep(1); 21 | } catch (Throwable ignored) { 22 | 23 | } 24 | } 25 | }); 26 | daemon.setDaemon(true); 27 | daemon.setName("blossom-time-tick-thread"); 28 | daemon.start(); 29 | } 30 | 31 | public static long currentTimeMillis() { 32 | return currentTimeMillis; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/util/okhttp/OkHttpInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.util.okhttp; 2 | 3 | import okhttp3.Interceptor; 4 | 5 | /** 6 | * OKHTTP 拦截器, 由于 OKHTTP 为工具类, 拦截器不好拓展, 所以使用 SPI 方式由引用方实现 7 | * 8 | * @author xzzz 9 | */ 10 | public interface OkHttpInterceptor extends Interceptor { 11 | 12 | /** 13 | * 说明该拦截器实现的作用 14 | */ 15 | void instructions(); 16 | } 17 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/util/security/Base64Util.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.util.security; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | 5 | import java.util.Base64; 6 | 7 | /** 8 | * 消息编码算法 9 | * 10 | * @author xzzz 11 | * @since 0.0.1 12 | */ 13 | public class Base64Util { 14 | 15 | public static String encrypt(byte[] data) { 16 | return Base64.getEncoder().encodeToString(data); 17 | } 18 | 19 | public static String decrypt(String data) { 20 | return new String(Base64.getDecoder().decode(data)); 21 | } 22 | 23 | /** 24 | * 是否 base64 图片, 只校验格式, 不判断内容是否为正确的图片 25 | * 例如: 传入 data:image/png;base64,a, 将会返回 true 26 | */ 27 | public static boolean isBase64Img(String image) { 28 | if (StrUtil.isBlank(image)) { 29 | return false; 30 | } 31 | String prefix = image.substring(0, Math.max(image.indexOf(','), 0)); 32 | return prefix.startsWith("data:image") && prefix.endsWith("base64"); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/util/security/SaltUtil.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.util.security; 2 | 3 | import java.security.SecureRandom; 4 | 5 | /** 6 | * 获取随机盐值 7 | * 8 | * @author xzzz 9 | * @since 0.0.1 10 | */ 11 | public class SaltUtil { 12 | 13 | /** 14 | * 安全随机类 15 | */ 16 | private static final SecureRandom RANDOM = new SecureRandom(); 17 | 18 | /** 19 | * 获取随机盐值 20 | * @return 加盐 21 | */ 22 | public static String randomSalt() { 23 | byte[] bytes = new byte[15]; 24 | RANDOM.nextBytes(bytes); 25 | return Base64Util.encrypt(bytes); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/util/spi/ServiceLoaderUtil.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.util.spi; 2 | 3 | import java.util.ServiceLoader; 4 | 5 | /** 6 | * 根据接口或抽象类获取该类的全部实现类 7 | * 8 | * @author xzzz 9 | */ 10 | public final class ServiceLoaderUtil { 11 | 12 | private static final String CLASSLOADER_DEFAULT = "default"; 13 | private static final String CLASSLOADER_CONTEXT = "context"; 14 | private static final String CLASSLOADER_PATH = ""; 15 | 16 | public static ServiceLoader getServiceLoader(Class clazz) { 17 | return ServiceLoader.load(clazz, clazz.getClassLoader()); 18 | } 19 | 20 | private ServiceLoaderUtil() {} 21 | } 22 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/java/com/blossom/common/base/util/spring/AntPathMatcherUtil.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.base.util.spring; 2 | 3 | import org.springframework.util.AntPathMatcher; 4 | 5 | /** 6 | * 路径匹配工具类,依赖 Spring 的工具类 7 | * 8 | * @author xzzz 9 | * @since 0.0.1 10 | */ 11 | public class AntPathMatcherUtil { 12 | 13 | private static AntPathMatcher antPathMatcher = new AntPathMatcher(); 14 | 15 | public static AntPathMatcher getAntPathMatcher() { 16 | return antPathMatcher; 17 | } 18 | 19 | /** 20 | * 匹配请求路径是否在模板中 21 | * @param pattern 模板路径 22 | * @param path 路径 23 | * @return true:在模板中, false:不在模板中 24 | */ 25 | public static boolean match (String pattern,String path) { 26 | return antPathMatcher.match(pattern,path); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /blossom-backend/common/common-base/src/main/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 2 | com.blossom.common.base.config.JacksonConfig,\ 3 | com.blossom.common.base.BaseProperties,\ 4 | com.blossom.common.base.BaseConfig,\ 5 | com.blossom.common.base.config.WebMvcConfig,\ 6 | com.blossom.common.base.exception.ExceptionAdviceByGlobal,\ 7 | com.blossom.common.base.exception.ExceptionAdviceByXz,\ 8 | com.blossom.common.base.util.spring.SpringUtil,\ 9 | com.blossom.common.base.log.DynamicLogRepositoryCaffeine 10 | 11 | 12 | -------------------------------------------------------------------------------- /blossom-backend/common/common-cache/src/main/java/com/blossom/common/cache/caffeine/DynamicExpiry.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.cache.caffeine; 2 | 3 | import com.github.benmanes.caffeine.cache.Expiry; 4 | import org.checkerframework.checker.index.qual.NonNegative; 5 | import org.checkerframework.checker.nullness.qual.NonNull; 6 | 7 | /** 8 | * key 使用不同的过期时间 9 | * 10 | * @since 1.13.0 11 | */ 12 | public class DynamicExpiry implements Expiry { 13 | 14 | @Override 15 | public long expireAfterCreate(@NonNull String key, @NonNull Object value, long currentTime) { 16 | return 0; 17 | } 18 | 19 | @Override 20 | public long expireAfterUpdate(@NonNull String key, @NonNull Object value, long currentTime, @NonNegative long currentDuration) { 21 | return currentDuration; 22 | } 23 | 24 | @Override 25 | public long expireAfterRead(@NonNull String key, @NonNull Object value, long currentTime, @NonNegative long currentDuration) { 26 | return currentDuration; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /blossom-backend/common/common-cache/src/main/java/com/blossom/common/cache/redis/RedisConstant.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.cache.redis; 2 | 3 | import com.blossom.common.base.BaseConstants; 4 | 5 | /** 6 | * @author xzzz 7 | * @since 0.0.1 8 | */ 9 | public final class RedisConstant { 10 | 11 | /** 12 | * cache 前后缀 13 | */ 14 | public static final String CACHE_PREFIX_WITH = BaseConstants.PROJECT_NAME + ":"; 15 | 16 | public static final String CACHE_SUFFIX_WITH = ":"; 17 | } 18 | -------------------------------------------------------------------------------- /blossom-backend/common/common-cache/src/main/java/com/blossom/common/cache/redis/RedisProperties.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.cache.redis; 2 | 3 | import org.springframework.boot.context.properties.ConfigurationProperties; 4 | import org.springframework.context.annotation.Configuration; 5 | 6 | /** 7 | * redis 配置 8 | * 9 | * @author xzzz 10 | */ 11 | @Configuration 12 | @ConfigurationProperties(prefix = "project.redis") 13 | public class RedisProperties { 14 | 15 | } 16 | -------------------------------------------------------------------------------- /blossom-backend/common/common-cache/src/main/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 2 | com.blossom.common.cache.CommonCacheProperties,\ 3 | com.blossom.common.cache.caffeine.CaffeineCacheConfig,\ 4 | com.blossom.common.cache.redis.RedisProperties,\ 5 | com.blossom.common.cache.redis.RedisCacheConfig,\ 6 | com.blossom.common.cache.redis.RedisConfiguration,\ 7 | com.blossom.common.cache.redis.DynamicLogRepositoryRedis 8 | 9 | -------------------------------------------------------------------------------- /blossom-backend/common/common-db/src/main/java/com/blossom/common/db/DBProperties.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.db; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | /** 8 | * 数据库配置 9 | * 10 | * @author xzzz 11 | */ 12 | @Data 13 | @Configuration 14 | @ConfigurationProperties(prefix = "project.db") 15 | public class DBProperties { 16 | 17 | /** 18 | * 慢SQL指标, 单位毫秒 19 | */ 20 | private long slowInterval = 2000L; 21 | 22 | } 23 | -------------------------------------------------------------------------------- /blossom-backend/common/common-db/src/main/java/com/blossom/common/db/aspect/Pages.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.db.aspect; 2 | 3 | import java.lang.annotation.*; 4 | 5 | /** 6 | * 分页注解, 仅对被注解方法的第一条sql语句生效, 多条语句分页时需显示调用 7 | * 8 | * @author xzzz 9 | */ 10 | @Target(ElementType.METHOD) 11 | @Retention(RetentionPolicy.RUNTIME) 12 | @Documented 13 | public @interface Pages { 14 | 15 | } 16 | -------------------------------------------------------------------------------- /blossom-backend/common/common-db/src/main/java/com/blossom/common/db/pojo/PageReq.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.db.pojo; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.blossom.common.base.pojo.AbstractPOJO; 5 | import lombok.Data; 6 | import lombok.EqualsAndHashCode; 7 | 8 | /** 9 | * 分页参数 10 | * 11 | * @author xzzz 12 | */ 13 | @Data 14 | @EqualsAndHashCode(callSuper = true) 15 | public class PageReq extends AbstractPOJO { 16 | 17 | /** 18 | * [分页参数] 页码, 0与1都表示第一页, 超过最大页时只显示最后一页 19 | */ 20 | @TableField(exist = false) 21 | private int pageNum; 22 | /** 23 | * [分页参数] 每页结果数, 不传则为10, 最大为200, 超过200会自动替换为200 24 | */ 25 | @TableField(exist = false) 26 | private int pageSize; 27 | /** 28 | * [分页参数] 排序字段, 需将驼峰类型字段改为下换线分隔字段,如 [userId > user_id] 29 | */ 30 | @TableField(exist = false) 31 | private String sortField; 32 | /** 33 | * [分页参数] 排序方式 asc(升序) 或 desc(降序) 34 | */ 35 | @TableField(exist = false) 36 | private String order; 37 | } 38 | -------------------------------------------------------------------------------- /blossom-backend/common/common-db/src/main/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 2 | com.blossom.common.db.DBProperties,\ 3 | com.blossom.common.db.exception.ExceptionAdviceByDB,\ 4 | com.blossom.common.db.interceptor.SlowSQLInterceptor,\ 5 | com.blossom.common.db.aspect.PageAspect 6 | 7 | 8 | -------------------------------------------------------------------------------- /blossom-backend/common/common-iaas/src/main/java/com/blossom/common/iaas/IaasEnum.java: -------------------------------------------------------------------------------- 1 | package com.blossom.common.iaas; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | @SuppressWarnings("all") 7 | public enum IaasEnum { 8 | 9 | ALIBABA("alibaba"), 10 | HUAWEI("huawei"), 11 | TENCENT("tencent"), 12 | QINIU("qiniu"), 13 | BLOSSOM("blossom"); 14 | 15 | private String type; 16 | 17 | IaasEnum(String type) { 18 | this.type = type; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /blossom-backend/common/common-iaas/src/main/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 2 | com.blossom.common.iaas.IaasProperties,\ 3 | com.blossom.common.iaas.IaasConfiguration 4 | 5 | -------------------------------------------------------------------------------- /blossom-backend/common/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | com.blossom 7 | blossom-backend 8 | 1.16.0-SNAPSHOT 9 | 10 | 4.0.0 11 | pom 12 | 13 | common 14 | 公共模块 15 | 16 | 17 | common-base 18 | common-cache 19 | common-db 20 | common-iaas 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /blossom-backend/expand-sentinel/expand-sentinel-metric/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | com.blossom 7 | expand-sentinel 8 | 1.16.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | expand-sentinel-metric 13 | 14 | 15 | -------------------------------------------------------------------------------- /blossom-backend/expand-sentinel/expand-sentinel-metric/src/main/java/com/blossom/expand/sentinel/metric/config/SentinelMetricConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.blossom.expand.sentinel.metric.config; 2 | 3 | import com.blossom.expand.sentinel.metric.controller.SentinelMetricController; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | import javax.annotation.PostConstruct; 9 | 10 | /** 11 | * @author xzzz 12 | */ 13 | @Slf4j 14 | @Configuration 15 | public class SentinelMetricConfiguration { 16 | 17 | @Bean 18 | public SentinelMetricController sentinelMetricController() { 19 | return new SentinelMetricController(); 20 | } 21 | 22 | @PostConstruct 23 | public void init() { 24 | log.debug("[SENTINEL] 指标接口初始化完成"); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /blossom-backend/expand-sentinel/expand-sentinel-metric/src/main/java/com/blossom/expand/sentinel/metric/pojo/OneLineMetric.java: -------------------------------------------------------------------------------- 1 | package com.blossom.expand.sentinel.metric.pojo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * Sentinel 原生日志字段 7 | *

详细信息见: https://www.yuque.com/xiaozeizeizi/learning/vdxicg 8 | * 9 | * @author xzzz 10 | */ 11 | @Data 12 | public class OneLineMetric { 13 | private Long timestamp; 14 | private String datetime; 15 | private String resource; 16 | private Integer p; 17 | private Integer b; 18 | private Integer s; 19 | private Integer e; 20 | private Integer rt; 21 | private Integer o; 22 | private Integer c; 23 | private Integer cf; 24 | } 25 | -------------------------------------------------------------------------------- /blossom-backend/expand-sentinel/expand-sentinel-metric/src/main/java/com/blossom/expand/sentinel/metric/pojo/ResourcesRes.java: -------------------------------------------------------------------------------- 1 | package com.blossom.expand.sentinel.metric.pojo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 资源信息 7 | * 8 | * @author xzzz 9 | */ 10 | @Data 11 | public class ResourcesRes { 12 | /** 13 | * 资源名 14 | */ 15 | private String resource; 16 | /** 17 | * 统计该资源所用的文档数,相当于多少秒的指标信息 18 | */ 19 | private Long docCount; 20 | /** 21 | * 最小响应时间 毫秒 22 | */ 23 | private Integer minRt; 24 | /** 25 | * 最大响应时间 毫秒 26 | */ 27 | private Integer maxRt; 28 | /** 29 | * 平均响应时间 毫秒 30 | */ 31 | private Double avgRt; 32 | /** 33 | * 请求成功数 34 | */ 35 | private Integer success; 36 | } 37 | -------------------------------------------------------------------------------- /blossom-backend/expand-sentinel/expand-sentinel-metric/src/main/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 2 | com.blossom.expand.sentinel.metric.config.SentinelMetricConfiguration 3 | 4 | -------------------------------------------------------------------------------- /blossom-backend/expand-sentinel/expand-sentinel-springmvc/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | com.blossom 7 | expand-sentinel 8 | 1.16.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | expand-sentinel-springmvc 13 | 14 | 15 | -------------------------------------------------------------------------------- /blossom-backend/expand-sentinel/expand-sentinel-springmvc/src/main/java/com/blossom/expand/sentinel/mvc/SpringInterceptorUtil.java: -------------------------------------------------------------------------------- 1 | package com.blossom.expand.sentinel.mvc; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | 5 | public class SpringInterceptorUtil { 6 | 7 | private static final String REQUEST_ATTRIBUTE_SENTINEL_EXCEPTION = "request_attribute_sentinel_exception"; 8 | 9 | public static void fillException(HttpServletRequest request, Exception ex) { 10 | request.setAttribute(REQUEST_ATTRIBUTE_SENTINEL_EXCEPTION, ex); 11 | } 12 | 13 | public static Exception getException(HttpServletRequest request) { 14 | Object ex = request.getAttribute(REQUEST_ATTRIBUTE_SENTINEL_EXCEPTION); 15 | if (ex != null) { 16 | return (Exception) ex; 17 | } 18 | return null; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /blossom-backend/expand-sentinel/expand-sentinel-springmvc/src/main/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 2 | com.blossom.expand.sentinel.mvc.config.SentinelInterceptorConfig 3 | 4 | -------------------------------------------------------------------------------- /blossom-backend/expand-tracker/expand-tracker-core/src/main/java/com/blossom/expand/tracker/core/adapter/aspect/TrackerStart.java: -------------------------------------------------------------------------------- 1 | package com.blossom.expand.tracker.core.adapter.aspect; 2 | 3 | 4 | import com.blossom.expand.tracker.core.common.TrackerConstants; 5 | 6 | import java.lang.annotation.*; 7 | 8 | /** 9 | * 10 | * @author xzzz 11 | */ 12 | @Documented 13 | @Target(ElementType.METHOD) 14 | @Retention(RetentionPolicy.RUNTIME) 15 | public @interface TrackerStart { 16 | 17 | /** 18 | * 是否创建新的Trace 19 | * 20 | * false: 如果当前存在跟踪链路, 则以当前为准 21 | * true : 忽略当前已存在的路径, 会替换后续全部链路 22 | * 23 | * @return 默认false 24 | */ 25 | String spanName() default ""; 26 | 27 | String spanType() default TrackerConstants.SPAN_TYPE_ANNOTATION; 28 | 29 | } 30 | -------------------------------------------------------------------------------- /blossom-backend/expand-tracker/expand-tracker-core/src/main/java/com/blossom/expand/tracker/core/adapter/mysql/TrackerMysqlConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.blossom.expand.tracker.core.adapter.mysql; 2 | 3 | import org.apache.ibatis.session.SqlSession; 4 | import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | /** 9 | * 链路追踪 mysql 配置 10 | * 11 | * @author xzzz 12 | */ 13 | @Configuration 14 | @ConditionalOnClass(value = SqlSession.class) 15 | public class TrackerMysqlConfiguration { 16 | 17 | @Bean 18 | public TrackerMysqlInterceptor trackerMysqlInterceptor() { 19 | return new TrackerMysqlInterceptor(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /blossom-backend/expand-tracker/expand-tracker-core/src/main/java/com/blossom/expand/tracker/core/adapter/redis/TrackerRedisProperties.java: -------------------------------------------------------------------------------- 1 | package com.blossom.expand.tracker.core.adapter.redis; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | /** 8 | * Redis 链路追踪配置 9 | * 10 | * @author xzzz 11 | */ 12 | @Data 13 | @Configuration 14 | @ConfigurationProperties(prefix = "tracker.redis") 15 | public class TrackerRedisProperties { 16 | 17 | /** 18 | * 开启 redis 追踪 19 | */ 20 | private Boolean enabled = true; 21 | 22 | /** 23 | * redis 请求详情保存至 Tracker.Record 中 24 | */ 25 | private Boolean detailToRecord = false; 26 | } 27 | -------------------------------------------------------------------------------- /blossom-backend/expand-tracker/expand-tracker-core/src/main/java/com/blossom/expand/tracker/core/adapter/spring/TrackerSpringConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.blossom.expand.tracker.core.adapter.spring; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | /** 8 | * @author xzzz 9 | * @since 1.2.0 10 | */ 11 | @Slf4j 12 | @Configuration 13 | public class TrackerSpringConfiguration { 14 | 15 | @Bean 16 | public TrackerFilter trackerFilter() { 17 | return new TrackerFilter(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /blossom-backend/expand-tracker/expand-tracker-core/src/main/java/com/blossom/expand/tracker/core/collector/TrackerCollector.java: -------------------------------------------------------------------------------- 1 | package com.blossom.expand.tracker.core.collector; 2 | 3 | import com.blossom.expand.tracker.core.SpanNode; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * 追踪收集器 9 | * 10 | * @author xzzz 11 | */ 12 | public interface TrackerCollector { 13 | 14 | /** 15 | * 收集 span 信息 16 | * 17 | * @param spanNode span 信息 18 | */ 19 | void collect(SpanNode spanNode); 20 | 21 | /** 22 | * 获取 span 列表 23 | * 24 | * @return span 列表 25 | */ 26 | List get(); 27 | } 28 | -------------------------------------------------------------------------------- /blossom-backend/expand-tracker/expand-tracker-core/src/main/java/com/blossom/expand/tracker/core/id/TraceIdGenerator.java: -------------------------------------------------------------------------------- 1 | package com.blossom.expand.tracker.core.id; 2 | 3 | /** 4 | * ID生成接口 5 | * 6 | * @author xzzz 7 | * @since 1.2.0 8 | */ 9 | public interface TraceIdGenerator { 10 | 11 | 12 | /** 13 | * 生成 traceId 14 | * @return traceId 15 | */ 16 | String traceId(); 17 | 18 | 19 | /** 20 | * 生成 spanId 21 | * @return spanId 22 | */ 23 | String spanId(); 24 | 25 | } 26 | -------------------------------------------------------------------------------- /blossom-backend/expand-tracker/expand-tracker-core/src/main/java/com/blossom/expand/tracker/core/id/TraceIdGeneratorUUID.java: -------------------------------------------------------------------------------- 1 | package com.blossom.expand.tracker.core.id; 2 | 3 | 4 | import cn.hutool.core.lang.UUID; 5 | 6 | /** 7 | * trace 生成类 8 | * 9 | * @author xzzz 10 | * @since 1.2.0 11 | */ 12 | public class TraceIdGeneratorUUID implements TraceIdGenerator { 13 | 14 | /** 15 | * 生成 traceId 16 | * @return traceId 17 | */ 18 | @Override 19 | public String traceId () { 20 | return generator(); 21 | } 22 | 23 | /** 24 | * 生成 spanId 25 | * @return spanId 26 | */ 27 | @Override 28 | public String spanId () { 29 | return generator(); 30 | } 31 | 32 | /** 33 | * 生成ID 34 | * @return ID 35 | */ 36 | private String generator() { 37 | return UUID.fastUUID().toString(true).toUpperCase(); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /blossom-backend/expand-tracker/expand-tracker-core/src/main/java/com/blossom/expand/tracker/core/id/TraceIdGeneratorUtil.java: -------------------------------------------------------------------------------- 1 | package com.blossom.expand.tracker.core.id; 2 | 3 | /** 4 | * 追踪ID生成 5 | * 6 | * @author xzzz 7 | */ 8 | public class TraceIdGeneratorUtil { 9 | /** 10 | * TraceGenerator traceId 生成器 11 | */ 12 | private static final TraceIdGenerator traceGenerator = new TraceIdGeneratorUUID(); 13 | 14 | public static String traceId() { 15 | return traceGenerator.traceId(); 16 | } 17 | 18 | public static String spanId() { 19 | return traceGenerator.spanId(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /blossom-backend/expand-tracker/expand-tracker-core/src/main/java/com/blossom/expand/tracker/core/repository/TrackerRepository.java: -------------------------------------------------------------------------------- 1 | package com.blossom.expand.tracker.core.repository; 2 | 3 | import com.blossom.expand.tracker.core.SpanNode; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * tracker span 信息持久化接口 9 | *

tracker 客户端和服务端的实现不同 10 | *

客户端的实现目前有

11 | *
    12 | *
  1. disk: 保存在本地日志中 13 | *
14 | * 15 | *

服务端接收到应用自身,或其他应用的 span 信息,通过如下方式保存

16 | * 本项目是 xz.irda.tracker 框架的简单版本, 不提供服务方 17 | * 18 | * @author xzzz 19 | */ 20 | public interface TrackerRepository { 21 | 22 | /** 23 | * 保存 span 集合, 24 | * 25 | * @param spanNodes span 集合 26 | * @return true: 保存成功; false:保存失败 27 | */ 28 | boolean save(List spanNodes); 29 | 30 | /** 31 | * span 信息到期 32 | * 33 | * @return 删除的条数 34 | */ 35 | default long expire() { 36 | return 0; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /blossom-backend/expand-tracker/expand-tracker-core/src/main/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 2 | com.blossom.expand.tracker.core.TrackerProperties,\ 3 | com.blossom.expand.tracker.core.TrackerConfiguration,\ 4 | com.blossom.expand.tracker.core.adapter.spring.TrackerSpringConfiguration,\ 5 | com.blossom.expand.tracker.core.adapter.redis.TrackerRedisConfiguration,\ 6 | com.blossom.expand.tracker.core.adapter.mysql.TrackerMysqlConfiguration 7 | 8 | -------------------------------------------------------------------------------- /blossom-backend/expand-tracker/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | blossom-backend 7 | com.blossom 8 | 1.16.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | expand-tracker 13 | pom 14 | 15 | 16 | expand-tracker-core 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /blossom-backend/script/restart-springboot.sh: -------------------------------------------------------------------------------- 1 | #!/dash 2 | # 重启 blossom 3 | pid=`ps aux | grep backend-blossom.jar | grep -v grep | awk '{print $2}'` 4 | echo "进程ID : " $pid 5 | kill -9 $pid 6 | echo "进程" $pid "已被杀死" 7 | echo "开始重启 backend-blossom 服务器" 8 | nohup java -Xms1024m -Xmx1024m -jar /usr/local/jasmine/blossom/backend/backend-blossom.jar --spring.profiles.active=prod & 9 | echo "backend-blossom 正在启动,请查看日志 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓" 10 | -------------------------------------------------------------------------------- /blossom-editor/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true -------------------------------------------------------------------------------- /blossom-editor/.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | out 4 | .gitignore 5 | -------------------------------------------------------------------------------- /blossom-editor/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | out 4 | *.log* 5 | stats.html 6 | auto-imports.d.ts 7 | components.d.ts -------------------------------------------------------------------------------- /blossom-editor/.npmrc: -------------------------------------------------------------------------------- 1 | ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ 2 | -------------------------------------------------------------------------------- /blossom-editor/.prettierignore: -------------------------------------------------------------------------------- 1 | out 2 | dist 3 | pnpm-lock.yaml 4 | LICENSE.md 5 | tsconfig.json 6 | tsconfig.*.json 7 | -------------------------------------------------------------------------------- /blossom-editor/.prettierrc.yaml: -------------------------------------------------------------------------------- 1 | singleQuote: true 2 | semi: false 3 | printWidth: 150 4 | trailingComma: none 5 | bracketSameLine: true -------------------------------------------------------------------------------- /blossom-editor/build/entitlements.mac.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.allow-jit 6 | 7 | com.apple.security.cs.allow-unsigned-executable-memory 8 | 9 | com.apple.security.cs.allow-dyld-environment-variables 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /blossom-editor/build/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/build/icon.icns -------------------------------------------------------------------------------- /blossom-editor/build/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/build/icon.ico -------------------------------------------------------------------------------- /blossom-editor/build/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/build/icon.png -------------------------------------------------------------------------------- /blossom-editor/dev-app-update.yml: -------------------------------------------------------------------------------- 1 | provider: generic 2 | url: https://example.com/auto-updates 3 | updaterCacheDirName: blossom-updater 4 | -------------------------------------------------------------------------------- /blossom-editor/resources/imgs/guardcat_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/resources/imgs/guardcat_logo.jpg -------------------------------------------------------------------------------- /blossom-editor/resources/imgs/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/resources/imgs/icon.ico -------------------------------------------------------------------------------- /blossom-editor/resources/imgs/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/resources/imgs/icon.png -------------------------------------------------------------------------------- /blossom-editor/resources/imgs/iconBigSur.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/resources/imgs/iconBigSur.png -------------------------------------------------------------------------------- /blossom-editor/resources/screenshot/PrScrn.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/resources/screenshot/PrScrn.dll -------------------------------------------------------------------------------- /blossom-editor/resources/screenshot/PrintScr.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/resources/screenshot/PrintScr.exe -------------------------------------------------------------------------------- /blossom-editor/resources/screenshot/README.md: -------------------------------------------------------------------------------- 1 | ## 前言 2 | 聊天软件需要截图功能。我们找到了一个方法,QQ dll,包装一下生成 exe 文件,我用 Node.js 去调用完成截图。 3 | 4 | 1. 第一步先用 Node 执行微信封装的 exe,然后会把截图复制到剪切板 5 | 2. 然后调用浏览把剪切板的内容复制出来 6 | ``` 7 | var screen_window = execFile(__dirname + '/screen/PrintScr.exe') 8 | screen_window.on('exit', function (code) { 9 | // 执行成功返回 1,返回 0 没有截图 10 | if (code) mainWindow.webContents.paste() 11 | }) 12 | ``` 13 | -------------------------------------------------------------------------------- /blossom-editor/src/env/.env: -------------------------------------------------------------------------------- 1 | RENDERER_VITE_MODE=ALL -------------------------------------------------------------------------------- /blossom-editor/src/env/.env.tryuse: -------------------------------------------------------------------------------- 1 | # 试用环境 2 | RENDERER_VITE_MODE=tryuse -------------------------------------------------------------------------------- /blossom-editor/src/main/printScreen.ts: -------------------------------------------------------------------------------- 1 | import { BrowserWindow, Notification } from 'electron' 2 | import { platform } from '@electron-toolkit/utils' 3 | import cp from "child_process" 4 | import { join } from 'path' 5 | 6 | /** 7 | * 截图功能 8 | * @param win 窗口 9 | * @returns 10 | */ 11 | export const printScreen = (win: BrowserWindow) => { 12 | // 非 window 平台不支持截图 13 | if (!platform.isWindows) { 14 | if (Notification.isSupported()) { 15 | new Notification({ 16 | title: '抱歉, 当前平台暂不支持截图功能' 17 | }).show() 18 | } 19 | return 20 | } 21 | let filePath = join(__dirname, '../../resources/screenshot/PrintScr.exe') 22 | // 截屏时将页面隐藏 23 | win.hide() 24 | const screen_window = cp.execFile(filePath) 25 | let psCode = 0 26 | screen_window.on('exit', (code) => { 27 | // 截图结果: 1:截图成功; 0:没有截图; 28 | if (code) { 29 | psCode = code 30 | win.webContents.send('printScreenAfter', psCode) 31 | } 32 | win.show() 33 | win.moveTop() 34 | }) 35 | } 36 | 37 | export default printScreen -------------------------------------------------------------------------------- /blossom-editor/src/main/shortcut.ts: -------------------------------------------------------------------------------- 1 | import { globalShortcut, BrowserWindow } from 'electron' 2 | import { printScreen } from './printScreen' 3 | import { platform } from '@electron-toolkit/utils' 4 | 5 | /** 6 | * 全局快捷键注册器 7 | */ 8 | class ShortcutRegistrant { 9 | win: BrowserWindow 10 | 11 | constructor(win: BrowserWindow) { 12 | console.log('5. 注册快捷键') 13 | this.win = win 14 | } 15 | 16 | /** 17 | * 注册截屏快捷键, 目前只有 windows 支持截图 18 | * CommandOrControl+Alt+Q 19 | * @returns 20 | */ 21 | printScreen(): ShortcutRegistrant { 22 | if (!platform.isWindows) { 23 | return this 24 | } 25 | console.log(' 5.1 注册全局截图快捷键 [CommandOrControl+Alt+Q]') 26 | globalShortcut.register('CommandOrControl+Alt+Q', () => { 27 | console.log('调用快捷键', 'CommandOrControl+Alt+Q') 28 | printScreen(this.win) 29 | }) 30 | return this 31 | } 32 | } 33 | 34 | export default ShortcutRegistrant 35 | -------------------------------------------------------------------------------- /blossom-editor/src/preload/index.d.ts: -------------------------------------------------------------------------------- 1 | import { ElectronAPI } from '@electron-toolkit/preload' 2 | 3 | declare global { 4 | interface Window { 5 | electron: ElectronAPI 6 | electronAPI: ElectronAPI, 7 | api: {} 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/public/favicon.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/App.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 15 | 16 | 26 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/api/note.ts: -------------------------------------------------------------------------------- 1 | import { defaultRequest as rq } from "./request"; 2 | import type { R } from "./request"; 3 | 4 | export const noteAllApi = (params?: object): Promise> => { 5 | return rq.get>("/note/list", { params }); 6 | } 7 | 8 | export const noteAddApi = (data?: object): Promise> => { 9 | return rq.post>("/note/add", data); 10 | } 11 | 12 | export const noteUpdApi = (data?: object): Promise> => { 13 | return rq.post>('/note/upd', data) 14 | } 15 | 16 | export const noteDelApi = (data?: object): Promise> => { 17 | return rq.post>("/note/del", data); 18 | } 19 | 20 | export const noteTopApi = (data?: object): Promise> => { 21 | return rq.post>("/note/top", data); 22 | } -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/api/plan.ts: -------------------------------------------------------------------------------- 1 | import { defaultRequest as rq } from './request' 2 | import type { R } from './request' 3 | 4 | export const planListDayApi = (params?: object): Promise> => { 5 | return rq.get>('/plan/list/day', { params }) 6 | } 7 | 8 | export const planListDailyApi = (params?: object): Promise> => { 9 | return rq.get>('/plan/list/daily', { params }) 10 | } 11 | 12 | export const planAddDailyApi = (data?: object): Promise> => { 13 | return rq.post>('/plan/add/daily', data) 14 | } 15 | 16 | export const planAddDayApi = (data?: object): Promise> => { 17 | return rq.post>('/plan/add/day', data) 18 | } 19 | 20 | export const planDelApi = (data?: object): Promise> => { 21 | return rq.post>('/plan/del', data) 22 | } 23 | 24 | export const planUpdDayApi = (data?: object): Promise> => { 25 | return rq.post>('/plan/upd/day', data) 26 | } 27 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/api/sentinel.ts: -------------------------------------------------------------------------------- 1 | import { defaultRequest as rq } from "./request"; 2 | import type { R } from "./request"; 3 | 4 | /** 5 | * 流量直方图 6 | */ 7 | export const metricLineApi = (params?: object): Promise> => { 8 | return rq.get>("/sentinel/metric/line", { params }); 9 | }; 10 | 11 | /** 12 | * 资源列表 13 | */ 14 | export const resourcesApi = (params?: object): Promise> => { 15 | return rq.get>("/sentinel/resources", { params }); 16 | }; -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/api/weather.ts: -------------------------------------------------------------------------------- 1 | import { defaultRequest as rq } from './request' 2 | import type { R } from './request' 3 | 4 | export const getAll = (params?: object): Promise> => { 5 | return rq.get>('/weather', { params }) 6 | } 7 | 8 | /** 9 | * 刷新天气缓存, 重新获取最新信息, 注意不要频繁调用该接口 10 | * @param params 11 | * @returns 12 | */ 13 | export const refreshApi = (): Promise> => { 14 | return rq.post>('/thirdparty/scheduled/weather') 15 | } 16 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/api/web.ts: -------------------------------------------------------------------------------- 1 | import { defaultRequest as rq } from "./request"; 2 | import type { R } from "./request"; 3 | 4 | export const webAllApi = (params?: object): Promise> => { 5 | return rq.get>("/web/list", { params }); 6 | } 7 | 8 | export const webSaveApi = (data?: object): Promise> => { 9 | return rq.post>("/web/save", data); 10 | } 11 | 12 | export const webDelApi = (data?: object): Promise> => { 13 | return rq.post>("/web/del", data); 14 | } -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/constants/keymaps.ts: -------------------------------------------------------------------------------- 1 | export const BlKeymaps = { 2 | 3 | } -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/constants/system.ts: -------------------------------------------------------------------------------- 1 | const blossom = { 2 | /** 3 | * 基础配置 4 | */ 5 | SYS: { 6 | NAME: 'Blossom', 7 | FULL_NAME: 'BLOSSOM-EDITOR', 8 | VERSION: 'v1.16.0', 9 | 10 | // 11 | DOC: 'https://www.wangyunf.com/blossom-doc/index', 12 | CONTACT: 'https://www.wangyunf.com/blossom-doc/guide/about/contact.html', 13 | SPONSOR: 'https://www.wangyunf.com/blossom-doc/guide/about/sponsor.html', 14 | GITHUB_REPO: 'https://github.com/blossom-editor/blossom', 15 | GITHUB_RELEASE: 'https://github.com/blossom-editor/blossom/releases', 16 | GITEE_REPO: 'https://gitee.com/blossom-editor/blossom' 17 | }, 18 | 19 | // 试用地址和账号 20 | TRY_USE: { 21 | serverUrl: 'https://www.wangyunf.com/bl', 22 | username: 'blos', 23 | password: 'blos' 24 | } 25 | } 26 | 27 | export default blossom 28 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/fonts/JetBrainsMono-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/fonts/JetBrainsMono-Bold.woff2 -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/fonts/JetBrainsMono-ExtraLight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/fonts/JetBrainsMono-ExtraLight.woff2 -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/fonts/JetBrainsMono-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/fonts/JetBrainsMono-Light.woff2 -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/fonts/JetBrainsMono-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/fonts/JetBrainsMono-Medium.woff2 -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/fonts/JetBrainsMono-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/fonts/JetBrainsMono-Regular.woff2 -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/fonts/JetBrainsMono-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/fonts/JetBrainsMono-SemiBold.woff2 -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/fonts/JetBrainsMono-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/fonts/JetBrainsMono-Thin.woff2 -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.ttf -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.woff -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.woff2 -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/iconfont/weather/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/iconfont/weather/iconfont.ttf -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/iconfont/weather/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/iconfont/weather/iconfont.woff -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/iconfont/weather/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/iconfont/weather/iconfont.woff2 -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/iconfont/weblogo/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/iconfont/weblogo/iconfont.ttf -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/iconfont/weblogo/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/iconfont/weblogo/iconfont.woff -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/iconfont/weblogo/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/iconfont/weblogo/iconfont.woff2 -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/blossom_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/blossom_logo.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/blossom_logo_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/blossom_logo_dark.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/default_user_avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/default_user_avatar.jpg -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/docs/tryuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/docs/tryuse.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/img_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/img_error.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/note/cd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/note/cd.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/note/dustbin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/note/dustbin.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/note/note.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/note/note.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/note/pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/note/pin.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/note/plane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/note/plane.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/pe/headset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/pe/headset.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/pe/phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/pe/phone.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/pe/sound.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/pe/sound.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/pe/watch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/pe/watch.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/plan/base-awesome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/plan/base-awesome.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/plan/base-celebrate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/plan/base-celebrate.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/plan/base-cool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/plan/base-cool.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/plan/base-learning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/plan/base-learning.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/plan/beer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/plan/beer.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/plan/cat-kiss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/plan/cat-kiss.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/plan/cat-nice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/plan/cat-nice.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/plan/cat-smile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/plan/cat-smile.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/plan/cat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/plan/cat.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/plan/coffee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/plan/coffee.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/plan/juice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/plan/juice.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/plant/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/plant/02.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/plant/08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/plant/08.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/plant/cactus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/plant/cactus.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/transparent.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/weather/feng-s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/weather/feng-s.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/weather/feng.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/weather/feng.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/weather/qing-moon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/weather/qing-moon.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/weather/qing-s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/weather/qing-s.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/weather/qing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/weather/qing.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/weather/wu-s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/weather/wu-s.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/weather/wu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/weather/wu.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/weather/xue-s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/weather/xue-s.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/weather/xue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/weather/xue.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/weather/yin-s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/weather/yin-s.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/weather/yin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/weather/yin.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/weather/yu-s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/weather/yu-s.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/weather/yu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/weather/yu.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/weather/zhongyu-s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/weather/zhongyu-s.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/imgs/weather/zhongyu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-editor/src/renderer/src/assets/imgs/weather/zhongyu.png -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/styles/bl-checkbox.scss: -------------------------------------------------------------------------------- 1 | .el-checkbox { 2 | 3 | .el-checkbox__input { 4 | .el-checkbox__inner { 5 | transition: none; 6 | 7 | &::after { 8 | transition: none; 9 | } 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/styles/bl-dropdown.scss: -------------------------------------------------------------------------------- 1 | .el-dropdown { 2 | .el-tooltip__trigger { 3 | &:focus-visible { 4 | outline: none; 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/styles/bl-image.scss: -------------------------------------------------------------------------------- 1 | .el-image { 2 | .el-image__inner { 3 | pointer-events: all; 4 | } 5 | } -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/styles/bl-loading-spinner.scss: -------------------------------------------------------------------------------- 1 | .bl-loading-spinner { 2 | @include flex(column, flex-end); 3 | height: 100px; 4 | top: calc(50% - 50px); 5 | 6 | &::before { 7 | // background-image: url('@renderer/assets/imgs/blossom_logo_grey.png'); 8 | background-position: center; 9 | background-repeat: no-repeat; 10 | background-size: 50px 50px; 11 | height: 100%; 12 | width: 100%; 13 | content: ''; 14 | position: absolute; 15 | top: 0; 16 | left: 0; 17 | filter: blur(5px); 18 | } 19 | 20 | .circular { 21 | display: none; 22 | } 23 | 24 | .el-loading-text { 25 | @include font(15px, 300); 26 | } 27 | } -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/styles/bl-message.scss: -------------------------------------------------------------------------------- 1 | .el-message { 2 | @include themeShadow(3px 3px 10px 1px rgb(191, 191, 191), 3px 3px 10px 1px #000); 3 | @include themeColor(#a4a8b0, #64666b); 4 | padding: 10px 10px !important; 5 | border: 3px; 6 | } 7 | 8 | .el-message--success { 9 | @include themeBg(#f7f7f7, #1e1e1e); 10 | --el-message-bg-color: var(--bl-html-color) !important; 11 | border: 0 !important; 12 | // border: 1px solid rgb(51, 217, 0) !important; 13 | } 14 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/styles/bl-notification.scss: -------------------------------------------------------------------------------- 1 | .el-notification { 2 | word-wrap: break-word; 3 | word-break: break-all; 4 | border: 2px solid var(--el-color-primary-light-5) !important; 5 | } -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/styles/bl-resize-divider.scss: -------------------------------------------------------------------------------- 1 | .resize-divider-vertical { 2 | width: 1px; 3 | height: 100%; 4 | background-color: var(--el-border-color); 5 | position: relative; 6 | z-index: 1001; 7 | cursor: ew-resize; 8 | 9 | &::before { 10 | content: ''; 11 | width: 3px; 12 | height: 100%; 13 | background-color: transparent; 14 | display: block; 15 | transition: 0.3s; 16 | position: absolute; 17 | left: -1px; 18 | z-index: 1002; 19 | cursor: ew-resize; 20 | } 21 | 22 | &:hover { 23 | &::before { 24 | background-color: var(--el-color-primary); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/styles/bl-tree.scss: -------------------------------------------------------------------------------- 1 | .el-tree { 2 | .el-tree-node { 3 | .el-tree-node__content { 4 | height: 20px; 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/styles/config.scss: -------------------------------------------------------------------------------- 1 | @import './utils.scss'; -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/styles/index.scss: -------------------------------------------------------------------------------- 1 | @import '../fonts/config.scss'; 2 | 3 | @import './bl-common.scss'; 4 | 5 | // bl 样式 6 | @import './bl-checkbox.scss'; 7 | @import './bl-dialog.scss'; 8 | @import './bl-dropdown.scss'; 9 | @import './bl-image.scss'; 10 | @import './bl-message.scss'; 11 | @import './bl-notification.scss'; 12 | @import './bl-popper.scss'; 13 | @import './bl-tip.scss'; 14 | @import './bl-tree.scss'; 15 | @import '../../views/doc/doc-tree-right-menu.scss'; -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/assets/utils/test.ts: -------------------------------------------------------------------------------- 1 | export const uuid = (): string => { 2 | return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { 3 | var r = (Math.random() * 16) | 0, 4 | v = c == 'x' ? r : (r & 0x3) | 0x8 5 | return v.toString(16) 6 | }) 7 | } 8 | 9 | console.log(uuid()) 10 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/components/BLCol.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 39 | 45 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/components/BLRow.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 37 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/components/DateLine.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 25 | 26 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/components/Template.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/components/Versions.vue: -------------------------------------------------------------------------------- 1 | 9 | 17 | 18 | 27 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/declaration.d.ts: -------------------------------------------------------------------------------- 1 | // 正常工作。 2 | export {} 3 | 4 | declare module '@renderer/assets/iconfont/iconfont.js' 5 | declare module 'highlight.js' 6 | declare module 'katex' 7 | 8 | declare module 'vue' { 9 | interface ComponentCustomProperties { 10 | $t: (key: string) => string 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | interface ImportMetaEnv { 4 | /** 5 | * 基础URL 6 | */ 7 | readonly VITE_BLOSSOM_BASE_URI: string 8 | } 9 | 10 | interface ImportMeta { 11 | readonly env: ImportMetaEnv 12 | } 13 | 14 | declare module '*.vue' { 15 | import type { DefineComponent } from 'vue' 16 | // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types 17 | const component: DefineComponent<{}, {}, any> 18 | 19 | export default component 20 | } 21 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/i18n/en.ts: -------------------------------------------------------------------------------- 1 | import type { Temp } from './types' 2 | 3 | export const en: Temp = { 4 | editor: { 5 | treeDoc: { 6 | loading: 'loading....' 7 | } 8 | }, 9 | picture: { 10 | treeDoc: { 11 | loading: '' 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/i18n/plugin.ts: -------------------------------------------------------------------------------- 1 | import { App } from 'vue' 2 | import { useI18n } from './useI18n' 3 | 4 | const i18n = useI18n() 5 | 6 | export default { 7 | install: (app: App) => { 8 | app.config.globalProperties.$t = (key: string) => { 9 | return i18n.getValue(key) 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/i18n/types.ts: -------------------------------------------------------------------------------- 1 | const template = { 2 | editor: { 3 | treeDoc: { 4 | loading: '' 5 | } 6 | }, 7 | picture: { 8 | treeDoc: { 9 | loading: '' 10 | } 11 | } 12 | } 13 | export type Temp = typeof template 14 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/i18n/useI18n.ts: -------------------------------------------------------------------------------- 1 | import { ref } from 'vue' 2 | import { zhCn } from './zh-cn' 3 | import { en } from './en' 4 | import { Temp } from './types' 5 | 6 | const locale = ref('zhCn') 7 | 8 | export const useI18n = () => { 9 | const getValue = (key: string): string => { 10 | let k: any = key.split('.').reduce((o, i) => { 11 | if (o) { 12 | return o[i] 13 | } 14 | }, getLocale()) 15 | return k as string 16 | } 17 | const getLocale = (): Temp => { 18 | let l = locale.value 19 | if (l === 'zh-cn') { 20 | return zhCn 21 | } 22 | if (l === 'en') { 23 | return en 24 | } 25 | return zhCn 26 | } 27 | 28 | return { 29 | locale, 30 | getValue, 31 | getLocale 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/i18n/zh-cn.ts: -------------------------------------------------------------------------------- 1 | import type { Temp } from './types' 2 | 3 | export const zhCn: Temp = { 4 | editor: { 5 | treeDoc: { 6 | loading: '加载中' 7 | } 8 | }, 9 | picture: { 10 | treeDoc: { 11 | loading: '' 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/router/index.ts: -------------------------------------------------------------------------------- 1 | import { createRouter, createWebHashHistory } from 'vue-router' 2 | 3 | const router = createRouter({ 4 | history: createWebHashHistory(import.meta.env.BASE_URL), 5 | routes: [] 6 | }) 7 | 8 | export const toRoute = (path: string) => { 9 | router.push(path) 10 | } 11 | 12 | export const toLogin = () => { 13 | router.push('/settingIndex') 14 | } 15 | 16 | /** 17 | * 前往设置页面, 指定激活的 tab 18 | * @param tabName 19 | */ 20 | export const toSetting = (tabName: 'setting' | 'about') => { 21 | router.push('/settingIndex?activeTab=' + tabName) 22 | } 23 | 24 | export default router 25 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/scripts/env.ts: -------------------------------------------------------------------------------- 1 | const tryuse = import.meta.env.MODE === 'tryuse' 2 | 3 | /** 4 | * 是否试用 5 | * @returns 6 | */ 7 | export const isTryuse = () => { 8 | return tryuse 9 | } 10 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/scripts/lifecycle.ts: -------------------------------------------------------------------------------- 1 | import { onActivated, onMounted } from 'vue' 2 | 3 | /** 4 | * 初始化时生命周期封装, 主要控制 mounted 和 activated 只执行一次 5 | * @param mounted 6 | * @param activated 7 | */ 8 | export const useLifecycle = (mounted: Function, activated: Function) => { 9 | let isMounted = false 10 | 11 | onMounted(() => { 12 | if (!isMounted) { 13 | mounted() 14 | } 15 | }) 16 | 17 | onActivated(() => { 18 | if (isMounted) { 19 | activated() 20 | } 21 | isMounted = true 22 | }) 23 | } 24 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/stores/server.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | import { Local } from '@renderer/assets/utils/storage' 3 | import SYSTEM from '@renderer/assets/constants/system' 4 | 5 | const isDemo = import.meta.env.MODE === 'tryuse' 6 | 7 | export const storeKey = 'serverUrl' 8 | export const usernameKey = 'username' 9 | 10 | const initServerUrl = (): string => { 11 | const defaultUrl = isDemo ? SYSTEM.TRY_USE.serverUrl : '' 12 | Local.set(storeKey, defaultUrl) 13 | return defaultUrl 14 | } 15 | 16 | export const useServerStore = defineStore('serverStore', { 17 | state: () => ({ 18 | serverUrl: (Local.get(storeKey) as string) || initServerUrl(), 19 | serverUsername: Local.get(usernameKey) || '' 20 | }), 21 | actions: { 22 | async setServerUrl(url: string) { 23 | this.serverUrl = url 24 | Local.set(storeKey, url) 25 | }, 26 | setServerUsername(username: string) { 27 | this.serverUsername = username 28 | Local.set(usernameKey, username) 29 | } 30 | } 31 | }) 32 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/stores/store-config.ts: -------------------------------------------------------------------------------- 1 | import { createPinia } from 'pinia' 2 | const pinia = createPinia() 3 | export default pinia -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/stores/theme.ts: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | 3 | export const useThemeStore = defineStore('themeStore', { 4 | state: () => ({ 5 | isShow: false 6 | }), 7 | actions: { 8 | show() { 9 | this.isShow = true 10 | }, 11 | close() { 12 | this.isShow = false 13 | } 14 | } 15 | }) 16 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/views/article/styles/article-backtop.scss: -------------------------------------------------------------------------------- 1 | .el-backtop { 2 | @include box(37px, 37px); 3 | box-shadow: none; 4 | background-color: transparent; 5 | } 6 | 7 | .backtop { 8 | @include box(100%, 100%); 9 | @include themeShadow(0 0 3px 1px #0000001e, 0 0 3px 1px #000000); 10 | color: var(--bl-text-color-light); 11 | background-color: var(--bl-html-color); 12 | text-align: center; 13 | line-height: 38px; 14 | border-radius: 8px; 15 | font-size: 20px; 16 | transition: color 0.2s; 17 | 18 | &:hover { 19 | color: var(--el-color-primary); 20 | } 21 | } 22 | 23 | .backbottom { 24 | @extend .backtop; 25 | } 26 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/views/picture/PictureTreeWorkbench.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 9 | 10 | 13 | -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/views/plan/PlanColor.scss: -------------------------------------------------------------------------------- 1 | .gray { 2 | background-color: #858585; 3 | } 4 | 5 | .gray.hl { 6 | background-color: #646464; 7 | } 8 | 9 | .red { 10 | background-color: #fb0036; 11 | } 12 | 13 | .red.hl { 14 | background-color: #c9002c; 15 | } 16 | 17 | .yellow { 18 | background-color: #d8a600; 19 | } 20 | 21 | .yellow.hl { 22 | background-color: #ffc400; 23 | } 24 | 25 | .blue { 26 | background-color: #00a3cb; 27 | } 28 | 29 | .blue.hl { 30 | background-color: #00657e; 31 | } 32 | 33 | .green { 34 | background-color: #339a00; 35 | } 36 | 37 | .green.hl { 38 | background-color: #2d8700; 39 | } 40 | 41 | .purple { 42 | background-color: #ad8cf2; 43 | } 44 | 45 | .purple.hl { 46 | background-color: #9665ff; 47 | } -------------------------------------------------------------------------------- /blossom-editor/src/renderer/src/views/tool/IndexTool.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /blossom-editor/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [{ "path": "./tsconfig.node.json" }, { "path": "./tsconfig.web.json" }] 4 | } 5 | -------------------------------------------------------------------------------- /blossom-editor/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@electron-toolkit/tsconfig/tsconfig.node.json", 3 | "include": ["electron.vite.config.*", "src/main/*", "src/preload/*"], 4 | "compilerOptions": { 5 | "composite": true, 6 | "types": ["electron-vite/node"] 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /blossom-editor/tsconfig.web.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@electron-toolkit/tsconfig/tsconfig.web.json", 3 | "include": [ 4 | "src/renderer/src/declaration.d.ts", 5 | "src/renderer/src/env.d.ts", 6 | "src/renderer/src/**/*", 7 | "src/renderer/src/**/*.vue", 8 | "src/renderer/src/**/*.d.ts", 9 | "src/renderer/src/assets/iconfont/**/*.json", 10 | "src/preload/*.d.ts", 11 | "src/main/*.d.ts", 12 | ], 13 | "compilerOptions": { 14 | "composite": true, 15 | "baseUrl": ".", 16 | "paths": { 17 | "@renderer/*": [ 18 | "src/renderer/src/*" 19 | ] 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /blossom-web/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | stats.html 10 | 11 | node_modules 12 | target 13 | .DS_Store 14 | dist 15 | dist-ssr 16 | coverage 17 | *.local 18 | 19 | /cypress/videos/ 20 | /cypress/screenshots/ 21 | auto-imports.d.ts 22 | components.d.ts 23 | 24 | # Editor directories and files 25 | .vscode/* 26 | !.vscode/extensions.json 27 | .idea 28 | *.suo 29 | *.ntvs* 30 | *.njsproj 31 | *.sln 32 | *.sw? 33 | -------------------------------------------------------------------------------- /blossom-web/.prettierrc.yaml: -------------------------------------------------------------------------------- 1 | singleQuote: true 2 | semi: false 3 | printWidth: 150 4 | trailingComma: none 5 | bracketSameLine: true -------------------------------------------------------------------------------- /blossom-web/README.md: -------------------------------------------------------------------------------- 1 | # Blossom-doc 2 | 3 | Blossom 笔记软件的博客工程 4 | 5 | [博客页面的使用文档](https://www.wangyunf.com/blossom-doc/guide/deploy/blog.html) 6 | 7 | ![](./doc/imgs/blog_home_pc.jpg "Blossom 首页") 8 | 9 |

10 | 11 | 12 |

13 |

博客移动端

14 | 15 | 16 | ``` 17 | # 下载依赖 18 | npm install 19 | 20 | # 构建 21 | npm run build 22 | ``` -------------------------------------------------------------------------------- /blossom-web/declaration.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'element-plus/dist/locale/zh-cn.mjs' 2 | -------------------------------------------------------------------------------- /blossom-web/doc/imgs/blog_home.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-web/doc/imgs/blog_home.jpg -------------------------------------------------------------------------------- /blossom-web/env/.env.spring: -------------------------------------------------------------------------------- 1 | VITE_BL_API_BASE_URI=../ -------------------------------------------------------------------------------- /blossom-web/env/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | interface ImportMetaEnv { 4 | /** 5 | * API 的基础 URL 6 | */ 7 | readonly VITE_BL_API_BASE_URI: string 8 | } 9 | 10 | interface ImportMeta { 11 | readonly env: ImportMetaEnv 12 | } 13 | 14 | declare module '*.vue' { 15 | import type { DefineComponent } from 'vue' 16 | // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types 17 | const component: DefineComponent<{}, {}, any> 18 | 19 | export default component 20 | } -------------------------------------------------------------------------------- /blossom-web/global.d.ts: -------------------------------------------------------------------------------- 1 | export {} 2 | 3 | declare global { 4 | interface Window { 5 | blconfig: { 6 | SYS: { 7 | NAME: string 8 | LOGO: string 9 | GONG_WANG_AN_BEI: string 10 | ICP_BEI_AN_HAO: string 11 | EMAIL: string 12 | } 13 | THEME: { 14 | LOGO_STYLE: { 15 | 'border-radius': string 16 | } 17 | SUBJECT_TITLE: string 18 | } 19 | DOMAIN: { 20 | PRD: string 21 | USER_ID: string 22 | } 23 | LINKS: [ 24 | { 25 | NAME: string 26 | URL: string 27 | LOGO: string 28 | } 29 | ] 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /blossom-web/public/blog-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-web/public/blog-logo.png -------------------------------------------------------------------------------- /blossom-web/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-web/public/favicon.png -------------------------------------------------------------------------------- /blossom-web/src/api/auth.ts: -------------------------------------------------------------------------------- 1 | import { defaultRequest as rq } from './request' 2 | import type { R } from './request' 3 | 4 | /** 5 | * 登录 6 | * @param params 7 | * @returns 8 | */ 9 | export const loginApi = (data?: object): Promise> => { 10 | return rq.post>('/login', data) 11 | } 12 | 13 | export const logoutApi = (): Promise> => { 14 | return rq.post>('/logout') 15 | } 16 | 17 | export const checkApi = (): Promise> => { 18 | return rq.get>('/check', {}) 19 | } 20 | 21 | export const userinfoApi = (params?: object): Promise> => { 22 | return rq.get>('/user/info', { params }) 23 | } 24 | 25 | export const userUpdApi = (data?: object): Promise> => { 26 | return rq.post('/user/upd', data) 27 | } 28 | 29 | export const userUpdPwdApi = (data?: object): Promise> => { 30 | return rq.post('/user/upd/pwd', data) 31 | } 32 | 33 | export const userAddApi = (data?: object): Promise> => { 34 | return rq.post('/user/add', data) 35 | } 36 | -------------------------------------------------------------------------------- /blossom-web/src/api/note.ts: -------------------------------------------------------------------------------- 1 | import { defaultRequest as rq } from './request' 2 | import type { R } from './request' 3 | 4 | export const noteAllApi = (params?: object): Promise> => { 5 | return rq.get>('/note/list', { params }) 6 | } 7 | 8 | export const noteAddApi = (data?: object): Promise> => { 9 | return rq.post>('/note/add', data) 10 | } 11 | 12 | export const noteUpdApi = (data?: object): Promise> => { 13 | return rq.post>('/note/upd', data) 14 | } 15 | 16 | export const noteDelApi = (data?: object): Promise> => { 17 | return rq.post>('/note/del', data) 18 | } 19 | 20 | export const noteTopApi = (data?: object): Promise> => { 21 | return rq.post>('/note/top', data) 22 | } 23 | -------------------------------------------------------------------------------- /blossom-web/src/api/plan.ts: -------------------------------------------------------------------------------- 1 | import { defaultRequest as rq } from './request' 2 | import type { R } from './request' 3 | 4 | export const planListDayApi = (params?: object): Promise> => { 5 | return rq.get>('/plan/list/day', { params }) 6 | } 7 | 8 | export const planListDailyApi = (params?: object): Promise> => { 9 | return rq.get>('/plan/list/daily', { params }) 10 | } 11 | 12 | export const planAddDailyApi = (data?: object): Promise> => { 13 | return rq.post>('/plan/add/daily', data) 14 | } 15 | 16 | export const planAddDayApi = (data?: object): Promise> => { 17 | return rq.post>('/plan/add/day', data) 18 | } 19 | 20 | export const planDelApi = (data?: object): Promise> => { 21 | return rq.post>('/plan/del', data) 22 | } 23 | 24 | export const planUpdDayApi = (data?: object): Promise> => { 25 | return rq.post>('/plan/upd/day', data) 26 | } 27 | -------------------------------------------------------------------------------- /blossom-web/src/assets/constants/blossom.ts: -------------------------------------------------------------------------------- 1 | const blossom = { 2 | SYS: { VERSION: 'v1.16.0' } 3 | } 4 | 5 | export default blossom 6 | -------------------------------------------------------------------------------- /blossom-web/src/assets/fonts/JetBrainsMono-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-web/src/assets/fonts/JetBrainsMono-Regular.woff2 -------------------------------------------------------------------------------- /blossom-web/src/assets/fonts/config.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Jetbrains Mono'; 3 | src: url('@/assets/fonts/JetBrainsMono-Regular.woff2'); 4 | font-weight: 400; 5 | font-style: normal; 6 | } 7 | -------------------------------------------------------------------------------- /blossom-web/src/assets/imgs/common/gong_wang_an_bei_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-web/src/assets/imgs/common/gong_wang_an_bei_img.png -------------------------------------------------------------------------------- /blossom-web/src/assets/imgs/note/dustbin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-web/src/assets/imgs/note/dustbin.png -------------------------------------------------------------------------------- /blossom-web/src/assets/imgs/note/pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-web/src/assets/imgs/note/pin.png -------------------------------------------------------------------------------- /blossom-web/src/assets/styles/common.scss: -------------------------------------------------------------------------------- 1 | .module-workbench { 2 | @include box(35px, 35px); 3 | @include flex(row, center, center); 4 | background-color: var(--bl-html-color); 5 | box-shadow: -1px 0px 3px #bababa; 6 | border-top-left-radius: 10px; 7 | border-bottom-left-radius: 10px; 8 | position: absolute; 9 | right: 0; 10 | bottom: 20px; 11 | transition: background-color 0.4s; 12 | cursor: pointer; 13 | 14 | .iconbl { 15 | color: #7b7b7ba9; 16 | font-size: 16px; 17 | transition: color 1s; 18 | } 19 | 20 | i { 21 | transition: color 1s; 22 | } 23 | 24 | &:hover { 25 | background-color: #606060; 26 | 27 | .iconbl { 28 | color: var(--bl-html-color); 29 | } 30 | 31 | i { 32 | --color: var(--bl-html-color) !important; 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /blossom-web/src/assets/styles/config.scss: -------------------------------------------------------------------------------- 1 | @import '../fonts/config.scss'; 2 | 3 | @import './element/dialog'; 4 | @import './element/drawer'; 5 | @import './element/popper'; 6 | @import './element/menu'; 7 | @import './element/message'; 8 | @import './mixin-fuc'; 9 | @import './iconfont'; 10 | @import './common'; 11 | -------------------------------------------------------------------------------- /blossom-web/src/assets/styles/css/main.css: -------------------------------------------------------------------------------- 1 | /* * { 2 | font-family: 'ubuntu mono', 'Consolas', 'Monaco', 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif; 3 | box-sizing: border-box; 4 | } */ 5 | 6 | html, 7 | body { 8 | width: 100%; 9 | height: 100%; 10 | box-sizing: border-box; 11 | background-color: var(--bl-html-color); 12 | -webkit-tap-highlight-color: transparent; 13 | } 14 | 15 | body { 16 | margin: 0; 17 | } 18 | 19 | #app { 20 | width: 100%; 21 | height: 100%; 22 | } 23 | 24 | /** ================================== 滚动条 ================================== */ 25 | /* 定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸 */ 26 | ::-webkit-scrollbar { 27 | width: 5px; 28 | height: 5px; 29 | } 30 | /* 定义滑块 内阴影+圆角 */ 31 | ::-webkit-scrollbar-thumb { 32 | background-color: #c7c7c7; 33 | } 34 | 35 | /* 滚动条右下角出现白色方块 */ 36 | ::-webkit-scrollbar-corner { 37 | background: transparent; 38 | } 39 | -------------------------------------------------------------------------------- /blossom-web/src/assets/styles/element/dialog.scss: -------------------------------------------------------------------------------- 1 | .el-dialog { 2 | --el-dialog-border-radius: 10px !important; 3 | --el-dialog-padding-primary: 10px !important; 4 | --el-dialog-box-shadow: var(--bl-dialog-box-shadow) !important; 5 | 6 | .el-dialog__headerbtn { 7 | top: -5px; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /blossom-web/src/assets/styles/element/menu.scss: -------------------------------------------------------------------------------- 1 | .el-menu { 2 | } 3 | 4 | :deep(.el-sub-menu__title) { 5 | transition: background-color 0s; 6 | } 7 | 8 | :deep(.el-menu-item:hover) { 9 | background-color: var(--el-color-primary-light-9); 10 | } -------------------------------------------------------------------------------- /blossom-web/src/assets/styles/element/message.scss: -------------------------------------------------------------------------------- 1 | .el-message { 2 | --el-message-padding: 9px 20px; 3 | --el-message-text-color: #dfdfdf; 4 | background-color: #00000097; 5 | border-color: #000; 6 | } 7 | -------------------------------------------------------------------------------- /blossom-web/src/assets/styles/iconfont/blossom/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-web/src/assets/styles/iconfont/blossom/iconfont.ttf -------------------------------------------------------------------------------- /blossom-web/src/assets/styles/iconfont/blossom/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-web/src/assets/styles/iconfont/blossom/iconfont.woff -------------------------------------------------------------------------------- /blossom-web/src/assets/styles/iconfont/blossom/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/blossom-web/src/assets/styles/iconfont/blossom/iconfont.woff2 -------------------------------------------------------------------------------- /blossom-web/src/components/BLCol.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 37 | -------------------------------------------------------------------------------- /blossom-web/src/components/BLRow.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 37 | -------------------------------------------------------------------------------- /blossom-web/src/components/Template.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 11 | 12 | -------------------------------------------------------------------------------- /blossom-web/src/main.ts: -------------------------------------------------------------------------------- 1 | import '@/assets/styles/css/main.css' 2 | import '@/assets/styles/iconfont/blossom/iconfont.css' 3 | import '@/assets/styles/iconfont/weblogo/iconfont.js' 4 | 5 | import { createApp } from 'vue' 6 | import App from './App.vue' 7 | 8 | import pinia from '@/stores/store-config' 9 | import router from '@/router/index' 10 | import '@/router/route-init' 11 | 12 | import 'element-plus/theme-chalk/dark/css-vars.css' 13 | import '@/assets/styles/css/theme.css' 14 | 15 | import BLRow from '@/components/BLRow.vue' 16 | import BLCol from '@/components/BLCol.vue' 17 | import BLTag from '@/components/BLTag.vue' 18 | 19 | const app = createApp(App) 20 | app.use(pinia) 21 | app.use(router) 22 | app.component('bl-row', BLRow).component('bl-col', BLCol).component('bl-tag', BLTag) 23 | app.mount('#app') 24 | -------------------------------------------------------------------------------- /blossom-web/src/router/index.ts: -------------------------------------------------------------------------------- 1 | import { createRouter, createWebHashHistory } from 'vue-router'; 2 | 3 | const router = createRouter({ 4 | history: createWebHashHistory(import.meta.env.BASE_URL), 5 | routes: [] 6 | }) 7 | 8 | export const toRoute = (path: string): void => { 9 | router.push(path) 10 | } 11 | 12 | export default router 13 | -------------------------------------------------------------------------------- /blossom-web/src/scripts/lifecycle.ts: -------------------------------------------------------------------------------- 1 | import { onActivated, onMounted } from 'vue' 2 | 3 | /** 4 | * 初始化时生命周期封装, 主要控制 mounted 和 activated 只执行一次 5 | * @param mounted 6 | * @param activated 7 | */ 8 | export const useLifecycle = (mounted: Function, activated: Function) => { 9 | let isMounted = false 10 | 11 | onMounted(() => { 12 | if (!isMounted) { 13 | mounted() 14 | } 15 | }) 16 | 17 | onActivated(() => { 18 | if (isMounted) { 19 | activated() 20 | } 21 | isMounted = true 22 | }) 23 | } 24 | -------------------------------------------------------------------------------- /blossom-web/src/stores/store-config.ts: -------------------------------------------------------------------------------- 1 | import { createPinia } from 'pinia' 2 | const pinia = createPinia() 3 | export default pinia 4 | -------------------------------------------------------------------------------- /blossom-web/src/views/article/ArticleSetting.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 16 | 17 | 32 | -------------------------------------------------------------------------------- /blossom-web/src/views/article/scripts/article-setting.ts: -------------------------------------------------------------------------------- 1 | import { ref } from 'vue' 2 | import { Local } from '@/assets/utils/storage' 3 | 4 | const FONT_SIZE_KEY = 'BLOSSOM-ARTICLE-FONT-SZIE' 5 | 6 | const fontSize = ref(Local.get(FONT_SIZE_KEY) || 0.9) 7 | 8 | const increase = () => { 9 | fontSize.value += 0.1 10 | Local.set(FONT_SIZE_KEY, fontSize.value) 11 | } 12 | 13 | const decrease = () => { 14 | fontSize.value -= 0.1 15 | Local.set(FONT_SIZE_KEY, fontSize.value) 16 | } 17 | 18 | const getFontSizeValue = () => { 19 | return fontSize.value 20 | } 21 | 22 | const getFontSize = () => { 23 | return fontSize.value + 'rem' 24 | } 25 | export { increase, decrease, getFontSizeValue, getFontSize } 26 | -------------------------------------------------------------------------------- /blossom-web/src/views/plan/PlanColor.scss: -------------------------------------------------------------------------------- 1 | .gray { 2 | background-color: #858585; 3 | } 4 | 5 | .gray.hl { 6 | background-color: #646464; 7 | } 8 | 9 | .red { 10 | background-color: #fb0036; 11 | } 12 | 13 | .red.hl { 14 | background-color: #c9002c; 15 | } 16 | 17 | .yellow { 18 | background-color: #d8a600; 19 | } 20 | 21 | .yellow.hl { 22 | background-color: #ffc400; 23 | } 24 | 25 | .blue { 26 | background-color: #00a3cb; 27 | } 28 | 29 | .blue.hl { 30 | background-color: #00657e; 31 | } 32 | 33 | .green { 34 | background-color: #339a00; 35 | } 36 | 37 | .green.hl { 38 | background-color: #2d8700; 39 | } 40 | 41 | .purple { 42 | background-color: #ad8cf2; 43 | } 44 | 45 | .purple.hl { 46 | background-color: #9665ff; 47 | } -------------------------------------------------------------------------------- /blossom-web/tsconfig.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": [ 3 | "vite.config.*", 4 | "vitest.config.*", 5 | "cypress.config.*", 6 | "playwright.config.*" 7 | ], 8 | "compilerOptions": { 9 | "composite": true, 10 | "types": [ 11 | "node" 12 | ], 13 | "lib": [ 14 | 15 | ] 16 | } 17 | } -------------------------------------------------------------------------------- /blossom-web/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@vue/tsconfig/tsconfig.dom.json", 3 | "include": [ 4 | "env/env.d.ts", 5 | "src/**/*", 6 | "src/**/*.vue", 7 | "src/**/*.d.ts", 8 | "declaration.d.ts", 9 | "global.d.ts" 10 | ], 11 | "compilerOptions": { 12 | "baseUrl": "./", 13 | "types": [ 14 | "node" 15 | ], 16 | "paths": { 17 | "@/*": [ 18 | "./src/*" 19 | ] 20 | } 21 | }, 22 | "references": [ 23 | { 24 | "path": "./tsconfig.config.json" 25 | } 26 | ] 27 | } -------------------------------------------------------------------------------- /doc/backend-api/xt256.min.css: -------------------------------------------------------------------------------- 1 | .hljs{display:block;overflow-x:auto;color:#eaeaea;background:#000;padding:.5em}.hljs-subst{color:#eaeaea}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-builtin-name,.hljs-type{color:#eaeaea}.hljs-params{color:#da0000}.hljs-literal,.hljs-name,.hljs-number{color:red;font-weight:bolder}.hljs-comment{color:#969896}.hljs-quote,.hljs-selector-id{color:#0ff}.hljs-template-variable,.hljs-title,.hljs-variable{color:#0ff;font-weight:700}.hljs-keyword,.hljs-selector-class,.hljs-symbol{color:#fff000}.hljs-bullet,.hljs-string{color:#0f0}.hljs-section,.hljs-tag{color:#000fff}.hljs-selector-tag{color:#000fff;font-weight:700}.hljs-attribute,.hljs-built_in,.hljs-link,.hljs-regexp{color:#f0f}.hljs-meta{color:#fff;font-weight:bolder} -------------------------------------------------------------------------------- /doc/imgs/article.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/doc/imgs/article.png -------------------------------------------------------------------------------- /doc/imgs/article_reference.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/doc/imgs/article_reference.png -------------------------------------------------------------------------------- /doc/imgs/blog_article.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/doc/imgs/blog_article.png -------------------------------------------------------------------------------- /doc/imgs/blog_home_m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/doc/imgs/blog_home_m.png -------------------------------------------------------------------------------- /doc/imgs/blog_home_pc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/doc/imgs/blog_home_pc.png -------------------------------------------------------------------------------- /doc/imgs/blossom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/doc/imgs/blossom.png -------------------------------------------------------------------------------- /doc/imgs/blossom_name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/doc/imgs/blossom_name.png -------------------------------------------------------------------------------- /doc/imgs/device.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/doc/imgs/device.png -------------------------------------------------------------------------------- /doc/imgs/note.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/doc/imgs/note.png -------------------------------------------------------------------------------- /doc/imgs/picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/doc/imgs/picture.png -------------------------------------------------------------------------------- /doc/imgs/plan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/doc/imgs/plan.png -------------------------------------------------------------------------------- /doc/imgs/qq1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/doc/imgs/qq1.png -------------------------------------------------------------------------------- /doc/imgs/qq2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/doc/imgs/qq2.png -------------------------------------------------------------------------------- /doc/imgs/qq3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/doc/imgs/qq3.png -------------------------------------------------------------------------------- /doc/imgs/sponsors/aifadian.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/doc/imgs/sponsors/aifadian.png -------------------------------------------------------------------------------- /doc/imgs/sponsors/ali.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/doc/imgs/sponsors/ali.png -------------------------------------------------------------------------------- /doc/imgs/sponsors/wechat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/doc/imgs/sponsors/wechat.png -------------------------------------------------------------------------------- /doc/imgs/todo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blossom-editor/blossom/57d7aa533571addbc5f75ff2f8b5410a120dfba5/doc/imgs/todo.png --------------------------------------------------------------------------------