├── .gitignore ├── LICENSE ├── SECURITY.md ├── dimple-api ├── dimple-api-blog │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── com │ │ │ └── dimple │ │ │ └── blog │ │ │ └── api │ │ │ ├── RemoteBlogArchiveService.java │ │ │ ├── RemoteBlogArticleService.java │ │ │ ├── RemoteBlogCategoryService.java │ │ │ ├── RemoteBlogCommentService.java │ │ │ ├── RemoteBlogConfigService.java │ │ │ ├── RemoteBlogLinkService.java │ │ │ ├── RemoteBlogTagService.java │ │ │ ├── bo │ │ │ ├── BlogArchiveItemBO.java │ │ │ ├── BlogArchivesBO.java │ │ │ ├── BlogArticleBO.java │ │ │ ├── BlogArticleCategoryBO.java │ │ │ ├── BlogArticlePreNextItemBO.java │ │ │ ├── BlogArticlePrevNextBO.java │ │ │ ├── BlogArticleTagBO.java │ │ │ ├── BlogCategoryBO.java │ │ │ ├── BlogCommentBO.java │ │ │ ├── BlogLinkBO.java │ │ │ ├── BlogTagBO.java │ │ │ ├── BlogTagDTO.java │ │ │ ├── GithubVisitorInfoBO.java │ │ │ ├── KeyValue.java │ │ │ └── config │ │ │ │ ├── BlogGlobalConfig.java │ │ │ │ ├── CommentConfig.java │ │ │ │ ├── EmailConfig.java │ │ │ │ ├── GithubLoginConfig.java │ │ │ │ └── SiteConfig.java │ │ │ ├── factory │ │ │ ├── RemoteBlogArchiveServiceFallbackFactory.java │ │ │ ├── RemoteBlogArticleServiceFallbackFactory.java │ │ │ ├── RemoteBlogCategoryServiceFallbackFactory.java │ │ │ ├── RemoteBlogCommentServiceFallbackFactory.java │ │ │ ├── RemoteBlogConfigServiceFallbackFactory.java │ │ │ ├── RemoteBlogLinkServiceFallbackFactory.java │ │ │ └── RemoteBlogTagServiceFallbackFactory.java │ │ │ └── model │ │ │ ├── BlogArticleDTO.java │ │ │ ├── BlogCategoryDTO.java │ │ │ ├── BlogCommentDTO.java │ │ │ └── BlogLinkDTO.java │ │ └── resources │ │ └── META-INF │ │ └── spring │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports ├── dimple-api-system │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── com │ │ │ └── dimple │ │ │ └── system │ │ │ └── api │ │ │ ├── RemoteDictService.java │ │ │ ├── RemoteFileService.java │ │ │ ├── RemoteLogService.java │ │ │ ├── RemoteUserService.java │ │ │ ├── factory │ │ │ ├── RemoteDictFallbackFactory.java │ │ │ ├── RemoteFileFallbackFactory.java │ │ │ ├── RemoteLogFallbackFactory.java │ │ │ └── RemoteUserFallbackFactory.java │ │ │ └── model │ │ │ ├── BlogVisitLogBO.java │ │ │ ├── LoginUser.java │ │ │ ├── SysDictDataBO.java │ │ │ ├── SysFileBO.java │ │ │ ├── SysLogininforBO.java │ │ │ ├── SysOperLogBO.java │ │ │ ├── SysRoleBO.java │ │ │ └── SysUserBO.java │ │ └── resources │ │ └── META-INF │ │ └── spring │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports └── pom.xml ├── dimple-auth ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── dimple │ │ └── auth │ │ ├── DimpleAuthApplication.java │ │ ├── controller │ │ └── TokenController.java │ │ ├── form │ │ ├── LoginBody.java │ │ └── RegisterBody.java │ │ └── service │ │ ├── SysLoginService.java │ │ ├── SysPasswordService.java │ │ └── SysRecordLogService.java │ └── resources │ ├── banner.txt │ ├── bootstrap.yml │ └── logback.xml ├── dimple-common ├── dimple-common-core │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── com │ │ │ │ └── dimple │ │ │ │ └── common │ │ │ │ └── core │ │ │ │ ├── annotation │ │ │ │ ├── Excel.java │ │ │ │ └── Excels.java │ │ │ │ ├── constant │ │ │ │ ├── Constants.java │ │ │ │ ├── GenConstants.java │ │ │ │ ├── HttpStatus.java │ │ │ │ ├── ScheduleConstants.java │ │ │ │ ├── SecurityConstants.java │ │ │ │ ├── ServiceNameConstants.java │ │ │ │ ├── TokenConstants.java │ │ │ │ └── UserConstants.java │ │ │ │ ├── context │ │ │ │ └── SecurityContextHolder.java │ │ │ │ ├── domain │ │ │ │ └── ResponseEntity.java │ │ │ │ ├── enums │ │ │ │ ├── BlogArticleStatus.java │ │ │ │ ├── BlogCommentType.java │ │ │ │ ├── BlogLinkStatus.java │ │ │ │ ├── BlogPageId.java │ │ │ │ └── UserStatus.java │ │ │ │ ├── exception │ │ │ │ ├── CaptchaException.java │ │ │ │ ├── CheckedException.java │ │ │ │ ├── DemoModeException.java │ │ │ │ ├── GlobalException.java │ │ │ │ ├── InnerAuthException.java │ │ │ │ ├── PreAuthorizeException.java │ │ │ │ ├── ServiceException.java │ │ │ │ ├── UtilException.java │ │ │ │ ├── article │ │ │ │ │ └── ArticleNotFoundException.java │ │ │ │ ├── auth │ │ │ │ │ ├── NotLoginException.java │ │ │ │ │ ├── NotPermissionException.java │ │ │ │ │ └── NotRoleException.java │ │ │ │ ├── base │ │ │ │ │ └── BaseException.java │ │ │ │ ├── file │ │ │ │ │ ├── FileException.java │ │ │ │ │ ├── FileNameLengthLimitExceededException.java │ │ │ │ │ ├── FileSizeLimitExceededException.java │ │ │ │ │ └── InvalidExtensionException.java │ │ │ │ ├── job │ │ │ │ │ └── TaskException.java │ │ │ │ └── user │ │ │ │ │ ├── CaptchaExpireException.java │ │ │ │ │ ├── UserException.java │ │ │ │ │ └── UserPasswordNotMatchException.java │ │ │ │ ├── text │ │ │ │ ├── CharsetKit.java │ │ │ │ ├── Convert.java │ │ │ │ └── StrFormatter.java │ │ │ │ ├── utils │ │ │ │ ├── DateUtils.java │ │ │ │ ├── ExceptionUtil.java │ │ │ │ ├── JwtUtils.java │ │ │ │ ├── PageUtils.java │ │ │ │ ├── ServletUtils.java │ │ │ │ ├── SpringUtils.java │ │ │ │ ├── StringUtils.java │ │ │ │ ├── bean │ │ │ │ │ ├── BeanMapper.java │ │ │ │ │ └── BeanValidators.java │ │ │ │ ├── file │ │ │ │ │ ├── FileTypeUtils.java │ │ │ │ │ ├── FileUtils.java │ │ │ │ │ ├── ImageUtils.java │ │ │ │ │ └── MimeTypeUtils.java │ │ │ │ ├── html │ │ │ │ │ ├── EscapeUtil.java │ │ │ │ │ └── HTMLFilter.java │ │ │ │ ├── ip │ │ │ │ │ ├── IpLocationInfo.java │ │ │ │ │ └── IpUtils.java │ │ │ │ ├── poi │ │ │ │ │ ├── ExcelHandlerAdapter.java │ │ │ │ │ └── ExcelUtil.java │ │ │ │ ├── reflect │ │ │ │ │ └── ReflectUtils.java │ │ │ │ ├── response │ │ │ │ │ └── ResponseEntityUtils.java │ │ │ │ ├── sign │ │ │ │ │ └── Base64.java │ │ │ │ ├── sql │ │ │ │ │ └── SqlUtil.java │ │ │ │ └── uuid │ │ │ │ │ ├── IdUtils.java │ │ │ │ │ ├── Seq.java │ │ │ │ │ └── UUID.java │ │ │ │ ├── web │ │ │ │ ├── controller │ │ │ │ │ └── BaseController.java │ │ │ │ ├── entity │ │ │ │ │ └── BaseEntity.java │ │ │ │ ├── page │ │ │ │ │ ├── PageDomain.java │ │ │ │ │ ├── TableDataInfo.java │ │ │ │ │ └── TableSupport.java │ │ │ │ └── vo │ │ │ │ │ └── params │ │ │ │ │ ├── AjaxResult.java │ │ │ │ │ ├── BaseVOParams.java │ │ │ │ │ └── TreeVOParams.java │ │ │ │ └── xss │ │ │ │ ├── Xss.java │ │ │ │ └── XssValidator.java │ │ └── resources │ │ │ ├── META-INF │ │ │ └── spring │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── ip2region │ │ │ └── ip2region.xdb │ │ └── test │ │ └── java │ │ └── com │ │ └── dimple │ │ └── common │ │ └── core │ │ └── utils │ │ ├── BeanMapperTest.java │ │ └── beans │ │ ├── Car.java │ │ ├── Person.java │ │ └── PersonVO.java ├── dimple-common-datascope │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── com │ │ │ └── dimple │ │ │ └── common │ │ │ └── datascope │ │ │ ├── annotation │ │ │ └── DataScope.java │ │ │ └── aspect │ │ │ ├── DataScopeAspect.java │ │ │ └── MybatisInterceptor.java │ │ └── resources │ │ └── META-INF │ │ └── spring │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports ├── dimple-common-datasource │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── com │ │ └── dimple │ │ └── common │ │ └── datasource │ │ └── annotation │ │ ├── Master.java │ │ └── Slave.java ├── dimple-common-log │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── com │ │ │ └── dimple │ │ │ └── common │ │ │ └── log │ │ │ ├── annotation │ │ │ ├── OperationLog.java │ │ │ └── VisitLog.java │ │ │ ├── aspect │ │ │ ├── LogAspectUtils.java │ │ │ ├── OperateLogAspect.java │ │ │ └── VisitLogAspect.java │ │ │ ├── enums │ │ │ ├── BusinessStatus.java │ │ │ ├── BusinessType.java │ │ │ ├── OperatorType.java │ │ │ ├── RequestType.java │ │ │ └── VisitLogTitle.java │ │ │ ├── filter │ │ │ └── PropertyPreExcludeFilter.java │ │ │ ├── service │ │ │ └── AsyncLogService.java │ │ │ └── utils │ │ │ └── SpiderUtils.java │ │ └── resources │ │ └── META-INF │ │ └── spring │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports ├── dimple-common-redis │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── com │ │ │ └── dimple │ │ │ └── common │ │ │ └── redis │ │ │ ├── configure │ │ │ ├── FastJson2JsonRedisSerializer.java │ │ │ └── RedisConfig.java │ │ │ ├── constants │ │ │ └── CacheConstants.java │ │ │ ├── core │ │ │ ├── RedisKeyDefine.java │ │ │ ├── RedisKeyRegistry.java │ │ │ ├── RedisKeyTypeEnum.java │ │ │ └── RedisTimeoutTypeEnum.java │ │ │ ├── jsonSerializer │ │ │ └── DurationToLongSerializer.java │ │ │ └── service │ │ │ └── RedisService.java │ │ └── resources │ │ └── META-INF │ │ └── spring │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports ├── dimple-common-seata │ └── pom.xml ├── dimple-common-security │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── com │ │ │ └── dimple │ │ │ └── common │ │ │ └── security │ │ │ ├── annotation │ │ │ ├── EnableCustomConfig.java │ │ │ ├── EnableDimpleFeignClients.java │ │ │ ├── InnerAuth.java │ │ │ ├── Logical.java │ │ │ ├── RequiresLogin.java │ │ │ ├── RequiresPermissions.java │ │ │ └── RequiresRoles.java │ │ │ ├── aspect │ │ │ ├── InnerAuthAspect.java │ │ │ └── PreAuthorizeAspect.java │ │ │ ├── auth │ │ │ ├── AuthLogic.java │ │ │ └── AuthUtil.java │ │ │ ├── config │ │ │ ├── ApplicationConfig.java │ │ │ └── WebMvcConfig.java │ │ │ ├── feign │ │ │ ├── FeignAutoConfiguration.java │ │ │ └── FeignRequestInterceptor.java │ │ │ ├── handler │ │ │ └── GlobalExceptionHandler.java │ │ │ ├── interceptor │ │ │ └── HeaderInterceptor.java │ │ │ ├── service │ │ │ └── TokenService.java │ │ │ └── utils │ │ │ ├── DictUtils.java │ │ │ └── SecurityUtils.java │ │ └── resources │ │ └── META-INF │ │ └── spring │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports ├── dimple-common-swagger │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── com │ │ │ └── dimple │ │ │ └── common │ │ │ └── swagger │ │ │ ├── annotation │ │ │ └── EnableCustomSwagger2.java │ │ │ └── config │ │ │ ├── SwaggerAutoConfiguration.java │ │ │ ├── SwaggerBeanPostProcessor.java │ │ │ ├── SwaggerProperties.java │ │ │ └── SwaggerWebConfiguration.java │ │ └── resources │ │ └── META-INF │ │ └── spring │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports └── pom.xml ├── dimple-gateway ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── dimple │ │ └── gateway │ │ ├── DimpleGatewayApplication.java │ │ ├── config │ │ ├── CaptchaConfig.java │ │ ├── GatewayConfig.java │ │ ├── KaptchaTextCreator.java │ │ ├── RouterFunctionConfiguration.java │ │ ├── SwaggerProvider.java │ │ └── properties │ │ │ ├── CaptchaProperties.java │ │ │ ├── IgnoreWhiteProperties.java │ │ │ └── XssProperties.java │ │ ├── filter │ │ ├── AuthFilter.java │ │ ├── BlackListUrlFilter.java │ │ ├── CacheRequestFilter.java │ │ ├── ValidateCodeFilter.java │ │ └── XssFilter.java │ │ ├── handler │ │ ├── GatewayExceptionHandler.java │ │ ├── SentinelFallbackHandler.java │ │ ├── SwaggerHandler.java │ │ └── ValidateCodeHandler.java │ │ └── service │ │ ├── ValidateCodeService.java │ │ └── impl │ │ └── ValidateCodeServiceImpl.java │ └── resources │ ├── banner.txt │ ├── bootstrap.yml │ └── logback.xml ├── dimple-modules ├── dimple-blog-front │ ├── dimple-blog-front-service │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── com │ │ │ └── dimple │ │ │ └── blog │ │ │ └── front │ │ │ └── service │ │ │ ├── config │ │ │ └── GithubTokenInfoConfig.java │ │ │ └── service │ │ │ ├── BlogRestArchivesService.java │ │ │ ├── BlogRestArticleService.java │ │ │ ├── BlogRestArticleTagService.java │ │ │ ├── BlogRestCategoryService.java │ │ │ ├── BlogRestCommentService.java │ │ │ ├── BlogRestConfigService.java │ │ │ ├── BlogRestLinkService.java │ │ │ ├── BlogRestTagService.java │ │ │ ├── BlogRestVisitorService.java │ │ │ └── impl │ │ │ ├── BlogRestArchivesServiceImpl.java │ │ │ ├── BlogRestArticleServiceImpl.java │ │ │ ├── BlogRestArticleTagServiceImpl.java │ │ │ ├── BlogRestCategoryServiceImpl.java │ │ │ ├── BlogRestCommentServiceImpl.java │ │ │ ├── BlogRestConfigServiceImpl.java │ │ │ ├── BlogRestLinkServiceImpl.java │ │ │ ├── BlogRestTagServiceImpl.java │ │ │ └── BlogRestVisitorServiceImpl.java │ ├── dimple-blog-front-web │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── com │ │ │ │ └── dimple │ │ │ │ └── blog │ │ │ │ └── front │ │ │ │ └── web │ │ │ │ ├── DimpleBlogFrontApplication.java │ │ │ │ └── controller │ │ │ │ ├── BlogAboutRest.java │ │ │ │ ├── BlogArchivesRest.java │ │ │ │ ├── BlogArticleRest.java │ │ │ │ ├── BlogCategoryRest.java │ │ │ │ ├── BlogCommentRest.java │ │ │ │ ├── BlogLinkRest.java │ │ │ │ ├── BlogMessageBoardRest.java │ │ │ │ ├── BlogPanelRest.java │ │ │ │ ├── BlogTagRest.java │ │ │ │ ├── ConfigRest.java │ │ │ │ ├── VisitorRest.java │ │ │ │ └── vo │ │ │ │ ├── BlogArchiveItemVO.java │ │ │ │ ├── BlogArchivesVO.java │ │ │ │ ├── BlogArticlePreNextItemVO.java │ │ │ │ ├── BlogArticlePrevNextVO.java │ │ │ │ ├── BlogArticleVO.java │ │ │ │ ├── BlogCategoryVO.java │ │ │ │ ├── BlogCommentVO.java │ │ │ │ ├── BlogLinkVO.java │ │ │ │ ├── BlogTagVO.java │ │ │ │ ├── config │ │ │ │ ├── BlogGlobalConfigVO.java │ │ │ │ ├── CommentConfigVO.java │ │ │ │ ├── GithubLoginConfig.java │ │ │ │ └── SiteConfig.java │ │ │ │ └── params │ │ │ │ ├── BlogArchivesVOParams.java │ │ │ │ ├── BlogArticleVOParams.java │ │ │ │ ├── BlogCategoryVOParams.java │ │ │ │ ├── BlogCommentVOParams.java │ │ │ │ ├── BlogLinkVOParams.java │ │ │ │ ├── BlogTagVOParams.java │ │ │ │ └── VisitLogVOParams.java │ │ │ └── resources │ │ │ ├── banner.txt │ │ │ ├── bootstrap.yml │ │ │ └── logback.xml │ └── pom.xml ├── dimple-blog │ ├── dimple-blog-service │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── com │ │ │ └── dimple │ │ │ └── blog │ │ │ └── service │ │ │ ├── entity │ │ │ ├── BlogArchiveItem.java │ │ │ ├── BlogArchives.java │ │ │ ├── BlogArticle.java │ │ │ ├── BlogArticleCategory.java │ │ │ ├── BlogArticleTag.java │ │ │ ├── BlogCategory.java │ │ │ ├── BlogComment.java │ │ │ ├── BlogLink.java │ │ │ └── BlogTag.java │ │ │ ├── enums │ │ │ └── BlogArticleStatus.java │ │ │ ├── mapper │ │ │ ├── BlogArchiveMapper.java │ │ │ ├── BlogArticleCategoryMapper.java │ │ │ ├── BlogArticleMapper.java │ │ │ ├── BlogArticleTagMapper.java │ │ │ ├── BlogCategoryMapper.java │ │ │ ├── BlogCommentMapper.java │ │ │ ├── BlogConfigMapper.java │ │ │ ├── BlogLinkMapper.java │ │ │ └── BlogTagMapper.java │ │ │ └── service │ │ │ ├── BlogArchiveService.java │ │ │ ├── BlogArticleCategoryService.java │ │ │ ├── BlogArticleService.java │ │ │ ├── BlogArticleTagService.java │ │ │ ├── BlogCategoryService.java │ │ │ ├── BlogCommentService.java │ │ │ ├── BlogConfigService.java │ │ │ ├── BlogLinkService.java │ │ │ ├── BlogTagService.java │ │ │ ├── EmailServices.java │ │ │ └── impl │ │ │ ├── BlogArchiveServiceImpl.java │ │ │ ├── BlogArticleCategoryServiceImpl.java │ │ │ ├── BlogArticleServiceImpl.java │ │ │ ├── BlogArticleTagServiceImpl.java │ │ │ ├── BlogCategoryServiceImpl.java │ │ │ ├── BlogCommentServiceImpl.java │ │ │ ├── BlogConfigServiceImpl.java │ │ │ ├── BlogLinkServiceImpl.java │ │ │ └── BlogTagServiceImpl.java │ ├── dimple-blog-web │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── com │ │ │ │ └── dimple │ │ │ │ └── blog │ │ │ │ └── web │ │ │ │ ├── DimpleBlogApplication.java │ │ │ │ └── controller │ │ │ │ ├── BlogAboutMeController.java │ │ │ │ ├── BlogArchiveController.java │ │ │ │ ├── BlogArticleController.java │ │ │ │ ├── BlogCategoryController.java │ │ │ │ ├── BlogCommentController.java │ │ │ │ ├── BlogConfigController.java │ │ │ │ ├── BlogLinkController.java │ │ │ │ ├── BlogTagController.java │ │ │ │ └── vo │ │ │ │ ├── BlogArticleVO.java │ │ │ │ ├── BlogCategoryVO.java │ │ │ │ ├── BlogCommentVO.java │ │ │ │ ├── BlogLinkVO.java │ │ │ │ ├── BlogTagVO.java │ │ │ │ └── params │ │ │ │ ├── BlogArticleVOParams.java │ │ │ │ ├── BlogCategoryVOParams.java │ │ │ │ ├── BlogCommentVOParams.java │ │ │ │ ├── BlogLinkVOParams.java │ │ │ │ └── BlogTagVOParams.java │ │ │ └── resources │ │ │ ├── banner.txt │ │ │ ├── bootstrap.yml │ │ │ ├── logback.xml │ │ │ └── mapper │ │ │ └── blog │ │ │ ├── BlogArchivesMapper.xml │ │ │ ├── BlogArticleCategoryMapper.xml │ │ │ ├── BlogArticleMapper.xml │ │ │ ├── BlogArticleTagMapper.xml │ │ │ ├── BlogCategoryMapper.xml │ │ │ ├── BlogCommentMapper.xml │ │ │ ├── BlogConfigMapper.xml │ │ │ ├── BlogLinkMapper.xml │ │ │ └── BlogTagMapper.xml │ └── pom.xml ├── dimple-file │ ├── dimple-file-service │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── com │ │ │ └── dimple │ │ │ └── file │ │ │ └── service │ │ │ ├── config │ │ │ ├── LocalFileConfig.java │ │ │ ├── QiNiuConfig.java │ │ │ └── ResourcesConfig.java │ │ │ ├── constants │ │ │ └── FileConstants.java │ │ │ ├── entity │ │ │ └── SysFile.java │ │ │ ├── mapper │ │ │ └── SysFileMapper.java │ │ │ ├── service │ │ │ ├── AbstractSysFileService.java │ │ │ ├── SysFileService.java │ │ │ └── impl │ │ │ │ ├── LocalSysFileServiceImpl.java │ │ │ │ ├── QiNiuSysFileServiceImpl.java │ │ │ │ └── SysFileServiceImpl.java │ │ │ └── utils │ │ │ ├── FileUploadUtils.java │ │ │ └── QiNiuUtils.java │ ├── dimple-file-web │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── com │ │ │ │ └── dimple │ │ │ │ └── file │ │ │ │ └── web │ │ │ │ ├── DimpleFileApplication.java │ │ │ │ └── controller │ │ │ │ ├── SysFileController.java │ │ │ │ └── vo │ │ │ │ ├── SysFileVO.java │ │ │ │ └── params │ │ │ │ └── SysFileVOParams.java │ │ │ └── resources │ │ │ ├── banner.txt │ │ │ ├── bootstrap.yml │ │ │ ├── logback.xml │ │ │ └── mapper │ │ │ └── file │ │ │ └── SysFileMapper.xml │ └── pom.xml ├── dimple-job │ ├── dimple-job-service │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── com │ │ │ └── dimple │ │ │ └── job │ │ │ └── service │ │ │ ├── entity │ │ │ ├── SysJob.java │ │ │ └── SysJobLog.java │ │ │ ├── mapper │ │ │ ├── SysJobLogMapper.java │ │ │ └── SysJobMapper.java │ │ │ ├── service │ │ │ ├── SysJobLogService.java │ │ │ ├── SysJobService.java │ │ │ ├── bo │ │ │ │ ├── SysJobBO.java │ │ │ │ └── SysJobLogBO.java │ │ │ └── impl │ │ │ │ ├── SysJobLogServiceImpl.java │ │ │ │ └── SysJobServiceImpl.java │ │ │ ├── task │ │ │ └── DimpleTask.java │ │ │ └── util │ │ │ ├── AbstractQuartzJob.java │ │ │ ├── CronUtils.java │ │ │ ├── JobInvokeUtil.java │ │ │ ├── QuartzDisallowConcurrentExecution.java │ │ │ ├── QuartzJobExecution.java │ │ │ └── ScheduleUtils.java │ ├── dimple-job-web │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── com │ │ │ │ └── dimple │ │ │ │ └── job │ │ │ │ └── web │ │ │ │ ├── DimpleJobApplication.java │ │ │ │ ├── config │ │ │ │ └── ScheduleConfig.java │ │ │ │ └── controller │ │ │ │ ├── SysJobController.java │ │ │ │ ├── SysJobLogController.java │ │ │ │ └── vo │ │ │ │ ├── SysJobLogVO.java │ │ │ │ ├── SysJobVO.java │ │ │ │ └── params │ │ │ │ ├── SysJobLogVOParams.java │ │ │ │ └── SysJobVOParamsParams.java │ │ │ └── resources │ │ │ ├── banner.txt │ │ │ ├── bootstrap.yml │ │ │ ├── logback.xml │ │ │ └── mapper │ │ │ └── job │ │ │ ├── SysJobLogMapper.xml │ │ │ └── SysJobMapper.xml │ └── pom.xml ├── dimple-log │ ├── dimple-log-service │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── com │ │ │ └── dimple │ │ │ └── log │ │ │ └── service │ │ │ ├── entity │ │ │ ├── BlogVisitLog.java │ │ │ ├── SysLogininfor.java │ │ │ └── SysOperLog.java │ │ │ ├── mapper │ │ │ ├── BlogVisitLogMapper.java │ │ │ ├── SysLogininforMapper.java │ │ │ └── SysOperLogMapper.java │ │ │ └── service │ │ │ ├── BlogVisitLogService.java │ │ │ ├── SysLogininforService.java │ │ │ ├── SysOperLogService.java │ │ │ └── impl │ │ │ ├── BlogVisitLogServiceImpl.java │ │ │ ├── SysLogininforServiceImpl.java │ │ │ └── SysOperLogServiceImpl.java │ ├── dimple-log-web │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── com │ │ │ │ └── dimple │ │ │ │ └── log │ │ │ │ └── web │ │ │ │ ├── DimpleLogApplication.java │ │ │ │ └── controller │ │ │ │ ├── BlogVisitLogController.java │ │ │ │ ├── SysLogininforController.java │ │ │ │ ├── SysOperlogController.java │ │ │ │ └── vo │ │ │ │ ├── BlogVisitLogVO.java │ │ │ │ ├── SysLogininforVO.java │ │ │ │ ├── SysOperLogVO.java │ │ │ │ └── params │ │ │ │ ├── BlogVisitLogVOParams.java │ │ │ │ ├── SysLogininforVOParams.java │ │ │ │ └── SysOperLogVOParams.java │ │ │ └── resources │ │ │ ├── banner.txt │ │ │ ├── bootstrap.yml │ │ │ ├── logback.xml │ │ │ └── mapper │ │ │ └── log │ │ │ ├── BlogVisitLogMapper.xml │ │ │ ├── SysLogininforMapper.xml │ │ │ └── SysOperLogMapper.xml │ └── pom.xml ├── dimple-monitor │ ├── dimple-monitor-service │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── com │ │ │ └── dimple │ │ │ └── monitor │ │ │ └── service │ │ │ └── service │ │ │ ├── SysUserOnlineService.java │ │ │ └── impl │ │ │ ├── SysUserOnlineServiceImpl.java │ │ │ └── bo │ │ │ └── SysUserOnlineBO.java │ ├── dimple-monitor-web │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── com │ │ │ │ └── dimple │ │ │ │ └── monitor │ │ │ │ └── web │ │ │ │ ├── DimpleMonitorApplication.java │ │ │ │ ├── config │ │ │ │ └── WebSecurityConfigurer.java │ │ │ │ └── controller │ │ │ │ ├── SysRedisMonitorController.java │ │ │ │ ├── SysUserOnlineController.java │ │ │ │ └── vo │ │ │ │ ├── package-info.java │ │ │ │ └── redis │ │ │ │ ├── RedisCommandVO.java │ │ │ │ ├── RedisKeyDefineVO.java │ │ │ │ ├── RedisKeyValueVO.java │ │ │ │ └── RedisMonitorInfoVO.java │ │ │ └── resources │ │ │ ├── banner.txt │ │ │ ├── bootstrap.yml │ │ │ └── logback.xml │ └── pom.xml ├── dimple-system │ ├── dimple-system-service │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── com │ │ │ └── dimple │ │ │ └── system │ │ │ └── service │ │ │ ├── entity │ │ │ ├── SysConfig.java │ │ │ ├── SysDictData.java │ │ │ ├── SysDictType.java │ │ │ ├── SysFile.java │ │ │ ├── SysMenu.java │ │ │ ├── SysNotice.java │ │ │ ├── SysRole.java │ │ │ ├── SysRoleMenu.java │ │ │ ├── SysUser.java │ │ │ ├── SysUserOnline.java │ │ │ ├── SysUserRole.java │ │ │ └── dashboard │ │ │ │ ├── Dashboard.java │ │ │ │ ├── DashboardCountItem.java │ │ │ │ ├── DashboardItem.java │ │ │ │ └── DashboardKeyValue.java │ │ │ ├── mapper │ │ │ ├── SysConfigMapper.java │ │ │ ├── SysDashboardMapper.java │ │ │ ├── SysDictDataMapper.java │ │ │ ├── SysDictTypeMapper.java │ │ │ ├── SysMenuMapper.java │ │ │ ├── SysNoticeMapper.java │ │ │ ├── SysRoleMapper.java │ │ │ ├── SysRoleMenuMapper.java │ │ │ ├── SysUserMapper.java │ │ │ └── SysUserRoleMapper.java │ │ │ └── service │ │ │ ├── SysConfigService.java │ │ │ ├── SysDashboardService.java │ │ │ ├── SysDictDataService.java │ │ │ ├── SysDictTypeService.java │ │ │ ├── SysMenuService.java │ │ │ ├── SysNoticeService.java │ │ │ ├── SysPermissionService.java │ │ │ ├── SysRoleService.java │ │ │ ├── SysUserService.java │ │ │ ├── bo │ │ │ ├── MetaBO.java │ │ │ ├── RouterBO.java │ │ │ ├── SysConfigBO.java │ │ │ ├── SysDictTypeBO.java │ │ │ ├── SysMenuBO.java │ │ │ ├── SysNoticeBO.java │ │ │ ├── SysRoleMenuBO.java │ │ │ ├── SysUserRoleBO.java │ │ │ └── TreeSelectBO.java │ │ │ └── impl │ │ │ ├── SysConfigServiceImpl.java │ │ │ ├── SysDashboardServiceImpl.java │ │ │ ├── SysDictDataServiceImpl.java │ │ │ ├── SysDictTypeServiceImpl.java │ │ │ ├── SysMenuServiceImpl.java │ │ │ ├── SysNoticeServiceImpl.java │ │ │ ├── SysPermissionServiceImpl.java │ │ │ ├── SysRoleServiceImpl.java │ │ │ └── SysUserServiceImpl.java │ ├── dimple-system-web │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── com │ │ │ │ └── dimple │ │ │ │ └── system │ │ │ │ └── web │ │ │ │ ├── DimpleSystemApplication.java │ │ │ │ └── controller │ │ │ │ ├── SysConfigController.java │ │ │ │ ├── SysDashboardController.java │ │ │ │ ├── SysDictDataController.java │ │ │ │ ├── SysDictTypeController.java │ │ │ │ ├── SysMenuController.java │ │ │ │ ├── SysNoticeController.java │ │ │ │ ├── SysProfileController.java │ │ │ │ ├── SysRoleController.java │ │ │ │ ├── SysUserController.java │ │ │ │ └── vo │ │ │ │ ├── MetaVO.java │ │ │ │ ├── RouterVO.java │ │ │ │ ├── SysConfigVO.java │ │ │ │ ├── SysDictDataVO.java │ │ │ │ ├── SysDictTypeVO.java │ │ │ │ ├── SysMenuVO.java │ │ │ │ ├── SysNoticeVO.java │ │ │ │ ├── SysRoleVO.java │ │ │ │ ├── SysUserVO.java │ │ │ │ ├── TreeSelectVO.java │ │ │ │ └── params │ │ │ │ ├── SysConfigVOParams.java │ │ │ │ ├── SysDictDataVOParams.java │ │ │ │ ├── SysDictTypeVOParams.java │ │ │ │ ├── SysFileVOParams.java │ │ │ │ ├── SysMenuVOParams.java │ │ │ │ ├── SysNoticeVOParams.java │ │ │ │ ├── SysRoleVOParams.java │ │ │ │ ├── SysUserRoleVOParams.java │ │ │ │ └── SysUserVOParams.java │ │ │ └── resources │ │ │ ├── banner.txt │ │ │ ├── bootstrap.yml │ │ │ ├── logback.xml │ │ │ └── mapper │ │ │ └── system │ │ │ ├── SysConfigMapper.xml │ │ │ ├── SysDictDataMapper.xml │ │ │ ├── SysDictTypeMapper.xml │ │ │ ├── SysMenuMapper.xml │ │ │ ├── SysNoticeMapper.xml │ │ │ ├── SysRoleMapper.xml │ │ │ ├── SysRoleMenuMapper.xml │ │ │ ├── SysUserMapper.xml │ │ │ └── SysUserRoleMapper.xml │ └── pom.xml └── pom.xml ├── dimple-ui-admin ├── .editorconfig ├── .env.development ├── .env.production ├── .env.staging ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── README.md ├── babel.config.js ├── build │ └── index.js ├── package.json ├── public │ ├── favicon.ico │ ├── html │ │ └── ie.html │ ├── index.html │ └── robots.txt ├── src │ ├── App.vue │ ├── api │ │ ├── blog │ │ │ ├── about.js │ │ │ ├── article.js │ │ │ ├── category.js │ │ │ ├── comment.js │ │ │ ├── config.js │ │ │ ├── link.js │ │ │ └── tag.js │ │ ├── file │ │ │ └── file.js │ │ ├── log │ │ │ ├── jobLog.js │ │ │ ├── logininfor.js │ │ │ ├── operlog.js │ │ │ └── visitLog.js │ │ ├── login.js │ │ ├── menu.js │ │ ├── monitor │ │ │ ├── online.js │ │ │ └── redis.js │ │ ├── system │ │ │ ├── config.js │ │ │ ├── dashboard.js │ │ │ ├── dict │ │ │ │ ├── data.js │ │ │ │ └── type.js │ │ │ ├── menu.js │ │ │ ├── notice.js │ │ │ ├── role.js │ │ │ └── user.js │ │ └── tool │ │ │ └── job.js │ ├── assets │ │ ├── 401_images │ │ │ └── 401.gif │ │ ├── 404_images │ │ │ ├── 404.png │ │ │ └── 404_cloud.png │ │ ├── icons │ │ │ ├── index.js │ │ │ ├── svg │ │ │ │ ├── 404.svg │ │ │ │ ├── bug.svg │ │ │ │ ├── build.svg │ │ │ │ ├── button.svg │ │ │ │ ├── cascader.svg │ │ │ │ ├── chart.svg │ │ │ │ ├── checkbox.svg │ │ │ │ ├── client.svg │ │ │ │ ├── clipboard.svg │ │ │ │ ├── code.svg │ │ │ │ ├── color.svg │ │ │ │ ├── component.svg │ │ │ │ ├── dashboard.svg │ │ │ │ ├── date-range.svg │ │ │ │ ├── date.svg │ │ │ │ ├── dict.svg │ │ │ │ ├── documentation.svg │ │ │ │ ├── download.svg │ │ │ │ ├── drag.svg │ │ │ │ ├── druid.svg │ │ │ │ ├── edit.svg │ │ │ │ ├── education.svg │ │ │ │ ├── email.svg │ │ │ │ ├── example.svg │ │ │ │ ├── excel.svg │ │ │ │ ├── exit-fullscreen.svg │ │ │ │ ├── eye-open.svg │ │ │ │ ├── eye.svg │ │ │ │ ├── form.svg │ │ │ │ ├── fullscreen.svg │ │ │ │ ├── github.svg │ │ │ │ ├── guide.svg │ │ │ │ ├── icon.svg │ │ │ │ ├── input.svg │ │ │ │ ├── international.svg │ │ │ │ ├── job.svg │ │ │ │ ├── language.svg │ │ │ │ ├── link.svg │ │ │ │ ├── list.svg │ │ │ │ ├── lock.svg │ │ │ │ ├── log.svg │ │ │ │ ├── logininfor.svg │ │ │ │ ├── message.svg │ │ │ │ ├── money.svg │ │ │ │ ├── monitor.svg │ │ │ │ ├── nacos.svg │ │ │ │ ├── nested.svg │ │ │ │ ├── number.svg │ │ │ │ ├── online.svg │ │ │ │ ├── password.svg │ │ │ │ ├── pdf.svg │ │ │ │ ├── people.svg │ │ │ │ ├── peoples.svg │ │ │ │ ├── phone.svg │ │ │ │ ├── post.svg │ │ │ │ ├── qq.svg │ │ │ │ ├── question.svg │ │ │ │ ├── radio.svg │ │ │ │ ├── rate.svg │ │ │ │ ├── row.svg │ │ │ │ ├── search.svg │ │ │ │ ├── select.svg │ │ │ │ ├── sentinel.svg │ │ │ │ ├── server.svg │ │ │ │ ├── shopping.svg │ │ │ │ ├── size.svg │ │ │ │ ├── skill.svg │ │ │ │ ├── slider.svg │ │ │ │ ├── star.svg │ │ │ │ ├── swagger.svg │ │ │ │ ├── switch.svg │ │ │ │ ├── system.svg │ │ │ │ ├── tab.svg │ │ │ │ ├── table.svg │ │ │ │ ├── textarea.svg │ │ │ │ ├── theme.svg │ │ │ │ ├── time-range.svg │ │ │ │ ├── time.svg │ │ │ │ ├── tool.svg │ │ │ │ ├── tree-table.svg │ │ │ │ ├── tree.svg │ │ │ │ ├── upload.svg │ │ │ │ ├── user.svg │ │ │ │ ├── validCode.svg │ │ │ │ ├── wechat.svg │ │ │ │ └── zip.svg │ │ │ └── svgo.yml │ │ ├── images │ │ │ ├── dark.svg │ │ │ ├── dashboard.png │ │ │ ├── light.svg │ │ │ ├── login-background.jpg │ │ │ └── profile.png │ │ ├── login │ │ │ ├── qrcode-icon.png │ │ │ └── side-logo.png │ │ ├── logo │ │ │ └── logo.png │ │ └── styles │ │ │ ├── btn.scss │ │ │ ├── dimple.scss │ │ │ ├── element-ui.scss │ │ │ ├── element-variables.scss │ │ │ ├── index.scss │ │ │ ├── mixin.scss │ │ │ ├── sidebar.scss │ │ │ ├── transition.scss │ │ │ └── variables.scss │ ├── components │ │ ├── Breadcrumb │ │ │ └── index.vue │ │ ├── ChooseImg │ │ │ ├── components │ │ │ │ └── UploadImage │ │ │ │ │ └── index.vue │ │ │ └── index.vue │ │ ├── Crontab │ │ │ ├── day.vue │ │ │ ├── hour.vue │ │ │ ├── index.vue │ │ │ ├── min.vue │ │ │ ├── month.vue │ │ │ ├── result.vue │ │ │ ├── second.vue │ │ │ ├── week.vue │ │ │ └── year.vue │ │ ├── DictData │ │ │ └── index.js │ │ ├── DictTag │ │ │ └── index.vue │ │ ├── Dimple │ │ │ ├── Doc │ │ │ │ └── index.vue │ │ │ └── Git │ │ │ │ └── index.vue │ │ ├── Editor │ │ │ └── index.vue │ │ ├── FileUpload │ │ │ └── index.vue │ │ ├── Hamburger │ │ │ └── index.vue │ │ ├── HeaderSearch │ │ │ └── index.vue │ │ ├── IconSelect │ │ │ ├── index.vue │ │ │ └── requireIcons.js │ │ ├── ImagePreview │ │ │ └── index.vue │ │ ├── ImageUpload │ │ │ └── index.vue │ │ ├── MarkdownEditor │ │ │ ├── defaultOptions.js │ │ │ └── index.vue │ │ ├── Pagination │ │ │ └── index.vue │ │ ├── PanThumb │ │ │ └── index.vue │ │ ├── ParentView │ │ │ └── index.vue │ │ ├── RightPanel │ │ │ └── index.vue │ │ ├── RightToolbar │ │ │ └── index.vue │ │ ├── Screenfull │ │ │ └── index.vue │ │ ├── SizeSelect │ │ │ └── index.vue │ │ ├── SvgIcon │ │ │ └── index.vue │ │ ├── ThemePicker │ │ │ └── index.vue │ │ ├── TopNav │ │ │ └── index.vue │ │ └── iFrame │ │ │ └── index.vue │ ├── directive │ │ ├── dialog │ │ │ ├── drag.js │ │ │ ├── dragHeight.js │ │ │ └── dragWidth.js │ │ ├── index.js │ │ ├── module │ │ │ └── clipboard.js │ │ └── permission │ │ │ ├── hasPermi.js │ │ │ └── hasRole.js │ ├── layout │ │ ├── components │ │ │ ├── AppMain.vue │ │ │ ├── IframeToggle │ │ │ │ └── index.vue │ │ │ ├── InnerLink │ │ │ │ └── index.vue │ │ │ ├── Navbar.vue │ │ │ ├── Settings │ │ │ │ └── index.vue │ │ │ ├── Sidebar │ │ │ │ ├── FixiOSBug.js │ │ │ │ ├── Item.vue │ │ │ │ ├── Link.vue │ │ │ │ ├── Logo.vue │ │ │ │ ├── SidebarItem.vue │ │ │ │ └── index.vue │ │ │ ├── TagsView │ │ │ │ ├── ScrollPane.vue │ │ │ │ └── index.vue │ │ │ └── index.js │ │ ├── index.vue │ │ └── mixin │ │ │ └── ResizeHandler.js │ ├── main.js │ ├── permission.js │ ├── plugins │ │ ├── auth.js │ │ ├── cache.js │ │ ├── download.js │ │ ├── index.js │ │ ├── modal.js │ │ └── tab.js │ ├── router │ │ └── index.js │ ├── settings.js │ ├── store │ │ ├── getters.js │ │ ├── index.js │ │ └── modules │ │ │ ├── app.js │ │ │ ├── dict.js │ │ │ ├── permission.js │ │ │ ├── settings.js │ │ │ ├── tagsView.js │ │ │ └── user.js │ ├── utils │ │ ├── auth.js │ │ ├── dict │ │ │ ├── Dict.js │ │ │ ├── DictConverter.js │ │ │ ├── DictData.js │ │ │ ├── DictMeta.js │ │ │ ├── DictOptions.js │ │ │ └── index.js │ │ ├── dimple.js │ │ ├── errorCode.js │ │ ├── generator │ │ │ ├── config.js │ │ │ ├── css.js │ │ │ ├── drawingDefault.js │ │ │ ├── html.js │ │ │ ├── icon.json │ │ │ ├── js.js │ │ │ └── render.js │ │ ├── index.js │ │ ├── jsencrypt.js │ │ ├── permission.js │ │ ├── request.js │ │ ├── scroll-to.js │ │ └── validate.js │ └── views │ │ ├── blog │ │ ├── about │ │ │ └── index.vue │ │ ├── article │ │ │ ├── add.vue │ │ │ ├── components │ │ │ │ └── ArticleDetail.vue │ │ │ ├── edit.vue │ │ │ └── index.vue │ │ ├── category │ │ │ └── index.vue │ │ ├── comment │ │ │ └── index.vue │ │ ├── config │ │ │ ├── index.vue │ │ │ └── test │ │ ├── link │ │ │ └── index.vue │ │ └── tag │ │ │ └── index.vue │ │ ├── components │ │ └── icons │ │ │ ├── element-icons.js │ │ │ ├── index.vue │ │ │ └── svg-icons.js │ │ ├── dashboard │ │ ├── BarChart.vue │ │ ├── LineChart.vue │ │ ├── PanelGroup.vue │ │ ├── PieChart.vue │ │ ├── RaddarChart.vue │ │ └── mixins │ │ │ └── resize.js │ │ ├── error │ │ ├── 401.vue │ │ └── 404.vue │ │ ├── index.vue │ │ ├── index_v1.vue │ │ ├── log │ │ ├── joblog │ │ │ └── index.vue │ │ ├── logininfor │ │ │ └── index.vue │ │ ├── operlog │ │ │ └── index.vue │ │ └── visitlog │ │ │ └── index.vue │ │ ├── login │ │ ├── components │ │ │ ├── LoginForm.vue │ │ │ └── LoginQrcode.vue │ │ ├── index.scss │ │ └── index.vue │ │ ├── monitor │ │ ├── online │ │ │ └── index.vue │ │ └── redis │ │ │ └── index.vue │ │ ├── redirect.vue │ │ ├── register │ │ └── index.vue │ │ ├── system │ │ ├── config │ │ │ └── index.vue │ │ ├── dict │ │ │ ├── data.vue │ │ │ └── index.vue │ │ ├── menu │ │ │ └── index.vue │ │ ├── notice │ │ │ └── index.vue │ │ ├── role │ │ │ ├── authUser.vue │ │ │ ├── index.vue │ │ │ └── selectUser.vue │ │ └── user │ │ │ ├── authRole.vue │ │ │ ├── index.vue │ │ │ └── profile │ │ │ ├── index.vue │ │ │ ├── resetPwd.vue │ │ │ ├── userAvatar.vue │ │ │ └── userInfo.vue │ │ └── tool │ │ └── job │ │ └── index.vue └── vue.config.js ├── dimple-ui-blog ├── .babelrc ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .husky │ ├── commit-msg │ └── pre-commit ├── .postcssrc.js ├── .prettierrc ├── build │ ├── checkPort.js │ ├── setup-dev-server.js │ ├── vue-loader.config.js │ ├── webpack.base.config.js │ ├── webpack.client.config.js │ └── webpack.server.config.js ├── commitlint.config.js ├── config │ ├── env.dev.js │ └── env.prod.js ├── copy.js ├── ecosystem.config.js ├── package.json ├── server.js ├── sitemap.js ├── src │ ├── App.vue │ ├── api │ │ ├── about.js │ │ ├── archives.js │ │ ├── article.js │ │ ├── asyncData.js │ │ ├── category.js │ │ ├── comment.js │ │ ├── index.js │ │ ├── link.js │ │ ├── messageBoard.js │ │ ├── panel.js │ │ ├── tag.js │ │ └── visitor.js │ ├── app.js │ ├── assets │ │ ├── css │ │ │ ├── emoji-sprite.css │ │ │ └── prism.css │ │ ├── font │ │ │ └── sf-arch │ │ │ │ ├── SF Arch Rival Extended Bold-embed.css │ │ │ │ ├── SF Arch Rival Extended Bold.css │ │ │ │ ├── SF Arch Rival Extended Bold.eot │ │ │ │ ├── SF Arch Rival Extended Bold.svg │ │ │ │ ├── SF Arch Rival Extended Bold.ttf │ │ │ │ └── SF Arch Rival Extended Bold.woff │ │ ├── img │ │ │ ├── github.png │ │ │ ├── icp.png │ │ │ ├── loading-error.gif │ │ │ ├── loading.gif │ │ │ ├── qq.png │ │ │ └── share.png │ │ └── js │ │ │ ├── emoji-data.js │ │ │ └── prism.js │ ├── components │ │ ├── base │ │ │ └── miss.vue │ │ ├── dot │ │ │ └── index.vue │ │ ├── emoji │ │ │ └── index.vue │ │ ├── note │ │ │ └── index.vue │ │ ├── rating │ │ │ └── index.vue │ │ └── splitLine │ │ │ └── index.vue │ ├── entry-client.js │ ├── entry-server.js │ ├── index.template.html │ ├── mixins │ │ └── mergeAsyncData.js │ ├── router │ │ └── index.js │ ├── store │ │ ├── actions.js │ │ ├── index.js │ │ └── mutations.js │ ├── style │ │ ├── animation.scss │ │ ├── article.scss │ │ ├── function.scss │ │ ├── global.scss │ │ ├── index.scss │ │ ├── mixins.scss │ │ ├── reset.scss │ │ └── theme │ │ │ ├── dark │ │ │ ├── color.scss │ │ │ ├── font.scss │ │ │ └── index.scss │ │ │ ├── light │ │ │ ├── color.scss │ │ │ ├── font.scss │ │ │ └── index.scss │ │ │ └── map.scss │ ├── utils │ │ ├── cache.js │ │ ├── cls.js │ │ ├── dimple.js │ │ ├── errCodeBack.js │ │ ├── errorCode.js │ │ ├── generateTree.js │ │ ├── getElementTop.js │ │ ├── getRandomCharacter.js │ │ ├── getRandomColor.js │ │ ├── getScrollTop.js │ │ ├── lazyLoad.js │ │ ├── request.js │ │ ├── requestAnimation.js │ │ ├── scrollTo.js │ │ └── storage.js │ └── views │ │ ├── about │ │ └── index.vue │ │ ├── archives │ │ └── index.vue │ │ ├── article-filter │ │ └── index.vue │ │ ├── article │ │ ├── articleDetail.vue │ │ └── components │ │ │ ├── copyright.vue │ │ │ ├── prevnext.vue │ │ │ └── share.vue │ │ ├── category │ │ └── index.vue │ │ ├── components │ │ ├── article-iterator.vue │ │ ├── comments-item.vue │ │ ├── comments.vue │ │ ├── search.vue │ │ ├── site-introduction.vue │ │ ├── submit.vue │ │ ├── tags-iterator.vue │ │ └── third │ │ │ └── login.vue │ │ ├── home │ │ └── index.vue │ │ ├── layout │ │ ├── components │ │ │ ├── header │ │ │ │ └── index.vue │ │ │ └── navbar │ │ │ │ ├── horizontal-navbar.vue │ │ │ │ ├── index.vue │ │ │ │ └── vertical-navbar.vue │ │ └── index.vue │ │ ├── links │ │ └── index.vue │ │ ├── messageBoard │ │ └── index.vue │ │ ├── panel │ │ ├── components │ │ │ ├── panel-archives.vue │ │ │ ├── panel-articles.vue │ │ │ ├── panel-catalog.vue │ │ │ ├── panel-category.vue │ │ │ ├── panel-comments.vue │ │ │ ├── panel-introduction.vue │ │ │ ├── panel-tags.vue │ │ │ └── tree-folder.vue │ │ ├── index.vue │ │ └── style │ │ │ └── mixins.scss │ │ └── tags │ │ └── index.vue └── static │ ├── .gitkeep │ ├── 404.html │ ├── baidu_verify_codeva-xxgPlAP2QG.html │ ├── img │ ├── avatar │ │ ├── avatar.png │ │ ├── introduction-1.png │ │ ├── introduction-2.png │ │ └── introduction.png │ ├── cover │ │ ├── archive.jpg │ │ ├── articles.jpg │ │ ├── category.jpg │ │ ├── default.jpg │ │ ├── home.jpg │ │ ├── links.jpg │ │ ├── msgboard.jpg │ │ └── tags.jpg │ ├── favicon.ico │ └── favicon.png │ ├── js │ ├── qrcode.min.js │ └── ribbon.js │ ├── qc_back.html │ └── robots.txt ├── docker ├── .env ├── deploy.sh ├── dimple │ ├── auth │ │ ├── Dockerfile │ │ └── jar │ │ │ └── readme.txt │ ├── gateway │ │ ├── Dockerfile │ │ └── jar │ │ │ └── readme.txt │ └── modules │ │ ├── blog-front │ │ ├── Dockerfile │ │ └── jar │ │ │ └── readme.txt │ │ ├── blog │ │ ├── Dockerfile │ │ └── jar │ │ │ └── readme.txt │ │ ├── file │ │ ├── Dockerfile │ │ └── jar │ │ │ └── readme.txt │ │ ├── job │ │ ├── Dockerfile │ │ └── jar │ │ │ └── readme.txt │ │ ├── log │ │ ├── Dockerfile │ │ └── jar │ │ │ └── readme.txt │ │ ├── monitor │ │ ├── Dockerfile │ │ └── jar │ │ │ └── readme.txt │ │ └── system │ │ ├── Dockerfile │ │ └── jar │ │ └── readme.txt ├── docker-compose.yml ├── mysql │ ├── Dockerfile │ └── db │ │ └── readme.txt ├── nacos │ ├── Dockerfile │ └── conf │ │ └── application.properties ├── nginx │ ├── Dockerfile │ ├── conf.d │ │ ├── admin.conf │ │ └── blog.conf │ └── conf │ │ └── nginx.conf ├── node │ └── Dockerfile └── redis │ ├── Dockerfile │ └── conf │ └── redis.conf ├── pom.xml ├── readme.md └── sql ├── dimple.sql ├── dimple_blog.sql ├── dimple_nacos.sql ├── dimple_seata.sql └── quartz.sql /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | Use this section to tell people about which versions of your project are 6 | currently being supported with security updates. 7 | 8 | | Version | Supported | 9 | | ------- | ------------------ | 10 | | 5.1.x | :white_check_mark: | 11 | | 5.0.x | :x: | 12 | | 4.0.x | :white_check_mark: | 13 | | < 4.0 | :x: | 14 | 15 | ## Reporting a Vulnerability 16 | 17 | Use this section to tell people how to report a vulnerability. 18 | 19 | Tell them where to go, how often they can expect to get an update on a 20 | reported vulnerability, what to expect if the vulnerability is accepted or 21 | declined, etc. 22 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/bo/BlogArchiveItemBO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.bo; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.Date; 6 | 7 | /** 8 | * BlogArchiveItem 9 | * 10 | * @author Dimple 11 | * @date 3/7/2023 10:00 AM 12 | */ 13 | @Data 14 | public class BlogArchiveItemBO { 15 | private Long id; 16 | private String title; 17 | private String headerImage; 18 | private Date createTime; 19 | } 20 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/bo/BlogArchivesBO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.bo; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * ArchivesVO 9 | * 10 | * @author Dimple 11 | * @date 2/28/2023 11:07 AM 12 | */ 13 | @Data 14 | public class BlogArchivesBO { 15 | private Long count; 16 | 17 | private String dateStr; 18 | 19 | List items; 20 | } 21 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/bo/BlogArticleCategoryBO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.bo; 2 | 3 | import com.dimple.common.core.web.entity.BaseEntity; 4 | import lombok.Data; 5 | 6 | /** 7 | * 对象 blog_article_category 8 | * 9 | * @author Dimple 10 | * @date 2023-02-13 11 | */ 12 | @Data 13 | public class BlogArticleCategoryBO extends BaseEntity { 14 | 15 | 16 | private Long id; 17 | 18 | 19 | private Long articleId; 20 | 21 | 22 | private Long categoryId; 23 | } 24 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/bo/BlogArticlePreNextItemBO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.bo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * BlogArticlePreNextItemVO 9 | * 10 | * @author Dimple 11 | * @date 2/28/2023 1:43 PM 12 | */ 13 | @Data 14 | @AllArgsConstructor 15 | @NoArgsConstructor 16 | public class BlogArticlePreNextItemBO { 17 | private Long id; 18 | private String headImage; 19 | private String title; 20 | } 21 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/bo/BlogArticlePrevNextBO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.bo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * BlogArticlePrevNextVO 9 | * 10 | * @author Dimple 11 | * @date 2/28/2023 1:42 PM 12 | */ 13 | @Data 14 | @AllArgsConstructor 15 | @NoArgsConstructor 16 | public class BlogArticlePrevNextBO { 17 | private BlogArticlePreNextItemBO prev; 18 | private BlogArticlePreNextItemBO next; 19 | 20 | } 21 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/bo/BlogArticleTagBO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.bo; 2 | 3 | import com.dimple.common.core.web.entity.BaseEntity; 4 | import lombok.Data; 5 | 6 | 7 | /** 8 | * 对象 blog_article_tag 9 | * 10 | * @author Dimple 11 | * @date 2023-02-13 12 | */ 13 | @Data 14 | public class BlogArticleTagBO extends BaseEntity { 15 | 16 | private Long id; 17 | 18 | private Long articleId; 19 | 20 | private Long tagId; 21 | } 22 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/bo/BlogCategoryBO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.bo; 2 | 3 | import com.dimple.common.core.annotation.Excel; 4 | import com.dimple.common.core.web.entity.BaseEntity; 5 | import lombok.Data; 6 | 7 | import java.util.List; 8 | 9 | 10 | /** 11 | * blog category对象 blog_category 12 | * 13 | * @author Dimple 14 | * @date 2023-02-13 15 | */ 16 | @Data 17 | public class BlogCategoryBO extends BaseEntity { 18 | 19 | 20 | private Long id; 21 | 22 | /** 23 | * category title, max length is 255 24 | */ 25 | @Excel(name = "标题") 26 | private String title; 27 | 28 | private Long articleCount; 29 | 30 | private List articles; 31 | } 32 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/bo/BlogLinkBO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.bo; 2 | 3 | import com.dimple.common.core.web.entity.BaseEntity; 4 | import lombok.Data; 5 | 6 | import java.util.Date; 7 | 8 | /** 9 | * BlogLinkBO 10 | * 11 | * @author Dimple 12 | * @date 3/8/2023 7:55 PM 13 | */ 14 | @Data 15 | public class BlogLinkBO extends BaseEntity { 16 | private Long id; 17 | private String title; 18 | private String headerImage; 19 | private String description; 20 | private String url; 21 | private String email; 22 | private Integer linkStatus; 23 | private Long visitCount; 24 | private String createBy; 25 | private Date createTime; 26 | private String updateBy; 27 | private Date updateTime; 28 | private String emailContent; 29 | } 30 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/bo/BlogTagBO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.bo; 2 | 3 | import com.dimple.common.core.annotation.Excel; 4 | import com.dimple.common.core.web.entity.BaseEntity; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | 9 | /** 10 | * 对象 blog_tag 11 | * 12 | * @author Dimple 13 | * @date 2023-02-13 14 | */ 15 | @Data 16 | @NoArgsConstructor 17 | public class BlogTagBO extends BaseEntity { 18 | 19 | 20 | private Long id; 21 | 22 | /** 23 | * the article tag 24 | */ 25 | @Excel(name = "标题") 26 | private String title; 27 | 28 | public BlogTagBO(String title) { 29 | this.title = title; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/bo/BlogTagDTO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.bo; 2 | 3 | import com.dimple.common.core.web.page.PageDomain; 4 | import lombok.Data; 5 | 6 | @Data 7 | public class BlogTagDTO extends PageDomain { 8 | private String title; 9 | } 10 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/bo/GithubVisitorInfoBO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.bo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * GithubVisitorInfoBO 7 | * 8 | * @author Dimple 9 | * @date 2023/3/14 13:35 10 | */ 11 | @Data 12 | public class GithubVisitorInfoBO { 13 | private String loginUsername; 14 | private String username; 15 | /** 16 | * linkUrl 17 | */ 18 | private String link; 19 | 20 | private String email; 21 | 22 | private String avatars; 23 | 24 | private Long id; 25 | } 26 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/bo/KeyValue.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.bo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * KeyValue 7 | * 8 | * @author Dimple 9 | * @date 3/2/2023 5:19 PM 10 | */ 11 | @Data 12 | public class KeyValue { 13 | private K key; 14 | private V value; 15 | } 16 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/bo/config/BlogGlobalConfig.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.bo.config; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * BlogConfig 7 | * 8 | * @author Dimple 9 | * @date 3/29/2023 10 | */ 11 | @Data 12 | public class BlogGlobalConfig { 13 | private SiteConfig siteConfig; 14 | private CommentConfig commentConfig; 15 | private EmailConfig emailConfig; 16 | } 17 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/bo/config/CommentConfig.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.bo.config; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * CommentConfig 7 | * 8 | * @author Dimple 9 | * @date 3/29/2023 10 | */ 11 | @Data 12 | public class CommentConfig { 13 | private boolean enableLocalLogin; 14 | private boolean enableGithubLogin; 15 | private boolean enableQQLogin; 16 | private GithubLoginConfig githubLoginConfig; 17 | } 18 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/bo/config/EmailConfig.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.bo.config; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * EmailConfig 7 | * 8 | * @author Dimple 9 | * @date 3/30/2023 10 | */ 11 | @Data 12 | public class EmailConfig { 13 | private String host; 14 | private Integer port; 15 | private String username; 16 | private String password; 17 | } 18 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/bo/config/GithubLoginConfig.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.bo.config; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * GithubLoginConfig 7 | * 8 | * @author Dimple 9 | * @date 3/29/2023 10 | */ 11 | @Data 12 | public class GithubLoginConfig { 13 | private String adminId; 14 | private String clientId; 15 | private String clientSecrets; 16 | private String accessTokenUrl; 17 | private String loginUrl; 18 | private String userInfoUrl; 19 | } 20 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/bo/config/SiteConfig.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.bo.config; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * SiteConfig 9 | * 10 | * @author Dimple 11 | * @date 3/29/2023 12 | */ 13 | @Data 14 | public class SiteConfig { 15 | private boolean mask; 16 | private String infoPanel; 17 | private String siteName; 18 | private String avatars; 19 | private String icp; 20 | private String githubUrl; 21 | private String copyright; 22 | private String githubUserName; 23 | private List> lables; 24 | } 25 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/factory/RemoteBlogCategoryServiceFallbackFactory.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.factory; 2 | 3 | import com.dimple.blog.api.RemoteBlogCategoryService; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.springframework.cloud.openfeign.FallbackFactory; 6 | import org.springframework.stereotype.Component; 7 | 8 | /** 9 | * Blog服务降级处理 10 | * 11 | * @author Dimple 12 | */ 13 | @Component 14 | @Slf4j 15 | public class RemoteBlogCategoryServiceFallbackFactory implements FallbackFactory { 16 | @Override 17 | public RemoteBlogCategoryService create(Throwable cause) { 18 | log.error("博客服务调用失败:{}", cause.getMessage()); 19 | return (blogCategory, source) -> null; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/factory/RemoteBlogConfigServiceFallbackFactory.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.factory; 2 | 3 | import com.dimple.blog.api.RemoteBlogConfigService; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.springframework.cloud.openfeign.FallbackFactory; 6 | import org.springframework.stereotype.Component; 7 | 8 | /** 9 | * Blog服务降级处理 10 | * 11 | * @author Dimple 12 | */ 13 | @Component 14 | @Slf4j 15 | public class RemoteBlogConfigServiceFallbackFactory implements FallbackFactory { 16 | @Override 17 | public RemoteBlogConfigService create(Throwable cause) { 18 | log.error("博客服务调用失败:{}", cause.getMessage()); 19 | return source -> null; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/model/BlogArticleDTO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.model; 2 | 3 | import com.dimple.common.core.web.page.PageDomain; 4 | import lombok.Data; 5 | 6 | @Data 7 | public class BlogArticleDTO extends PageDomain { 8 | private Long id; 9 | 10 | /** 11 | * article title 12 | */ 13 | private String title; 14 | 15 | private Long categoryId; 16 | 17 | private String summary; 18 | } 19 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/model/BlogCategoryDTO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.model; 2 | 3 | import com.dimple.common.core.web.page.PageDomain; 4 | import lombok.Data; 5 | 6 | @Data 7 | public class BlogCategoryDTO extends PageDomain { 8 | private Long id; 9 | 10 | /** 11 | * category title, max length is 255 12 | */ 13 | private String title; 14 | } 15 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/model/BlogCommentDTO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.model; 2 | 3 | import com.dimple.common.core.web.page.PageDomain; 4 | import lombok.Data; 5 | 6 | @Data 7 | public class BlogCommentDTO extends PageDomain { 8 | /** 9 | * comment article id 10 | */ 11 | private Long articleId; 12 | } 13 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/java/com/dimple/blog/api/model/BlogLinkDTO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.api.model; 2 | 3 | import com.dimple.common.core.web.page.PageDomain; 4 | import lombok.Data; 5 | 6 | @Data 7 | public class BlogLinkDTO extends PageDomain { 8 | } 9 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-blog/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | com.dimple.blog.api.factory.RemoteBlogArchiveServiceFallbackFactory 2 | com.dimple.blog.api.factory.RemoteBlogArticleServiceFallbackFactory 3 | com.dimple.blog.api.factory.RemoteBlogCategoryServiceFallbackFactory 4 | com.dimple.blog.api.factory.RemoteBlogCommentServiceFallbackFactory 5 | com.dimple.blog.api.factory.RemoteBlogLinkServiceFallbackFactory 6 | com.dimple.blog.api.factory.RemoteBlogConfigServiceFallbackFactory 7 | com.dimple.blog.api.factory.RemoteBlogTagServiceFallbackFactory 8 | 9 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-system/src/main/java/com/dimple/system/api/factory/RemoteDictFallbackFactory.java: -------------------------------------------------------------------------------- 1 | package com.dimple.system.api.factory; 2 | 3 | import com.dimple.system.api.RemoteDictService; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.springframework.cloud.openfeign.FallbackFactory; 6 | import org.springframework.stereotype.Component; 7 | 8 | import java.util.ArrayList; 9 | 10 | /** 11 | * 文件服务降级处理 12 | * 13 | * @author Dimple 14 | */ 15 | @Component 16 | @Slf4j 17 | public class RemoteDictFallbackFactory implements FallbackFactory { 18 | 19 | @Override 20 | public RemoteDictService create(Throwable cause) { 21 | log.error("字典服务调用失败:{}", cause.getMessage()); 22 | return (type, source) -> new ArrayList<>(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-system/src/main/java/com/dimple/system/api/model/SysFileBO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.system.api.model; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 文件信息 7 | * 8 | * @author Dimple 9 | */ 10 | @Data 11 | public class SysFileBO { 12 | private Long id; 13 | /** 14 | * 文件名称 15 | */ 16 | private String name; 17 | 18 | /** 19 | * 文件地址 20 | */ 21 | private String url; 22 | 23 | 24 | private String extension; 25 | 26 | /** 27 | * local or qiNiu 28 | */ 29 | private String type; 30 | 31 | /** 32 | * if type is qiNiu, the path value is file name. 33 | * if type is local, the path value is local path 34 | */ 35 | private String path; 36 | } 37 | -------------------------------------------------------------------------------- /dimple-api/dimple-api-system/src/main/java/com/dimple/system/api/model/SysLogininforBO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.system.api.model; 2 | 3 | import com.dimple.common.core.web.entity.BaseEntity; 4 | import lombok.Data; 5 | 6 | import java.util.Date; 7 | 8 | /** 9 | * 系统访问记录表 sys_logininfor 10 | * 11 | * @author Dimple 12 | */ 13 | @Data 14 | public class SysLogininforBO extends BaseEntity { 15 | private static final long serialVersionUID = 1L; 16 | 17 | /** 18 | * ID 19 | */ 20 | private Long id; 21 | 22 | /** 23 | * 用户账号 24 | */ 25 | private String userName; 26 | 27 | /** 28 | * 状态 0成功 1失败 29 | */ 30 | private String status; 31 | 32 | /** 33 | * 地址 34 | */ 35 | private String ip; 36 | 37 | /** 38 | * 描述 39 | */ 40 | private String msg; 41 | } -------------------------------------------------------------------------------- /dimple-api/dimple-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | com.dimple.system.api.factory.RemoteUserFallbackFactory 2 | com.dimple.system.api.factory.RemoteLogFallbackFactory 3 | com.dimple.system.api.factory.RemoteFileFallbackFactory 4 | com.dimple.system.api.factory.RemoteDictFallbackFactory 5 | -------------------------------------------------------------------------------- /dimple-api/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | com.dimple 6 | dimple 7 | 3.1.0 8 | 9 | 4.0.0 10 | 11 | 12 | dimple-api-system 13 | dimple-api-blog 14 | 15 | 16 | dimple-api 17 | pom 18 | 19 | 20 | Dimple-api系统接口 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /dimple-auth/src/main/java/com/dimple/auth/DimpleAuthApplication.java: -------------------------------------------------------------------------------- 1 | package com.dimple.auth; 2 | 3 | import com.dimple.common.security.annotation.EnableDimpleFeignClients; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; 7 | 8 | /** 9 | * 认证授权中心 10 | * 11 | * @author Dimple 12 | */ 13 | @EnableDimpleFeignClients 14 | @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}, scanBasePackages = {"com.dimple.auth"}) 15 | public class DimpleAuthApplication { 16 | public static void main(String[] args) { 17 | SpringApplication.run(DimpleAuthApplication.class, args); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /dimple-auth/src/main/java/com/dimple/auth/form/LoginBody.java: -------------------------------------------------------------------------------- 1 | package com.dimple.auth.form; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 用户登录对象 7 | * 8 | * @author Dimple 9 | */ 10 | @Data 11 | public class LoginBody { 12 | /** 13 | * 用户名 14 | */ 15 | private String username; 16 | 17 | /** 18 | * 用户密码 19 | */ 20 | private String password; 21 | 22 | } 23 | -------------------------------------------------------------------------------- /dimple-auth/src/main/java/com/dimple/auth/form/RegisterBody.java: -------------------------------------------------------------------------------- 1 | package com.dimple.auth.form; 2 | 3 | /** 4 | * 用户注册对象 5 | * 6 | * @author Dimple 7 | */ 8 | public class RegisterBody extends LoginBody { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /dimple-auth/src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | Spring Boot Version: ${spring-boot.version} 2 | Spring Application Name: ${spring.application.name} 3 | ██ ██ ██ ██ ██ 4 | ░██░░ ██████ ░██ ░██ ░██ 5 | ░██ ██ ██████████ ░██░░░██ ░██ █████ ██████ ██ ██ ██████░██ 6 | ██████░██░░██░░██░░██░██ ░██ ░██ ██░░░██ █████ ░░░░░░██ ░██ ░██░░░██░ ░██████ 7 | ██░░░██░██ ░██ ░██ ░██░██████ ░██░███████░░░░░ ███████ ░██ ░██ ░██ ░██░░░██ 8 | ░██ ░██░██ ░██ ░██ ░██░██░░░ ░██░██░░░░ ██░░░░██ ░██ ░██ ░██ ░██ ░██ 9 | ░░██████░██ ███ ░██ ░██░██ ███░░██████ ░░████████░░██████ ░░██ ░██ ░██ 10 | ░░░░░░ ░░ ░░░ ░░ ░░ ░░ ░░░ ░░░░░░ ░░░░░░░░ ░░░░░░ ░░ ░░ ░░ 11 | -------------------------------------------------------------------------------- /dimple-auth/src/main/resources/bootstrap.yml: -------------------------------------------------------------------------------- 1 | # Tomcat 2 | server: 3 | port: 9200 4 | 5 | # Spring 6 | spring: 7 | application: 8 | # 应用名称 9 | name: dimple-auth 10 | profiles: 11 | # 环境配置 12 | active: dev 13 | cloud: 14 | nacos: 15 | discovery: 16 | # 服务注册地址 17 | server-addr: dimple-nacos:8848 18 | namespace: 63c3335c-2ba4-42c7-b05c-d8c62c1ac5a8 19 | config: 20 | # 配置中心地址 21 | server-addr: dimple-nacos:8848 22 | # 配置文件格式 23 | file-extension: yml 24 | # 共享配置 25 | shared-configs: 26 | - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} 27 | namespace: 63c3335c-2ba4-42c7-b05c-d8c62c1ac5a8 -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/annotation/Excels.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * Excel注解集 10 | * 11 | * @author Dimple 12 | */ 13 | @Target(ElementType.FIELD) 14 | @Retention(RetentionPolicy.RUNTIME) 15 | public @interface Excels { 16 | Excel[] value(); 17 | } -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/constant/ServiceNameConstants.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.constant; 2 | 3 | /** 4 | * 服务名称 5 | * 6 | * @author Dimple 7 | */ 8 | public class ServiceNameConstants { 9 | 10 | /** 11 | * 系统模块的serviceid 12 | */ 13 | public static final String SYSTEM_SERVICE = "dimple-system"; 14 | public static final String LOG_SERVICE = "dimple-log"; 15 | public static final String BLOG_SERVICE = "dimple-blog"; 16 | 17 | /** 18 | * 文件服务的serviceid 19 | */ 20 | public static final String FILE_SERVICE = "dimple-file"; 21 | } 22 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/constant/TokenConstants.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.constant; 2 | 3 | /** 4 | * Token的Key常量 5 | * 6 | * @author Dimple 7 | */ 8 | public class TokenConstants { 9 | /** 10 | * 令牌自定义标识 11 | */ 12 | public static final String AUTHENTICATION = "Authorization"; 13 | 14 | /** 15 | * 令牌前缀 16 | */ 17 | public static final String PREFIX = "Bearer "; 18 | 19 | /** 20 | * 令牌秘钥 21 | */ 22 | public final static String SECRET = "abcdefghijklmnopqrstuvwxyz"; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/domain/ResponseEntity.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.domain; 2 | 3 | import com.dimple.common.core.constant.HttpStatus; 4 | import lombok.Data; 5 | 6 | /** 7 | * ResponseEntity 8 | * 9 | * @author Dimple 10 | * @date 12/23/2022 2:34 PM 11 | */ 12 | @Data 13 | public class ResponseEntity { 14 | private int code; 15 | 16 | private String msg; 17 | 18 | private T data; 19 | 20 | private T rows; 21 | 22 | private Long total; 23 | 24 | public boolean isOk() { 25 | return this.code == HttpStatus.SUCCESS; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/enums/BlogArticleStatus.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * ArticleStatus 8 | * 9 | * @author Dimple 10 | */ 11 | @AllArgsConstructor 12 | @Getter 13 | public enum BlogArticleStatus { 14 | /** 15 | * 1 published 16 | */ 17 | PUBLISHED(1), 18 | 19 | /** 20 | * 2 draft 21 | */ 22 | DRAFT(2), 23 | ; 24 | private Integer status; 25 | } 26 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/enums/BlogCommentType.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * BlogCommentType 8 | * 9 | * @author Dimple 10 | * @date 2023/3/15 11 | */ 12 | @AllArgsConstructor 13 | @Getter 14 | public enum BlogCommentType { 15 | LOCAL(0), 16 | GITHUB(1), 17 | QQ(2),; 18 | private Integer type; 19 | } 20 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/enums/BlogLinkStatus.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * BlogLinkStatus 8 | * 9 | * @author Dimple 10 | * @date 3/8/2023 7:56 PM 11 | */ 12 | @AllArgsConstructor 13 | @Getter 14 | public enum BlogLinkStatus { 15 | PENDING(1), 16 | REJECTED(2), 17 | APPROVE(3); 18 | 19 | private Integer status; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/enums/UserStatus.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * 用户状态 8 | * 9 | * @author Dimple 10 | */ 11 | @AllArgsConstructor 12 | @Getter 13 | public enum UserStatus { 14 | OK("0", "正常"), DISABLE("1", "停用"), DELETED("2", "删除"); 15 | 16 | private final String code; 17 | private final String info; 18 | } 19 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/exception/CaptchaException.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.exception; 2 | 3 | /** 4 | * 验证码错误异常类 5 | * 6 | * @author Dimple 7 | */ 8 | public class CaptchaException extends RuntimeException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | public CaptchaException(String msg) { 12 | super(msg); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/exception/CheckedException.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.exception; 2 | 3 | /** 4 | * 检查异常 5 | * 6 | * @author Dimple 7 | */ 8 | public class CheckedException extends RuntimeException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | public CheckedException(String message) { 12 | super(message); 13 | } 14 | 15 | public CheckedException(Throwable cause) { 16 | super(cause); 17 | } 18 | 19 | public CheckedException(String message, Throwable cause) { 20 | super(message, cause); 21 | } 22 | 23 | public CheckedException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { 24 | super(message, cause, enableSuppression, writableStackTrace); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/exception/DemoModeException.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.exception; 2 | 3 | /** 4 | * 演示模式异常 5 | * 6 | * @author Dimple 7 | */ 8 | public class DemoModeException extends RuntimeException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | public DemoModeException() { 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/exception/InnerAuthException.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.exception; 2 | 3 | /** 4 | * 内部认证异常 5 | * 6 | * @author Dimple 7 | */ 8 | public class InnerAuthException extends RuntimeException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | public InnerAuthException(String message) { 12 | super(message); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/exception/PreAuthorizeException.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.exception; 2 | 3 | /** 4 | * 权限异常 5 | * 6 | * @author Dimple 7 | */ 8 | public class PreAuthorizeException extends RuntimeException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | public PreAuthorizeException() { 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/exception/UtilException.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.exception; 2 | 3 | /** 4 | * 工具类异常 5 | * 6 | * @author Dimple 7 | */ 8 | public class UtilException extends RuntimeException { 9 | private static final long serialVersionUID = 8247610319171014183L; 10 | 11 | public UtilException(Throwable e) { 12 | super(e.getMessage(), e); 13 | } 14 | 15 | public UtilException(String message) { 16 | super(message); 17 | } 18 | 19 | public UtilException(String message, Throwable throwable) { 20 | super(message, throwable); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/exception/article/ArticleNotFoundException.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.exception.article; 2 | 3 | /** 4 | * Article Not Found Exception 5 | * 6 | * @author Dimple 7 | */ 8 | public class ArticleNotFoundException extends RuntimeException { 9 | 10 | public ArticleNotFoundException() { 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/exception/auth/NotLoginException.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.exception.auth; 2 | 3 | /** 4 | * 未能通过的登录认证异常 5 | * 6 | * @author Dimple 7 | */ 8 | public class NotLoginException extends RuntimeException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | public NotLoginException(String message) { 12 | super(message); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/exception/auth/NotPermissionException.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.exception.auth; 2 | 3 | import org.apache.commons.lang3.StringUtils; 4 | 5 | /** 6 | * 未能通过的权限认证异常 7 | * 8 | * @author Dimple 9 | */ 10 | public class NotPermissionException extends RuntimeException { 11 | private static final long serialVersionUID = 1L; 12 | 13 | public NotPermissionException(String permission) { 14 | super(permission); 15 | } 16 | 17 | public NotPermissionException(String[] permissions) { 18 | super(StringUtils.join(permissions, ",")); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/exception/auth/NotRoleException.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.exception.auth; 2 | 3 | import org.apache.commons.lang3.StringUtils; 4 | 5 | /** 6 | * 未能通过的角色认证异常 7 | * 8 | * @author Dimple 9 | */ 10 | public class NotRoleException extends RuntimeException { 11 | private static final long serialVersionUID = 1L; 12 | 13 | public NotRoleException(String role) { 14 | super(role); 15 | } 16 | 17 | public NotRoleException(String[] roles) { 18 | super(StringUtils.join(roles, ",")); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/exception/file/FileException.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.exception.file; 2 | 3 | import com.dimple.common.core.exception.base.BaseException; 4 | 5 | /** 6 | * 文件信息异常类 7 | * 8 | * @author Dimple 9 | */ 10 | public class FileException extends BaseException { 11 | private static final long serialVersionUID = 1L; 12 | 13 | public FileException(String code, Object[] args) { 14 | super("file", code, args, null); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/exception/file/FileNameLengthLimitExceededException.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.exception.file; 2 | 3 | /** 4 | * 文件名称超长限制异常类 5 | * 6 | * @author Dimple 7 | */ 8 | public class FileNameLengthLimitExceededException extends FileException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | public FileNameLengthLimitExceededException(int defaultFileNameLength) { 12 | super("upload.filename.exceed.length", new Object[]{defaultFileNameLength}); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/exception/file/FileSizeLimitExceededException.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.exception.file; 2 | 3 | /** 4 | * 文件名大小限制异常类 5 | * 6 | * @author Dimple 7 | */ 8 | public class FileSizeLimitExceededException extends FileException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | public FileSizeLimitExceededException(long defaultMaxSize) { 12 | super("upload.exceed.maxSize", new Object[]{defaultMaxSize}); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/exception/job/TaskException.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.exception.job; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * 计划策略异常 7 | * 8 | * @author Dimple 9 | */ 10 | public class TaskException extends Exception { 11 | private static final long serialVersionUID = 1L; 12 | 13 | @Getter 14 | private Code code; 15 | 16 | public TaskException(String msg, Code code) { 17 | this(msg, code, null); 18 | } 19 | 20 | public TaskException(String msg, Code code, Exception nestedEx) { 21 | super(msg, nestedEx); 22 | this.code = code; 23 | } 24 | 25 | 26 | public enum Code { 27 | TASK_EXISTS, NO_TASK_EXISTS, TASK_ALREADY_STARTED, UNKNOWN, CONFIG_ERROR, TASK_NODE_NOT_AVAILABLE 28 | } 29 | } -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/exception/user/CaptchaExpireException.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.exception.user; 2 | 3 | /** 4 | * 验证码失效异常类 5 | * 6 | * @author Dimple 7 | */ 8 | public class CaptchaExpireException extends UserException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | public CaptchaExpireException() { 12 | super("user.jcaptcha.expire", null); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/exception/user/UserException.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.exception.user; 2 | 3 | import com.dimple.common.core.exception.base.BaseException; 4 | 5 | /** 6 | * 用户信息异常类 7 | * 8 | * @author Dimple 9 | */ 10 | public class UserException extends BaseException { 11 | private static final long serialVersionUID = 1L; 12 | 13 | public UserException(String code, Object[] args) { 14 | super("user", code, args, null); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/exception/user/UserPasswordNotMatchException.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.exception.user; 2 | 3 | /** 4 | * 用户密码不正确或不符合规范异常类 5 | * 6 | * @author Dimple 7 | */ 8 | public class UserPasswordNotMatchException extends UserException { 9 | private static final long serialVersionUID = 1L; 10 | 11 | public UserPasswordNotMatchException() { 12 | super("user.password.not.match", null); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/utils/bean/BeanValidators.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.utils.bean; 2 | 3 | import javax.validation.ConstraintViolation; 4 | import javax.validation.ConstraintViolationException; 5 | import javax.validation.Validator; 6 | import java.util.Set; 7 | 8 | /** 9 | * bean对象属性验证 10 | * 11 | * @author Dimple 12 | */ 13 | public class BeanValidators { 14 | public static void validateWithException(Validator validator, Object object, Class... groups) 15 | throws ConstraintViolationException { 16 | Set> constraintViolations = validator.validate(object, groups); 17 | if (!constraintViolations.isEmpty()) { 18 | throw new ConstraintViolationException(constraintViolations); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/utils/ip/IpLocationInfo.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.utils.ip; 2 | 3 | import com.dimple.common.core.utils.StringUtils; 4 | import lombok.Data; 5 | 6 | /** 7 | * IpLocationInfo 8 | * 9 | * @author Dimple 10 | * @date 2023/3/15 11 | */ 12 | @Data 13 | public class IpLocationInfo { 14 | private String country; 15 | private String region; 16 | private String province; 17 | private String city; 18 | private String isp; 19 | 20 | public String getLocationInfo() { 21 | return StringUtils.format("{}-{}-{}-{}", country, province, city, isp); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/java/com/dimple/common/core/utils/poi/ExcelHandlerAdapter.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.utils.poi; 2 | 3 | /** 4 | * Excel数据格式处理适配器 5 | * 6 | * @author Dimple 7 | */ 8 | public interface ExcelHandlerAdapter { 9 | /** 10 | * 格式化 11 | * 12 | * @param value 单元格数据值 13 | * @param args excel注解args参数组 14 | * @return 处理后的值 15 | */ 16 | Object format(Object value, String[] args); 17 | } 18 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | com.dimple.common.core.utils.SpringUtils 2 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/main/resources/ip2region/ip2region.xdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-common/dimple-common-core/src/main/resources/ip2region/ip2region.xdb -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/test/java/com/dimple/common/core/utils/beans/Car.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.utils.beans; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.NoArgsConstructor; 5 | import lombok.experimental.Accessors; 6 | 7 | /** 8 | * Cat 9 | * 10 | * @author Dimple 11 | * @date 12/26/2022 8:57 AM 12 | */ 13 | @NoArgsConstructor 14 | @AllArgsConstructor 15 | @Accessors(chain = true) 16 | public class Car { 17 | private String brand; 18 | 19 | private String type; 20 | } 21 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/test/java/com/dimple/common/core/utils/beans/Person.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.utils.beans; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | import lombok.ToString; 7 | import lombok.experimental.Accessors; 8 | 9 | import java.time.LocalDateTime; 10 | import java.util.List; 11 | 12 | /** 13 | * Person 14 | * 15 | * @author Dimple 16 | * @date 12/26/2022 8:56 AM 17 | */ 18 | @Data 19 | @AllArgsConstructor 20 | @NoArgsConstructor 21 | @ToString 22 | @Accessors(chain = true) 23 | public class Person { 24 | private String name; 25 | 26 | private Integer age; 27 | 28 | private List carList; 29 | 30 | private LocalDateTime birthday; 31 | } 32 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-core/src/test/java/com/dimple/common/core/utils/beans/PersonVO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.core.utils.beans; 2 | 3 | import lombok.Data; 4 | 5 | import java.time.LocalDateTime; 6 | import java.util.List; 7 | 8 | /** 9 | * PersonVO 10 | * 11 | * @author Dimple 12 | * @date 12/26/2022 8:57 AM 13 | */ 14 | @Data 15 | public class PersonVO { 16 | private List carList; 17 | private LocalDateTime birthday; 18 | } 19 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-datascope/src/main/java/com/dimple/common/datascope/annotation/DataScope.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.datascope.annotation; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * 数据权限过滤注解 11 | * 12 | * @author Dimple 13 | */ 14 | @Target(ElementType.METHOD) 15 | @Retention(RetentionPolicy.RUNTIME) 16 | @Documented 17 | public @interface DataScope { 18 | /** 19 | * 用户表的别名 20 | */ 21 | String userAlias() default ""; 22 | 23 | /** 24 | * 权限字符(用于多个角色匹配符合要求的权限)默认根据权限注解@RequiresPermissions获取,多个权限用逗号分隔开来 25 | */ 26 | String permission() default ""; 27 | } 28 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-datascope/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | com.dimple.common.datascope.aspect.DataScopeAspect 2 | com.dimple.common.datascope.aspect.MybatisInterceptor 3 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-datasource/src/main/java/com/dimple/common/datasource/annotation/Master.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.datasource.annotation; 2 | 3 | import com.baomidou.dynamic.datasource.annotation.DS; 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 | * 主库数据源 13 | * 14 | * @author Dimple 15 | */ 16 | @Target({ElementType.TYPE, ElementType.METHOD}) 17 | @Retention(RetentionPolicy.RUNTIME) 18 | @Documented 19 | @DS("master") 20 | public @interface Master { 21 | 22 | } -------------------------------------------------------------------------------- /dimple-common/dimple-common-datasource/src/main/java/com/dimple/common/datasource/annotation/Slave.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.datasource.annotation; 2 | 3 | import com.baomidou.dynamic.datasource.annotation.DS; 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 | * 从库数据源 13 | * 14 | * @author Dimple 15 | */ 16 | @Target({ElementType.TYPE, ElementType.METHOD}) 17 | @Retention(RetentionPolicy.RUNTIME) 18 | @Documented 19 | @DS("slave") 20 | public @interface Slave { 21 | 22 | } -------------------------------------------------------------------------------- /dimple-common/dimple-common-log/src/main/java/com/dimple/common/log/enums/BusinessStatus.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.log.enums; 2 | 3 | /** 4 | * 操作状态 5 | * 6 | * @author Dimple 7 | */ 8 | public enum BusinessStatus { 9 | /** 10 | * 成功 11 | */ 12 | SUCCESS, 13 | 14 | /** 15 | * 失败 16 | */ 17 | FAIL, 18 | } 19 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-log/src/main/java/com/dimple/common/log/enums/OperatorType.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.log.enums; 2 | 3 | /** 4 | * 操作人类别 5 | * 6 | * @author Dimple 7 | */ 8 | public enum OperatorType { 9 | /** 10 | * 其它 11 | */ 12 | OTHER, 13 | 14 | /** 15 | * 后台用户 16 | */ 17 | MANAGE, 18 | 19 | /** 20 | * 手机端用户 21 | */ 22 | MOBILE 23 | } 24 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-log/src/main/java/com/dimple/common/log/enums/RequestType.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.log.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * RequestType 8 | * 9 | * @author Dimple 10 | */ 11 | @AllArgsConstructor 12 | @Getter 13 | public enum RequestType { 14 | PAGE_REQUEST(1), 15 | API_REQUEST(0); 16 | private Integer code; 17 | } 18 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-log/src/main/java/com/dimple/common/log/filter/PropertyPreExcludeFilter.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.log.filter; 2 | 3 | import com.alibaba.fastjson2.filter.SimplePropertyPreFilter; 4 | 5 | /** 6 | * 排除JSON敏感属性 7 | * 8 | * @author Dimple 9 | */ 10 | public class PropertyPreExcludeFilter extends SimplePropertyPreFilter { 11 | public PropertyPreExcludeFilter() { 12 | } 13 | 14 | public PropertyPreExcludeFilter addExcludes(String... filters) { 15 | for (int i = 0; i < filters.length; i++) { 16 | this.getExcludes().add(filters[i]); 17 | } 18 | return this; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | com.dimple.common.log.service.AsyncLogService 2 | com.dimple.common.log.aspect.OperateLogAspect 3 | com.dimple.common.log.aspect.VisitLogAspect 4 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-redis/src/main/java/com/dimple/common/redis/core/RedisKeyRegistry.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.redis.core; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * RedisKeyRegistry 8 | * 9 | * @author Dimple 10 | * @date 2/22/2023 2:51 PM 11 | */ 12 | public class RedisKeyRegistry { 13 | /** 14 | * Redis RedisKeyDefine 数组 15 | */ 16 | private static final List DEFINES = new ArrayList<>(); 17 | 18 | public static void add(RedisKeyDefine define) { 19 | DEFINES.add(define); 20 | } 21 | 22 | public static List list() { 23 | return DEFINES; 24 | } 25 | 26 | public static int size() { 27 | return DEFINES.size(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-redis/src/main/java/com/dimple/common/redis/core/RedisKeyTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.redis.core; 2 | 3 | import com.fasterxml.jackson.annotation.JsonValue; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | 7 | /** 8 | * KeyTypeEnum 9 | * 10 | * @author Dimple 11 | * @date 2/22/2023 2:51 PM 12 | */ 13 | @Getter 14 | @AllArgsConstructor 15 | public enum RedisKeyTypeEnum { 16 | 17 | STRING("String"), 18 | LIST("List"), 19 | HASH("Hash"), 20 | SET("Set"), 21 | ZSET("Sorted Set"), 22 | STREAM("Stream"), 23 | PUBSUB("Pub/Sub"); 24 | 25 | /** 26 | * 类型 27 | */ 28 | @JsonValue 29 | private final String type; 30 | 31 | } -------------------------------------------------------------------------------- /dimple-common/dimple-common-redis/src/main/java/com/dimple/common/redis/core/RedisTimeoutTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.redis.core; 2 | 3 | import com.fasterxml.jackson.annotation.JsonValue; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | 7 | /** 8 | * RedisTimeoutTypeEnum 9 | * 10 | * @author Dimple 11 | * @date 2/22/2023 2:51 PM 12 | */ 13 | @Getter 14 | @AllArgsConstructor 15 | public enum RedisTimeoutTypeEnum { 16 | 17 | FOREVER(1), // 永不超时 18 | DYNAMIC(2), // 动态超时 19 | FIXED(3); // 固定超时 20 | 21 | /** 22 | * 类型 23 | */ 24 | @JsonValue 25 | private final Integer type; 26 | 27 | } -------------------------------------------------------------------------------- /dimple-common/dimple-common-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | com.dimple.common.redis.configure.RedisConfig 2 | com.dimple.common.redis.service.RedisService 3 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-security/src/main/java/com/dimple/common/security/annotation/InnerAuth.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.security.annotation; 2 | 3 | import java.lang.annotation.Documented; 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * 内部认证注解 11 | * 12 | * @author Dimple 13 | */ 14 | @Target(ElementType.METHOD) 15 | @Retention(RetentionPolicy.RUNTIME) 16 | @Documented 17 | public @interface InnerAuth { 18 | /** 19 | * 是否校验用户信息 20 | */ 21 | boolean isUser() default false; 22 | } -------------------------------------------------------------------------------- /dimple-common/dimple-common-security/src/main/java/com/dimple/common/security/annotation/Logical.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.security.annotation; 2 | 3 | /** 4 | * 权限注解的验证模式 5 | * 6 | * @author Dimple 7 | */ 8 | public enum Logical { 9 | /** 10 | * 必须具有所有的元素 11 | */ 12 | AND, 13 | 14 | /** 15 | * 只需具有其中一个元素 16 | */ 17 | OR 18 | } 19 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-security/src/main/java/com/dimple/common/security/annotation/RequiresLogin.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.security.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * 登录认证:只有登录之后才能进入该方法 10 | * 11 | * @author Dimple 12 | */ 13 | @Retention(RetentionPolicy.RUNTIME) 14 | @Target({ElementType.METHOD, ElementType.TYPE}) 15 | public @interface RequiresLogin { 16 | } 17 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-security/src/main/java/com/dimple/common/security/annotation/RequiresPermissions.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.security.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * 权限认证:必须具有指定权限才能进入该方法 10 | * 11 | * @author Dimple 12 | */ 13 | @Retention(RetentionPolicy.RUNTIME) 14 | @Target({ElementType.METHOD, ElementType.TYPE}) 15 | public @interface RequiresPermissions { 16 | /** 17 | * 需要校验的权限码 18 | */ 19 | String[] value() default {}; 20 | 21 | /** 22 | * 验证模式:AND | OR,默认AND 23 | */ 24 | Logical logical() default Logical.AND; 25 | } 26 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-security/src/main/java/com/dimple/common/security/annotation/RequiresRoles.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.security.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * 角色认证:必须具有指定角色标识才能进入该方法 10 | * 11 | * @author Dimple 12 | */ 13 | @Retention(RetentionPolicy.RUNTIME) 14 | @Target({ElementType.METHOD, ElementType.TYPE}) 15 | public @interface RequiresRoles { 16 | /** 17 | * 需要校验的角色标识 18 | */ 19 | String[] value() default {}; 20 | 21 | /** 22 | * 验证逻辑:AND | OR,默认AND 23 | */ 24 | Logical logical() default Logical.AND; 25 | } 26 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-security/src/main/java/com/dimple/common/security/config/ApplicationConfig.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.security.config; 2 | 3 | import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; 4 | import org.springframework.context.annotation.Bean; 5 | 6 | import java.util.TimeZone; 7 | 8 | /** 9 | * 系统配置 10 | * 11 | * @author Dimple 12 | */ 13 | public class ApplicationConfig { 14 | /** 15 | * 时区配置 16 | */ 17 | @Bean 18 | public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() { 19 | return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-security/src/main/java/com/dimple/common/security/feign/FeignAutoConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.security.feign; 2 | 3 | import feign.RequestInterceptor; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | /** 8 | * Feign 配置注册 9 | * 10 | * @author Dimple 11 | **/ 12 | @Configuration 13 | public class FeignAutoConfiguration { 14 | @Bean 15 | public RequestInterceptor requestInterceptor() { 16 | return new FeignRequestInterceptor(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | com.dimple.common.security.config.WebMvcConfig 2 | com.dimple.common.security.service.TokenService 3 | com.dimple.common.security.aspect.PreAuthorizeAspect 4 | com.dimple.common.security.aspect.InnerAuthAspect 5 | com.dimple.common.security.handler.GlobalExceptionHandler 6 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-swagger/src/main/java/com/dimple/common/swagger/annotation/EnableCustomSwagger2.java: -------------------------------------------------------------------------------- 1 | package com.dimple.common.swagger.annotation; 2 | 3 | import com.dimple.common.swagger.config.SwaggerAutoConfiguration; 4 | import org.springframework.context.annotation.Import; 5 | 6 | import java.lang.annotation.Documented; 7 | import java.lang.annotation.ElementType; 8 | import java.lang.annotation.Inherited; 9 | import java.lang.annotation.Retention; 10 | import java.lang.annotation.RetentionPolicy; 11 | import java.lang.annotation.Target; 12 | 13 | @Target({ElementType.TYPE}) 14 | @Retention(RetentionPolicy.RUNTIME) 15 | @Documented 16 | @Inherited 17 | @Import({SwaggerAutoConfiguration.class}) 18 | public @interface EnableCustomSwagger2 { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /dimple-common/dimple-common-swagger/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports: -------------------------------------------------------------------------------- 1 | com.dimple.common.swagger.config.SwaggerAutoConfiguration 2 | com.dimple.common.swagger.config.SwaggerWebConfiguration 3 | com.dimple.common.swagger.config.SwaggerBeanPostProcessor 4 | -------------------------------------------------------------------------------- /dimple-gateway/src/main/java/com/dimple/gateway/DimpleGatewayApplication.java: -------------------------------------------------------------------------------- 1 | package com.dimple.gateway; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; 6 | 7 | /** 8 | * 网关启动程序 9 | * 10 | * @author Dimple 11 | */ 12 | @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}, scanBasePackages = {"com.dimple.gateway"}) 13 | public class DimpleGatewayApplication { 14 | public static void main(String[] args) { 15 | SpringApplication.run(DimpleGatewayApplication.class, args); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /dimple-gateway/src/main/java/com/dimple/gateway/config/GatewayConfig.java: -------------------------------------------------------------------------------- 1 | package com.dimple.gateway.config; 2 | 3 | import com.dimple.gateway.handler.SentinelFallbackHandler; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.core.Ordered; 7 | import org.springframework.core.annotation.Order; 8 | 9 | /** 10 | * 网关限流配置 11 | * 12 | * @author Dimple 13 | */ 14 | @Configuration 15 | public class GatewayConfig { 16 | @Bean 17 | @Order(Ordered.HIGHEST_PRECEDENCE) 18 | public SentinelFallbackHandler sentinelGatewayExceptionHandler() { 19 | return new SentinelFallbackHandler(); 20 | } 21 | } -------------------------------------------------------------------------------- /dimple-gateway/src/main/java/com/dimple/gateway/config/properties/CaptchaProperties.java: -------------------------------------------------------------------------------- 1 | package com.dimple.gateway.config.properties; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.cloud.context.config.annotation.RefreshScope; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | /** 9 | * 验证码配置 10 | * 11 | * @author Dimple 12 | */ 13 | @Configuration 14 | @RefreshScope 15 | @Data 16 | @ConfigurationProperties(prefix = "security.captcha") 17 | public class CaptchaProperties { 18 | /** 19 | * 验证码开关 20 | */ 21 | private Boolean enabled; 22 | 23 | /** 24 | * 验证码类型(math 数组计算 char 字符) 25 | */ 26 | private String type; 27 | } 28 | -------------------------------------------------------------------------------- /dimple-gateway/src/main/java/com/dimple/gateway/config/properties/XssProperties.java: -------------------------------------------------------------------------------- 1 | package com.dimple.gateway.config.properties; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.cloud.context.config.annotation.RefreshScope; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | import java.util.ArrayList; 9 | import java.util.List; 10 | 11 | /** 12 | * XSS跨站脚本配置 13 | * 14 | * @author Dimple 15 | */ 16 | @Configuration 17 | @Data 18 | @RefreshScope 19 | @ConfigurationProperties(prefix = "security.xss") 20 | public class XssProperties { 21 | /** 22 | * Xss开关 23 | */ 24 | private Boolean enabled; 25 | 26 | /** 27 | * 排除路径 28 | */ 29 | private List excludeUrls = new ArrayList<>(); 30 | } 31 | -------------------------------------------------------------------------------- /dimple-gateway/src/main/java/com/dimple/gateway/service/ValidateCodeService.java: -------------------------------------------------------------------------------- 1 | package com.dimple.gateway.service; 2 | 3 | import com.dimple.common.core.exception.CaptchaException; 4 | import com.dimple.common.core.web.vo.params.AjaxResult; 5 | 6 | import java.io.IOException; 7 | 8 | /** 9 | * 验证码处理 10 | * 11 | * @author Dimple 12 | */ 13 | public interface ValidateCodeService { 14 | /** 15 | * 生成验证码 16 | */ 17 | AjaxResult createCaptcha() throws IOException, CaptchaException; 18 | 19 | /** 20 | * 校验验证码 21 | */ 22 | void checkCaptcha(String key, String value) throws CaptchaException; 23 | } 24 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-service/src/main/java/com/dimple/blog/front/service/config/GithubTokenInfoConfig.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.service.config; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * GithubTokenInfo 7 | * 8 | * @author Dimple 9 | * @date 2023/3/14 13:42 10 | */ 11 | @Data 12 | public class GithubTokenInfoConfig { 13 | private String clientId; 14 | private String clientSecrets; 15 | private String accessTokenUrl; 16 | private String userInfoUrl; 17 | private Long adminId; 18 | } 19 | 20 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-service/src/main/java/com/dimple/blog/front/service/service/BlogRestArchivesService.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.service.service; 2 | 3 | import com.dimple.blog.api.bo.BlogArchivesBO; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * BlogRestArchivesService 9 | * 10 | * @author Dimple 11 | * @date 2/28/2023 11:09 AM 12 | */ 13 | public interface BlogRestArchivesService { 14 | List getArchiveList(String countType); 15 | 16 | List getArchives(String countType); 17 | } 18 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-service/src/main/java/com/dimple/blog/front/service/service/BlogRestArticleTagService.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.service.service; 2 | 3 | import com.dimple.blog.api.bo.BlogArticleTagBO; 4 | 5 | import java.util.List; 6 | 7 | 8 | /** 9 | * Service接口 10 | * 11 | * @author Dimple 12 | * @date 2023-02-13 13 | */ 14 | public interface BlogRestArticleTagService { 15 | 16 | List selectBlogArticleTagByArticleId(Long article); 17 | } 18 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-service/src/main/java/com/dimple/blog/front/service/service/BlogRestCategoryService.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.service.service; 2 | 3 | import com.dimple.blog.api.bo.BlogCategoryBO; 4 | 5 | import java.util.List; 6 | 7 | 8 | /** 9 | * blog categoryService接口 10 | * 11 | * @author Dimple 12 | * @date 2023-02-13 13 | */ 14 | public interface BlogRestCategoryService { 15 | 16 | /** 17 | * 查询blog category列表 18 | * 19 | * @param blogCategory blog category 20 | * @return blog category集合 21 | */ 22 | List selectBlogCategoryList(BlogCategoryBO blogCategory); 23 | } 24 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-service/src/main/java/com/dimple/blog/front/service/service/BlogRestCommentService.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.service.service; 2 | 3 | import com.dimple.blog.api.bo.BlogCommentBO; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * Service接口 9 | * 10 | * @author Dimple 11 | * @date 2023-02-13 12 | */ 13 | public interface BlogRestCommentService { 14 | 15 | List selectBlogCommentListWithSub(BlogCommentBO blogComment); 16 | 17 | 18 | /** 19 | * 新增 20 | * 21 | * @param blogComment 22 | * @return affected lines 23 | */ 24 | int insertBlogComment(BlogCommentBO blogComment); 25 | 26 | int addBlogCommentLikeCount(Long id); 27 | } 28 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-service/src/main/java/com/dimple/blog/front/service/service/BlogRestConfigService.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.service.service; 2 | 3 | 4 | import com.dimple.blog.api.bo.config.BlogGlobalConfig; 5 | import com.dimple.blog.api.bo.config.GithubLoginConfig; 6 | 7 | /** 8 | * BlogRestConfigService 9 | * 10 | * @author Dimple 11 | * @date 3/29/2023 12 | */ 13 | public interface BlogRestConfigService { 14 | BlogGlobalConfig getBlogGlobalConfig(); 15 | 16 | GithubLoginConfig getGithubLoginConfig(); 17 | } 18 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-service/src/main/java/com/dimple/blog/front/service/service/BlogRestLinkService.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.service.service; 2 | 3 | import com.dimple.blog.api.bo.BlogLinkBO; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * BlogRestLinkService 9 | * 10 | * @author Dimple 11 | * @date 3/8/2023 7:54 PM 12 | */ 13 | public interface BlogRestLinkService { 14 | int insertLink(BlogLinkBO blogLinkBO); 15 | 16 | List listBlogLink(BlogLinkBO blogLinkBO); 17 | 18 | int addLinkVisitCount(Long id); 19 | } 20 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-service/src/main/java/com/dimple/blog/front/service/service/BlogRestTagService.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.service.service; 2 | 3 | import com.dimple.blog.api.bo.BlogTagBO; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * Service接口 9 | * 10 | * @author Dimple 11 | * @date 2023-02-13 12 | */ 13 | public interface BlogRestTagService { 14 | 15 | List selectBlogTagByIds(List ids); 16 | 17 | /** 18 | * 查询列表 19 | * 20 | * @param blogTag 21 | * @return 集合 22 | */ 23 | List selectBlogTagList(BlogTagBO blogTag); 24 | 25 | } 26 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-service/src/main/java/com/dimple/blog/front/service/service/BlogRestVisitorService.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.service.service; 2 | 3 | import com.dimple.blog.api.bo.GithubVisitorInfoBO; 4 | 5 | /** 6 | * VisitorService 7 | * 8 | * @author Dimple 9 | * @date 2023/3/14 13:34 10 | */ 11 | public interface BlogRestVisitorService { 12 | GithubVisitorInfoBO getGithubVisitorInfo(String code); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-web/src/main/java/com/dimple/blog/front/web/controller/vo/BlogArchiveItemVO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.web.controller.vo; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.Date; 6 | 7 | /** 8 | * BlogArchiveItemVO 9 | * 10 | * @author Dimple 11 | * @date 3/7/2023 10:13 AM 12 | */ 13 | @Data 14 | public class BlogArchiveItemVO { 15 | private Long id; 16 | private String title; 17 | private String headerImage; 18 | private Date createTime; 19 | } 20 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-web/src/main/java/com/dimple/blog/front/web/controller/vo/BlogArchivesVO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.web.controller.vo; 2 | 3 | import com.dimple.blog.api.bo.BlogArchiveItemBO; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * ArchivesVO 10 | * 11 | * @author Dimple 12 | * @date 2/28/2023 11:07 AM 13 | */ 14 | @Data 15 | public class BlogArchivesVO { 16 | private Long count; 17 | 18 | private String dateStr; 19 | 20 | List items; 21 | } 22 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-web/src/main/java/com/dimple/blog/front/web/controller/vo/BlogArticlePreNextItemVO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.web.controller.vo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * BlogArticlePreNextItemVO 7 | * 8 | * @author Dimple 9 | * @date 2/28/2023 1:43 PM 10 | */ 11 | @Data 12 | public class BlogArticlePreNextItemVO { 13 | private Long id; 14 | private String headImage; 15 | private String title; 16 | } 17 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-web/src/main/java/com/dimple/blog/front/web/controller/vo/BlogArticlePrevNextVO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.web.controller.vo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * BlogArticlePrevNextVO 7 | * 8 | * @author Dimple 9 | * @date 2/28/2023 1:42 PM 10 | */ 11 | @Data 12 | public class BlogArticlePrevNextVO { 13 | private BlogArticlePreNextItemVO prev; 14 | private BlogArticlePreNextItemVO next; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-web/src/main/java/com/dimple/blog/front/web/controller/vo/BlogCategoryVO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.web.controller.vo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * BlogCategoryVOParams 7 | * 8 | * @author Dimple 9 | */ 10 | @Data 11 | public class BlogCategoryVO { 12 | private Long id; 13 | private String title; 14 | private Long articleCount; 15 | } 16 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-web/src/main/java/com/dimple/blog/front/web/controller/vo/BlogLinkVO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.web.controller.vo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * BlogLinkVO 7 | * 8 | * @author Dimple 9 | * @date 3/8/2023 7:03 PM 10 | */ 11 | @Data 12 | public class BlogLinkVO { 13 | private String title; 14 | private String headerImage; 15 | private String description; 16 | private String url; 17 | private Long id; 18 | } 19 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-web/src/main/java/com/dimple/blog/front/web/controller/vo/BlogTagVO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.web.controller.vo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * BlogTagVO 7 | * 8 | * @author Dimple 9 | * @date 2/14/2023 10:23 AM 10 | */ 11 | @Data 12 | public class BlogTagVO { 13 | private Long id; 14 | 15 | /** 16 | * the article tag 17 | */ 18 | private String title; 19 | } 20 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-web/src/main/java/com/dimple/blog/front/web/controller/vo/config/BlogGlobalConfigVO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.web.controller.vo.config; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * BlogConfig 7 | * 8 | * @author Dimple 9 | * @date 3/29/2023 10 | */ 11 | @Data 12 | public class BlogGlobalConfigVO { 13 | private SiteConfig siteConfig; 14 | private CommentConfigVO commentConfig; 15 | } 16 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-web/src/main/java/com/dimple/blog/front/web/controller/vo/config/CommentConfigVO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.web.controller.vo.config; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * CommentConfig 7 | * 8 | * @author Dimple 9 | * @date 3/29/2023 10 | */ 11 | @Data 12 | public class CommentConfigVO { 13 | private boolean enableLocalLogin; 14 | private boolean enableGithubLogin; 15 | private boolean enableQQLogin; 16 | private GithubLoginConfig githubLoginConfig; 17 | } 18 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-web/src/main/java/com/dimple/blog/front/web/controller/vo/config/GithubLoginConfig.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.web.controller.vo.config; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * GithubLoginConfig 7 | * 8 | * @author Dimple 9 | * @date 3/29/2023 10 | */ 11 | @Data 12 | public class GithubLoginConfig { 13 | private String adminId; 14 | private String clientId; 15 | private String loginUrl; 16 | } 17 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-web/src/main/java/com/dimple/blog/front/web/controller/vo/config/SiteConfig.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.web.controller.vo.config; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * SiteConfig 9 | * 10 | * @author Dimple 11 | * @date 3/29/2023 12 | */ 13 | @Data 14 | public class SiteConfig { 15 | private boolean mask; 16 | private String infoPanel; 17 | private String siteName; 18 | private String avatars; 19 | private String icp; 20 | private String githubUrl; 21 | private String copyright; 22 | private String githubUserName; 23 | List> lables; 24 | } 25 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-web/src/main/java/com/dimple/blog/front/web/controller/vo/params/BlogArchivesVOParams.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.web.controller.vo.params; 2 | 3 | import com.dimple.common.core.web.vo.params.BaseVOParams; 4 | import lombok.Data; 5 | 6 | /** 7 | * BlogArchivesVOParams 8 | * 9 | * @author Dimple 10 | * @date 2/28/2023 11:10 AM 11 | */ 12 | @Data 13 | public class BlogArchivesVOParams extends BaseVOParams { 14 | /** 15 | * 分类类型 16 | */ 17 | private String countType; 18 | } 19 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-web/src/main/java/com/dimple/blog/front/web/controller/vo/params/BlogArticleVOParams.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.web.controller.vo.params; 2 | 3 | import com.dimple.common.core.web.entity.BaseEntity; 4 | import lombok.Data; 5 | 6 | /** 7 | * Blog table 8 | * 9 | * @author Dimple 10 | */ 11 | @Data 12 | public class BlogArticleVOParams extends BaseEntity { 13 | 14 | /** 15 | * article title 16 | */ 17 | private String title; 18 | /** 19 | * article category id 20 | */ 21 | private Long categoryId; 22 | 23 | 24 | /** 25 | * article summary,max length 512 26 | */ 27 | private String summary; 28 | 29 | private Long tagId; 30 | 31 | } 32 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-web/src/main/java/com/dimple/blog/front/web/controller/vo/params/BlogCategoryVOParams.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.web.controller.vo.params; 2 | 3 | import com.dimple.common.core.web.vo.params.BaseVOParams; 4 | import lombok.Data; 5 | 6 | /** 7 | * BlogCategoryVOParams 8 | * 9 | * @author Dimple 10 | */ 11 | @Data 12 | public class BlogCategoryVOParams extends BaseVOParams { 13 | private String title; 14 | } 15 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-web/src/main/java/com/dimple/blog/front/web/controller/vo/params/BlogTagVOParams.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.web.controller.vo.params; 2 | 3 | import com.dimple.common.core.web.vo.params.BaseVOParams; 4 | import lombok.Data; 5 | 6 | /** 7 | * BlogTagVOParams 8 | * 9 | * @author Dimple 10 | * @date 2/14/2023 10:23 AM 11 | */ 12 | @Data 13 | public class BlogTagVOParams extends BaseVOParams { 14 | 15 | /** 16 | * the article tag 17 | */ 18 | private String title; 19 | } 20 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-web/src/main/java/com/dimple/blog/front/web/controller/vo/params/VisitLogVOParams.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.front.web.controller.vo.params; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * VisitLogVOParams 7 | * 8 | * @author Dimple 9 | */ 10 | @Data 11 | public class VisitLogVOParams { 12 | private String title; 13 | private Long pageId; 14 | private String requestUri; 15 | private String referer; 16 | private Integer statusCode; 17 | private String userAgent; 18 | private String os; 19 | private String ip; 20 | } 21 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog-front/dimple-blog-front-web/src/main/resources/bootstrap.yml: -------------------------------------------------------------------------------- 1 | # Tomcat 2 | server: 3 | port: 9500 4 | 5 | # Spring 6 | spring: 7 | application: 8 | # 应用名称 9 | name: dimple-blog-front 10 | profiles: 11 | # 环境配置 12 | active: dev 13 | cloud: 14 | nacos: 15 | discovery: 16 | # 服务注册地址 17 | server-addr: dimple-nacos:8848 18 | namespace: 63c3335c-2ba4-42c7-b05c-d8c62c1ac5a8 19 | config: 20 | # 配置中心地址 21 | server-addr: dimple-nacos:8848 22 | # 配置文件格式 23 | file-extension: yml 24 | # 共享配置 25 | shared-configs: 26 | - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} 27 | namespace: 63c3335c-2ba4-42c7-b05c-d8c62c1ac5a8 28 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-service/src/main/java/com/dimple/blog/service/entity/BlogArchiveItem.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.service.entity; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.Date; 6 | 7 | /** 8 | * BlogArchiveItem 9 | * 10 | * @author Dimple 11 | * @date 3/7/2023 10:01 AM 12 | */ 13 | @Data 14 | public class BlogArchiveItem { 15 | private Long id; 16 | private String title; 17 | private String headerImage; 18 | private Date createTime; 19 | } 20 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-service/src/main/java/com/dimple/blog/service/entity/BlogArchives.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.service.entity; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * BlogArchives 7 | * 8 | * @author Dimple 9 | * @date 2/28/2023 11:29 AM 10 | */ 11 | @Data 12 | public class BlogArchives { 13 | private Long count; 14 | private String dateStr; 15 | } 16 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-service/src/main/java/com/dimple/blog/service/entity/BlogArticleCategory.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.service.entity; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 对象 blog_article_category 7 | * 8 | * @author Dimple 9 | * @date 2023-02-13 10 | */ 11 | @Data 12 | public class BlogArticleCategory { 13 | 14 | 15 | private Long id; 16 | 17 | 18 | private Long articleId; 19 | 20 | private Long categoryId; 21 | } 22 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-service/src/main/java/com/dimple/blog/service/entity/BlogArticleTag.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.service.entity; 2 | 3 | import lombok.Data; 4 | 5 | 6 | /** 7 | * 对象 blog_article_tag 8 | * 9 | * @author Dimple 10 | * @date 2023-02-13 11 | */ 12 | @Data 13 | public class BlogArticleTag { 14 | 15 | private Long id; 16 | 17 | private Long articleId; 18 | 19 | private Long tagId; 20 | } 21 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-service/src/main/java/com/dimple/blog/service/entity/BlogCategory.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.service.entity; 2 | 3 | import com.dimple.common.core.web.entity.BaseEntity; 4 | import lombok.Data; 5 | 6 | 7 | /** 8 | * blog category对象 blog_category 9 | * 10 | * @author Dimple 11 | * @date 2023-02-13 12 | */ 13 | @Data 14 | public class BlogCategory extends BaseEntity { 15 | 16 | 17 | private Long id; 18 | 19 | /** 20 | * category title, max length is 255 21 | */ 22 | private String title; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-service/src/main/java/com/dimple/blog/service/entity/BlogLink.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.service.entity; 2 | 3 | import com.dimple.common.core.web.entity.BaseEntity; 4 | import lombok.Data; 5 | 6 | /** 7 | * BlogLink 8 | * 9 | * @author Dimple 10 | * @date 3/10/2023 11:26 AM 11 | */ 12 | @Data 13 | public class BlogLink extends BaseEntity { 14 | private Long id; 15 | private String title; 16 | private String headerImage; 17 | private String description; 18 | private String url; 19 | private Integer linkStatus; 20 | private Long visitCount; 21 | private String email; 22 | 23 | private String emailContent; 24 | } 25 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-service/src/main/java/com/dimple/blog/service/entity/BlogTag.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.service.entity; 2 | 3 | import com.dimple.common.core.web.entity.BaseEntity; 4 | import lombok.Data; 5 | 6 | 7 | /** 8 | * 对象 blog_tag 9 | * 10 | * @author Dimple 11 | * @date 2023-02-13 12 | */ 13 | @Data 14 | public class BlogTag extends BaseEntity { 15 | 16 | private Long id; 17 | 18 | /** 19 | * the article tag 20 | */ 21 | private String title; 22 | 23 | } 24 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-service/src/main/java/com/dimple/blog/service/enums/BlogArticleStatus.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.service.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * ArticleStatus 8 | * 9 | * @author Dimple 10 | */ 11 | @AllArgsConstructor 12 | @Getter 13 | public enum BlogArticleStatus { 14 | /** 15 | * 1 published 16 | */ 17 | PUBLISHED(1), 18 | 19 | /** 20 | * 2 draft 21 | */ 22 | DRAFT(2), 23 | ; 24 | private Integer status; 25 | } 26 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-service/src/main/java/com/dimple/blog/service/mapper/BlogArchiveMapper.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.service.mapper; 2 | 3 | import com.dimple.blog.service.entity.BlogArchiveItem; 4 | import com.dimple.blog.service.entity.BlogArchives; 5 | 6 | import java.util.List; 7 | 8 | public interface BlogArchiveMapper { 9 | List getArchiveList(String countType); 10 | 11 | List getArchives(); 12 | } 13 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-service/src/main/java/com/dimple/blog/service/mapper/BlogConfigMapper.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.service.mapper; 2 | 3 | /** 4 | * BlogConfigMapper 5 | * 6 | * @author Dimple 7 | * @date 3/30/2023 8 | */ 9 | public interface BlogConfigMapper { 10 | int updateConfig(String configValue); 11 | 12 | String getConfig(); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-service/src/main/java/com/dimple/blog/service/service/BlogArchiveService.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.service.service; 2 | 3 | import com.dimple.blog.api.bo.BlogArchiveItemBO; 4 | import com.dimple.blog.api.bo.BlogArchivesBO; 5 | 6 | import java.util.List; 7 | 8 | public interface BlogArchiveService { 9 | List getArchiveList(String countType); 10 | 11 | List getArchives(); 12 | } 13 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-service/src/main/java/com/dimple/blog/service/service/BlogConfigService.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.service.service; 2 | 3 | 4 | import com.dimple.blog.api.bo.config.BlogGlobalConfig; 5 | 6 | /** 7 | * BlogConfigService 8 | * 9 | * @author Dimple 10 | * @date 3/30/2023 11 | */ 12 | public interface BlogConfigService { 13 | int updateConfig(BlogGlobalConfig blogGlobalConfig); 14 | 15 | void deleteConfigCache(); 16 | 17 | BlogGlobalConfig getBlogConfig(); 18 | 19 | 20 | } 21 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-web/src/main/java/com/dimple/blog/web/DimpleBlogApplication.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.web; 2 | 3 | import com.dimple.common.security.annotation.EnableCustomConfig; 4 | import com.dimple.common.security.annotation.EnableDimpleFeignClients; 5 | import com.dimple.common.swagger.annotation.EnableCustomSwagger2; 6 | import org.springframework.boot.SpringApplication; 7 | import org.springframework.boot.autoconfigure.SpringBootApplication; 8 | 9 | @EnableCustomConfig 10 | @EnableCustomSwagger2 11 | @EnableDimpleFeignClients 12 | @SpringBootApplication(scanBasePackages = {"com.dimple.blog"}) 13 | public class DimpleBlogApplication { 14 | public static void main(String[] args) { 15 | SpringApplication.run(DimpleBlogApplication.class, args); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-web/src/main/java/com/dimple/blog/web/controller/vo/BlogCategoryVO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.web.controller.vo; 2 | 3 | import com.dimple.common.core.web.entity.BaseEntity; 4 | import lombok.Data; 5 | 6 | /** 7 | * BlogCategoryVOParams 8 | * 9 | * @author Dimple 10 | */ 11 | @Data 12 | public class BlogCategoryVO extends BaseEntity { 13 | private Long id; 14 | private String title; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-web/src/main/java/com/dimple/blog/web/controller/vo/BlogLinkVO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.web.controller.vo; 2 | 3 | import com.dimple.common.core.web.entity.BaseEntity; 4 | import lombok.Data; 5 | 6 | /** 7 | * BlogLinkVO 8 | * 9 | * @author Dimple 10 | * @date 3/10/2023 11:26 AM 11 | */ 12 | @Data 13 | public class BlogLinkVO extends BaseEntity { 14 | private Long id; 15 | private String title; 16 | private String headerImage; 17 | private String description; 18 | private String url; 19 | private Integer linkStatus; 20 | private Long visitCount; 21 | private String email; 22 | private String emailContent; 23 | } 24 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-web/src/main/java/com/dimple/blog/web/controller/vo/BlogTagVO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.web.controller.vo; 2 | 3 | import com.dimple.common.core.web.entity.BaseEntity; 4 | import lombok.Data; 5 | 6 | /** 7 | * BlogTagVO 8 | * 9 | * @author Dimple 10 | * @date 2/14/2023 10:23 AM 11 | */ 12 | @Data 13 | public class BlogTagVO extends BaseEntity { 14 | private Long id; 15 | 16 | /** 17 | * the article tag 18 | */ 19 | private String title; 20 | } 21 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-web/src/main/java/com/dimple/blog/web/controller/vo/params/BlogCategoryVOParams.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.web.controller.vo.params; 2 | 3 | import com.dimple.common.core.web.vo.params.BaseVOParams; 4 | import lombok.Data; 5 | 6 | /** 7 | * BlogCategoryVOParams 8 | * 9 | * @author Dimple 10 | */ 11 | @Data 12 | public class BlogCategoryVOParams extends BaseVOParams { 13 | private String title; 14 | } 15 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-web/src/main/java/com/dimple/blog/web/controller/vo/params/BlogLinkVOParams.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.web.controller.vo.params; 2 | 3 | import com.dimple.common.core.web.vo.params.BaseVOParams; 4 | import lombok.Data; 5 | 6 | /** 7 | * BlogLinkVOParams 8 | * 9 | * @author Dimple 10 | * @date 3/10/2023 11:27 AM 11 | */ 12 | @Data 13 | public class BlogLinkVOParams extends BaseVOParams { 14 | private String title; 15 | private String headerImage; 16 | private String description; 17 | private String url; 18 | private Integer linkStatus; 19 | private Long visitCount; 20 | private String email; 21 | private Boolean sendEmail; 22 | private String emailContent; 23 | } 24 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-web/src/main/java/com/dimple/blog/web/controller/vo/params/BlogTagVOParams.java: -------------------------------------------------------------------------------- 1 | package com.dimple.blog.web.controller.vo.params; 2 | 3 | import com.dimple.common.core.web.vo.params.BaseVOParams; 4 | import lombok.Data; 5 | 6 | /** 7 | * BlogTagVOParams 8 | * 9 | * @author Dimple 10 | * @date 2/14/2023 10:23 AM 11 | */ 12 | @Data 13 | public class BlogTagVOParams extends BaseVOParams { 14 | 15 | /** 16 | * the article tag 17 | */ 18 | private String title; 19 | } 20 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-web/src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | Spring Boot Version: ${spring-boot.version} 2 | Spring Application Name: ${spring.application.name} 3 | _______ __ .___ ___. .______ __ _______ .______ __ ______ _______ 4 | | \ | | | \/ | | _ \ | | | ____| | _ \ | | / __ \ / _____| 5 | | .--. || | | \ / | | |_) | | | | |__ ______| |_) | | | | | | | | | __ 6 | | | | || | | |\/| | | ___/ | | | __| |______| _ < | | | | | | | | |_ | 7 | | '--' || | | | | | | | | `----.| |____ | |_) | | `----.| `--' | | |__| | 8 | |_______/ |__| |__| |__| | _| |_______||_______| |______/ |_______| \______/ \______| 9 | 10 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-web/src/main/resources/bootstrap.yml: -------------------------------------------------------------------------------- 1 | # Tomcat 2 | server: 3 | port: 9401 4 | 5 | # Spring 6 | spring: 7 | application: 8 | # 应用名称 9 | name: dimple-blog 10 | profiles: 11 | # 环境配置 12 | active: dev 13 | cloud: 14 | nacos: 15 | discovery: 16 | # 服务注册地址 17 | server-addr: dimple-nacos:8848 18 | namespace: 63c3335c-2ba4-42c7-b05c-d8c62c1ac5a8 19 | config: 20 | # 配置中心地址 21 | server-addr: dimple-nacos:8848 22 | # 配置文件格式 23 | file-extension: yml 24 | # 共享配置 25 | shared-configs: 26 | - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} 27 | namespace: 63c3335c-2ba4-42c7-b05c-d8c62c1ac5a8 -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/dimple-blog-web/src/main/resources/mapper/blog/BlogConfigMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | update blog_config 9 | set config_value=#{configValue} 10 | where id=1; 11 | 12 | 17 | -------------------------------------------------------------------------------- /dimple-modules/dimple-blog/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | com.dimple 7 | dimple-modules 8 | 3.1.0 9 | 10 | pom 11 | 12 | dimple-blog-web 13 | dimple-blog-service 14 | 15 | 4.0.0 16 | 17 | dimple-modules-blog 18 | 19 | 20 | Dimple-modules-blog博客服务 21 | 22 | 23 | -------------------------------------------------------------------------------- /dimple-modules/dimple-file/dimple-file-service/src/main/java/com/dimple/file/service/config/LocalFileConfig.java: -------------------------------------------------------------------------------- 1 | package com.dimple.file.service.config; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.stereotype.Component; 6 | 7 | /** 8 | * LocalFileConfig 9 | * 10 | * @author Dimple 11 | * @date 2023/3/13 13:45 12 | */ 13 | @Component 14 | @ConfigurationProperties(prefix = "file.local.config") 15 | @Data 16 | public class LocalFileConfig { 17 | private String domain; 18 | private String path; 19 | private String prefix; 20 | } 21 | -------------------------------------------------------------------------------- /dimple-modules/dimple-file/dimple-file-service/src/main/java/com/dimple/file/service/config/QiNiuConfig.java: -------------------------------------------------------------------------------- 1 | package com.dimple.file.service.config; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.stereotype.Component; 6 | 7 | /** 8 | * QiNiuConfig 9 | * 10 | * @author Dimple 11 | * @date 2023/3/13 13:34 12 | */ 13 | @Component 14 | @ConfigurationProperties(prefix = "file.qiniu.config") 15 | @Data 16 | public class QiNiuConfig { 17 | private String accessKey; 18 | private String secretKey; 19 | private String bucket; 20 | private String region; 21 | private String domain; 22 | } 23 | -------------------------------------------------------------------------------- /dimple-modules/dimple-file/dimple-file-service/src/main/java/com/dimple/file/service/constants/FileConstants.java: -------------------------------------------------------------------------------- 1 | package com.dimple.file.service.constants; 2 | 3 | /** 4 | * FileConstants 5 | * 6 | * @author Dimple 7 | * @date 2023/3/13 17:48 8 | */ 9 | public class FileConstants { 10 | public static final String LOCAL = "local"; 11 | public static final String QiNiu = "qiniu"; 12 | } 13 | -------------------------------------------------------------------------------- /dimple-modules/dimple-file/dimple-file-service/src/main/java/com/dimple/file/service/entity/SysFile.java: -------------------------------------------------------------------------------- 1 | package com.dimple.file.service.entity; 2 | 3 | import com.dimple.common.core.web.entity.BaseEntity; 4 | import lombok.Data; 5 | 6 | /** 7 | * SysFile 8 | * 9 | * @author Dimple 10 | * @date 2023/3/12 15:15 11 | */ 12 | @Data 13 | public class SysFile extends BaseEntity { 14 | private Long id; 15 | /** 16 | * 文件名称 17 | */ 18 | private String name; 19 | 20 | /** 21 | * 文件地址 22 | */ 23 | private String url; 24 | 25 | private String extension; 26 | /** 27 | * the file type,IMAGE/OTHER 28 | */ 29 | private String type; 30 | 31 | private String path; 32 | } 33 | -------------------------------------------------------------------------------- /dimple-modules/dimple-file/dimple-file-service/src/main/java/com/dimple/file/service/mapper/SysFileMapper.java: -------------------------------------------------------------------------------- 1 | package com.dimple.file.service.mapper; 2 | 3 | import com.dimple.file.service.entity.SysFile; 4 | import org.apache.ibatis.annotations.Param; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * FileMapper 10 | * 11 | * @author Dimple 12 | * @date 2023/3/12 15:13 13 | */ 14 | public interface SysFileMapper { 15 | 16 | void saveFileMetaInfo(SysFile sysFile); 17 | 18 | List selectFileList(SysFile sysFile); 19 | 20 | int updateFileName(@Param("id") Long id, @Param("name") String name); 21 | 22 | SysFile selectFileById(Long id); 23 | 24 | int deleteFileById(Long id); 25 | } 26 | -------------------------------------------------------------------------------- /dimple-modules/dimple-file/dimple-file-service/src/main/java/com/dimple/file/service/service/AbstractSysFileService.java: -------------------------------------------------------------------------------- 1 | package com.dimple.file.service.service; 2 | 3 | import com.dimple.system.api.model.SysFileBO; 4 | import org.springframework.web.multipart.MultipartFile; 5 | 6 | /** 7 | * AbstractSysFileService 8 | * 9 | * @author Dimple 10 | * @date 2023/3/13 17:42 11 | */ 12 | public abstract class AbstractSysFileService { 13 | /** 14 | * 文件上传接口 15 | * 16 | * @param file 上传的文件 17 | * @return 访问地址 18 | * @throws Exception 19 | */ 20 | public abstract SysFileBO uploadFile(MultipartFile file); 21 | 22 | public abstract void deleteFile(String url); 23 | } 24 | -------------------------------------------------------------------------------- /dimple-modules/dimple-file/dimple-file-service/src/main/java/com/dimple/file/service/service/SysFileService.java: -------------------------------------------------------------------------------- 1 | package com.dimple.file.service.service; 2 | 3 | import com.dimple.system.api.model.SysFileBO; 4 | import org.springframework.web.multipart.MultipartFile; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * 文件上传接口 10 | * 11 | * @author Dimple 12 | */ 13 | public interface SysFileService { 14 | 15 | 16 | List selectFileList(SysFileBO sysFileBO); 17 | 18 | int updateFileName(Long id, String name); 19 | 20 | SysFileBO selectSysFile(Long id); 21 | 22 | SysFileBO upload(MultipartFile file,String type); 23 | 24 | int deleteFile(Long id); 25 | } 26 | -------------------------------------------------------------------------------- /dimple-modules/dimple-file/dimple-file-web/src/main/java/com/dimple/file/web/DimpleFileApplication.java: -------------------------------------------------------------------------------- 1 | package com.dimple.file.web; 2 | 3 | import com.dimple.common.security.annotation.EnableCustomConfig; 4 | import com.dimple.common.swagger.annotation.EnableCustomSwagger2; 5 | import org.springframework.boot.SpringApplication; 6 | import org.springframework.boot.autoconfigure.SpringBootApplication; 7 | 8 | /** 9 | * 文件服务 10 | * 11 | * @author Dimple 12 | */ 13 | @EnableCustomSwagger2 14 | @EnableCustomConfig 15 | @SpringBootApplication( scanBasePackages = {"com.dimple.file"}) 16 | public class DimpleFileApplication { 17 | public static void main(String[] args) { 18 | SpringApplication.run(DimpleFileApplication.class, args); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /dimple-modules/dimple-file/dimple-file-web/src/main/java/com/dimple/file/web/controller/vo/SysFileVO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.file.web.controller.vo; 2 | 3 | import com.dimple.common.core.web.entity.BaseEntity; 4 | import lombok.Data; 5 | 6 | /** 7 | * SysFileVO 8 | * 9 | * @author Dimple 10 | * @date 2023/3/11 22:24 11 | */ 12 | @Data 13 | public class SysFileVO extends BaseEntity { 14 | private Long id; 15 | private String name; 16 | private String url; 17 | private String extension; 18 | /** 19 | * the file type,IMAGE/OTHER 20 | */ 21 | private String type; 22 | } 23 | -------------------------------------------------------------------------------- /dimple-modules/dimple-file/dimple-file-web/src/main/java/com/dimple/file/web/controller/vo/params/SysFileVOParams.java: -------------------------------------------------------------------------------- 1 | package com.dimple.file.web.controller.vo.params; 2 | 3 | import com.dimple.common.core.web.vo.params.BaseVOParams; 4 | import lombok.Data; 5 | 6 | /** 7 | * SysFileVOParams 8 | * 9 | * @author Dimple 10 | * @date 2023/3/12 15:51 11 | */ 12 | @Data 13 | public class SysFileVOParams extends BaseVOParams { 14 | private String name; 15 | } 16 | -------------------------------------------------------------------------------- /dimple-modules/dimple-file/dimple-file-web/src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | Spring Boot Version: ${spring-boot.version} 2 | Spring Application Name: ${spring.application.name} 3 | 4 | _______ __ .___ ___. .______ __ _______ _______ __ __ _______ 5 | | \ | | | \/ | | _ \ | | | ____| | ____|| | | | | ____| 6 | | .--. || | | \ / | | |_) | | | | |__ ______| |__ | | | | | |__ 7 | | | | || | | |\/| | | ___/ | | | __| |______| __| | | | | | __| 8 | | '--' || | | | | | | | | `----.| |____ | | | | | `----.| |____ 9 | |_______/ |__| |__| |__| | _| |_______||_______| |__| |__| |_______||_______| 10 | 11 | -------------------------------------------------------------------------------- /dimple-modules/dimple-file/dimple-file-web/src/main/resources/bootstrap.yml: -------------------------------------------------------------------------------- 1 | # Tomcat 2 | server: 3 | port: 9300 4 | 5 | # Spring 6 | spring: 7 | application: 8 | # 应用名称 9 | name: dimple-file 10 | profiles: 11 | # 环境配置 12 | active: dev 13 | cloud: 14 | nacos: 15 | discovery: 16 | # 服务注册地址 17 | server-addr: dimple-nacos:8848 18 | namespace: 63c3335c-2ba4-42c7-b05c-d8c62c1ac5a8 19 | config: 20 | # 配置中心地址 21 | server-addr: dimple-nacos:8848 22 | # 配置文件格式 23 | file-extension: yml 24 | # 共享配置 25 | shared-configs: 26 | - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} 27 | namespace: 63c3335c-2ba4-42c7-b05c-d8c62c1ac5a8 -------------------------------------------------------------------------------- /dimple-modules/dimple-job/dimple-job-service/src/main/java/com/dimple/job/service/task/DimpleTask.java: -------------------------------------------------------------------------------- 1 | package com.dimple.job.service.task; 2 | 3 | import com.dimple.common.core.utils.StringUtils; 4 | import org.springframework.stereotype.Component; 5 | 6 | /** 7 | * 定时任务调度测试 8 | * 9 | * @author Dimple 10 | */ 11 | @Component("dimpleTask") 12 | public class DimpleTask { 13 | public void dimpleMultipleParams(String s, Boolean b, Long l, Double d, Integer i) { 14 | System.out.println(StringUtils.format("执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i)); 15 | } 16 | 17 | public void dimpleParams(String params) { 18 | System.out.println("执行有参方法:" + params); 19 | } 20 | 21 | public void dimpleNoParams() { 22 | System.out.println("执行无参方法"); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /dimple-modules/dimple-job/dimple-job-service/src/main/java/com/dimple/job/service/util/QuartzDisallowConcurrentExecution.java: -------------------------------------------------------------------------------- 1 | package com.dimple.job.service.util; 2 | 3 | import com.dimple.job.service.service.bo.SysJobBO; 4 | import org.quartz.DisallowConcurrentExecution; 5 | import org.quartz.JobExecutionContext; 6 | 7 | /** 8 | * 定时任务处理(禁止并发执行) 9 | * 10 | * @author Dimple 11 | */ 12 | @DisallowConcurrentExecution 13 | public class QuartzDisallowConcurrentExecution extends AbstractQuartzJob { 14 | @Override 15 | protected void doExecute(JobExecutionContext context, SysJobBO sysJob) throws Exception { 16 | JobInvokeUtil.invokeMethod(sysJob); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /dimple-modules/dimple-job/dimple-job-service/src/main/java/com/dimple/job/service/util/QuartzJobExecution.java: -------------------------------------------------------------------------------- 1 | package com.dimple.job.service.util; 2 | 3 | import com.dimple.job.service.service.bo.SysJobBO; 4 | import org.quartz.JobExecutionContext; 5 | 6 | /** 7 | * 定时任务处理(允许并发执行) 8 | * 9 | * @author Dimple 10 | */ 11 | public class QuartzJobExecution extends AbstractQuartzJob { 12 | @Override 13 | protected void doExecute(JobExecutionContext context, SysJobBO sysJob) throws Exception { 14 | JobInvokeUtil.invokeMethod(sysJob); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /dimple-modules/dimple-job/dimple-job-web/src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | Spring Boot Version: ${spring-boot.version} 2 | Spring Application Name: ${spring.application.name} 3 | 4 | _______ __ .___ ___. .______ __ _______ __ ______ .______ 5 | | \ | | | \/ | | _ \ | | | ____| | | / __ \ | _ \ 6 | | .--. || | | \ / | | |_) | | | | |__ ______ | | | | | | | |_) | 7 | | | | || | | |\/| | | ___/ | | | __| |______|.--. | | | | | | | _ < 8 | | '--' || | | | | | | | | `----.| |____ | `--' | | `--' | | |_) | 9 | |_______/ |__| |__| |__| | _| |_______||_______| \______/ \______/ |______/ 10 | 11 | -------------------------------------------------------------------------------- /dimple-modules/dimple-job/dimple-job-web/src/main/resources/bootstrap.yml: -------------------------------------------------------------------------------- 1 | # Tomcat 2 | server: 3 | port: 9203 4 | 5 | # Spring 6 | spring: 7 | application: 8 | # 应用名称 9 | name: dimple-job 10 | profiles: 11 | # 环境配置 12 | active: dev 13 | cloud: 14 | nacos: 15 | discovery: 16 | # 服务注册地址 17 | server-addr: dimple-nacos:8848 18 | namespace: 63c3335c-2ba4-42c7-b05c-d8c62c1ac5a8 19 | config: 20 | # 配置中心地址 21 | server-addr: dimple-nacos:8848 22 | # 配置文件格式 23 | file-extension: yml 24 | # 共享配置 25 | shared-configs: 26 | - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} 27 | namespace: 63c3335c-2ba4-42c7-b05c-d8c62c1ac5a8 -------------------------------------------------------------------------------- /dimple-modules/dimple-log/dimple-log-service/src/main/java/com/dimple/log/service/entity/SysLogininfor.java: -------------------------------------------------------------------------------- 1 | package com.dimple.log.service.entity; 2 | 3 | import com.dimple.common.core.web.entity.BaseEntity; 4 | import lombok.Data; 5 | 6 | /** 7 | * 系统访问记录表 sys_logininfor 8 | * 9 | * @author Dimple 10 | */ 11 | @Data 12 | public class SysLogininfor extends BaseEntity { 13 | private static final long serialVersionUID = 1L; 14 | 15 | /** 16 | * ID 17 | */ 18 | private Long id; 19 | 20 | /** 21 | * 用户账号 22 | */ 23 | private String userName; 24 | 25 | /** 26 | * 状态 0成功 1失败 27 | */ 28 | private String status; 29 | 30 | /** 31 | * 地址 32 | */ 33 | private String ip; 34 | 35 | /** 36 | * 描述 37 | */ 38 | private String msg; 39 | } -------------------------------------------------------------------------------- /dimple-modules/dimple-log/dimple-log-service/src/main/java/com/dimple/log/service/mapper/BlogVisitLogMapper.java: -------------------------------------------------------------------------------- 1 | package com.dimple.log.service.mapper; 2 | 3 | import com.dimple.log.service.entity.BlogVisitLog; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * BlogVisitLogMapper 9 | * 10 | * @author Dimple 11 | * @date 3/6/2023 8:33 PM 12 | */ 13 | public interface BlogVisitLogMapper { 14 | List selectVisitLogList(BlogVisitLog blogVisitLog); 15 | 16 | int deleteVisitLogByIds(List ids); 17 | 18 | void cleanVisitLog(); 19 | 20 | int insertVisitLog(BlogVisitLog blogVisitLog); 21 | 22 | } 23 | -------------------------------------------------------------------------------- /dimple-modules/dimple-log/dimple-log-service/src/main/java/com/dimple/log/service/service/BlogVisitLogService.java: -------------------------------------------------------------------------------- 1 | package com.dimple.log.service.service; 2 | 3 | import com.dimple.system.api.model.BlogVisitLogBO; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * BlogVisitLogService 9 | * 10 | * @author Dimple 11 | * @date 3/6/2023 8:56 PM 12 | */ 13 | public interface BlogVisitLogService { 14 | List selectVisitLogList(BlogVisitLogBO blogVisitLogBO); 15 | 16 | int deleteVisitLogByIds(List ids); 17 | 18 | void cleanVisitLog(); 19 | 20 | int insertVisitLog(BlogVisitLogBO blogVisitLogBO); 21 | 22 | } 23 | -------------------------------------------------------------------------------- /dimple-modules/dimple-log/dimple-log-web/src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | Spring Boot Version: ${spring-boot.version} 2 | Spring Application Name: ${spring.application.name} 3 | 4 | _______ __ .___ ___. .______ __ _______ __ ______ _______ 5 | | \ | | | \/ | | _ \ | | | ____| | | / __ \ / _____| 6 | | .--. || | | \ / | | |_) | | | | |__ ______| | | | | | | | __ 7 | | | | || | | |\/| | | ___/ | | | __| |______| | | | | | | | |_ | 8 | | '--' || | | | | | | | | `----.| |____ | `----.| `--' | | |__| | 9 | |_______/ |__| |__| |__| | _| |_______||_______| |_______| \______/ \______| 10 | 11 | -------------------------------------------------------------------------------- /dimple-modules/dimple-log/dimple-log-web/src/main/resources/bootstrap.yml: -------------------------------------------------------------------------------- 1 | # Tomcat 2 | server: 3 | port: 9408 4 | 5 | # Spring 6 | spring: 7 | application: 8 | # 应用名称 9 | name: dimple-log 10 | profiles: 11 | # 环境配置 12 | active: dev 13 | cloud: 14 | nacos: 15 | discovery: 16 | # 服务注册地址 17 | server-addr: dimple-nacos:8848 18 | namespace: 63c3335c-2ba4-42c7-b05c-d8c62c1ac5a8 19 | config: 20 | # 配置中心地址 21 | server-addr: dimple-nacos:8848 22 | # 配置文件格式 23 | file-extension: yml 24 | # 共享配置 25 | shared-configs: 26 | - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} 27 | namespace: 63c3335c-2ba4-42c7-b05c-d8c62c1ac5a8 -------------------------------------------------------------------------------- /dimple-modules/dimple-monitor/dimple-monitor-web/src/main/java/com/dimple/monitor/web/controller/vo/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * package-info 3 | * 4 | * @author Dimple 5 | * @date 2/22/2023 2:34 PM 6 | */ 7 | package com.dimple.monitor.web.controller.vo; -------------------------------------------------------------------------------- /dimple-modules/dimple-monitor/dimple-monitor-web/src/main/java/com/dimple/monitor/web/controller/vo/redis/RedisCommandVO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.monitor.web.controller.vo.redis; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * RedisCommandVO 9 | * 10 | * @author Dimple 11 | * @date 2/22/2023 2:35 PM 12 | */ 13 | @Data 14 | @AllArgsConstructor 15 | @NoArgsConstructor 16 | public class RedisCommandVO { 17 | /** 18 | * Redis 命令 19 | */ 20 | private String command; 21 | 22 | /** 23 | * 调用次数 24 | */ 25 | private Long calls; 26 | 27 | /** 28 | * 消耗 CPU 秒数 29 | */ 30 | private Long usec; 31 | } 32 | -------------------------------------------------------------------------------- /dimple-modules/dimple-monitor/dimple-monitor-web/src/main/java/com/dimple/monitor/web/controller/vo/redis/RedisKeyValueVO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.monitor.web.controller.vo.redis; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * RedisKeyValueVO 9 | * 10 | * @author Dimple 11 | * @date 2/22/2023 3:12 PM 12 | */ 13 | @Data 14 | @NoArgsConstructor 15 | @AllArgsConstructor 16 | public class RedisKeyValueVO { 17 | private String key; 18 | 19 | private String value; 20 | } 21 | -------------------------------------------------------------------------------- /dimple-modules/dimple-monitor/dimple-monitor-web/src/main/java/com/dimple/monitor/web/controller/vo/redis/RedisMonitorInfoVO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.monitor.web.controller.vo.redis; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | import java.util.Properties; 7 | 8 | /** 9 | * RedisMonitorInfo 10 | * 11 | * @author Dimple 12 | * @date 2/22/2023 2:34 PM 13 | */ 14 | @Data 15 | public class RedisMonitorInfoVO { 16 | 17 | /** 18 | * Redis info 指令结果,具体字段,查看 Redis 文档 19 | */ 20 | private Properties info; 21 | 22 | /** 23 | * Redis key 数量 24 | */ 25 | private Long dbSize; 26 | 27 | private List commandStats; 28 | 29 | } 30 | -------------------------------------------------------------------------------- /dimple-modules/dimple-monitor/dimple-monitor-web/src/main/resources/bootstrap.yml: -------------------------------------------------------------------------------- 1 | # Tomcat 2 | server: 3 | port: 9100 4 | 5 | # Spring 6 | spring: 7 | application: 8 | # 应用名称 9 | name: dimple-monitor 10 | profiles: 11 | # 环境配置 12 | active: dev 13 | cloud: 14 | nacos: 15 | discovery: 16 | # 服务注册地址 17 | server-addr: dimple-nacos:8848 18 | namespace: 63c3335c-2ba4-42c7-b05c-d8c62c1ac5a8 19 | config: 20 | # 配置中心地址 21 | server-addr: dimple-nacos:8848 22 | # 配置文件格式 23 | file-extension: yml 24 | # 共享配置 25 | shared-configs: 26 | - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} 27 | namespace: 63c3335c-2ba4-42c7-b05c-d8c62c1ac5a8 -------------------------------------------------------------------------------- /dimple-modules/dimple-system/dimple-system-service/src/main/java/com/dimple/system/service/entity/SysDictType.java: -------------------------------------------------------------------------------- 1 | package com.dimple.system.service.entity; 2 | 3 | import com.dimple.common.core.web.entity.BaseEntity; 4 | import lombok.Data; 5 | 6 | /** 7 | * 字典类型表 sys_dict_type 8 | * 9 | * @author Dimple 10 | */ 11 | @Data 12 | public class SysDictType extends BaseEntity { 13 | private static final long serialVersionUID = 1L; 14 | 15 | /** 16 | * 字典主键 17 | */ 18 | private Long id; 19 | 20 | /** 21 | * 字典名称 22 | */ 23 | private String dictName; 24 | 25 | /** 26 | * 字典类型 27 | */ 28 | private String dictType; 29 | 30 | /** 31 | * 状态(0正常 1停用) 32 | */ 33 | private String status; 34 | } 35 | -------------------------------------------------------------------------------- /dimple-modules/dimple-system/dimple-system-service/src/main/java/com/dimple/system/service/entity/SysFile.java: -------------------------------------------------------------------------------- 1 | package com.dimple.system.service.entity; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 文件信息 7 | * 8 | * @author Dimple 9 | */ 10 | @Data 11 | public class SysFile { 12 | /** 13 | * 文件名称 14 | */ 15 | private String name; 16 | 17 | /** 18 | * 文件地址 19 | */ 20 | private String url; 21 | } 22 | -------------------------------------------------------------------------------- /dimple-modules/dimple-system/dimple-system-service/src/main/java/com/dimple/system/service/entity/SysRoleMenu.java: -------------------------------------------------------------------------------- 1 | package com.dimple.system.service.entity; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 角色和菜单关联 sys_role_menu 7 | * 8 | * @author Dimple 9 | */ 10 | @Data 11 | public class SysRoleMenu { 12 | /** 13 | * 角色ID 14 | */ 15 | private Long roleId; 16 | 17 | /** 18 | * 菜单ID 19 | */ 20 | private Long menuId; 21 | } 22 | -------------------------------------------------------------------------------- /dimple-modules/dimple-system/dimple-system-service/src/main/java/com/dimple/system/service/entity/SysUserRole.java: -------------------------------------------------------------------------------- 1 | package com.dimple.system.service.entity; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 用户和角色关联 sys_user_role 7 | * 8 | * @author Dimple 9 | */ 10 | @Data 11 | public class SysUserRole { 12 | /** 13 | * 用户ID 14 | */ 15 | private Long userId; 16 | 17 | /** 18 | * 角色ID 19 | */ 20 | private Long roleId; 21 | } 22 | -------------------------------------------------------------------------------- /dimple-modules/dimple-system/dimple-system-service/src/main/java/com/dimple/system/service/entity/dashboard/Dashboard.java: -------------------------------------------------------------------------------- 1 | package com.dimple.system.service.entity.dashboard; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | @Data 8 | public class Dashboard { 9 | private List weeks; 10 | private DashboardItem visitor; 11 | private DashboardItem comment; 12 | private DashboardItem article; 13 | private DashboardItem login; 14 | } 15 | -------------------------------------------------------------------------------- /dimple-modules/dimple-system/dimple-system-service/src/main/java/com/dimple/system/service/entity/dashboard/DashboardCountItem.java: -------------------------------------------------------------------------------- 1 | package com.dimple.system.service.entity.dashboard; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * DashboardCountItem 7 | * 8 | * @author Dimple 9 | */ 10 | @Data 11 | public class DashboardCountItem { 12 | public Long visitor; 13 | private Long comment; 14 | private Long login; 15 | private Long article; 16 | } 17 | -------------------------------------------------------------------------------- /dimple-modules/dimple-system/dimple-system-service/src/main/java/com/dimple/system/service/entity/dashboard/DashboardItem.java: -------------------------------------------------------------------------------- 1 | package com.dimple.system.service.entity.dashboard; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.util.List; 8 | 9 | @Data 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public class DashboardItem { 13 | private List lastWeekData; 14 | private List currentWeekData; 15 | } 16 | -------------------------------------------------------------------------------- /dimple-modules/dimple-system/dimple-system-service/src/main/java/com/dimple/system/service/entity/dashboard/DashboardKeyValue.java: -------------------------------------------------------------------------------- 1 | package com.dimple.system.service.entity.dashboard; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * DashboardKeyValue 7 | * 8 | * @author Dimple 9 | */ 10 | @Data 11 | public class DashboardKeyValue { 12 | private String name; 13 | private Long value; 14 | } 15 | -------------------------------------------------------------------------------- /dimple-modules/dimple-system/dimple-system-service/src/main/java/com/dimple/system/service/service/SysDashboardService.java: -------------------------------------------------------------------------------- 1 | package com.dimple.system.service.service; 2 | 3 | import com.dimple.system.service.entity.dashboard.Dashboard; 4 | import com.dimple.system.service.entity.dashboard.DashboardCountItem; 5 | import com.dimple.system.service.entity.dashboard.DashboardKeyValue; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * SysDashboardService 11 | * 12 | * @author Dimple 13 | */ 14 | public interface SysDashboardService { 15 | Dashboard getDashboardWeeklyCount(); 16 | 17 | DashboardCountItem getDashboardCountItems(); 18 | 19 | List getSpiderCount(); 20 | 21 | 22 | List getRefererCount(); 23 | } 24 | -------------------------------------------------------------------------------- /dimple-modules/dimple-system/dimple-system-service/src/main/java/com/dimple/system/service/service/SysPermissionService.java: -------------------------------------------------------------------------------- 1 | package com.dimple.system.service.service; 2 | 3 | 4 | 5 | import com.dimple.system.api.model.SysUserBO; 6 | 7 | import java.util.Set; 8 | 9 | /** 10 | * 权限信息 服务层 11 | * 12 | * @author Dimple 13 | */ 14 | public interface SysPermissionService { 15 | /** 16 | * 获取角色数据权限 17 | * 18 | * @param userId 用户Id 19 | * @return 角色权限信息 20 | */ 21 | Set getRolePermission(SysUserBO user); 22 | 23 | /** 24 | * 获取菜单数据权限 25 | * 26 | * @param userId 用户Id 27 | * @return 菜单权限信息 28 | */ 29 | Set getMenuPermission(SysUserBO user); 30 | } 31 | -------------------------------------------------------------------------------- /dimple-modules/dimple-system/dimple-system-service/src/main/java/com/dimple/system/service/service/bo/SysConfigBO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.system.service.service.bo; 2 | 3 | import com.dimple.common.core.web.entity.BaseEntity; 4 | import lombok.Data; 5 | 6 | /** 7 | * SysConfigBO 8 | * 9 | * @author Dimple 10 | */ 11 | @Data 12 | public class SysConfigBO extends BaseEntity { 13 | /** 14 | * 参数主键 15 | */ 16 | private Long id; 17 | 18 | /** 19 | * 参数名称 20 | */ 21 | private String configName; 22 | 23 | /** 24 | * 参数键名 25 | */ 26 | private String configKey; 27 | 28 | /** 29 | * 参数键值 30 | */ 31 | private String configValue; 32 | 33 | /** 34 | * 系统内置(Y是 N否) 35 | */ 36 | private String configType; 37 | } 38 | -------------------------------------------------------------------------------- /dimple-modules/dimple-system/dimple-system-service/src/main/java/com/dimple/system/service/service/bo/SysDictTypeBO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.system.service.service.bo; 2 | 3 | import com.dimple.common.core.web.entity.BaseEntity; 4 | import lombok.Data; 5 | 6 | /** 7 | * 字典类型表 sys_dict_type 8 | * 9 | * @author Dimple 10 | */ 11 | @Data 12 | public class SysDictTypeBO extends BaseEntity { 13 | private static final long serialVersionUID = 1L; 14 | 15 | /** 16 | * 字典主键 17 | */ 18 | private Long id; 19 | 20 | /** 21 | * 字典名称 22 | */ 23 | private String dictName; 24 | 25 | /** 26 | * 字典类型 27 | */ 28 | private String dictType; 29 | 30 | /** 31 | * 状态(0正常 1停用) 32 | */ 33 | private String status; 34 | } 35 | -------------------------------------------------------------------------------- /dimple-modules/dimple-system/dimple-system-service/src/main/java/com/dimple/system/service/service/bo/SysRoleMenuBO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.system.service.service.bo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 角色和菜单关联 sys_role_menu 7 | * 8 | * @author Dimple 9 | */ 10 | @Data 11 | public class SysRoleMenuBO { 12 | /** 13 | * 角色ID 14 | */ 15 | private Long roleId; 16 | 17 | /** 18 | * 菜单ID 19 | */ 20 | private Long menuId; 21 | } 22 | -------------------------------------------------------------------------------- /dimple-modules/dimple-system/dimple-system-service/src/main/java/com/dimple/system/service/service/bo/SysUserRoleBO.java: -------------------------------------------------------------------------------- 1 | package com.dimple.system.service.service.bo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 用户和角色关联 sys_user_role 7 | * 8 | * @author Dimple 9 | */ 10 | @Data 11 | public class SysUserRoleBO { 12 | /** 13 | * 用户ID 14 | */ 15 | private Long userId; 16 | 17 | /** 18 | * 角色ID 19 | */ 20 | private Long roleId; 21 | } 22 | -------------------------------------------------------------------------------- /dimple-modules/dimple-system/dimple-system-web/src/main/java/com/dimple/system/web/controller/vo/params/SysFileVOParams.java: -------------------------------------------------------------------------------- 1 | package com.dimple.system.web.controller.vo.params; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 文件信息 7 | * 8 | * @author Dimple 9 | */ 10 | @Data 11 | public class SysFileVOParams { 12 | /** 13 | * 文件名称 14 | */ 15 | private String name; 16 | 17 | /** 18 | * 文件地址 19 | */ 20 | private String url; 21 | } 22 | -------------------------------------------------------------------------------- /dimple-modules/dimple-system/dimple-system-web/src/main/java/com/dimple/system/web/controller/vo/params/SysUserRoleVOParams.java: -------------------------------------------------------------------------------- 1 | package com.dimple.system.web.controller.vo.params; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 用户和角色关联 sys_user_role 7 | * 8 | * @author Dimple 9 | */ 10 | @Data 11 | public class SysUserRoleVOParams { 12 | /** 13 | * 用户ID 14 | */ 15 | private Long userId; 16 | 17 | /** 18 | * 角色ID 19 | */ 20 | private Long roleId; 21 | } 22 | -------------------------------------------------------------------------------- /dimple-modules/dimple-system/dimple-system-web/src/main/resources/bootstrap.yml: -------------------------------------------------------------------------------- 1 | # Tomcat 2 | server: 3 | port: 9201 4 | 5 | # Spring 6 | spring: 7 | application: 8 | # 应用名称 9 | name: dimple-system 10 | profiles: 11 | # 环境配置 12 | active: dev 13 | cloud: 14 | nacos: 15 | discovery: 16 | # 服务注册地址 17 | server-addr: dimple-nacos:8848 18 | namespace: 63c3335c-2ba4-42c7-b05c-d8c62c1ac5a8 19 | config: 20 | # 配置中心地址 21 | server-addr: dimple-nacos:8848 22 | # 配置文件格式 23 | file-extension: yml 24 | # 共享配置 25 | shared-configs: 26 | - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} 27 | namespace: 63c3335c-2ba4-42c7-b05c-d8c62c1ac5a8 -------------------------------------------------------------------------------- /dimple-ui-admin/.editorconfig: -------------------------------------------------------------------------------- 1 | # 告诉EditorConfig插件,这是根文件,不用继续往上查找 2 | root = true 3 | 4 | # 匹配全部文件 5 | [*] 6 | # 设置字符集 7 | charset = utf-8 8 | # 缩进风格,可选space、tab 9 | indent_style = space 10 | # 缩进的空格数 11 | indent_size = 2 12 | # 结尾换行符,可选lf、cr、crlf 13 | end_of_line = lf 14 | # 在文件结尾插入新行 15 | insert_final_newline = true 16 | # 删除一行中的前后空格 17 | trim_trailing_whitespace = true 18 | 19 | # 匹配md结尾的文件 20 | [*.md] 21 | insert_final_newline = false 22 | trim_trailing_whitespace = false 23 | -------------------------------------------------------------------------------- /dimple-ui-admin/.env.development: -------------------------------------------------------------------------------- 1 | # 页面标题 2 | VUE_APP_TITLE = Dimple管理系统 3 | 4 | # 开发环境配置 5 | ENV = 'development' 6 | 7 | # Dimple管理系统/开发环境 8 | VUE_APP_BASE_API = '/dev-api' 9 | 10 | # 路由懒加载 11 | VUE_CLI_BABEL_TRANSPILE_MODULES = true 12 | -------------------------------------------------------------------------------- /dimple-ui-admin/.env.production: -------------------------------------------------------------------------------- 1 | # 页面标题 2 | VUE_APP_TITLE = Dimple管理系统 3 | 4 | # 生产环境配置 5 | ENV = 'production' 6 | 7 | # Dimple管理系统/生产环境 8 | VUE_APP_BASE_API = '/prod-api' 9 | -------------------------------------------------------------------------------- /dimple-ui-admin/.env.staging: -------------------------------------------------------------------------------- 1 | # 页面标题 2 | VUE_APP_TITLE = Dimple管理系统 3 | 4 | NODE_ENV = production 5 | 6 | # 测试环境配置 7 | ENV = 'staging' 8 | 9 | # Dimple管理系统/测试环境 10 | VUE_APP_BASE_API = '/stage-api' 11 | -------------------------------------------------------------------------------- /dimple-ui-admin/.eslintignore: -------------------------------------------------------------------------------- 1 | # 忽略build目录下类型为js的文件的语法检查 2 | build/*.js 3 | # 忽略src/assets目录下文件的语法检查 4 | src/assets 5 | # 忽略public目录下文件的语法检查 6 | public 7 | # 忽略当前目录下为js的文件的语法检查 8 | *.js 9 | # 忽略当前目录下为vue的文件的语法检查 10 | *.vue -------------------------------------------------------------------------------- /dimple-ui-admin/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | **/*.log 8 | 9 | tests/**/coverage/ 10 | tests/e2e/reports 11 | selenium-debug.log 12 | 13 | # Editor directories and files 14 | .idea 15 | .vscode 16 | *.suo 17 | *.ntvs* 18 | *.njsproj 19 | *.sln 20 | *.local 21 | 22 | package-lock.json 23 | yarn.lock 24 | -------------------------------------------------------------------------------- /dimple-ui-admin/README.md: -------------------------------------------------------------------------------- 1 | ## 开发 2 | 3 | ```bash 4 | # 克隆项目 5 | git clone https://github.com/martin-chips/DimpleBlog.git 6 | 7 | # 进入项目目录 8 | cd dimple-ui 9 | 10 | # 安装依赖 11 | npm install 12 | 13 | # 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 14 | npm install --registry=https://registry.npmmirror.com 15 | 16 | # 启动服务 17 | npm run dev 18 | ``` 19 | 20 | 浏览器访问 http://localhost:80 21 | 22 | ## 发布 23 | 24 | ```bash 25 | # 构建测试环境 26 | npm run build:stage 27 | 28 | # 构建生产环境 29 | npm run build:prod 30 | ``` -------------------------------------------------------------------------------- /dimple-ui-admin/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app 4 | '@vue/cli-plugin-babel/preset' 5 | ], 6 | 'env': { 7 | 'development': { 8 | // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require(). 9 | // This plugin can significantly increase the speed of hot updates, when you have a large number of pages. 10 | 'plugins': ['dynamic-import-node'] 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /dimple-ui-admin/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-admin/public/favicon.ico -------------------------------------------------------------------------------- /dimple-ui-admin/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: / -------------------------------------------------------------------------------- /dimple-ui-admin/src/api/blog/about.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | 4 | export function getAbout(id) { 5 | return request({ 6 | url: '/blog/about/', 7 | method: 'get' 8 | }) 9 | } 10 | 11 | export function updateAbout(data) { 12 | return request({ 13 | url: '/blog/about/', 14 | method: 'put', 15 | data: data 16 | }) 17 | } 18 | 19 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/api/blog/config.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | 4 | export function getConfig() { 5 | return request({ 6 | url: '/blog/config/', 7 | method: 'get' 8 | }) 9 | } 10 | 11 | export function updateConfig(data) { 12 | return request({ 13 | url: '/blog/config/', 14 | method: 'put', 15 | data: data 16 | }) 17 | } 18 | 19 | export function deleteCache() { 20 | return request({ 21 | url: '/blog/config/', 22 | method: 'delete', 23 | }) 24 | } 25 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/api/file/file.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function listFile(query) { 4 | return request({ 5 | url: '/file/file/list', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | 12 | export function editFileName(params) { 13 | return request({ 14 | url: '/file/file/' + params.id + '/name/', 15 | method: 'put', 16 | data: {name: params.name} 17 | }) 18 | } 19 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/api/log/jobLog.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询调度日志列表 4 | export function listJobLog(query) { 5 | return request({ 6 | url: '/schedule/job/log/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 删除调度日志 13 | export function delJobLog(id) { 14 | return request({ 15 | url: '/schedule/job/log/' + id, 16 | method: 'delete' 17 | }) 18 | } 19 | 20 | // 清空调度日志 21 | export function cleanJobLog() { 22 | return request({ 23 | url: '/schedule/job/log/clean', 24 | method: 'delete' 25 | }) 26 | } 27 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/api/log/logininfor.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询登录日志列表 4 | export function list(query) { 5 | return request({ 6 | url: '/log/logininfor/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 删除登录日志 13 | export function delLogininfor(id) { 14 | return request({ 15 | url: '/log/logininfor/' + id, 16 | method: 'delete' 17 | }) 18 | } 19 | 20 | // 解锁用户登录状态 21 | export function unlockLogininfor(userName) { 22 | return request({ 23 | url: '/log/user/unlock/' + userName, 24 | method: 'get' 25 | }) 26 | } 27 | 28 | // 清空登录日志 29 | export function cleanLogininfor() { 30 | return request({ 31 | url: '/log/logininfor/clean', 32 | method: 'delete' 33 | }) 34 | } 35 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/api/log/operlog.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询操作日志列表 4 | export function list(query) { 5 | return request({ 6 | url: '/log/operlog/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 删除操作日志 13 | export function delOperlog(id) { 14 | return request({ 15 | url: '/log/operlog/' + id, 16 | method: 'delete' 17 | }) 18 | } 19 | 20 | // 清空操作日志 21 | export function cleanOperlog() { 22 | return request({ 23 | url: '/log/operlog/clean', 24 | method: 'delete' 25 | }) 26 | } 27 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/api/log/visitLog.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询访问日志列表 4 | export function list(query) { 5 | return request({ 6 | url: '/log/visitlog/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 删除访问日志 13 | export function delVisitLog(id) { 14 | return request({ 15 | url: '/log/visitlog/' + id, 16 | method: 'delete' 17 | }) 18 | } 19 | 20 | // 清空访问日志 21 | export function cleanVisitLog() { 22 | return request({ 23 | url: '/log/visitlog/clean', 24 | method: 'delete' 25 | }) 26 | } 27 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/api/menu.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 获取路由 4 | export const getRouters = () => { 5 | return request({ 6 | url: '/system/menu/getRouters', 7 | method: 'get' 8 | }) 9 | } -------------------------------------------------------------------------------- /dimple-ui-admin/src/api/monitor/online.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询在线用户列表 4 | export function list(query) { 5 | return request({ 6 | url: '/monitor/online/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 强退用户 13 | export function forceLogout(tokenId) { 14 | return request({ 15 | url: '/monitor/online/' + tokenId, 16 | method: 'delete' 17 | }) 18 | } 19 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/api/system/dashboard.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | export function getDashboardCount(query) { 4 | return request({ 5 | url: '/system/dashboard/count', 6 | method: 'get', 7 | params: query 8 | }) 9 | } 10 | 11 | export function getDashboardCountItem() { 12 | return request({ 13 | url: '/system/dashboard/count/item', 14 | method: 'get', 15 | }) 16 | } 17 | 18 | export function getDashboardSpider() { 19 | return request({ 20 | url: '/system/dashboard/spider', 21 | method: 'get', 22 | }) 23 | } 24 | 25 | export function getDashboardReferer() { 26 | return request({ 27 | url: '/system/dashboard/referer', 28 | method: 'get', 29 | }) 30 | } 31 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/401_images/401.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-admin/src/assets/401_images/401.gif -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/404_images/404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-admin/src/assets/404_images/404.png -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/404_images/404_cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-admin/src/assets/404_images/404_cloud.png -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import SvgIcon from '@/components/SvgIcon' // svg component 3 | 4 | // register globally 5 | Vue.component('svg-icon', SvgIcon) 6 | 7 | const req = require.context('./svg', false, /\.svg$/) 8 | const requireAll = requireContext => requireContext.keys().map(requireContext) 9 | requireAll(req) 10 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/chart.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/code.svg: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | 7 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/documentation.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/drag.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/druid.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/edit.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/education.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/email.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/example.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/excel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/fullscreen.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/guide.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/input.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/link.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/lock.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/message.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/money.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/nested.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/password.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/peoples.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/search.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/server.svg: -------------------------------------------------------------------------------- 1 | 3 | 5 | 6 | 7 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/size.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/slider.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/star.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/switch.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/tab.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/table.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/textarea.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/theme.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/time.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svg/user.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/icons/svgo.yml: -------------------------------------------------------------------------------- 1 | # replace default config 2 | 3 | # multipass: true 4 | # full: true 5 | 6 | plugins: 7 | 8 | # - name 9 | # 10 | # or: 11 | # - name: false 12 | # - name: true 13 | # 14 | # or: 15 | # - name: 16 | # param1: 1 17 | # param2: 2 18 | 19 | - removeAttrs: 20 | attrs: 21 | - 'fill' 22 | - 'fill-rule' 23 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/images/dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-admin/src/assets/images/dashboard.png -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/images/login-background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-admin/src/assets/images/login-background.jpg -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/images/profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-admin/src/assets/images/profile.png -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/login/qrcode-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-admin/src/assets/login/qrcode-icon.png -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/login/side-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-admin/src/assets/login/side-logo.png -------------------------------------------------------------------------------- /dimple-ui-admin/src/assets/logo/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-admin/src/assets/logo/logo.png -------------------------------------------------------------------------------- /dimple-ui-admin/src/components/Dimple/Doc/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 22 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/components/Dimple/Git/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 22 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/components/IconSelect/requireIcons.js: -------------------------------------------------------------------------------- 1 | const req = require.context('../../assets/icons/svg', false, /\.svg$/) 2 | const requireAll = requireContext => requireContext.keys() 3 | 4 | const re = /\.\/(.*)\.svg/ 5 | 6 | const icons = requireAll(req).map(i => { 7 | return i.match(re)[1] 8 | }) 9 | 10 | export default icons 11 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/components/MarkdownEditor/defaultOptions.js: -------------------------------------------------------------------------------- 1 | export default { 2 | minHeight: '800px', 3 | previewStyle: 'vertical', // Markdown Editor的预览样式(标签,垂直) 4 | useCommandShortcut: true, // 是否使用键盘快捷键执行命令 5 | useDefaultHTMLSanitizer: true, 6 | usageStatistics: false, // 发送主机名到谷歌分析 7 | hideModeSwitch: false, // 隐藏模式开关选项卡栏 8 | // 工具栏配置 9 | toolbarItems: [ 10 | ['heading', 'bold', 'italic', 'strike'], 11 | ['hr', 'quote'], 12 | ['ul', 'ol', 'task', 'indent', 'outdent'], 13 | ['table', 'image', 'link'], 14 | ['code', 'codeblock'], 15 | ['scrollSync'] 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/components/ParentView/index.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/directive/index.js: -------------------------------------------------------------------------------- 1 | import hasRole from './permission/hasRole' 2 | import hasPermi from './permission/hasPermi' 3 | import dialogDrag from './dialog/drag' 4 | import dialogDragWidth from './dialog/dragWidth' 5 | import dialogDragHeight from './dialog/dragHeight' 6 | import clipboard from './module/clipboard' 7 | 8 | const install = function (Vue) { 9 | Vue.directive('hasRole', hasRole) 10 | Vue.directive('hasPermi', hasPermi) 11 | Vue.directive('clipboard', clipboard) 12 | Vue.directive('dialogDrag', dialogDrag) 13 | Vue.directive('dialogDragWidth', dialogDragWidth) 14 | Vue.directive('dialogDragHeight', dialogDragHeight) 15 | } 16 | 17 | if (window.Vue) { 18 | window['hasRole'] = hasRole 19 | window['hasPermi'] = hasPermi 20 | Vue.use(install); // eslint-disable-line 21 | } 22 | 23 | export default install 24 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/directive/permission/hasRole.js: -------------------------------------------------------------------------------- 1 | /** 2 | * v-hasRole 角色权限处理 3 | * Copyright (c) 2022 Dimple 4 | */ 5 | 6 | import store from '@/store' 7 | 8 | export default { 9 | inserted(el, binding, vnode) { 10 | const {value} = binding 11 | const super_admin = "admin"; 12 | const roles = store.getters && store.getters.roles 13 | 14 | if (value && value instanceof Array && value.length > 0) { 15 | const roleFlag = value 16 | 17 | const hasRole = roles.some(role => { 18 | return super_admin === role || roleFlag.includes(role) 19 | }) 20 | 21 | if (!hasRole) { 22 | el.parentNode && el.parentNode.removeChild(el) 23 | } 24 | } else { 25 | throw new Error(`请设置角色权限标签值"`) 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/layout/components/IframeToggle/index.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 25 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/layout/components/Sidebar/FixiOSBug.js: -------------------------------------------------------------------------------- 1 | export default { 2 | computed: { 3 | device() { 4 | return this.$store.state.app.device 5 | } 6 | }, 7 | mounted() { 8 | // In order to fix the click on menu on the ios device will trigger the mouseleave bug 9 | this.fixBugIniOS() 10 | }, 11 | methods: { 12 | fixBugIniOS() { 13 | const $subMenu = this.$refs.subMenu 14 | if ($subMenu) { 15 | const handleMouseleave = $subMenu.handleMouseleave 16 | $subMenu.handleMouseleave = (e) => { 17 | if (this.device === 'mobile') { 18 | return 19 | } 20 | handleMouseleave(e) 21 | } 22 | } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/layout/components/Sidebar/Item.vue: -------------------------------------------------------------------------------- 1 | 34 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/layout/components/index.js: -------------------------------------------------------------------------------- 1 | export { default as AppMain } from './AppMain' 2 | export { default as Navbar } from './Navbar' 3 | export {default as Settings} from './Settings' 4 | export {default as Sidebar} from './Sidebar/index.vue' 5 | export {default as TagsView} from './TagsView/index.vue' 6 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/plugins/index.js: -------------------------------------------------------------------------------- 1 | import tab from './tab' 2 | import auth from './auth' 3 | import cache from './cache' 4 | import modal from './modal' 5 | import download from './download' 6 | 7 | export default { 8 | install(Vue) { 9 | // 页签操作 10 | Vue.prototype.$tab = tab 11 | // 认证对象 12 | Vue.prototype.$auth = auth 13 | // 缓存对象 14 | Vue.prototype.$cache = cache 15 | // 模态框对象 16 | Vue.prototype.$modal = modal 17 | // 下载文件 18 | Vue.prototype.$download = download 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import app from './modules/app' 4 | import dict from './modules/dict' 5 | import user from './modules/user' 6 | import tagsView from './modules/tagsView' 7 | import permission from './modules/permission' 8 | import settings from './modules/settings' 9 | import getters from './getters' 10 | 11 | Vue.use(Vuex) 12 | 13 | const store = new Vuex.Store({ 14 | modules: { 15 | app, 16 | dict, 17 | user, 18 | tagsView, 19 | permission, 20 | settings 21 | }, 22 | getters 23 | }) 24 | 25 | export default store 26 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/utils/auth.js: -------------------------------------------------------------------------------- 1 | import Cookies from 'js-cookie' 2 | 3 | const TokenKey = 'Admin-Token' 4 | 5 | const ExpiresInKey = 'Admin-Expires-In' 6 | 7 | export function getToken() { 8 | return Cookies.get(TokenKey) 9 | } 10 | 11 | export function setToken(token) { 12 | return Cookies.set(TokenKey, token) 13 | } 14 | 15 | export function removeToken() { 16 | return Cookies.remove(TokenKey) 17 | } 18 | 19 | export function getExpiresIn() { 20 | return Cookies.get(ExpiresInKey) || -1 21 | } 22 | 23 | export function setExpiresIn(time) { 24 | return Cookies.set(ExpiresInKey, time) 25 | } 26 | 27 | export function removeExpiresIn() { 28 | return Cookies.remove(ExpiresInKey) 29 | } 30 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/utils/dict/DictConverter.js: -------------------------------------------------------------------------------- 1 | import DictOptions from './DictOptions' 2 | import DictData from './DictData' 3 | 4 | export default function (dict, dictMeta) { 5 | const label = determineDictField(dict, dictMeta.labelField, ...DictOptions.DEFAULT_LABEL_FIELDS) 6 | const value = determineDictField(dict, dictMeta.valueField, ...DictOptions.DEFAULT_VALUE_FIELDS) 7 | return new DictData(dict[label], dict[value], dict) 8 | } 9 | 10 | /** 11 | * 确定字典字段 12 | * @param {DictData} dict 13 | * @param {...String} fields 14 | */ 15 | function determineDictField(dict, ...fields) { 16 | return fields.find(f => Object.prototype.hasOwnProperty.call(dict, f)) 17 | } 18 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/utils/dict/DictData.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @classdesc 字典数据 3 | * @property {String} label 标签 4 | * @property {*} value 标签 5 | * @property {Object} raw 原始数据 6 | */ 7 | export default class DictData { 8 | constructor(label, value, raw) { 9 | this.label = label 10 | this.value = value 11 | this.raw = raw 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/utils/errorCode.js: -------------------------------------------------------------------------------- 1 | export default { 2 | '401': '认证失败,无法访问系统资源', 3 | '403': '当前操作没有权限', 4 | '404': '访问资源不存在', 5 | 'default': '系统未知错误,请反馈给管理员' 6 | } 7 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/utils/generator/css.js: -------------------------------------------------------------------------------- 1 | const styles = { 2 | 'el-rate': '.el-rate{display: inline-block; vertical-align: text-top;}', 3 | 'el-upload': '.el-upload__tip{line-height: 1.2;}' 4 | } 5 | 6 | function addCss(cssList, el) { 7 | const css = styles[el.tag] 8 | css && cssList.indexOf(css) === -1 && cssList.push(css) 9 | if (el.children) { 10 | el.children.forEach(el2 => addCss(cssList, el2)) 11 | } 12 | } 13 | 14 | export function makeUpCss(conf) { 15 | const cssList = [] 16 | conf.fields.forEach(el => addCss(cssList, el)) 17 | return cssList.join('\n') 18 | } 19 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/utils/generator/drawingDefault.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | layout: 'colFormItem', 4 | tagIcon: 'input', 5 | label: '手机号', 6 | vModel: 'mobile', 7 | formId: 6, 8 | tag: 'el-input', 9 | placeholder: '请输入手机号', 10 | defaultValue: '', 11 | span: 24, 12 | style: { width: '100%' }, 13 | clearable: true, 14 | prepend: '', 15 | append: '', 16 | 'prefix-icon': 'el-icon-mobile', 17 | 'suffix-icon': '', 18 | maxlength: 11, 19 | 'show-word-limit': true, 20 | readonly: false, 21 | disabled: false, 22 | required: true, 23 | changeTag: true, 24 | regList: [{ 25 | pattern: '/^1(3|4|5|7|8|9)\\d{9}$/', 26 | message: '手机号格式错误' 27 | }] 28 | } 29 | ] 30 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/views/blog/article/add.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 13 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/views/blog/article/edit.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 13 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/views/components/icons/svg-icons.js: -------------------------------------------------------------------------------- 1 | const req = require.context('../../../assets/icons/svg', false, /\.svg$/) 2 | const requireAll = requireContext => requireContext.keys() 3 | 4 | const re = /\.\/(.*)\.svg/ 5 | 6 | const svgIcons = requireAll(req).map(i => { 7 | return i.match(re)[1] 8 | }) 9 | 10 | export default svgIcons 11 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/views/login/components/LoginQrcode.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 18 | 19 | 22 | -------------------------------------------------------------------------------- /dimple-ui-admin/src/views/redirect.vue: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /dimple-ui-blog/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [["@babel/preset-env"]], 3 | "plugins": [ 4 | "transform-vue-jsx", 5 | "@babel/transform-runtime", 6 | [ 7 | "component", 8 | { 9 | "libraryName": "element-ui", 10 | "styleLibraryName": "theme-chalk" 11 | } 12 | ] 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /dimple-ui-blog/.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 10 | -------------------------------------------------------------------------------- /dimple-ui-blog/.eslintignore: -------------------------------------------------------------------------------- 1 | 2 | config/* 3 | src/assets 4 | src/utils/lazyLoad.js 5 | node_modules 6 | dist -------------------------------------------------------------------------------- /dimple-ui-blog/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist/* 4 | server/db/secret.js 5 | server/db/copy/* 6 | server/files/movies 7 | package-lock.json 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | pnpm-debug.log* 14 | 15 | # Editor directories and files 16 | .idea 17 | .vscode 18 | .history 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /dimple-ui-blog/.husky/commit-msg: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npx --no-install commitlint --edit "$1" 5 | -------------------------------------------------------------------------------- /dimple-ui-blog/.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npx lint-staged --allow-empty "$1" 5 | -------------------------------------------------------------------------------- /dimple-ui-blog/.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | "postcss-import": {}, 6 | "postcss-url": {}, 7 | // to edit target browsers: use "browserslist" field in package.json 8 | "autoprefixer": {} 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /dimple-ui-blog/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "semi": false, 4 | "trailingComma":"none", 5 | "htmlWhitespaceSensitivity": "ignore", 6 | "printWidth": 120, 7 | "proseWrap ": "preserver" 8 | } -------------------------------------------------------------------------------- /dimple-ui-blog/build/checkPort.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @desc 检查端口占用并返回一个可用端口 3 | */ 4 | const detect = require('detect-port') 5 | 6 | module.exports = function checkPort(port = 8820) { 7 | return new Promise((resolve) => { 8 | detect(port, (err, _port) => { 9 | if (err) { 10 | console.log(err) 11 | } 12 | if (port == _port) { 13 | resolve(port) 14 | } else { 15 | resolve(_port) 16 | console.log(`port: ${port} was occupied, try port: ${_port}`) 17 | } 18 | }) 19 | }) 20 | } 21 | -------------------------------------------------------------------------------- /dimple-ui-blog/build/vue-loader.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extractCSS: process.env.NODE_ENV === 'production', 3 | preserveWhitespace: false, 4 | postcss: [ 5 | require('autoprefixer')({ 6 | browsers: ['last 3 versions'] 7 | }) 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /dimple-ui-blog/commitlint.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * feat:新增功能 3 | * fix:bug 修复 4 | * docs:文档更新 5 | * style:不影响程序逻辑的代码修改(修改空白字符,格式缩进,补全缺失的分号等,没有改变代码逻辑) 6 | * refactor:重构代码(既没有新增功能,也没有修复 bug) 7 | * perf:性能, 体验优化 8 | * test:新增测试用例或是更新现有测试 9 | * build:主要目的是修改项目构建系统(例如 glup,webpack,rollup 的配置等)的提交 10 | * ci:主要目的是修改项目继续集成流程(例如 Travis,Jenkins,GitLab CI,Circle等)的提交 11 | * chore:不属于以上类型的其他类型,比如构建流程, 依赖管理 12 | * revert:回滚某个更早之前的提交 13 | */ 14 | module.exports = { 15 | extends: ['@commitlint/config-conventional'], 16 | rules: { 17 | 'type-enum': [2, 'always', ['feat', 'fix', 'docs', 'style', 'perf', 'refactor', 'test', 'chore', 'revert']], 18 | 'subject-full-stop': [0, 'never'], 19 | 'subject-case': [0, 'never'] 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /dimple-ui-blog/config/env.dev.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | NODE_ENV: '"development"', 3 | STATS: '"development"', 4 | BASE_URL: '"http://localhost:8820"', 5 | BASE_API_URL: '"http://localhost:8080"', 6 | BASE_API_PREFIX: '"/dev-api"' 7 | } 8 | -------------------------------------------------------------------------------- /dimple-ui-blog/config/env.prod.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @desc 生产环境的变量注入 3 | */ 4 | module.exports = { 5 | NODE_ENV: '"production"', 6 | STATS: '"production"', 7 | BASE_URL: '"https://www.bianxf.com"', 8 | BASE_API_URL: '"http://dimple-gateway:8080"', 9 | BASE_API_PREFIX: '"/prod-api"' 10 | } 11 | -------------------------------------------------------------------------------- /dimple-ui-blog/copy.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs-extra') 2 | console.log() 3 | console.log('开始复制部署资源 >>>>') 4 | console.log() 5 | fs.copySync('./static', './dist/front') 6 | fs.copySync('./src/index.template.html', './dist/front/index.template.html') 7 | fs.copySync('./server.js', './dist/server.js') 8 | fs.copySync('./sitemap.js', './dist/sitemap.js') 9 | fs.copySync('./ecosystem.config.js', './dist/ecosystem.config.js') 10 | // 处理package.json 11 | const json = fs.readFileSync('./package.json') 12 | const obj = JSON.parse(json) 13 | ;(obj.scripts['start:local'] = '../node_modules/.bin/cross-env NODE_ENV=production node server'), 14 | fs.writeFileSync('./dist/package.json', JSON.stringify(obj, null, '\t'), 'utf8') 15 | 16 | console.log('部署资源复制完毕 >>>>') 17 | console.log() 18 | -------------------------------------------------------------------------------- /dimple-ui-blog/ecosystem.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | apps: [ 3 | { 4 | name: `Dimple's Blog`, 5 | cwd: './', 6 | script: 'server.js', 7 | max_memory_restart: '1024M', 8 | log_date_format: 'YYYY-MM-DD HH:mm Z', 9 | exec_mode: 'cluster', 10 | // 自定义应用程序的错误日志文件(错误日志文件) 11 | error_file: './logs/app-err.log', 12 | // 自定义应用程序日志文件(正常日志文件) 13 | out_file: './logs/app-out.log', 14 | // 设置追加日志而不是新建日志 15 | // 启用/禁用应用程序崩溃或退出时自动重启,默认为true, 发生异常的情况下自动重启 16 | autorestart: true, 17 | merge_logs: true, 18 | instances: '1', 19 | watch: 'false', 20 | env: { 21 | NODE_ENV: 'development' 22 | }, 23 | env_production: { 24 | NODE_ENV: 'production' // 环境参数,当前指定为生产环境 25 | } 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/api/about.js: -------------------------------------------------------------------------------- 1 | import request from "@/utils/request"; 2 | 3 | export default { 4 | getAbout() { 5 | return request({ 6 | url: '/blog-front/about', 7 | method: 'get' 8 | }) 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/api/archives.js: -------------------------------------------------------------------------------- 1 | import request from "@/utils/request"; 2 | 3 | export default { 4 | // archive page used 5 | getArchives(query) { 6 | return request({ 7 | url: '/blog-front/archives', 8 | method: 'get', 9 | params: query 10 | }) 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/api/category.js: -------------------------------------------------------------------------------- 1 | import request from "@/utils/request"; 2 | 3 | 4 | export default { 5 | listCategory(query) { 6 | return request({ 7 | url: '/blog-front/category/list', 8 | method: 'get', 9 | params: query 10 | }); 11 | }, 12 | getCategory(id) { 13 | return request({ 14 | url: '/blog-front/category/' + id, 15 | method: 'get' 16 | }) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/api/index.js: -------------------------------------------------------------------------------- 1 | import article from "./article"; 2 | import comments from "./comment"; 3 | import messageBoard from './messageBoard' 4 | import category from "./category"; 5 | import tags from "./tag"; 6 | import archives from "./archives"; 7 | import link from "./link"; 8 | import visitor from "./visitor"; 9 | import panel from "./panel"; 10 | import about from "./about"; 11 | import asyncData from "./asyncData"; 12 | 13 | export default { 14 | ...article, 15 | ...archives, 16 | ...comments, 17 | ...category, 18 | ...messageBoard, 19 | ...link, 20 | ...about, 21 | ...panel, 22 | ...visitor, 23 | ...tags, 24 | ...asyncData 25 | } 26 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/api/link.js: -------------------------------------------------------------------------------- 1 | import request from "@/utils/request"; 2 | 3 | export default { 4 | listLink(query) { 5 | return request({ 6 | url: '/blog-front/link/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | }, 11 | addLink(data) { 12 | return request({ 13 | url: '/blog-front/link', 14 | method: 'post', 15 | data: data 16 | }) 17 | }, 18 | addLinkVisitCount(id) { 19 | return request({ 20 | url: '/blog-front/link/' + id + "/visitCount", 21 | method: 'put', 22 | }) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/api/messageBoard.js: -------------------------------------------------------------------------------- 1 | import request from "@/utils/request"; 2 | 3 | export default { 4 | getMessageBoard(query) { 5 | return request({ 6 | url: "/blog-front/messageBoard/list", 7 | method: "get", 8 | params: query 9 | }); 10 | }, 11 | 12 | saveMessageBoard(data) { 13 | return request({ 14 | url: "/blog-front/messageBoard", 15 | method: "post", 16 | data: data 17 | }); 18 | }, 19 | 20 | likeMessageBoard(id) { 21 | return request({ 22 | url: "/blog-front/messageBoard/likeCount/" + id, 23 | method: "post", 24 | }); 25 | } 26 | }; 27 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/api/tag.js: -------------------------------------------------------------------------------- 1 | import request from "@/utils/request"; 2 | 3 | export default { 4 | listTag(query) { 5 | return request({ 6 | url: '/blog-front/tag/list', method: 'get', params: query 7 | }) 8 | }, 9 | 10 | // 查询标签详细 11 | getTag(id) { 12 | return request({ 13 | url: '/blog-front/tag/' + id, method: 'get' 14 | }) 15 | } 16 | } -------------------------------------------------------------------------------- /dimple-ui-blog/src/assets/font/sf-arch/SF Arch Rival Extended Bold.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: "SF Arch Rival Extended Bold"; 3 | src: url("SF Arch Rival Extended Bold.eot"); /* IE9 */ 4 | src: url("SF Arch Rival Extended Bold.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */ 5 | 6 | url("SF Arch Rival Extended Bold.woff") format("woff"), /* chrome、firefox */ 7 | url("SF Arch Rival Extended Bold.ttf") format("truetype"), /* chrome、firefox、opera、Safari, Android, iOS 4.2+ */ 8 | 9 | url("SF Arch Rival Extended Bold.svg#SF Arch Rival Extended Bold") format("svg"); /* iOS 4.1- */ 10 | font-style: normal; 11 | font-weight: normal; 12 | } 13 | 14 | 15 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/assets/font/sf-arch/SF Arch Rival Extended Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/src/assets/font/sf-arch/SF Arch Rival Extended Bold.eot -------------------------------------------------------------------------------- /dimple-ui-blog/src/assets/font/sf-arch/SF Arch Rival Extended Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/src/assets/font/sf-arch/SF Arch Rival Extended Bold.ttf -------------------------------------------------------------------------------- /dimple-ui-blog/src/assets/font/sf-arch/SF Arch Rival Extended Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/src/assets/font/sf-arch/SF Arch Rival Extended Bold.woff -------------------------------------------------------------------------------- /dimple-ui-blog/src/assets/img/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/src/assets/img/github.png -------------------------------------------------------------------------------- /dimple-ui-blog/src/assets/img/icp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/src/assets/img/icp.png -------------------------------------------------------------------------------- /dimple-ui-blog/src/assets/img/loading-error.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/src/assets/img/loading-error.gif -------------------------------------------------------------------------------- /dimple-ui-blog/src/assets/img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/src/assets/img/loading.gif -------------------------------------------------------------------------------- /dimple-ui-blog/src/assets/img/qq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/src/assets/img/qq.png -------------------------------------------------------------------------------- /dimple-ui-blog/src/assets/img/share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/src/assets/img/share.png -------------------------------------------------------------------------------- /dimple-ui-blog/src/components/base/miss.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/components/dot/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 14 | 39 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/components/note/index.vue: -------------------------------------------------------------------------------- 1 | 9 | 17 | 39 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/store/actions.js: -------------------------------------------------------------------------------- 1 | export default {} 2 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/style/function.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * @desc 函数 3 | */ 4 | 5 | @function merge($maps...) { 6 | $copy: (); 7 | @each $mv in $maps { 8 | @each $k, $v in $mv { 9 | $copy: map-merge( 10 | $copy, 11 | ( 12 | $k: $v 13 | ) 14 | ); 15 | } 16 | } 17 | @return $copy; 18 | } 19 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/style/index.scss: -------------------------------------------------------------------------------- 1 | @import './theme/map.scss'; 2 | @import './mixins.scss'; 3 | @import './global.scss'; 4 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/style/theme/dark/font.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * @desc: 字体表 ,切换主题有文字变化时在此文件补充 3 | */ 4 | 5 | $font: ( 6 | font12: 12px, 7 | font14: 14px 8 | ); 9 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/style/theme/dark/index.scss: -------------------------------------------------------------------------------- 1 | // 暗黑色系 2 | @import './color.scss'; 3 | @import './font.scss'; 4 | @import '~@/style/function.scss'; 5 | 6 | $dark: merge($color, $font); 7 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/style/theme/light/font.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * @desc: 字体表 ,切换主题有文字变化时在此文件补充 3 | */ 4 | 5 | $font: ( 6 | font12: 12px, 7 | font14: 14px 8 | ); 9 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/style/theme/light/index.scss: -------------------------------------------------------------------------------- 1 | // 亮色,默认色系 2 | @import './color.scss'; 3 | @import './font.scss'; 4 | @import '~@/style/function.scss'; 5 | 6 | $light: merge($color, $font); 7 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/style/theme/map.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * @desc: 主题映射表 3 | * @use key即为主题后缀 .dimple—theme-${key} 4 | */ 5 | @import './dark/index.scss'; 6 | @import './light/index.scss'; 7 | 8 | $themes: ( 9 | dark: $dark, 10 | light: $light 11 | ); 12 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/utils/cls.js: -------------------------------------------------------------------------------- 1 | export function cls(cls) { 2 | if (document.getElementsByClassName) { 3 | return document.getElementsByClassName(cls)[0] 4 | } else { 5 | let arr = document.getElementsByTagName('*') 6 | let tempArr = [] 7 | for (let i = 0; i < arr.length; i++) { 8 | let clsArr = arr[i].className.split(' ') 9 | for (let k = 0; k < clsArr.length; k++) { 10 | if (clsArr[k] === cls) { 11 | tempArr.push(arr[i]) 12 | } 13 | } 14 | } 15 | return tempArr[0] 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/utils/errCodeBack.js: -------------------------------------------------------------------------------- 1 | import {Message} from 'element-ui' 2 | 3 | export function errorCode(code) { 4 | switch (code) { 5 | case 200: 6 | break 7 | case 100: 8 | _message('warning', '昵称已存在') 9 | break 10 | case 101: 11 | _message('warning', '您已经点过赞了 ~') 12 | break 13 | case 102: 14 | _message('warning', '文章不存在或已删除 ~') 15 | break 16 | case 429: 17 | _message('warning', '访问次数超限,请稍后再试 ~') 18 | break 19 | } 20 | } 21 | 22 | function _message(t, m) { 23 | Message({ 24 | type: t, 25 | message: m, 26 | center: true 27 | }) 28 | } 29 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/utils/errorCode.js: -------------------------------------------------------------------------------- 1 | export default { 2 | '401': '认证失败,无法访问系统资源', 3 | '403': '当前操作没有权限', 4 | '404': '访问资源不存在', 5 | 'default': '系统未知错误,请反馈给管理员' 6 | } 7 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/utils/getElementTop.js: -------------------------------------------------------------------------------- 1 | export function getElementTop(ele) { 2 | let actualTop = ele.offsetTop 3 | let current = ele.offsetParent 4 | while (current !== null) { 5 | actualTop += current.offsetTop 6 | current = current.offsetParent 7 | } 8 | return actualTop 9 | } 10 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/utils/getRandomCharacter.js: -------------------------------------------------------------------------------- 1 | export function getRandomCharacter(digits = 4, join = '') { 2 | const words = [ 3 | 'A', 4 | 'B', 5 | 'C', 6 | 'D', 7 | 'E', 8 | 'F', 9 | 'G', 10 | 'H', 11 | 'I', 12 | 'J', 13 | 'K', 14 | 'L', 15 | 'M', 16 | 'N', 17 | 'O', 18 | 'P', 19 | 'Q', 20 | 'R', 21 | 'S', 22 | 'T', 23 | 'U', 24 | 'V', 25 | 'W', 26 | 'X', 27 | 'Y', 28 | 'Z' 29 | ] 30 | if (typeof digits !== 'number') throw new Error('参数必须为 number 类型') 31 | return Array(digits) 32 | .fill() 33 | .map(() => words[Math.ceil(Math.random() * 1000) % 26]) 34 | .join(join) 35 | } 36 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/utils/getRandomColor.js: -------------------------------------------------------------------------------- 1 | export function getRandomColor() { 2 | const r = Math.floor(Math.random() * 255) 3 | const g = Math.floor(Math.random() * 255) 4 | const b = Math.floor(Math.random() * 255) 5 | const rgb = `rgb(${r},${g},${b})` 6 | return rgb 7 | } 8 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/utils/getScrollTop.js: -------------------------------------------------------------------------------- 1 | export function getScrollTop() { 2 | let scrollTop = 0 3 | if (document.documentElement && document.documentElement.scrollTop) { 4 | scrollTop = document.documentElement.scrollTop 5 | } else if (document.body) { 6 | scrollTop = document.body.scrollTop 7 | } 8 | return scrollTop 9 | } 10 | -------------------------------------------------------------------------------- /dimple-ui-blog/src/utils/storage.js: -------------------------------------------------------------------------------- 1 | // 访客信息key 2 | const visitorKey = 'v_k_i' 3 | const themeKey = 'global_theme' 4 | 5 | export const storage = { 6 | getVisitor() { 7 | if (localStorage.getItem(visitorKey)) { 8 | return JSON.parse(localStorage.getItem(visitorKey)) 9 | } 10 | }, 11 | setVisitor(info) { 12 | localStorage.setItem(visitorKey, JSON.stringify(info)) 13 | }, 14 | removeVisitor() { 15 | localStorage.removeItem(visitorKey) 16 | }, 17 | getTheme() { 18 | return localStorage.getItem(themeKey); 19 | }, 20 | setTheme(theme) { 21 | localStorage.setItem(themeKey, theme) 22 | }, 23 | removeTheme() { 24 | localStorage.removeItem(themeKey) 25 | }, 26 | } 27 | -------------------------------------------------------------------------------- /dimple-ui-blog/static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/static/.gitkeep -------------------------------------------------------------------------------- /dimple-ui-blog/static/baidu_verify_codeva-xxgPlAP2QG.html: -------------------------------------------------------------------------------- 1 | cd60ff609079a28be9851ad204425e3b -------------------------------------------------------------------------------- /dimple-ui-blog/static/img/avatar/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/static/img/avatar/avatar.png -------------------------------------------------------------------------------- /dimple-ui-blog/static/img/avatar/introduction-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/static/img/avatar/introduction-1.png -------------------------------------------------------------------------------- /dimple-ui-blog/static/img/avatar/introduction-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/static/img/avatar/introduction-2.png -------------------------------------------------------------------------------- /dimple-ui-blog/static/img/avatar/introduction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/static/img/avatar/introduction.png -------------------------------------------------------------------------------- /dimple-ui-blog/static/img/cover/archive.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/static/img/cover/archive.jpg -------------------------------------------------------------------------------- /dimple-ui-blog/static/img/cover/articles.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/static/img/cover/articles.jpg -------------------------------------------------------------------------------- /dimple-ui-blog/static/img/cover/category.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/static/img/cover/category.jpg -------------------------------------------------------------------------------- /dimple-ui-blog/static/img/cover/default.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/static/img/cover/default.jpg -------------------------------------------------------------------------------- /dimple-ui-blog/static/img/cover/home.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/static/img/cover/home.jpg -------------------------------------------------------------------------------- /dimple-ui-blog/static/img/cover/links.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/static/img/cover/links.jpg -------------------------------------------------------------------------------- /dimple-ui-blog/static/img/cover/msgboard.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/static/img/cover/msgboard.jpg -------------------------------------------------------------------------------- /dimple-ui-blog/static/img/cover/tags.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/static/img/cover/tags.jpg -------------------------------------------------------------------------------- /dimple-ui-blog/static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/static/img/favicon.ico -------------------------------------------------------------------------------- /dimple-ui-blog/static/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/martin-chips/DimpleBlog/6a0e29e085ab814518ed5250fecb09a02a3865d4/dimple-ui-blog/static/img/favicon.png -------------------------------------------------------------------------------- /dimple-ui-blog/static/qc_back.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | QQConnect JSDK - redirectURI 7 | 14 | 15 | 16 |
17 |

数据传输中,请稍后...

18 |
19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /dimple-ui-blog/static/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /docker/.env: -------------------------------------------------------------------------------- 1 | HOME="/" -------------------------------------------------------------------------------- /docker/dimple/auth/Dockerfile: -------------------------------------------------------------------------------- 1 | # 基础镜像 2 | FROM openjdk:8-jre 3 | # author 4 | MAINTAINER dimple 5 | ENV JAVA_OPTS="" 6 | ENV SPRING_OPTS="" 7 | # 挂载目录 8 | VOLUME /home/dimple 9 | # 创建目录 10 | RUN mkdir -p /home/dimple 11 | # 指定路径 12 | WORKDIR /home/dimple 13 | # 复制jar文件到路径 14 | COPY ./jar/dimple-auth.jar /home/dimple/dimple-auth.jar 15 | # 启动认证服务 16 | CMD ["sh", "-c", "java $JAVA_OPTS -jar dimple-auth.jar $SPRING_OPTS"] -------------------------------------------------------------------------------- /docker/dimple/auth/jar/readme.txt: -------------------------------------------------------------------------------- 1 | put your jar package here -------------------------------------------------------------------------------- /docker/dimple/gateway/Dockerfile: -------------------------------------------------------------------------------- 1 | # 基础镜像 2 | FROM openjdk:8-jre 3 | # author 4 | MAINTAINER dimple 5 | ENV JAVA_OPTS="" 6 | ENV SPRING_OPTS="" 7 | # 挂载目录 8 | VOLUME /home/dimple 9 | # 创建目录 10 | RUN mkdir -p /home/dimple 11 | # 指定路径 12 | WORKDIR /home/dimple 13 | # 复制jar文件到路径 14 | COPY ./jar/dimple-gateway.jar /home/dimple/dimple-gateway.jar 15 | # 启动网关服务 16 | CMD ["sh", "-c", "java $JAVA_OPTS -jar dimple-gateway.jar $SPRING_OPTS"] -------------------------------------------------------------------------------- /docker/dimple/gateway/jar/readme.txt: -------------------------------------------------------------------------------- 1 | put your jar package here -------------------------------------------------------------------------------- /docker/dimple/modules/blog-front/Dockerfile: -------------------------------------------------------------------------------- 1 | # 基础镜像 2 | FROM openjdk:8-jre 3 | # author 4 | MAINTAINER dimple 5 | 6 | ENV JAVA_OPTS="" 7 | ENV SPRING_OPTS="" 8 | # 挂载目录 9 | VOLUME /home/dimple 10 | # 创建目录 11 | RUN mkdir -p /home/dimple 12 | # 指定路径 13 | WORKDIR /home/dimple 14 | # 复制jar文件到路径 15 | COPY ./jar/dimple-modules-blog-front-web.jar /home/dimple/dimple-blog-front.jar 16 | # 启动认证服务 17 | CMD ["sh", "-c", "java $JAVA_OPTS -jar dimple-blog-front.jar $SPRING_OPTS"] -------------------------------------------------------------------------------- /docker/dimple/modules/blog-front/jar/readme.txt: -------------------------------------------------------------------------------- 1 | put your jar package here -------------------------------------------------------------------------------- /docker/dimple/modules/blog/Dockerfile: -------------------------------------------------------------------------------- 1 | # 基础镜像 2 | FROM openjdk:8-jre 3 | # author 4 | MAINTAINER dimple 5 | 6 | ENV JAVA_OPTS="" 7 | ENV SPRING_OPTS="" 8 | # 挂载目录 9 | VOLUME /home/dimple 10 | # 创建目录 11 | RUN mkdir -p /home/dimple 12 | # 指定路径 13 | WORKDIR /home/dimple 14 | # 复制jar文件到路径 15 | COPY ./jar/dimple-modules-blog-web.jar /home/dimple/dimple-blog.jar 16 | # 启动认证服务 17 | CMD ["sh", "-c", "java $JAVA_OPTS -jar dimple-blog.jar $SPRING_OPTS"] -------------------------------------------------------------------------------- /docker/dimple/modules/blog/jar/readme.txt: -------------------------------------------------------------------------------- 1 | put your jar package here -------------------------------------------------------------------------------- /docker/dimple/modules/file/Dockerfile: -------------------------------------------------------------------------------- 1 | # 基础镜像 2 | FROM openjdk:8-jre 3 | # author 4 | MAINTAINER dimple 5 | 6 | ENV JAVA_OPTS="" 7 | ENV SPRING_OPTS="" 8 | # 挂载目录 9 | VOLUME /home/dimple 10 | # 创建目录 11 | RUN mkdir -p /home/dimple 12 | # 指定路径 13 | WORKDIR /home/dimple 14 | # 复制jar文件到路径 15 | COPY ./jar/dimple-modules-file-web.jar /home/dimple/dimple-modules-file.jar 16 | # 启动文件服务 17 | CMD ["sh", "-c", "java $JAVA_OPTS -jar dimple-modules-file.jar $SPRING_OPTS"] -------------------------------------------------------------------------------- /docker/dimple/modules/file/jar/readme.txt: -------------------------------------------------------------------------------- 1 | put your jar package here -------------------------------------------------------------------------------- /docker/dimple/modules/job/Dockerfile: -------------------------------------------------------------------------------- 1 | # 基础镜像 2 | FROM openjdk:8-jre 3 | # author 4 | MAINTAINER dimple 5 | 6 | ENV JAVA_OPTS="" 7 | ENV SPRING_OPTS="" 8 | # 挂载目录 9 | VOLUME /home/dimple 10 | # 创建目录 11 | RUN mkdir -p /home/dimple 12 | # 指定路径 13 | WORKDIR /home/dimple 14 | # 复制jar文件到路径 15 | COPY ./jar/dimple-modules-job-web.jar /home/dimple/dimple-modules-job.jar 16 | # 启动定时任务服务 17 | CMD ["sh", "-c", "java $JAVA_OPTS -jar dimple-modules-job.jar $SPRING_OPTS"] -------------------------------------------------------------------------------- /docker/dimple/modules/job/jar/readme.txt: -------------------------------------------------------------------------------- 1 | put your jar package here -------------------------------------------------------------------------------- /docker/dimple/modules/log/Dockerfile: -------------------------------------------------------------------------------- 1 | # 基础镜像 2 | FROM openjdk:8-jre 3 | # author 4 | MAINTAINER dimple 5 | ENV JAVA_OPTS="" 6 | ENV SPRING_OPTS="" 7 | # 挂载目录 8 | VOLUME /home/dimple 9 | # 创建目录 10 | RUN mkdir -p /home/dimple 11 | # 指定路径 12 | WORKDIR /home/dimple 13 | # 复制jar文件到路径 14 | COPY ./jar/dimple-modules-log-web.jar /home/dimple/dimple-modules-log.jar 15 | # 启动定时任务服务 16 | CMD ["sh", "-c", "java $JAVA_OPTS -jar dimple-modules-log.jar $SPRING_OPTS"] -------------------------------------------------------------------------------- /docker/dimple/modules/log/jar/readme.txt: -------------------------------------------------------------------------------- 1 | put your jar package here -------------------------------------------------------------------------------- /docker/dimple/modules/monitor/Dockerfile: -------------------------------------------------------------------------------- 1 | # 基础镜像 2 | FROM openjdk:8-jre 3 | # author 4 | MAINTAINER dimple 5 | ENV JAVA_OPTS="" 6 | ENV SPRING_OPTS="" 7 | # 挂载目录 8 | VOLUME /home/dimple 9 | # 创建目录 10 | RUN mkdir -p /home/dimple 11 | # 指定路径 12 | WORKDIR /home/dimple 13 | # 复制jar文件到路径 14 | COPY ./jar/dimple-modules-monitor-web.jar /home/dimple/dimple-modules-monitor.jar 15 | # 启动系统服务 16 | CMD ["sh", "-c", "java $JAVA_OPTS -jar dimple-modules-monitor.jar $SPRING_OPTS"] -------------------------------------------------------------------------------- /docker/dimple/modules/monitor/jar/readme.txt: -------------------------------------------------------------------------------- 1 | put your jar package here -------------------------------------------------------------------------------- /docker/dimple/modules/system/Dockerfile: -------------------------------------------------------------------------------- 1 | # 基础镜像 2 | FROM openjdk:8-jre 3 | # author 4 | MAINTAINER dimple 5 | ENV JAVA_OPTS="" 6 | ENV SPRING_OPTS="" 7 | # 挂载目录 8 | VOLUME /home/dimple 9 | # 创建目录 10 | RUN mkdir -p /home/dimple 11 | # 指定路径 12 | WORKDIR /home/dimple 13 | # 复制jar文件到路径 14 | COPY ./jar/dimple-modules-system-web.jar /home/dimple/dimple-modules-system.jar 15 | # 启动系统服务 16 | CMD ["sh", "-c", "java $JAVA_OPTS -jar dimple-modules-system.jar $SPRING_OPTS"] -------------------------------------------------------------------------------- /docker/dimple/modules/system/jar/readme.txt: -------------------------------------------------------------------------------- 1 | put your jar package here -------------------------------------------------------------------------------- /docker/mysql/Dockerfile: -------------------------------------------------------------------------------- 1 | # 基础镜像 2 | FROM mysql 3 | # author 4 | MAINTAINER dimple 5 | -------------------------------------------------------------------------------- /docker/mysql/db/readme.txt: -------------------------------------------------------------------------------- 1 | put your jar package here -------------------------------------------------------------------------------- /docker/nacos/Dockerfile: -------------------------------------------------------------------------------- 1 | # 基础镜像 2 | FROM nacos/nacos-server 3 | # author 4 | MAINTAINER dimple -------------------------------------------------------------------------------- /docker/nginx/Dockerfile: -------------------------------------------------------------------------------- 1 | # 基础镜像 2 | FROM nginx 3 | # author 4 | MAINTAINER dimple 5 | -------------------------------------------------------------------------------- /docker/nginx/conf/nginx.conf: -------------------------------------------------------------------------------- 1 | worker_processes 1; 2 | 3 | events { 4 | worker_connections 1024; 5 | } 6 | 7 | http { 8 | include /etc/nginx/mime.types; 9 | default_type application/octet-stream; 10 | access_log /var/log/nginx/access.log; 11 | error_log /var/log/nginx/error.log; 12 | sendfile on; 13 | tcp_nopush on; 14 | tcp_nodelay on; 15 | keepalive_timeout 65; 16 | types_hash_max_size 2048; 17 | 18 | gzip on; 19 | gzip_disable "msie6"; 20 | gzip_vary on; 21 | gzip_proxied any; 22 | gzip_comp_level 6; 23 | gzip_buffers 16 8k; 24 | gzip_http_version 1.1; 25 | gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; 26 | 27 | include /etc/nginx/conf.d/*.conf; 28 | } -------------------------------------------------------------------------------- /docker/node/Dockerfile: -------------------------------------------------------------------------------- 1 | # 使用官方 Node.js 14 镜像作为基础镜像 2 | FROM node:14 3 | 4 | # 设置工作目录 5 | WORKDIR /home/dimple/projects/dimple-ui-blog/ 6 | 7 | RUN npm install pm2 -g 8 | # 暴露容器端口 9 | EXPOSE 8820 10 | 11 | # 启动应用程序 12 | CMD ["npm", "run","pm2:prod"] 13 | -------------------------------------------------------------------------------- /docker/redis/Dockerfile: -------------------------------------------------------------------------------- 1 | # 基础镜像 2 | FROM redis 3 | # author 4 | MAINTAINER dimple 5 | # 指定路径 6 | WORKDIR /home/project/redis 7 | 8 | --------------------------------------------------------------------------------