├── .env-example ├── .github ├── release-drafter.yml └── workflows │ ├── build.yml │ ├── build_jdk_ffmpeg.yml │ ├── pushAliyun.yml │ ├── release-drafter.yml │ └── test-build.yml ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── docker-compose.base-aliyun-beijing.yml ├── docker-compose.base-aliyun-guangzhou.yml ├── docker-compose.base.proxy.yml ├── docker-compose.base.yml ├── docker-compose.example.yml ├── docker-entrypoint.sh ├── docker ├── Dockerfile ├── ip2region.xdb └── nginx │ └── nginx.conf ├── jc.sh ├── pom.xml ├── release-www.sh ├── src ├── main │ ├── java │ │ └── com │ │ │ └── jmal │ │ │ └── clouddisk │ │ │ ├── JmalCloudApplication.java │ │ │ ├── acpect │ │ │ ├── LogOperatingAspect.java │ │ │ └── PermissionAspect.java │ │ │ ├── annotation │ │ │ ├── AnnoManageUtil.java │ │ │ ├── LogOperatingFun.java │ │ │ ├── OperationType.java │ │ │ └── Permission.java │ │ │ ├── config │ │ │ ├── ErrorConfig.java │ │ │ ├── FileProperties.java │ │ │ ├── GlobalCorsConfig.java │ │ │ ├── JacksonConfig.java │ │ │ ├── MongoClientConfig.java │ │ │ ├── MyTomcatServletWebServerFactoryCustomizer.java │ │ │ ├── WebConfig.java │ │ │ ├── WebFilter.java │ │ │ └── YamlPropertyLoaderFactory.java │ │ │ ├── controller │ │ │ ├── ArticlesController.java │ │ │ ├── FileViewController.java │ │ │ ├── rest │ │ │ │ ├── AuthController.java │ │ │ │ ├── CategoryController.java │ │ │ │ ├── CloudSettingController.java │ │ │ │ ├── FileController.java │ │ │ │ ├── FileVersionController.java │ │ │ │ ├── LogController.java │ │ │ │ ├── LuceneSearchController.java │ │ │ │ ├── MarkDownController.java │ │ │ │ ├── MenuController.java │ │ │ │ ├── OcrController.java │ │ │ │ ├── RoleController.java │ │ │ │ ├── ShareController.java │ │ │ │ ├── TagController.java │ │ │ │ ├── UserController.java │ │ │ │ ├── UserSettingController.java │ │ │ │ ├── VideoController.java │ │ │ │ └── WebsiteSettingController.java │ │ │ └── sse │ │ │ │ ├── Message.java │ │ │ │ └── SseController.java │ │ │ ├── exception │ │ │ ├── CheckedFunction.java │ │ │ ├── CommonException.java │ │ │ ├── CommonExceptionHandler.java │ │ │ ├── Either.java │ │ │ └── ExceptionType.java │ │ │ ├── ftp │ │ │ ├── FTPServerConfig.java │ │ │ └── MyPropertiesUserManager.java │ │ │ ├── interceptor │ │ │ ├── AuthInterceptor.java │ │ │ ├── FileInterceptor.java │ │ │ ├── HeaderLocaleChangeInterceptor.java │ │ │ ├── PreFileInterceptor.java │ │ │ └── ShareFileInterceptor.java │ │ │ ├── listener │ │ │ ├── FileListener.java │ │ │ └── FileMonitor.java │ │ │ ├── lucene │ │ │ ├── EtagService.java │ │ │ ├── IndexStatus.java │ │ │ ├── LuceneConfig.java │ │ │ ├── LuceneService.java │ │ │ ├── ReadContentService.java │ │ │ ├── RebuildIndexTaskService.java │ │ │ ├── SearchFileService.java │ │ │ ├── TaskProgress.java │ │ │ ├── TaskProgressService.java │ │ │ └── TaskType.java │ │ │ ├── media │ │ │ ├── FFMPEGCommand.java │ │ │ ├── FFMPEGUtils.java │ │ │ ├── HeifUtils.java │ │ │ ├── TranscodeConfig.java │ │ │ ├── TranscodeStatus.java │ │ │ ├── VideoInfo.java │ │ │ ├── VideoInfoDO.java │ │ │ ├── VideoInfoUtil.java │ │ │ └── VideoProcessService.java │ │ │ ├── model │ │ │ ├── ArchivesVO.java │ │ │ ├── ArticleDTO.java │ │ │ ├── ArticleParamDTO.java │ │ │ ├── ArticleVO.java │ │ │ ├── ArticlesQueryVO.java │ │ │ ├── CategoryDO.java │ │ │ ├── CategoryDTO.java │ │ │ ├── CloudSettingDO.java │ │ │ ├── CloudSettingDTO.java │ │ │ ├── CommentDO.java │ │ │ ├── EditTagDTO.java │ │ │ ├── ExifInfo.java │ │ │ ├── FileBase.java │ │ │ ├── FileDocument.java │ │ │ ├── FileIndex.java │ │ │ ├── FileIntroVO.java │ │ │ ├── FileType.java │ │ │ ├── GridFSBO.java │ │ │ ├── HeartwingsDO.java │ │ │ ├── LdapConfigDO.java │ │ │ ├── LdapConfigDTO.java │ │ │ ├── LogOperation.java │ │ │ ├── LogOperationDTO.java │ │ │ ├── MarkdownBaseFile.java │ │ │ ├── MarkdownVO.java │ │ │ ├── Metadata.java │ │ │ ├── Music.java │ │ │ ├── OperationPermission.java │ │ │ ├── OperationTips.java │ │ │ ├── Page.java │ │ │ ├── ShareDO.java │ │ │ ├── ShareVO.java │ │ │ ├── SharerDTO.java │ │ │ ├── Tag.java │ │ │ ├── TagDO.java │ │ │ ├── TagDTO.java │ │ │ ├── Trash.java │ │ │ ├── UploadApiParamDTO.java │ │ │ ├── UploadImageDTO.java │ │ │ ├── UploadResponse.java │ │ │ ├── Urlset.java │ │ │ ├── UserAccessTokenDO.java │ │ │ ├── UserAccessTokenDTO.java │ │ │ ├── UserTokenDO.java │ │ │ ├── WebsiteSettingDO.java │ │ │ ├── WebsiteSettingDTO.java │ │ │ ├── query │ │ │ │ ├── QueryBaseDTO.java │ │ │ │ ├── QueryMenuDTO.java │ │ │ │ ├── QueryRoleDTO.java │ │ │ │ ├── QueryUserDTO.java │ │ │ │ ├── SearchDTO.java │ │ │ │ └── SearchOptionHistoryDO.java │ │ │ └── rbac │ │ │ │ ├── ConsumerBase.java │ │ │ │ ├── ConsumerDO.java │ │ │ │ ├── ConsumerDTO.java │ │ │ │ ├── MenuDO.java │ │ │ │ ├── MenuDTO.java │ │ │ │ ├── RoleDO.java │ │ │ │ ├── RoleDTO.java │ │ │ │ └── UserLoginContext.java │ │ │ ├── ocr │ │ │ ├── CommonOcrService.java │ │ │ ├── IOcrService.java │ │ │ ├── OcrConfig.java │ │ │ ├── OcrEngine.java │ │ │ ├── OcrLiteOnnxService.java │ │ │ ├── OcrService.java │ │ │ ├── TesseractOcrConfig.java │ │ │ └── TesseractService.java │ │ │ ├── office │ │ │ ├── OfficeConfigService.java │ │ │ ├── OfficeController.java │ │ │ ├── OfficeHistory.java │ │ │ ├── callbacks │ │ │ │ ├── Callback.java │ │ │ │ ├── CallbackHandler.java │ │ │ │ ├── Status.java │ │ │ │ └── implementations │ │ │ │ │ ├── EditCallback.java │ │ │ │ │ ├── EditNothingCallback.java │ │ │ │ │ ├── ForceSaveCallback.java │ │ │ │ │ └── SaveCallback.java │ │ │ └── model │ │ │ │ ├── Action.java │ │ │ │ ├── OfficeConfigDO.java │ │ │ │ ├── OfficeConfigDTO.java │ │ │ │ ├── Track.java │ │ │ │ └── enums │ │ │ │ └── Action.java │ │ │ ├── oss │ │ │ ├── AbstractOssObject.java │ │ │ ├── BaseOssService.java │ │ │ ├── BucketInfo.java │ │ │ ├── FileInfo.java │ │ │ ├── IOssService.java │ │ │ ├── OssConfigService.java │ │ │ ├── OssInputStream.java │ │ │ ├── PlatformOSS.java │ │ │ ├── S3ObjectSummary.java │ │ │ ├── TempFileObject.java │ │ │ ├── aliyun │ │ │ │ ├── AliyunOssObject.java │ │ │ │ └── AliyunOssService.java │ │ │ ├── minio │ │ │ │ ├── MinIOObject.java │ │ │ │ ├── MinIOService.java │ │ │ │ └── MinIoClient.java │ │ │ ├── tencent │ │ │ │ ├── TencentOssObject.java │ │ │ │ └── TencentOssService.java │ │ │ └── web │ │ │ │ ├── OssController.java │ │ │ │ ├── STSObjectVO.java │ │ │ │ ├── WebOssCommonService.java │ │ │ │ ├── WebOssCopyFileService.java │ │ │ │ ├── WebOssService.java │ │ │ │ └── model │ │ │ │ ├── OssConfigDO.java │ │ │ │ └── OssConfigDTO.java │ │ │ ├── repository │ │ │ ├── DataSource.java │ │ │ ├── IAuthDAO.java │ │ │ └── impl │ │ │ │ └── AuthDAOImpl.java │ │ │ ├── service │ │ │ ├── Constants.java │ │ │ ├── IAuthService.java │ │ │ ├── IFileService.java │ │ │ ├── IFileVersionService.java │ │ │ ├── IMarkdownService.java │ │ │ ├── IShareService.java │ │ │ ├── IUserService.java │ │ │ └── impl │ │ │ │ ├── AuthServiceImpl.java │ │ │ │ ├── CategoryService.java │ │ │ │ ├── CommonFileService.java │ │ │ │ ├── FileServiceImpl.java │ │ │ │ ├── FileVersionServiceImpl.java │ │ │ │ ├── LogService.java │ │ │ │ ├── MarkdownServiceImpl.java │ │ │ │ ├── MenuService.java │ │ │ │ ├── MultipartUpload.java │ │ │ │ ├── RoleService.java │ │ │ │ ├── SettingService.java │ │ │ │ ├── ShareServiceImpl.java │ │ │ │ ├── TagService.java │ │ │ │ ├── UserLoginHolder.java │ │ │ │ └── UserServiceImpl.java │ │ │ ├── swagger │ │ │ └── OpenApiConfig.java │ │ │ ├── util │ │ │ ├── AudioFileUtils.java │ │ │ ├── CaffeineUtil.java │ │ │ ├── CalcMd5.java │ │ │ ├── CompressUtils.java │ │ │ ├── FFMPEGUtils.java │ │ │ ├── FastImageInfo.java │ │ │ ├── FileContentTypeUtils.java │ │ │ ├── FileContentUtil.java │ │ │ ├── ImageExifUtil.java │ │ │ ├── MapUtils.java │ │ │ ├── MessageUtil.java │ │ │ ├── MongoUtil.java │ │ │ ├── MyFileUtils.java │ │ │ ├── PasswordHash.java │ │ │ ├── ResponseResult.java │ │ │ ├── ResultUtil.java │ │ │ ├── ShortSignedIdUtil.java │ │ │ ├── StringUtil.java │ │ │ ├── SystemUtil.java │ │ │ ├── TesseractUtil.java │ │ │ ├── ThrottleExecutor.java │ │ │ ├── TimeUntils.java │ │ │ ├── TokenUtil.java │ │ │ └── UrlEncodingChecker.java │ │ │ └── webdav │ │ │ ├── BasicAuthenticator.java │ │ │ ├── MyDirResourceSet.java │ │ │ ├── MyRealm.java │ │ │ ├── MyStandardRoot.java │ │ │ ├── MyWebdavServlet.java │ │ │ ├── WebdavAuthenticator.java │ │ │ ├── WebdavConfig.java │ │ │ ├── WebdavMethod.java │ │ │ ├── WebdavServlet.java │ │ │ └── resource │ │ │ ├── FileResourceSet.java │ │ │ ├── LocalFileResource.java │ │ │ └── OssFileResource.java │ └── resources │ │ ├── META-INF │ │ └── additional-spring-configuration-metadata.json │ │ ├── application-dev.yml │ │ ├── application-prod.yml │ │ ├── application-test.yml │ │ ├── application.yml │ │ ├── banner.txt │ │ ├── db │ │ ├── menu.json │ │ └── role.json │ │ ├── file.yml │ │ ├── i18n │ │ ├── messages.properties │ │ ├── messages_en_US.properties │ │ └── messages_zh_CN.properties │ │ ├── logback.xml │ │ ├── static │ │ ├── articles │ │ │ ├── css │ │ │ │ ├── dark │ │ │ │ │ └── index-2.0.3.css │ │ │ │ ├── independent.css │ │ │ │ └── light │ │ │ │ │ └── index-2.0.3.css │ │ │ ├── favicon.ico │ │ │ ├── font-awesome │ │ │ │ └── free-6.4.2 │ │ │ │ │ ├── css │ │ │ │ │ └── all.min.css │ │ │ │ │ └── webfonts │ │ │ │ │ ├── fa-brands-400.ttf │ │ │ │ │ ├── fa-brands-400.woff2 │ │ │ │ │ ├── fa-regular-400.ttf │ │ │ │ │ ├── fa-regular-400.woff2 │ │ │ │ │ ├── fa-solid-900.ttf │ │ │ │ │ ├── fa-solid-900.woff2 │ │ │ │ │ ├── fa-v4compatibility.ttf │ │ │ │ │ └── fa-v4compatibility.woff2 │ │ │ ├── img │ │ │ │ └── beian.png │ │ │ ├── js │ │ │ │ ├── echarts-wordcloud.min.js │ │ │ │ ├── echarts.min.js │ │ │ │ ├── font_2024484_qwtkvngfp5b.js │ │ │ │ ├── jquery-3.5.1.min.js │ │ │ │ └── jquery.pjax.js │ │ │ ├── layui │ │ │ │ ├── css │ │ │ │ │ ├── layui.css │ │ │ │ │ ├── layui.mobile.css │ │ │ │ │ └── modules │ │ │ │ │ │ ├── code.css │ │ │ │ │ │ ├── laydate │ │ │ │ │ │ └── default │ │ │ │ │ │ │ └── laydate.css │ │ │ │ │ │ └── layer │ │ │ │ │ │ └── default │ │ │ │ │ │ ├── icon-ext.png │ │ │ │ │ │ ├── icon.png │ │ │ │ │ │ ├── layer.css │ │ │ │ │ │ ├── loading-0.gif │ │ │ │ │ │ ├── loading-1.gif │ │ │ │ │ │ └── loading-2.gif │ │ │ │ ├── font │ │ │ │ │ ├── iconfont.eot │ │ │ │ │ ├── iconfont.svg │ │ │ │ │ ├── iconfont.ttf │ │ │ │ │ ├── iconfont.woff │ │ │ │ │ └── iconfont.woff2 │ │ │ │ ├── images │ │ │ │ │ └── face │ │ │ │ │ │ ├── 0.gif │ │ │ │ │ │ ├── 1.gif │ │ │ │ │ │ ├── 10.gif │ │ │ │ │ │ ├── 11.gif │ │ │ │ │ │ ├── 12.gif │ │ │ │ │ │ ├── 13.gif │ │ │ │ │ │ ├── 14.gif │ │ │ │ │ │ ├── 15.gif │ │ │ │ │ │ ├── 16.gif │ │ │ │ │ │ ├── 17.gif │ │ │ │ │ │ ├── 18.gif │ │ │ │ │ │ ├── 19.gif │ │ │ │ │ │ ├── 2.gif │ │ │ │ │ │ ├── 20.gif │ │ │ │ │ │ ├── 21.gif │ │ │ │ │ │ ├── 22.gif │ │ │ │ │ │ ├── 23.gif │ │ │ │ │ │ ├── 24.gif │ │ │ │ │ │ ├── 25.gif │ │ │ │ │ │ ├── 26.gif │ │ │ │ │ │ ├── 27.gif │ │ │ │ │ │ ├── 28.gif │ │ │ │ │ │ ├── 29.gif │ │ │ │ │ │ ├── 3.gif │ │ │ │ │ │ ├── 30.gif │ │ │ │ │ │ ├── 31.gif │ │ │ │ │ │ ├── 32.gif │ │ │ │ │ │ ├── 33.gif │ │ │ │ │ │ ├── 34.gif │ │ │ │ │ │ ├── 35.gif │ │ │ │ │ │ ├── 36.gif │ │ │ │ │ │ ├── 37.gif │ │ │ │ │ │ ├── 38.gif │ │ │ │ │ │ ├── 39.gif │ │ │ │ │ │ ├── 4.gif │ │ │ │ │ │ ├── 40.gif │ │ │ │ │ │ ├── 41.gif │ │ │ │ │ │ ├── 42.gif │ │ │ │ │ │ ├── 43.gif │ │ │ │ │ │ ├── 44.gif │ │ │ │ │ │ ├── 45.gif │ │ │ │ │ │ ├── 46.gif │ │ │ │ │ │ ├── 47.gif │ │ │ │ │ │ ├── 48.gif │ │ │ │ │ │ ├── 49.gif │ │ │ │ │ │ ├── 5.gif │ │ │ │ │ │ ├── 50.gif │ │ │ │ │ │ ├── 51.gif │ │ │ │ │ │ ├── 52.gif │ │ │ │ │ │ ├── 53.gif │ │ │ │ │ │ ├── 54.gif │ │ │ │ │ │ ├── 55.gif │ │ │ │ │ │ ├── 56.gif │ │ │ │ │ │ ├── 57.gif │ │ │ │ │ │ ├── 58.gif │ │ │ │ │ │ ├── 59.gif │ │ │ │ │ │ ├── 6.gif │ │ │ │ │ │ ├── 60.gif │ │ │ │ │ │ ├── 61.gif │ │ │ │ │ │ ├── 62.gif │ │ │ │ │ │ ├── 63.gif │ │ │ │ │ │ ├── 64.gif │ │ │ │ │ │ ├── 65.gif │ │ │ │ │ │ ├── 66.gif │ │ │ │ │ │ ├── 67.gif │ │ │ │ │ │ ├── 68.gif │ │ │ │ │ │ ├── 69.gif │ │ │ │ │ │ ├── 7.gif │ │ │ │ │ │ ├── 70.gif │ │ │ │ │ │ ├── 71.gif │ │ │ │ │ │ ├── 8.gif │ │ │ │ │ │ └── 9.gif │ │ │ │ ├── lay │ │ │ │ │ └── modules │ │ │ │ │ │ ├── carousel.js │ │ │ │ │ │ ├── code.js │ │ │ │ │ │ ├── colorpicker.js │ │ │ │ │ │ ├── element.js │ │ │ │ │ │ ├── flow.js │ │ │ │ │ │ ├── form.js │ │ │ │ │ │ ├── jquery.js │ │ │ │ │ │ ├── laydate.js │ │ │ │ │ │ ├── layedit.js │ │ │ │ │ │ ├── layer.js │ │ │ │ │ │ ├── laypage.js │ │ │ │ │ │ ├── laytpl.js │ │ │ │ │ │ ├── mobile.js │ │ │ │ │ │ ├── rate.js │ │ │ │ │ │ ├── slider.js │ │ │ │ │ │ ├── table.js │ │ │ │ │ │ ├── transfer.js │ │ │ │ │ │ ├── tree.js │ │ │ │ │ │ ├── upload.js │ │ │ │ │ │ └── util.js │ │ │ │ ├── layui.all.js │ │ │ │ └── layui.js │ │ │ ├── robots.txt │ │ │ ├── vditor@3.9.3 │ │ │ │ └── dist │ │ │ │ │ ├── css │ │ │ │ │ └── content-theme │ │ │ │ │ │ ├── ant-design.css │ │ │ │ │ │ ├── dark.css │ │ │ │ │ │ ├── light.css │ │ │ │ │ │ └── wechat.css │ │ │ │ │ ├── images │ │ │ │ │ ├── emoji │ │ │ │ │ │ ├── b3log.png │ │ │ │ │ │ ├── chainbook.png │ │ │ │ │ │ ├── doge.png │ │ │ │ │ │ ├── hacpai.png │ │ │ │ │ │ ├── huaji.gif │ │ │ │ │ │ ├── latke.png │ │ │ │ │ │ ├── lute.png │ │ │ │ │ │ ├── octocat.png │ │ │ │ │ │ ├── pipe.png │ │ │ │ │ │ ├── solo.png │ │ │ │ │ │ ├── sym.png │ │ │ │ │ │ ├── trollface.png │ │ │ │ │ │ ├── vditor.png │ │ │ │ │ │ ├── wide.png │ │ │ │ │ │ └── wulian.png │ │ │ │ │ ├── img-loading.svg │ │ │ │ │ └── logo.png │ │ │ │ │ ├── index.css │ │ │ │ │ ├── index.d.ts │ │ │ │ │ ├── index.min.js │ │ │ │ │ ├── js │ │ │ │ │ ├── abcjs │ │ │ │ │ │ └── abcjs_basic.min.js │ │ │ │ │ ├── echarts │ │ │ │ │ │ └── echarts.min.js │ │ │ │ │ ├── flowchart.js │ │ │ │ │ │ └── flowchart.min.js │ │ │ │ │ ├── graphviz │ │ │ │ │ │ ├── full.render.js │ │ │ │ │ │ └── viz.js │ │ │ │ │ ├── highlight.js │ │ │ │ │ │ ├── highlight.pack.js │ │ │ │ │ │ ├── solidity.min.js │ │ │ │ │ │ ├── styles │ │ │ │ │ │ │ ├── abap.css │ │ │ │ │ │ │ ├── algol.css │ │ │ │ │ │ │ ├── algol_nu.css │ │ │ │ │ │ │ ├── ant-design.css │ │ │ │ │ │ │ ├── arduino.css │ │ │ │ │ │ │ ├── autumn.css │ │ │ │ │ │ │ ├── borland.css │ │ │ │ │ │ │ ├── bw.css │ │ │ │ │ │ │ ├── colorful.css │ │ │ │ │ │ │ ├── dracula.css │ │ │ │ │ │ │ ├── emacs.css │ │ │ │ │ │ │ ├── friendly.css │ │ │ │ │ │ │ ├── fruity.css │ │ │ │ │ │ │ ├── github.css │ │ │ │ │ │ │ ├── igor.css │ │ │ │ │ │ │ ├── lovelace.css │ │ │ │ │ │ │ ├── manni.css │ │ │ │ │ │ │ ├── monokai.css │ │ │ │ │ │ │ ├── monokailight.css │ │ │ │ │ │ │ ├── murphy.css │ │ │ │ │ │ │ ├── native.css │ │ │ │ │ │ │ ├── paraiso-dark.css │ │ │ │ │ │ │ ├── paraiso-light.css │ │ │ │ │ │ │ ├── pastie.css │ │ │ │ │ │ │ ├── perldoc.css │ │ │ │ │ │ │ ├── pygments.css │ │ │ │ │ │ │ ├── rainbow_dash.css │ │ │ │ │ │ │ ├── rrt.css │ │ │ │ │ │ │ ├── solarized-dark.css │ │ │ │ │ │ │ ├── solarized-dark256.css │ │ │ │ │ │ │ ├── solarized-light.css │ │ │ │ │ │ │ ├── swapoff.css │ │ │ │ │ │ │ ├── tango.css │ │ │ │ │ │ │ ├── trac.css │ │ │ │ │ │ │ ├── vim.css │ │ │ │ │ │ │ ├── vs.css │ │ │ │ │ │ │ └── xcode.css │ │ │ │ │ │ └── yul.min.js │ │ │ │ │ ├── i18n │ │ │ │ │ │ ├── en_US.js │ │ │ │ │ │ ├── fr_FR.js │ │ │ │ │ │ ├── ja_JP.js │ │ │ │ │ │ ├── ko_KR.js │ │ │ │ │ │ ├── pt_BR.js │ │ │ │ │ │ ├── ru_RU.js │ │ │ │ │ │ ├── sv_SE.js │ │ │ │ │ │ ├── zh_CN.js │ │ │ │ │ │ └── zh_TW.js │ │ │ │ │ ├── icons │ │ │ │ │ │ ├── ant.js │ │ │ │ │ │ └── material.js │ │ │ │ │ ├── katex │ │ │ │ │ │ ├── fonts │ │ │ │ │ │ │ ├── KaTeX_AMS-Regular.ttf │ │ │ │ │ │ │ ├── KaTeX_AMS-Regular.woff │ │ │ │ │ │ │ ├── KaTeX_AMS-Regular.woff2 │ │ │ │ │ │ │ ├── KaTeX_Caligraphic-Bold.ttf │ │ │ │ │ │ │ ├── KaTeX_Caligraphic-Bold.woff │ │ │ │ │ │ │ ├── KaTeX_Caligraphic-Bold.woff2 │ │ │ │ │ │ │ ├── KaTeX_Caligraphic-Regular.ttf │ │ │ │ │ │ │ ├── KaTeX_Caligraphic-Regular.woff │ │ │ │ │ │ │ ├── KaTeX_Caligraphic-Regular.woff2 │ │ │ │ │ │ │ ├── KaTeX_Fraktur-Bold.ttf │ │ │ │ │ │ │ ├── KaTeX_Fraktur-Bold.woff │ │ │ │ │ │ │ ├── KaTeX_Fraktur-Bold.woff2 │ │ │ │ │ │ │ ├── KaTeX_Fraktur-Regular.ttf │ │ │ │ │ │ │ ├── KaTeX_Fraktur-Regular.woff │ │ │ │ │ │ │ ├── KaTeX_Fraktur-Regular.woff2 │ │ │ │ │ │ │ ├── KaTeX_Main-Bold.ttf │ │ │ │ │ │ │ ├── KaTeX_Main-Bold.woff │ │ │ │ │ │ │ ├── KaTeX_Main-Bold.woff2 │ │ │ │ │ │ │ ├── KaTeX_Main-BoldItalic.ttf │ │ │ │ │ │ │ ├── KaTeX_Main-BoldItalic.woff │ │ │ │ │ │ │ ├── KaTeX_Main-BoldItalic.woff2 │ │ │ │ │ │ │ ├── KaTeX_Main-Italic.ttf │ │ │ │ │ │ │ ├── KaTeX_Main-Italic.woff │ │ │ │ │ │ │ ├── KaTeX_Main-Italic.woff2 │ │ │ │ │ │ │ ├── KaTeX_Main-Regular.ttf │ │ │ │ │ │ │ ├── KaTeX_Main-Regular.woff │ │ │ │ │ │ │ ├── KaTeX_Main-Regular.woff2 │ │ │ │ │ │ │ ├── KaTeX_Math-BoldItalic.ttf │ │ │ │ │ │ │ ├── KaTeX_Math-BoldItalic.woff │ │ │ │ │ │ │ ├── KaTeX_Math-BoldItalic.woff2 │ │ │ │ │ │ │ ├── KaTeX_Math-Italic.ttf │ │ │ │ │ │ │ ├── KaTeX_Math-Italic.woff │ │ │ │ │ │ │ ├── KaTeX_Math-Italic.woff2 │ │ │ │ │ │ │ ├── KaTeX_SansSerif-Bold.ttf │ │ │ │ │ │ │ ├── KaTeX_SansSerif-Bold.woff │ │ │ │ │ │ │ ├── KaTeX_SansSerif-Bold.woff2 │ │ │ │ │ │ │ ├── KaTeX_SansSerif-Italic.ttf │ │ │ │ │ │ │ ├── KaTeX_SansSerif-Italic.woff │ │ │ │ │ │ │ ├── KaTeX_SansSerif-Italic.woff2 │ │ │ │ │ │ │ ├── KaTeX_SansSerif-Regular.ttf │ │ │ │ │ │ │ ├── KaTeX_SansSerif-Regular.woff │ │ │ │ │ │ │ ├── KaTeX_SansSerif-Regular.woff2 │ │ │ │ │ │ │ ├── KaTeX_Script-Regular.ttf │ │ │ │ │ │ │ ├── KaTeX_Script-Regular.woff │ │ │ │ │ │ │ ├── KaTeX_Script-Regular.woff2 │ │ │ │ │ │ │ ├── KaTeX_Size1-Regular.ttf │ │ │ │ │ │ │ ├── KaTeX_Size1-Regular.woff │ │ │ │ │ │ │ ├── KaTeX_Size1-Regular.woff2 │ │ │ │ │ │ │ ├── KaTeX_Size2-Regular.ttf │ │ │ │ │ │ │ ├── KaTeX_Size2-Regular.woff │ │ │ │ │ │ │ ├── KaTeX_Size2-Regular.woff2 │ │ │ │ │ │ │ ├── KaTeX_Size3-Regular.ttf │ │ │ │ │ │ │ ├── KaTeX_Size3-Regular.woff │ │ │ │ │ │ │ ├── KaTeX_Size3-Regular.woff2 │ │ │ │ │ │ │ ├── KaTeX_Size4-Regular.ttf │ │ │ │ │ │ │ ├── KaTeX_Size4-Regular.woff │ │ │ │ │ │ │ ├── KaTeX_Size4-Regular.woff2 │ │ │ │ │ │ │ ├── KaTeX_Typewriter-Regular.ttf │ │ │ │ │ │ │ ├── KaTeX_Typewriter-Regular.woff │ │ │ │ │ │ │ └── KaTeX_Typewriter-Regular.woff2 │ │ │ │ │ │ ├── katex.min.css │ │ │ │ │ │ ├── katex.min.js │ │ │ │ │ │ └── mhchem.min.js │ │ │ │ │ ├── lute │ │ │ │ │ │ └── lute.min.js │ │ │ │ │ ├── markmap │ │ │ │ │ │ ├── katex.min.css │ │ │ │ │ │ ├── markmap.min.js │ │ │ │ │ │ └── prism.css │ │ │ │ │ ├── mathjax │ │ │ │ │ │ ├── LICENSE │ │ │ │ │ │ ├── a11y │ │ │ │ │ │ │ ├── assistive-mml.js │ │ │ │ │ │ │ ├── complexity.js │ │ │ │ │ │ │ ├── explorer.js │ │ │ │ │ │ │ └── semantic-enrich.js │ │ │ │ │ │ ├── input │ │ │ │ │ │ │ ├── asciimath.js │ │ │ │ │ │ │ ├── mml.js │ │ │ │ │ │ │ ├── mml │ │ │ │ │ │ │ │ └── entities.js │ │ │ │ │ │ │ ├── tex-base.js │ │ │ │ │ │ │ ├── tex-full.js │ │ │ │ │ │ │ ├── tex.js │ │ │ │ │ │ │ └── tex │ │ │ │ │ │ │ │ └── extensions │ │ │ │ │ │ │ │ ├── action.js │ │ │ │ │ │ │ │ ├── all-packages.js │ │ │ │ │ │ │ │ ├── ams.js │ │ │ │ │ │ │ │ ├── amscd.js │ │ │ │ │ │ │ │ ├── autoload.js │ │ │ │ │ │ │ │ ├── bbox.js │ │ │ │ │ │ │ │ ├── boldsymbol.js │ │ │ │ │ │ │ │ ├── braket.js │ │ │ │ │ │ │ │ ├── bussproofs.js │ │ │ │ │ │ │ │ ├── cancel.js │ │ │ │ │ │ │ │ ├── color.js │ │ │ │ │ │ │ │ ├── colorV2.js │ │ │ │ │ │ │ │ ├── configMacros.js │ │ │ │ │ │ │ │ ├── enclose.js │ │ │ │ │ │ │ │ ├── extpfeil.js │ │ │ │ │ │ │ │ ├── html.js │ │ │ │ │ │ │ │ ├── mhchem.js │ │ │ │ │ │ │ │ ├── newcommand.js │ │ │ │ │ │ │ │ ├── noerrors.js │ │ │ │ │ │ │ │ ├── noundefined.js │ │ │ │ │ │ │ │ ├── physics.js │ │ │ │ │ │ │ │ ├── require.js │ │ │ │ │ │ │ │ ├── tagFormat.js │ │ │ │ │ │ │ │ ├── textmacros.js │ │ │ │ │ │ │ │ ├── unicode.js │ │ │ │ │ │ │ │ └── verb.js │ │ │ │ │ │ ├── sre │ │ │ │ │ │ │ ├── mathmaps │ │ │ │ │ │ │ │ ├── de.js │ │ │ │ │ │ │ │ ├── en.js │ │ │ │ │ │ │ │ ├── es.js │ │ │ │ │ │ │ │ ├── fr.js │ │ │ │ │ │ │ │ ├── mathmaps_ie.js │ │ │ │ │ │ │ │ └── nemeth.js │ │ │ │ │ │ │ ├── sre-node.js │ │ │ │ │ │ │ └── sre_browser.js │ │ │ │ │ │ └── tex-svg-full.js │ │ │ │ │ ├── mermaid │ │ │ │ │ │ └── mermaid.min.js │ │ │ │ │ └── plantuml │ │ │ │ │ │ └── plantuml-encoder.min.js │ │ │ │ │ ├── method.d.ts │ │ │ │ │ ├── method.min.js │ │ │ │ │ ├── ts │ │ │ │ │ ├── constants.d.ts │ │ │ │ │ ├── devtools │ │ │ │ │ │ └── index.d.ts │ │ │ │ │ ├── export │ │ │ │ │ │ └── index.d.ts │ │ │ │ │ ├── hint │ │ │ │ │ │ └── index.d.ts │ │ │ │ │ ├── ir │ │ │ │ │ │ ├── expandMarker.d.ts │ │ │ │ │ │ ├── highlightToolbarIR.d.ts │ │ │ │ │ │ ├── index.d.ts │ │ │ │ │ │ ├── input.d.ts │ │ │ │ │ │ ├── process.d.ts │ │ │ │ │ │ └── processKeydown.d.ts │ │ │ │ │ ├── markdown │ │ │ │ │ │ ├── abcRender.d.ts │ │ │ │ │ │ ├── adapterRender.d.ts │ │ │ │ │ │ ├── anchorRender.d.ts │ │ │ │ │ │ ├── chartRender.d.ts │ │ │ │ │ │ ├── codeRender.d.ts │ │ │ │ │ │ ├── flowchartRender.d.ts │ │ │ │ │ │ ├── getHTML.d.ts │ │ │ │ │ │ ├── getMarkdown.d.ts │ │ │ │ │ │ ├── graphvizRender.d.ts │ │ │ │ │ │ ├── highlightRender.d.ts │ │ │ │ │ │ ├── lazyLoadImageRender.d.ts │ │ │ │ │ │ ├── markmapRender.d.ts │ │ │ │ │ │ ├── mathRender.d.ts │ │ │ │ │ │ ├── mediaRender.d.ts │ │ │ │ │ │ ├── mermaidRender.d.ts │ │ │ │ │ │ ├── mindmapRender.d.ts │ │ │ │ │ │ ├── outlineRender.d.ts │ │ │ │ │ │ ├── plantumlRender.d.ts │ │ │ │ │ │ ├── previewRender.d.ts │ │ │ │ │ │ ├── setLute.d.ts │ │ │ │ │ │ └── speechRender.d.ts │ │ │ │ │ ├── outline │ │ │ │ │ │ └── index.d.ts │ │ │ │ │ ├── preview │ │ │ │ │ │ ├── image.d.ts │ │ │ │ │ │ └── index.d.ts │ │ │ │ │ ├── resize │ │ │ │ │ │ └── index.d.ts │ │ │ │ │ ├── sv │ │ │ │ │ │ ├── index.d.ts │ │ │ │ │ │ ├── inputEvent.d.ts │ │ │ │ │ │ ├── process.d.ts │ │ │ │ │ │ └── processKeydown.d.ts │ │ │ │ │ ├── tip │ │ │ │ │ │ └── index.d.ts │ │ │ │ │ ├── toolbar │ │ │ │ │ │ ├── Both.d.ts │ │ │ │ │ │ ├── Br.d.ts │ │ │ │ │ │ ├── CodeTheme.d.ts │ │ │ │ │ │ ├── ContentTheme.d.ts │ │ │ │ │ │ ├── Counter.d.ts │ │ │ │ │ │ ├── Custom.d.ts │ │ │ │ │ │ ├── Devtools.d.ts │ │ │ │ │ │ ├── Divider.d.ts │ │ │ │ │ │ ├── EditMode.d.ts │ │ │ │ │ │ ├── Emoji.d.ts │ │ │ │ │ │ ├── Export.d.ts │ │ │ │ │ │ ├── Fullscreen.d.ts │ │ │ │ │ │ ├── Headings.d.ts │ │ │ │ │ │ ├── Help.d.ts │ │ │ │ │ │ ├── Indent.d.ts │ │ │ │ │ │ ├── Info.d.ts │ │ │ │ │ │ ├── InsertAfter.d.ts │ │ │ │ │ │ ├── InsertBefore.d.ts │ │ │ │ │ │ ├── MenuItem.d.ts │ │ │ │ │ │ ├── Outdent.d.ts │ │ │ │ │ │ ├── Outline.d.ts │ │ │ │ │ │ ├── Preview.d.ts │ │ │ │ │ │ ├── Record.d.ts │ │ │ │ │ │ ├── Redo.d.ts │ │ │ │ │ │ ├── Undo.d.ts │ │ │ │ │ │ ├── Upload.d.ts │ │ │ │ │ │ ├── index.d.ts │ │ │ │ │ │ └── setToolbar.d.ts │ │ │ │ │ ├── ui │ │ │ │ │ │ ├── initUI.d.ts │ │ │ │ │ │ ├── setCodeTheme.d.ts │ │ │ │ │ │ ├── setContentTheme.d.ts │ │ │ │ │ │ ├── setPreviewMode.d.ts │ │ │ │ │ │ └── setTheme.d.ts │ │ │ │ │ ├── undo │ │ │ │ │ │ └── index.d.ts │ │ │ │ │ ├── upload │ │ │ │ │ │ ├── getElement.d.ts │ │ │ │ │ │ ├── index.d.ts │ │ │ │ │ │ └── setHeaders.d.ts │ │ │ │ │ ├── util │ │ │ │ │ │ ├── Options.d.ts │ │ │ │ │ │ ├── RecordMedia.d.ts │ │ │ │ │ │ ├── addScript.d.ts │ │ │ │ │ │ ├── addStyle.d.ts │ │ │ │ │ │ ├── code160to32.d.ts │ │ │ │ │ │ ├── compatibility.d.ts │ │ │ │ │ │ ├── editorCommonEvent.d.ts │ │ │ │ │ │ ├── fixBrowserBehavior.d.ts │ │ │ │ │ │ ├── getSelectText.d.ts │ │ │ │ │ │ ├── hasClosest.d.ts │ │ │ │ │ │ ├── hasClosestByHeadings.d.ts │ │ │ │ │ │ ├── highlightToolbar.d.ts │ │ │ │ │ │ ├── hotKey.d.ts │ │ │ │ │ │ ├── log.d.ts │ │ │ │ │ │ ├── merge.d.ts │ │ │ │ │ │ ├── processCode.d.ts │ │ │ │ │ │ ├── selection.d.ts │ │ │ │ │ │ └── toc.d.ts │ │ │ │ │ └── wysiwyg │ │ │ │ │ │ ├── afterRenderEvent.d.ts │ │ │ │ │ │ ├── highlightToolbarWYSIWYG.d.ts │ │ │ │ │ │ ├── index.d.ts │ │ │ │ │ │ ├── inlineTag.d.ts │ │ │ │ │ │ ├── input.d.ts │ │ │ │ │ │ ├── processKeydown.d.ts │ │ │ │ │ │ ├── renderDomByMd.d.ts │ │ │ │ │ │ ├── setHeading.d.ts │ │ │ │ │ │ ├── showCode.d.ts │ │ │ │ │ │ └── toolbarEvent.d.ts │ │ │ │ │ └── types │ │ │ │ │ └── index.d.ts │ │ │ └── viewerjs │ │ │ │ ├── viewer.min.css │ │ │ │ └── viewer.min.js │ │ └── banner.txt │ │ └── templates │ │ ├── 404.html │ │ ├── archives.html │ │ ├── article.html │ │ ├── articles-query.html │ │ ├── articles.html │ │ ├── categories.html │ │ ├── component │ │ ├── article-tail.html │ │ ├── article-top.html │ │ ├── articles-list.html │ │ ├── common-js.html │ │ ├── footer.html │ │ ├── head.html │ │ └── sidebar.html │ │ ├── index.html │ │ └── tags.html └── test │ └── java │ └── com │ └── jmal │ └── clouddisk │ ├── ConcurrencyText.java │ ├── EpubCoverTest.java │ ├── ExportSysDBText.java │ ├── FileSorter.java │ ├── FileWatchMonitor.java │ ├── GridFSTest.java │ ├── InitSysDBText.java │ ├── PdfCoverTest.java │ ├── RBACText.java │ ├── StdRandom.java │ ├── Test.java │ ├── UpdateJDKTest.java │ ├── WebpTest.java │ ├── WordCoverTest.java │ ├── ip2region │ └── Ip2regionTest.java │ ├── lucene │ ├── ExcelSaxReader.java │ ├── IndexFiles.java │ ├── LargeExcelSaxReader.java │ ├── ReadExcel.java │ ├── ReadPDFTest.java │ ├── ReadPPTX.java │ ├── ReadWord.java │ ├── SearchFiles.java │ └── SheetHandler.java │ ├── mongodb │ └── RegexTest.java │ └── oss │ ├── AliyunOSSTest.java │ └── TencentOSSTest.java ├── tess4j └── datapath │ └── chi_sim.traineddata └── upload.sh /.env-example: -------------------------------------------------------------------------------- 1 | APP_PORT=7070 2 | BLOG_PORT=7071 3 | SERVER_PORT=7072 4 | FTP_SERVER_PORT=7073 5 | CONTAINER_NAME_PREFIX=jmalcloud 6 | RESOURCE_DB_PATH=./docker/jmalcloud/mongodb 7 | RESOURCE_FILE_PATH=./docker/jmalcloud/files 8 | OFFICE_IMAGE_VERSION=7.0.0.132 9 | DRAWIO_IMAGE_VERSION=20.2.3 10 | -------------------------------------------------------------------------------- /.github/release-drafter.yml: -------------------------------------------------------------------------------- 1 | # .github/release-drafter.yml 2 | name-template: 'v$NEXT_PATCH_VERSION' 3 | tag-template: 'v$NEXT_PATCH_VERSION' 4 | categories: 5 | - title: '新功能 ✨' 6 | labels: 7 | - 'feature' 8 | - title: '修复 🐛' 9 | labels: 10 | - 'bug' 11 | - title: '优化 ⚡️' 12 | labels: 13 | - 'improvement' 14 | change-template: '- $TITLE (#$NUMBER)' 15 | no-changes-template: '- No changes' 16 | template: | 17 | 18 | [docker-docker.yml](https://github.com/jamebal/jmal-cloud-server/blob/master/docker-compose.base.yml) 19 | 20 | #### 更新前备份数据库 21 | 22 | ```shell 23 | docker exec -it jmalcloud_mongodb mongodump -d jmalcloud -o /dump/$PREVIOUS_TAG --gzip --quiet 24 | ``` 25 | 26 | ```shell 27 | docker-compose pull && docker-compose up -d --remove-orphans 28 | ``` 29 | 30 | #### 清理旧镜像 31 | ```shell 32 | docker rmi $(docker images --filter "dangling=true" | grep "jmalcloud" | awk '{print $3}') 33 | ``` 34 | 35 | ## Changes in this release: 36 | 37 | $CHANGES 38 | 39 | **Full Changelog**: [$PREVIOUS_TAG...v$NEXT_PATCH_VERSION](https://github.com/jamebal/jmal-cloud-server/compare/$PREVIOUS_TAG...v$NEXT_PATCH_VERSION) 40 | -------------------------------------------------------------------------------- /.github/workflows/build_jdk_ffmpeg.yml: -------------------------------------------------------------------------------- 1 | name: Build jdk17_ffmpeg_nvidia Docker Image 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | jobs: 7 | build-and-push: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Checkout repository 11 | uses: actions/checkout@v4 12 | 13 | - name: Set up JDK 17 14 | uses: actions/setup-java@v4 15 | with: 16 | distribution: 'temurin' 17 | java-version: '17' 18 | cache: 'maven' 19 | 20 | - name: Build with Maven 21 | run: mvn clean package -DskipTests 22 | 23 | - name: Set up Docker Buildx 24 | uses: docker/setup-buildx-action@v3 25 | 26 | - name: Login to Docker Hub 27 | uses: docker/login-action@v3 28 | with: 29 | username: ${{ secrets.DOCKER_USERNAME }} 30 | password: ${{ secrets.DOCKER_PASSWORD }} 31 | 32 | - name: Login to GitHub Container Registry 33 | uses: docker/login-action@v3 34 | with: 35 | registry: ghcr.io 36 | username: ${{ secrets.GHCR_IO_USERNAME }} 37 | password: ${{ secrets.GHCR_IO_TOKEN }} 38 | 39 | - name: Build and push Docker image 40 | uses: docker/build-push-action@v5 41 | with: 42 | context: . 43 | file: docker/Dockerfile 44 | push: true 45 | tags: | 46 | jmal/jdk17_ffmpeg_nvidia:latest 47 | ghcr.io/${{ secrets.GHCR_IO_USERNAME }}/jdk17_ffmpeg_nvidia:latest 48 | platforms: linux/amd64,linux/arm64 49 | -------------------------------------------------------------------------------- /.github/workflows/release-drafter.yml: -------------------------------------------------------------------------------- 1 | # .github/workflows/release-drafter.yml 2 | name: Release Drafter 3 | 4 | on: 5 | push: 6 | branches: 7 | - master 8 | 9 | jobs: 10 | update_release_draft: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v4 14 | - uses: release-drafter/release-drafter@v5 15 | with: 16 | config-name: release-drafter.yml 17 | env: 18 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## myproject 2 | push.sh 3 | update.sh 4 | HELP.md 5 | .env 6 | /log/ 7 | /lucene/ 8 | /docker/ 9 | target/ 10 | !.mvn/wrapper/maven-wrapper.jar 11 | !**/src/main/** 12 | !**/src/test/** 13 | 14 | ### STS ### 15 | .apt_generated 16 | .classpath 17 | .factorypath 18 | .project 19 | .settings 20 | .springBeans 21 | .sts4-cache 22 | 23 | ### IntelliJ IDEA ### 24 | .idea 25 | *.iws 26 | *.iml 27 | *.ipr 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | build/ 36 | 37 | ### VS Code ### 38 | .vscode/ 39 | src/main/resources/application-dev.yml 40 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ghcr.io/jamebal/jdk17_ffmpeg_nvidia:latest 2 | 3 | ARG VERSION 4 | 5 | ENV MONGODB_URI "mongodb://mongo:27017/jmalcloud" 6 | ENV RUN_ENVIRONMENT prod 7 | ENV JVM_OPTS "" 8 | ENV LOG_LEVEL warn 9 | 10 | # 是否开启精确搜索 11 | ENV EXACT_SEARCH false 12 | 13 | ENV FILE_MONITOR true 14 | ENV MONITOR_IGNORE_FILE_PREFIX ".DS_Store,._" 15 | ENV FILE_ROOT_DIR /jmalcloud/files 16 | ENV TESS4J_DATA_PATH /jmalcloud/tess4j/datapath 17 | 18 | ADD target/clouddisk-${VERSION}.jar /usr/local/ 19 | 20 | VOLUME /jmalcloud/ 21 | 22 | # 设置支持的平台 23 | ARG TARGETPLATFORM 24 | RUN echo "Building for platform: $TARGETPLATFORM" 25 | LABEL org.label-schema.build.multi-platform=true 26 | ENV PLATFORM=$TARGETPLATFORM 27 | ENV VERSION=${VERSION} 28 | 29 | # 将 Linux/arm64/v8 架构设置为默认平台 30 | # 如果需要,可以根据需要更改此设置 31 | ENV DOCKER_DEFAULT_PLATFORM=linux/amd64,linux/arm64 32 | 33 | COPY docker-entrypoint.sh /docker-entrypoint.sh 34 | 35 | RUN apt-get update && \ 36 | apt-get install -y gosu && \ 37 | chmod +x /docker-entrypoint.sh && \ 38 | rm -rf /var/lib/apt/lists/* 39 | 40 | EXPOSE 8088 41 | 42 | ENTRYPOINT ["/docker-entrypoint.sh"] 43 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 jmal 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [JmalCloud](https://github.com/jamebal/jmal-cloud-view) 个人网盘 服务端 [查看说明](https://github.com/jamebal/jmal-cloud-view/blob/master/README.md) 2 | 3 | ### 许可 4 | 5 | [MIT](https://github.com/jamebal/jmal-cloud-view/blob/master/LICENSE) license. 6 | 7 | Copyright (c) 2023-present jmal 8 | -------------------------------------------------------------------------------- /docker-compose.base.proxy.yml: -------------------------------------------------------------------------------- 1 | services: 2 | mongo: 3 | container_name: jmalcloud_mongodb 4 | image: docker.jmalx.com/mongo:4.4 5 | environment: 6 | TZ: "Asia/Shanghai" 7 | volumes: 8 | - ./docker/jmalcloud/mongodb/data/db:/data/db 9 | - ./docker/jmalcloud/mongodb/backup:/dump 10 | restart: unless-stopped 11 | healthcheck: 12 | test: ["CMD", "mongo", "--eval", "db.adminCommand('ping')"] 13 | interval: 10s 14 | timeout: 5s 15 | retries: 3 16 | command: --wiredTigerCacheSizeGB 0.5 17 | 18 | jmalcloud: 19 | container_name: jmalcloud_server 20 | image: docker.jmalx.com/jmal/jmalcloud:latest 21 | environment: 22 | MONGODB_URI: "mongodb://mongo:27017/jmalcloud" 23 | TZ: "Asia/Shanghai" 24 | JVM_OPTS: "-Xms256m -Xmx1024m" 25 | volumes: 26 | - ./docker/jmalcloud/files:/jmalcloud/files/ 27 | restart: unless-stopped 28 | depends_on: 29 | mongo: 30 | condition: service_healthy 31 | 32 | nginx: 33 | container_name: jmalcloud_nginx 34 | image: docker.jmalx.com/jmal/jmalcloud-nginx:latest 35 | ports: 36 | - 7070:80 37 | - 7071:8089 38 | environment: 39 | TZ: "Asia/Shanghai" 40 | links: 41 | - jmalcloud 42 | - office 43 | restart: unless-stopped 44 | 45 | office: # Optional 46 | container_name: jmalcloud_office 47 | image: docker.jmalx.com/onlyoffice/documentserver:8.0.1 48 | environment: 49 | TZ: "Asia/Shanghai" 50 | JWT_SECRET: "my_secret" 51 | restart: unless-stopped 52 | -------------------------------------------------------------------------------- /docker-compose.base.yml: -------------------------------------------------------------------------------- 1 | services: 2 | mongo: 3 | container_name: jmalcloud_mongodb 4 | image: mongo:4.4 5 | environment: 6 | TZ: "Asia/Shanghai" 7 | volumes: 8 | - ./docker/jmalcloud/mongodb/data/db:/data/db 9 | - ./docker/jmalcloud/mongodb/backup:/dump 10 | restart: unless-stopped 11 | healthcheck: 12 | test: ["CMD", "mongo", "--eval", "db.adminCommand('ping')"] 13 | interval: 10s 14 | timeout: 5s 15 | retries: 3 16 | command: --wiredTigerCacheSizeGB 0.5 17 | 18 | jmalcloud: 19 | container_name: jmalcloud_server 20 | image: jmal/jmalcloud:latest 21 | environment: 22 | MONGODB_URI: "mongodb://mongo:27017/jmalcloud" 23 | TZ: "Asia/Shanghai" 24 | JVM_OPTS: "-Xms256m -Xmx1024m" 25 | volumes: 26 | - ./docker/jmalcloud/files:/jmalcloud/files/ 27 | restart: unless-stopped 28 | depends_on: 29 | mongo: 30 | condition: service_healthy 31 | 32 | nginx: 33 | container_name: jmalcloud_nginx 34 | image: jmal/jmalcloud-nginx:latest 35 | ports: 36 | - 7070:80 37 | - 7071:8089 38 | environment: 39 | TZ: "Asia/Shanghai" 40 | links: 41 | - jmalcloud 42 | - office 43 | restart: unless-stopped 44 | 45 | office: # Optional 46 | container_name: jmalcloud_office 47 | image: onlyoffice/documentserver:8.0.1 48 | environment: 49 | TZ: "Asia/Shanghai" 50 | JWT_SECRET: "my_secret" 51 | restart: unless-stopped 52 | -------------------------------------------------------------------------------- /docker-compose.example.yml: -------------------------------------------------------------------------------- 1 | services: 2 | mongo: 3 | container_name: ${CONTAINER_NAME_PREFIX}_mongodb 4 | image: mongo:4.4 5 | environment: 6 | TZ: Asia/Shanghai 7 | volumes: 8 | - ${RESOURCE_DB_PATH}/data/db:/data/db 9 | - ${RESOURCE_DB_PATH}/custom:/etc/mongo 10 | - ${RESOURCE_DB_PATH}/backup:/dump 11 | restart: unless-stopped 12 | command: --wiredTigerCacheSizeGB 0.5 13 | jmalcloud: 14 | container_name: ${CONTAINER_NAME_PREFIX}_server 15 | image: ghcr.io/jamebal/jmalcloud:latest 16 | environment: 17 | MONGODB_URI: mongodb://mongo:27017/jmalcloud 18 | TZ: Asia/Shanghai 19 | ports: 20 | - ${SERVER_PORT}:8088 21 | volumes: 22 | - ${RESOURCE_FILE_PATH}:/jmalcloud/files/ 23 | restart: unless-stopped 24 | nginx: 25 | container_name: ${CONTAINER_NAME_PREFIX}_nginx 26 | image: ghcr.io/jamebal/jmalcloud-nginx:latest 27 | ports: 28 | - ${APP_PORT}:80 29 | - ${BLOG_PORT}:8089 30 | environment: 31 | TZ: Asia/Shanghai 32 | links: 33 | - jmalcloud 34 | - office 35 | restart: unless-stopped 36 | office: 37 | container_name: ${CONTAINER_NAME_PREFIX}_office 38 | image: onlyoffice/documentserver:${OFFICE_IMAGE_VERSION} 39 | environment: 40 | TZ: Asia/Shanghai 41 | JWT_ENABLED: false 42 | ALLOW_PRIVATE_IP_ADDRESS: true 43 | restart: unless-stopped 44 | networks: {} 45 | -------------------------------------------------------------------------------- /docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | USER_UID=${PUID:-0} 5 | USER_GID=${PGID:-0} 6 | TZ=${TZ:-Asia/Shanghai} 7 | 8 | mkdir -p /log 9 | 10 | chown ${USER_UID}:${USER_GID} /usr/local/clouddisk-${VERSION}.jar 11 | chown -R ${USER_UID}:${USER_GID} /usr/local/clouddisk-lib 12 | chown -R ${USER_UID}:${USER_GID} log 13 | 14 | exec gosu ${USER_UID}:${USER_GID} java ${JVM_OPTS} \ 15 | -Duser.timezone=${TZ} \ 16 | -Dfile.encoding=UTF-8 \ 17 | -Dloader.path=/usr/local/clouddisk-lib \ 18 | -jar /usr/local/clouddisk-${VERSION}.jar \ 19 | --spring.profiles.active=${RUN_ENVIRONMENT} \ 20 | --spring.data.mongodb.uri=${MONGODB_URI} \ 21 | --tess4j.data-path=${TESS4J_DATA_PATH} \ 22 | --file.exactSearch=${EXACT_SEARCH} \ 23 | --file.monitor=${FILE_MONITOR} \ 24 | --file.rootDir=${FILE_ROOT_DIR} \ 25 | --file.monitorIgnoreFilePrefix=${MONITOR_IGNORE_FILE_PREFIX} \ 26 | --logging.level.root=${LOG_LEVEL} \ 27 | --file.ip2region-db-path=/jmalcloud/ip2region.xdb \ 28 | --file.ocr-lite-onnx-model-path=/jmalcloud/models 29 | -------------------------------------------------------------------------------- /docker/ip2region.xdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/docker/ip2region.xdb -------------------------------------------------------------------------------- /release-www.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # version 3 | if [ -n "$1" ]; then 4 | echo "version: $1" 5 | else 6 | echo "需要带上版本号, 例如 sh release-www.sh 2.5.1" 7 | exit 8 | fi 9 | version=$1 10 | 11 | # jmal-cloud-view Directory location 12 | view_dir="/Users/jmal/studio/myProject/github/jmal-cloud-view" 13 | # jmal-cloud-server Directory location 14 | server_dir="/Users/jmal/studio/myProject/github/jmal-cloud-server" 15 | 16 | # build jmal-cloud-view 17 | cd $view_dir || exit 18 | echo "location: ${view_dir} " 19 | if [ ! -f "dist-$version.tar" ]; then 20 | npm run build:prod 21 | tar -czf "dist-$version.tar" dist 22 | fi 23 | echo "current $(pwd)" 24 | echo "copy dist-$version.tar to $server_dir/www/releases/dist-latest.tar" 25 | cp "dist-$version.tar" $server_dir"/www/releases/dist-latest.tar" 26 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/JmalCloudApplication.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk; 2 | 3 | import cn.hutool.crypto.SecureUtil; 4 | import com.jmal.clouddisk.util.TesseractUtil; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.boot.SpringApplication; 7 | import org.springframework.boot.autoconfigure.SpringBootApplication; 8 | import org.springframework.cache.annotation.EnableCaching; 9 | import org.springframework.scheduling.annotation.EnableScheduling; 10 | 11 | /** 12 | * ClouddiskApplication 13 | * 14 | * @author jmal 15 | */ 16 | @SpringBootApplication 17 | @EnableCaching 18 | @EnableScheduling 19 | @Slf4j 20 | public class JmalCloudApplication { 21 | 22 | public static void main(String[] args) { 23 | SecureUtil.disableBouncyCastle(); 24 | SpringApplication application = new SpringApplication(JmalCloudApplication.class); 25 | // 允许循环引用 26 | application.setAllowCircularReferences(true); 27 | 28 | // dev环境下设置tesseract的lib路径 29 | TesseractUtil.setTesseractLibPath(); 30 | 31 | application.run(args); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/annotation/LogOperatingFun.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.annotation; 2 | 3 | 4 | 5 | import com.jmal.clouddisk.model.LogOperation; 6 | 7 | import java.lang.annotation.*; 8 | 9 | /** 10 | * 操作方法日志注解 11 | * @author jmal 12 | */ 13 | @Documented 14 | @Target({ElementType.METHOD, ElementType.TYPE}) 15 | @Retention(RetentionPolicy.RUNTIME) 16 | public @interface LogOperatingFun { 17 | /** 18 | * 操作功能 19 | */ 20 | String value() default ""; 21 | /*** 22 | * 日志类型 23 | */ 24 | LogOperation.Type logType() default LogOperation.Type.OPERATION; 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/annotation/OperationType.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.annotation; 2 | 3 | /** 4 | * OperationType 数据操作类型枚举 5 | * 6 | * @author jmal 7 | */ 8 | 9 | public enum OperationType { 10 | /*** 11 | * 添加 12 | */ 13 | create, 14 | /*** 15 | * 查询 16 | */ 17 | read, 18 | /*** 19 | * 更新 20 | */ 21 | update, 22 | /*** 23 | * 删除 24 | */ 25 | delete 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/annotation/Permission.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.annotation; 2 | 3 | 4 | 5 | import java.lang.annotation.*; 6 | 7 | /** 8 | * 操作日志注解 9 | * @author jmal 10 | */ 11 | @Documented 12 | @Retention(RetentionPolicy.RUNTIME) 13 | @Target(ElementType.METHOD) 14 | public @interface Permission { 15 | 16 | /*** 17 | * @return 权限标识 18 | */ 19 | String value() default ""; 20 | 21 | /*** 22 | * @return 只有网盘创建者才能通过 23 | */ 24 | boolean onlyCreator() default false; 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/config/ErrorConfig.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.config; 2 | 3 | import org.springframework.boot.web.server.ErrorPage; 4 | import org.springframework.boot.web.server.ErrorPageRegistrar; 5 | import org.springframework.boot.web.server.ErrorPageRegistry; 6 | import org.springframework.http.HttpStatus; 7 | import org.springframework.stereotype.Component; 8 | 9 | /** 10 | * @author jmal 11 | * @Description 错误页 12 | * @Date 2020/12/16 3:39 下午 13 | */ 14 | @Component 15 | public class ErrorConfig implements ErrorPageRegistrar { 16 | @Override 17 | public void registerErrorPages(ErrorPageRegistry registry) { 18 | ErrorPage[] errorPages = new ErrorPage[1]; 19 | errorPages[0] = new ErrorPage(HttpStatus.NOT_FOUND, "/public/404"); 20 | registry.addErrorPages(errorPages); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/config/GlobalCorsConfig.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.config; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | 5 | /** 6 | * GlobalCorsConfig 7 | * 8 | * @author jmal 9 | */ 10 | @Configuration 11 | public class GlobalCorsConfig { 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/config/JacksonConfig.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.config; 2 | 3 | import com.fasterxml.jackson.annotation.JsonInclude; 4 | import com.fasterxml.jackson.databind.ObjectMapper; 5 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 6 | import org.springframework.context.annotation.Bean; 7 | import org.springframework.context.annotation.Configuration; 8 | import org.springframework.context.annotation.Primary; 9 | import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; 10 | 11 | /** 12 | * @Description: 去掉返回值中为null的字段 13 | * @author jmal 14 | */ 15 | 16 | @Configuration 17 | public class JacksonConfig { 18 | @Bean 19 | @Primary 20 | @ConditionalOnMissingBean(ObjectMapper.class) 21 | public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { 22 | ObjectMapper objectMapper = builder.createXmlMapper(false).build(); 23 | //通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化,属性为NULL 不序列化 24 | objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 25 | return objectMapper; 26 | } 27 | 28 | //Include.Include.ALWAYS 默认 29 | //Include.NON_DEFAULT 属性为默认值不序列化 30 | //nclude.NON_EMPTY 属性为 空("") 或者为 NULL 都不序列化 31 | //Include.NON_NULL 属性为NULL 不序列化 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/config/MyTomcatServletWebServerFactoryCustomizer.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.config; 2 | 3 | import org.springframework.boot.autoconfigure.web.ServerProperties; 4 | import org.springframework.boot.autoconfigure.web.servlet.TomcatServletWebServerFactoryCustomizer; 5 | import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; 6 | import org.springframework.stereotype.Component; 7 | 8 | /** 9 | * @author jmal 10 | */ 11 | @Component 12 | public class MyTomcatServletWebServerFactoryCustomizer extends TomcatServletWebServerFactoryCustomizer { 13 | 14 | public MyTomcatServletWebServerFactoryCustomizer(ServerProperties serverProperties) { 15 | super(serverProperties); 16 | } 17 | 18 | @Override 19 | public void customize(TomcatServletWebServerFactory factory) { 20 | super.customize(factory); 21 | factory.addConnectorCustomizers(connector -> { 22 | connector.setProperty("relaxedPathChars", "|{}[]"); 23 | connector.setProperty("relaxedQueryChars", "|{}[]"); 24 | }); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/config/WebFilter.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.config; 2 | 3 | import jakarta.servlet.*; 4 | import jakarta.servlet.http.HttpServletRequest; 5 | import org.springframework.context.annotation.Lazy; 6 | import org.springframework.stereotype.Component; 7 | 8 | import java.io.IOException; 9 | import java.util.regex.Pattern; 10 | 11 | /** 12 | * @author jmal 13 | * @Description 路径过滤器 14 | * @Date 2020/10/20 4:12 下午 15 | */ 16 | @Component 17 | @Lazy 18 | public class WebFilter implements Filter { 19 | 20 | public static final String API = "/api"; 21 | public static final Pattern COMPILE = Pattern.compile(API); 22 | 23 | @Override 24 | public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 25 | HttpServletRequest httpRequest = (HttpServletRequest) request; 26 | String uri = httpRequest.getRequestURI(); 27 | if (uri.startsWith(API)) { 28 | uri = COMPILE.matcher(uri).replaceFirst(""); 29 | httpRequest.getRequestDispatcher(uri).forward(request, response); 30 | return; 31 | } 32 | chain.doFilter(request, response); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/config/YamlPropertyLoaderFactory.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.config; 2 | 3 | import org.springframework.boot.env.YamlPropertySourceLoader; 4 | import org.springframework.core.env.PropertySource; 5 | import org.springframework.core.io.support.DefaultPropertySourceFactory; 6 | import org.springframework.core.io.support.EncodedResource; 7 | import org.springframework.lang.Nullable; 8 | 9 | import java.io.IOException; 10 | import java.util.List; 11 | 12 | /** 13 | * yml 资源加载工厂类 14 | * 15 | * @author jmal 16 | */ 17 | public class YamlPropertyLoaderFactory extends DefaultPropertySourceFactory { 18 | 19 | 20 | @Override 21 | public PropertySource createPropertySource(@Nullable String name, EncodedResource resource) throws IOException { 22 | 23 | if (null == resource) { 24 | super.createPropertySource(name, resource); 25 | } 26 | if (resource == null) { 27 | throw new RuntimeException("请配置 file.yml"); 28 | } 29 | List> sourceList = new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource()); 30 | if(sourceList.size() < 1){ 31 | throw new RuntimeException("请配置 file.yml"); 32 | } 33 | return sourceList.get(0); 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/controller/rest/LogController.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.controller.rest; 2 | 3 | import com.jmal.clouddisk.annotation.Permission; 4 | import com.jmal.clouddisk.model.LogOperation; 5 | import com.jmal.clouddisk.model.LogOperationDTO; 6 | import com.jmal.clouddisk.service.impl.LogService; 7 | import com.jmal.clouddisk.util.ResponseResult; 8 | import io.swagger.v3.oas.annotations.Operation; 9 | import io.swagger.v3.oas.annotations.tags.Tag; 10 | import lombok.RequiredArgsConstructor; 11 | import org.springframework.web.bind.annotation.*; 12 | 13 | import java.util.List; 14 | 15 | /** 16 | * @author jmal 17 | * @Description 日志管理 18 | * @Date 2021/2/8 2:12 下午 19 | */ 20 | @RestController 21 | @RequestMapping("log") 22 | @Tag(name = "日志") 23 | @RequiredArgsConstructor 24 | public class LogController { 25 | 26 | private final LogService logService; 27 | 28 | @Operation(summary = "查询日志") 29 | @GetMapping("/list") 30 | @Permission("sys:log:list") 31 | public ResponseResult> list(@ModelAttribute LogOperationDTO logOperationDTO) { 32 | return logService.list(logOperationDTO); 33 | } 34 | 35 | @Operation(summary = "查询文件操作记录") 36 | @GetMapping("/getFileOperationHistory") 37 | public ResponseResult> getFileOperationHistory(@ModelAttribute LogOperationDTO logOperationDTO, @RequestParam String fileId) { 38 | return logService.getFileOperationHistory(logOperationDTO, fileId); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/controller/rest/OcrController.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.controller.rest; 2 | 3 | import cn.hutool.core.date.TimeInterval; 4 | import cn.hutool.core.io.FileUtil; 5 | import cn.hutool.http.HttpUtil; 6 | import com.jmal.clouddisk.ocr.OcrService; 7 | import com.jmal.clouddisk.service.impl.UserLoginHolder; 8 | import io.swagger.v3.oas.annotations.tags.Tag; 9 | import lombok.RequiredArgsConstructor; 10 | import lombok.extern.slf4j.Slf4j; 11 | import org.springframework.web.bind.annotation.GetMapping; 12 | import org.springframework.web.bind.annotation.RequestParam; 13 | import org.springframework.web.bind.annotation.RestController; 14 | 15 | @RestController 16 | @RequiredArgsConstructor 17 | @Tag(name = "OCR") 18 | @Slf4j 19 | public class OcrController { 20 | 21 | private final OcrService ocrService; 22 | private final UserLoginHolder userLoginHolder; 23 | 24 | @GetMapping("/ocr") 25 | public String performOcr(@RequestParam String fileUrl) { 26 | String tempImagePath = ocrService.generateOrcTempImagePath(userLoginHolder.getUsername()); 27 | try { 28 | HttpUtil.downloadFile(fileUrl, tempImagePath); 29 | TimeInterval timeInterval = new TimeInterval(); 30 | timeInterval.start(); 31 | String str = ocrService.doOCR(tempImagePath, null, "tesseract"); 32 | log.info("OCR time consuming: {}", timeInterval.intervalMs()); 33 | return str; 34 | } finally { 35 | // 删除临时文件 36 | FileUtil.del(tempImagePath); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/controller/sse/Message.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.controller.sse; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Getter 7 | @Setter 8 | public class Message { 9 | private String username; 10 | private Object body; 11 | private String url; 12 | private Long space; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/exception/CheckedFunction.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.exception; 2 | 3 | 4 | @FunctionalInterface 5 | public interface CheckedFunction { 6 | R apply(T t) throws Exception; 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/exception/CommonException.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.exception; 2 | 3 | import lombok.Getter; 4 | import org.springframework.data.annotation.Transient; 5 | 6 | import java.io.Serial; 7 | 8 | /** 9 | * @Description 通用异常处理类 10 | * @Author jmal 11 | * @Date 2019-08-15 10:54 12 | * @author jmal 13 | */ 14 | @Getter 15 | public class CommonException extends RuntimeException { 16 | 17 | /** 18 | * 19 | */ 20 | @Serial 21 | private static final long serialVersionUID = 1L; 22 | private final int code; 23 | private final String msg; 24 | 25 | @Transient 26 | private final Object data; 27 | 28 | public CommonException(int code, String msg) { 29 | this.code = code; 30 | this.msg = msg; 31 | this.data = null; 32 | } 33 | 34 | public CommonException(ExceptionType type, Object data) { 35 | this.code = type.getCode(); 36 | this.msg = type.getMsg(); 37 | this.data = data; 38 | } 39 | 40 | public CommonException(ExceptionType type) { 41 | this.code = type.getCode(); 42 | this.msg = type.getMsg(); 43 | this.data = null; 44 | } 45 | 46 | public CommonException(String msg) { 47 | this.code = -1; 48 | this.msg = msg; 49 | this.data = null; 50 | } 51 | 52 | public String getMessage() { 53 | return msg; 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/interceptor/HeaderLocaleChangeInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.interceptor; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import jakarta.servlet.http.HttpServletRequest; 5 | import jakarta.servlet.http.HttpServletResponse; 6 | import org.jetbrains.annotations.NotNull; 7 | import org.springframework.context.i18n.LocaleContextHolder; 8 | import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; 9 | 10 | import java.util.Locale; 11 | 12 | public class HeaderLocaleChangeInterceptor extends LocaleChangeInterceptor { 13 | 14 | @Override 15 | public boolean preHandle(HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) { 16 | String lang = request.getHeader("lang"); 17 | if (StrUtil.isNotBlank(lang) && lang.indexOf("_") > 0) { 18 | Locale locale = Locale.forLanguageTag(lang.replace("_", "-")); 19 | LocaleContextHolder.setLocale(locale); 20 | } else { 21 | LocaleContextHolder.setLocale(Locale.US); 22 | } 23 | return true; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/lucene/IndexStatus.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.lucene; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * 索引状态 7 | */ 8 | @Getter 9 | public enum IndexStatus { 10 | /** 11 | * 未索引,待索引 12 | */ 13 | NOT_INDEX(0), 14 | /** 15 | * 正在进行索引 16 | */ 17 | INDEXING(1), 18 | /** 19 | * 已完成索引 20 | */ 21 | INDEXED(2); 22 | 23 | private final int status; 24 | 25 | IndexStatus(int status) { 26 | this.status = status; 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/lucene/TaskProgress.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.lucene; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class TaskProgress { 7 | /** 8 | * 任务id 9 | */ 10 | private String taskId; 11 | /** 12 | * 任务类型 13 | */ 14 | private TaskType taskType; 15 | /** 16 | * 任务类型 taskType.getType() 17 | */ 18 | private String type; 19 | /** 20 | * 任务名称 21 | */ 22 | private String name; 23 | /** 24 | * 文件路径 25 | */ 26 | private String path; 27 | /** 28 | * 任务状态 29 | */ 30 | private String progress; 31 | private String username; 32 | 33 | public TaskProgress(String taskId, String username, TaskType taskType, String name, String progress) { 34 | this.taskId = taskId; 35 | this.username = username; 36 | this.taskType = taskType; 37 | this.type = taskType.getType(); 38 | this.name = name; 39 | this.progress = progress; 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/lucene/TaskType.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.lucene; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * 任务类型 7 | */ 8 | @Getter 9 | public enum TaskType { 10 | /** 11 | * OCR识别 12 | */ 13 | OCR("OCR识别"), 14 | /** 15 | * 视频转码 16 | */ 17 | TRANSCODE_VIDEO("视频转码"); 18 | 19 | private final String type; 20 | 21 | TaskType(String type) { 22 | this.type = type; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/media/TranscodeStatus.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.media; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * 转码状态 7 | */ 8 | @Getter 9 | public enum TranscodeStatus { 10 | /** 11 | * 待转码 12 | */ 13 | NOT_TRANSCODE(0), 14 | /** 15 | * 正在进行转码 16 | */ 17 | TRANSCODING(1), 18 | /** 19 | * 已完成转码 20 | */ 21 | TRANSCENDED(2); 22 | 23 | private final int status; 24 | 25 | TranscodeStatus(int status) { 26 | this.status = status; 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/media/VideoInfoDO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.media; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class VideoInfoDO { 7 | private Integer width; 8 | private Integer height; 9 | /** 10 | * 视频码率 11 | */ 12 | private String bitrate; 13 | /** 14 | * 视频码率数值 15 | */ 16 | private Integer bitrateNum; 17 | /** 18 | * 视频格式 19 | */ 20 | private String format; 21 | /** 22 | * 视频帧率 23 | */ 24 | private Double frameRate; 25 | /** 26 | * 视频时长 27 | */ 28 | private String duration; 29 | /** 30 | * 视频时长数值(秒) 31 | */ 32 | private Integer durationNum; 33 | 34 | /** 35 | * 转码后的视频高度 36 | */ 37 | private Integer toHeight; 38 | /** 39 | * 转码后的视频码率 40 | */ 41 | private Integer toBitrate; 42 | /** 43 | * 转码后的视频帧率 44 | */ 45 | private Double toFrameRate; 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/ArchivesVO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import com.jmal.clouddisk.util.TimeUntils; 4 | import lombok.Data; 5 | 6 | import java.time.LocalDateTime; 7 | import java.util.Date; 8 | 9 | /** 10 | * @Description 归档展示 11 | * @blame jmal 12 | * @Date 2020/11/15 7:33 下午 13 | */ 14 | @Data 15 | public class ArchivesVO { 16 | 17 | /*** 18 | * 归档id 19 | */ 20 | private String id; 21 | /*** 22 | * 归档名称 23 | */ 24 | private String name; 25 | /*** 26 | * 显示时间 27 | */ 28 | private Date date; 29 | /*** 30 | * 归档缩略名 31 | */ 32 | private String slug; 33 | 34 | public String date(){ 35 | LocalDateTime localDateTime = date.toInstant().atZone(TimeUntils.ZONE_ID).toLocalDateTime(); 36 | return localDateTime.format(TimeUntils.DATE_MONTH); 37 | } 38 | 39 | public String dateTime(){ 40 | LocalDateTime localDateTime = date.toInstant().atZone(TimeUntils.ZONE_ID).toLocalDateTime(); 41 | return localDateTime.format(TimeUntils.DATE_DAY); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/ArticleDTO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import io.swagger.v3.oas.annotations.media.Schema; 4 | 5 | import lombok.Data; 6 | 7 | import jakarta.validation.Valid; 8 | 9 | /** 10 | * @author jmal 11 | * @Description 文章DTO 12 | * @Date 2020/11/26 11:13 上午 13 | */ 14 | @Data 15 | @Schema 16 | @Valid 17 | public class ArticleDTO { 18 | 19 | @Schema(name = "mark", title = "文章id") 20 | String mark; 21 | 22 | @Schema(name = "userId", title = "用户Id") 23 | String userId; 24 | 25 | @Schema(name = "isRelease", title = "是否发布") 26 | Boolean isRelease; 27 | 28 | @Schema(name = "isAlonePage", title = "是否为独立页面") 29 | Boolean isAlonePage; 30 | 31 | @Schema(name = "isDraft", title = "是否为草稿") 32 | Boolean isDraft; 33 | 34 | @Schema(name = "keyword", title = "关键字") 35 | String keyword; 36 | 37 | @Schema(name = "categoryIds", title = "分类id集合") 38 | String[] categoryIds; 39 | 40 | @Schema(name = "tagIds", title = "标签id集合") 41 | String[] tagIds; 42 | 43 | @Schema(name = "sortableProp", title = "排序字段") 44 | String sortableProp; 45 | 46 | @Schema(name = "order", title = "排序的顺序") 47 | String order; 48 | 49 | @Schema(hidden = true, name = "pageIndex", title = "当前页数") 50 | Integer pageIndex; 51 | @Schema(hidden = true, name = "pageSize", title = "每页条数") 52 | Integer pageSize; 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/ArticleVO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import lombok.Data; 4 | import lombok.EqualsAndHashCode; 5 | 6 | /** 7 | * @Description 文章展示 8 | * @blame jmal 9 | * @Date 2020/11/15 7:33 下午 10 | */ 11 | @Data 12 | @EqualsAndHashCode(callSuper = true) 13 | public class ArticleVO extends MarkdownBaseFile { 14 | /*** 15 | * 文件内容 16 | */ 17 | private String contentText; 18 | /*** 19 | * html内容 20 | */ 21 | private String html; 22 | /*** 23 | * 是否为独立页,适用于文档类型 24 | */ 25 | private Boolean alonePage; 26 | /*** 27 | * 是否可编辑 28 | */ 29 | private Boolean editable; 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/ArticlesQueryVO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @author jmal 7 | * @Description 文章查询页简要信息 8 | * @Date 2020/12/16 3:12 下午 9 | */ 10 | @Data 11 | public class ArticlesQueryVO { 12 | /*** 13 | * 文章标题名 14 | */ 15 | String name; 16 | /*** 17 | * 文章背景 18 | */ 19 | String background; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/CloudSettingDO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import lombok.Data; 4 | 5 | 6 | /** 7 | * @author jmal 8 | * @Description 网盘设置 9 | * @Date 2022/03/26 2:45 下午 10 | */ 11 | @Data 12 | public class CloudSettingDO { 13 | /** 14 | * 网盘名称 15 | */ 16 | private String cloudName; 17 | /** 18 | * 网盘logo 19 | */ 20 | private byte[] logo; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/CloudSettingDTO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import lombok.Data; 4 | import org.springframework.web.multipart.MultipartFile; 5 | 6 | /** 7 | * @author jmal 8 | * @Description 网盘设置DTO 9 | * @Date 2022/03/26 2:45 下午 10 | */ 11 | @Data 12 | public class CloudSettingDTO { 13 | /** 14 | * 网盘名称 15 | */ 16 | private String cloudName; 17 | /** 18 | * 网盘logo 19 | */ 20 | private byte[] logo; 21 | 22 | private MultipartFile file; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/EditTagDTO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import io.swagger.v3.oas.annotations.media.Schema; 4 | import jakarta.validation.Valid; 5 | import jakarta.validation.constraints.NotNull; 6 | import lombok.Data; 7 | 8 | import java.util.List; 9 | 10 | @Data 11 | @Schema 12 | @Valid 13 | public class EditTagDTO { 14 | @NotNull(message = "文件id列表不能为空") 15 | @Schema(description = "要修改的文件id列表") 16 | List fileIds; 17 | 18 | @NotNull(message = "标签列表不能为空") 19 | @Schema(description = "于文件id列表相关联的标签列表") 20 | List tagList; 21 | 22 | @Schema(description = "要额外删除的标签id列表") 23 | List removeTagIds; 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/FileIndex.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | import java.io.File; 7 | 8 | /** 9 | * 创建文件索引需要的内容 10 | */ 11 | @Data 12 | @Accessors(chain = true) 13 | public class FileIndex { 14 | 15 | public FileIndex(File file, FileIntroVO fileIntroVO) { 16 | this.file = file; 17 | this.userId = fileIntroVO.getUserId(); 18 | this.fileId = fileIntroVO.getId(); 19 | this.path = fileIntroVO.getPath(); 20 | this.isFolder = fileIntroVO.getIsFolder(); 21 | this.isFavorite = fileIntroVO.getIsFavorite(); 22 | this.remark = fileIntroVO.getRemark(); 23 | } 24 | 25 | 26 | private String userId; 27 | private String username; 28 | private File file; 29 | private String fileId; 30 | private String name; 31 | private String path; 32 | private String type; 33 | private String tagName; 34 | private Long modified; 35 | private Long size; 36 | private Boolean isFolder; 37 | private Boolean isFavorite; 38 | private String remark; 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/FileType.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | /** 4 | * @Description 文件类型 5 | * @Author jmal 6 | */ 7 | public enum FileType { 8 | /*** 9 | * 音频 10 | */ 11 | audio, 12 | /*** 13 | * 视频 14 | */ 15 | video, 16 | /*** 17 | * 图片 18 | */ 19 | image, 20 | /*** 21 | * 文本 22 | */ 23 | text, 24 | /*** 25 | * 文档 26 | */ 27 | document; 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/GridFSBO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | import lombok.Data; 5 | 6 | import java.time.LocalDateTime; 7 | 8 | /** 9 | * @author jmal 10 | * @Description GridFSDO 11 | * @date 2023/5/10 16:43 12 | */ 13 | @Data 14 | public class GridFSBO { 15 | 16 | String id; 17 | 18 | String filename; 19 | 20 | long length; 21 | 22 | @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss") 23 | LocalDateTime uploadDate; 24 | 25 | Metadata metadata; 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/HeartwingsDO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | import lombok.Data; 5 | import org.springframework.data.mongodb.core.index.CompoundIndex; 6 | import org.springframework.data.mongodb.core.index.CompoundIndexes; 7 | import org.springframework.data.mongodb.core.mapping.Document; 8 | import org.springframework.format.annotation.DateTimeFormat; 9 | 10 | import java.time.LocalDateTime; 11 | 12 | /** 13 | * @author jmal 14 | * @Description 心语记录 15 | * @Date 2021/3/1 10:19 上午 16 | */ 17 | @Data 18 | @Document(collection = "heartwings") 19 | @CompoundIndexes({ 20 | @CompoundIndex(name = "createTime_1", def = "{'createTime': 1}"), 21 | }) 22 | public class HeartwingsDO { 23 | 24 | private String id; 25 | 26 | /*** 27 | * 创建者 userId 28 | */ 29 | private String creator; 30 | 31 | /*** 32 | * 创建者 username 33 | */ 34 | private String username; 35 | 36 | /*** 37 | * 心语 38 | */ 39 | private String heartwings; 40 | 41 | @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss") 42 | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 43 | private LocalDateTime createTime; 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/MarkdownBaseFile.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import lombok.Data; 4 | import lombok.EqualsAndHashCode; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * @author jmal 10 | * @Description MarkdownBaseFile 11 | * @date 2023/5/10 13:54 12 | */ 13 | @Data 14 | @EqualsAndHashCode(callSuper = true) 15 | public class MarkdownBaseFile extends FileBase { 16 | 17 | private String username; 18 | /*** 19 | * 是否发布,适用于文档类型 20 | */ 21 | private Boolean release; 22 | /*** 23 | * 封面 24 | */ 25 | private String cover; 26 | /*** 27 | * 用户头像 28 | */ 29 | private String avatar; 30 | /*** 31 | * 缩略名 32 | */ 33 | private String slug; 34 | /*** 35 | * 分类Id集合 36 | */ 37 | private String[] categoryIds; 38 | 39 | /*** 40 | * 分类集合 41 | */ 42 | private List categories; 43 | /*** 44 | * 标签Id集合 45 | */ 46 | private String[] tagIds; 47 | /*** 48 | * 标签集合 49 | */ 50 | private List tags; 51 | 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/MarkdownVO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import lombok.Data; 4 | import lombok.EqualsAndHashCode; 5 | 6 | /** 7 | * @Description 文档 8 | * @blame jmal 9 | * @Date 2020/11/15 7:33 下午 10 | */ 11 | @Data 12 | @EqualsAndHashCode(callSuper = true) 13 | public class MarkdownVO extends MarkdownBaseFile { 14 | 15 | private String userId; 16 | /*** 17 | * updateDate 距离现在的时间 18 | */ 19 | private Long agoTime; 20 | /*** 21 | * 是否有草稿 22 | */ 23 | private Boolean draft; 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/Metadata.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class Metadata { 7 | String filepath; 8 | String filename; 9 | String time; 10 | String compression; 11 | /** 12 | * 操作人(username) 13 | */ 14 | String operator; 15 | Long size; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/Music.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @author jmal 7 | */ 8 | @Data 9 | public class Music { 10 | /*** 11 | * 歌名 12 | */ 13 | String songName; 14 | /*** 15 | * 歌手 16 | */ 17 | String singer; 18 | /*** 19 | * 专辑 20 | */ 21 | String album; 22 | /*** 23 | * 封面 24 | */ 25 | String coverBase64; 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/OperationPermission.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | /** 4 | * @author jmal 5 | * @Description 文件操作权限 6 | * @date 2023/8/10 15:19 7 | */ 8 | public enum OperationPermission { 9 | DOWNLOAD, 10 | UPLOAD, 11 | DELETE, 12 | PUT; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/OperationTips.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import lombok.Builder; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | @Data 8 | @Accessors(chain = true) 9 | @Builder 10 | public class OperationTips { 11 | /** 12 | * 操作结果说明 13 | */ 14 | String msg; 15 | /** 16 | * 操作结果状态 17 | */ 18 | Boolean success; 19 | /** 20 | * 操作 21 | */ 22 | String operation; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/ShareVO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | import lombok.Data; 5 | import org.springframework.format.annotation.DateTimeFormat; 6 | 7 | import java.time.LocalDateTime; 8 | import java.util.List; 9 | 10 | /** 11 | * @Description 文件分享模型 12 | * @Author jmal 13 | * @Date 2020-03-17 16:28 14 | */ 15 | @Data 16 | public class ShareVO { 17 | private String shareId; 18 | private String shortId; 19 | /*** 20 | * 提取码 21 | */ 22 | private String extractionCode; 23 | 24 | private Boolean isPrivacy; 25 | 26 | private String userId; 27 | 28 | private String fileName; 29 | 30 | private Boolean shareBase; 31 | private Boolean subShare; 32 | 33 | private Boolean isFolder; 34 | private String contentType; 35 | @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm") 36 | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm") 37 | private LocalDateTime expireDate; 38 | 39 | private List operationPermissionList; 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/SharerDTO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import io.swagger.v3.oas.annotations.media.Schema; 4 | 5 | import lombok.Data; 6 | 7 | /** 8 | * @author jmal 9 | * @Description 分享者信息 10 | * @Date 2021/4/6 4:25 下午 11 | */ 12 | @Data 13 | @Schema 14 | public class SharerDTO { 15 | String shareId; 16 | String userId; 17 | @Schema(name = "avatar", title = "头像链接") 18 | String avatar; 19 | @Schema(name = "showName", title = "昵称") 20 | String showName; 21 | @Schema(name = "username", title = "用户名") 22 | String username; 23 | @Schema(name = "netdiskLogo", title = "网盘logo文件名", hidden = true) 24 | String netdiskLogo; 25 | @Schema(name = "netdiskName", title = "网盘名称", hidden = true) 26 | String netdiskName; 27 | @Schema(name = "iframe", title = "iframe配置", hidden = true) 28 | String iframe; 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/Tag.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import lombok.Data; 4 | import org.springframework.data.annotation.TypeAlias; 5 | 6 | @Data 7 | @TypeAlias("") 8 | public class Tag { 9 | String tagId; 10 | String name; 11 | String color; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/UploadImageDTO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import lombok.Data; 4 | import org.springframework.web.multipart.MultipartFile; 5 | 6 | /** 7 | * @author jmal 8 | * @Description 图片上传传输对象 9 | * @Date 2020/11/16 11:12 上午 10 | */ 11 | @Data 12 | public class UploadImageDTO { 13 | String username; 14 | String userId; 15 | /*** 16 | * 远程url图像 17 | */ 18 | String url; 19 | MultipartFile[] files; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/UploadResponse.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | /** 9 | * @Description UploadResponse 10 | * @Author jmal 11 | * @Date 2020-01-27 17:04 12 | * @author jmal 13 | */ 14 | @Data 15 | public class UploadResponse { 16 | 17 | /*** 18 | * 服务是否已经存在该文件,通过文件的md5校验 19 | */ 20 | boolean pass; 21 | /** 22 | * 已存在 23 | */ 24 | boolean exist; 25 | /*** 26 | * 代表这些分片是已经上传过的了 27 | */ 28 | List resume; 29 | /*** 30 | * 是否上传完成 31 | */ 32 | boolean upload; 33 | /*** 34 | * 上传后是合并完成 35 | */ 36 | boolean merge; 37 | 38 | public UploadResponse() { 39 | this.pass = false; 40 | this.upload = false; 41 | this.merge = false; 42 | this.resume = new ArrayList<>(); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/Urlset.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; 4 | import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; 5 | import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; 6 | import lombok.Data; 7 | import java.util.ArrayList; 8 | import java.util.List; 9 | 10 | /** 11 | * @author jmal 12 | * @Description sitemap xml 13 | * @Date 2021/02/25 4:26 下午 14 | */ 15 | 16 | @JacksonXmlRootElement(localName = "urlset") 17 | @Data 18 | public class Urlset { 19 | 20 | @JacksonXmlElementWrapper(useWrapping = false) 21 | private List url = new ArrayList<>(); 22 | 23 | @JacksonXmlRootElement(localName = "url") 24 | @Data 25 | public static class Url { 26 | /*** 27 | * 必填标签,这是具体某一个链接的定义入口,每一条数据都要用包含在里面,这是必须的 28 | */ 29 | @JacksonXmlProperty(localName = "loc") 30 | private String loc; 31 | /*** 32 | * 可以不提交该标签,用来指定该链接的最后更新时间 33 | */ 34 | @JacksonXmlProperty(localName = "lastmod") 35 | private String lastmod; 36 | /*** 37 | * 可以不提交该标签,用这个标签告诉此链接可能会出现的更新频率 38 | */ 39 | @JacksonXmlProperty(localName = "changefreq") 40 | private String changefreq; 41 | /*** 42 | * 可以不提交该标签,用来指定此链接相对于其他链接的优先权比值,此值定于0.0-1.0之间 43 | */ 44 | @JacksonXmlProperty(localName = "priority") 45 | private String priority; 46 | } 47 | } -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/UserAccessTokenDO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import lombok.Data; 4 | 5 | import java.time.LocalDateTime; 6 | 7 | /** 8 | * @Description 用户授权码 9 | * @Author jmal 10 | * @Date 2020/9/30 10:34 上午 11 | */ 12 | @Data 13 | public class UserAccessTokenDO { 14 | String id; 15 | /*** 16 | * 授权码名称 17 | */ 18 | private String name; 19 | /*** 20 | * 用户账号 21 | */ 22 | private String username; 23 | /*** 24 | * 用户授权码 25 | */ 26 | private String accessToken; 27 | /*** 28 | * 创建时间 29 | */ 30 | LocalDateTime createTime; 31 | /*** 32 | * 最近活动时间 33 | */ 34 | LocalDateTime lastActiveTime; 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/UserAccessTokenDTO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | 5 | import io.swagger.v3.oas.annotations.media.Schema; 6 | import lombok.Data; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | /** 11 | * @Description 用户授权码 12 | * @Author jmal 13 | * @Date 2020/9/30 10:34 上午 14 | */ 15 | @Data 16 | public class UserAccessTokenDTO { 17 | String id; 18 | /*** 19 | * 授权码名称 20 | */ 21 | private String name; 22 | /*** 23 | * 用户账号 24 | */ 25 | private String username; 26 | /*** 27 | * 创建时间 28 | */ 29 | @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss") 30 | @Schema(hidden = true) 31 | LocalDateTime createTime; 32 | /*** 33 | * 最近活动时间 34 | */ 35 | @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss") 36 | @Schema(hidden = true) 37 | LocalDateTime lastActiveTime; 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/UserTokenDO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | /** 7 | * @Description userToken 8 | * 用来存储用户登录后的信息 9 | * @Author jmal 10 | * @Date 2020/9/30 10:34 上午 11 | */ 12 | @Data 13 | @Accessors(chain = true) 14 | public class UserTokenDO { 15 | private String username; 16 | /*** 17 | * 最后一次访问的时间戳 18 | */ 19 | private long timestamp; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/query/QueryBaseDTO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model.query; 2 | 3 | import io.swagger.v3.oas.annotations.media.Schema; 4 | import lombok.Data; 5 | 6 | /** 7 | * @author jmal 8 | * @Description 查询条件基类 9 | * @Date 2021/1/10 2:03 下午 10 | */ 11 | @Data 12 | @Schema 13 | public class QueryBaseDTO { 14 | @Schema(name = "page", title = "当前页") 15 | Integer page; 16 | @Schema(name = "pageSize", title = "每页条数") 17 | Integer pageSize; 18 | @Schema(name = "sortProp", title = "要排序字段") 19 | String sortProp; 20 | @Schema(name = "sortProp", title = "要排序顺序(descending|ascending)") 21 | String sortOrder; 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/query/QueryMenuDTO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model.query; 2 | 3 | import io.swagger.v3.oas.annotations.media.Schema; 4 | 5 | import lombok.Data; 6 | import lombok.EqualsAndHashCode; 7 | 8 | /** 9 | * @author jmal 10 | * @Description 菜单查询条件 11 | * @Date 2021/1/10 2:03 下午 12 | */ 13 | @EqualsAndHashCode(callSuper = true) 14 | @Data 15 | @Schema 16 | public class QueryMenuDTO extends QueryBaseDTO { 17 | @Schema(name = "name", title = "菜单名称") 18 | String name; 19 | @Schema(name = "code", title = "菜单地址") 20 | String path; 21 | @Schema(name = "roleId", title = "角色Id") 22 | String roleId; 23 | @Schema(name = "userId", title = "userId") 24 | String userId; 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/query/QueryRoleDTO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model.query; 2 | 3 | import io.swagger.v3.oas.annotations.media.Schema; 4 | 5 | import lombok.Data; 6 | import lombok.EqualsAndHashCode; 7 | 8 | /** 9 | * @author jmal 10 | * @Description 角色查询条件 11 | * @Date 2021/1/10 2:03 下午 12 | */ 13 | @EqualsAndHashCode(callSuper = true) 14 | @Data 15 | @Schema 16 | public class QueryRoleDTO extends QueryBaseDTO { 17 | @Schema(name = "name", title = "角色名称") 18 | String name; 19 | @Schema(name = "code", title = "角色标识") 20 | String code; 21 | @Schema(name = "remarks", title = "备注") 22 | String remarks; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/query/QueryUserDTO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model.query; 2 | 3 | import io.swagger.v3.oas.annotations.media.Schema; 4 | 5 | import lombok.Data; 6 | import lombok.EqualsAndHashCode; 7 | 8 | /** 9 | * @author jmal 10 | * @Description 用户查询条件 11 | * @Date 2021/1/10 2:03 下午 12 | */ 13 | @EqualsAndHashCode(callSuper = true) 14 | @Data 15 | @Schema 16 | public class QueryUserDTO extends QueryBaseDTO { 17 | @Schema(name = "username", title = "用户账号") 18 | String username; 19 | @Schema(name = "showName", title = "用户名") 20 | String showName; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/rbac/ConsumerBase.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model.rbac; 2 | 3 | import io.swagger.v3.oas.annotations.media.Schema; 4 | import lombok.Data; 5 | 6 | /** 7 | * @Description ConsumerBase 8 | * @blame jmal 9 | * @Date 2022/8/20 23:21 10 | */ 11 | @Data 12 | public class ConsumerBase { 13 | @Schema(name = "password", title = "密码", example = "123456") 14 | String password; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/rbac/MenuDO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model.rbac; 2 | 3 | import com.jmal.clouddisk.service.impl.MenuService; 4 | import lombok.Data; 5 | import org.springframework.data.mongodb.core.mapping.Document; 6 | 7 | import java.time.LocalDateTime; 8 | 9 | /** 10 | * @author jmal 11 | * @Description 菜单模型 12 | * @Date 2021/1/7 8:53 下午 13 | */ 14 | @Data 15 | @Document(collection = MenuService.COLLECTION_NAME) 16 | public class MenuDO { 17 | /*** 18 | * 主键 19 | */ 20 | String id; 21 | /*** 22 | * 父级菜单Id 23 | */ 24 | String parentId; 25 | /*** 26 | * 菜单名称 27 | */ 28 | String name; 29 | /*** 30 | * 权限标识 31 | */ 32 | String authority; 33 | /*** 34 | * 路由地址 35 | */ 36 | String path; 37 | /*** 38 | * 组件路径 39 | */ 40 | String component; 41 | /*** 42 | * 菜单图标 43 | */ 44 | String icon; 45 | /*** 46 | * 排序号 47 | */ 48 | Integer sortNumber; 49 | /*** 50 | * 菜单类型 0:菜单,1:按钮 51 | */ 52 | Integer menuType; 53 | /*** 54 | * 是否隐藏 55 | */ 56 | Boolean hide; 57 | /*** 58 | * 创建时间 59 | */ 60 | LocalDateTime createTime; 61 | /*** 62 | * 修改时间 63 | */ 64 | LocalDateTime updateTime; 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/rbac/RoleDO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model.rbac; 2 | 3 | import com.jmal.clouddisk.service.impl.RoleService; 4 | import lombok.Data; 5 | import org.springframework.data.mongodb.core.mapping.Document; 6 | 7 | import java.time.LocalDateTime; 8 | import java.util.List; 9 | 10 | /** 11 | * @Description 角色模型 12 | * @blame jmal 13 | * @Date 2021/1/7 7:41 下午 14 | */ 15 | @Data 16 | @Document(collection = RoleService.COLLECTION_NAME) 17 | public class RoleDO { 18 | /*** 19 | * 主键 20 | */ 21 | String id; 22 | /*** 23 | * 角色名称 24 | */ 25 | String name; 26 | /*** 27 | * 角色标识 28 | */ 29 | String code; 30 | /*** 31 | * 备注 32 | */ 33 | String remarks; 34 | /*** 35 | * 菜单Id列表 36 | */ 37 | List menuIds; 38 | /*** 39 | * 创建时间 40 | */ 41 | LocalDateTime createTime; 42 | /*** 43 | * 修改时间 44 | */ 45 | LocalDateTime updateTime; 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/rbac/RoleDTO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model.rbac; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | import com.jmal.clouddisk.service.Constants; 5 | import io.swagger.v3.oas.annotations.media.Schema; 6 | import lombok.Data; 7 | 8 | import jakarta.validation.Valid; 9 | import jakarta.validation.constraints.NotNull; 10 | import java.time.LocalDateTime; 11 | import java.util.List; 12 | 13 | /** 14 | * @Description 角色传输对象 15 | * @Author jmal 16 | * @Date 2021/1/7 7:41 下午 17 | */ 18 | @Data 19 | @Valid 20 | @Schema 21 | public class RoleDTO { 22 | String id; 23 | @NotNull(message = "角色名称不能为空") 24 | @Schema(name = "name", title = "角色名称", requiredMode = Schema.RequiredMode.REQUIRED) 25 | String name; 26 | @NotNull(message = "角色标识不能为空") 27 | @Schema(name = "code", title = "角色标识", requiredMode = Schema.RequiredMode.REQUIRED) 28 | String code; 29 | @Schema(name = "remarks", title = "备注") 30 | String remarks; 31 | @Schema(name = "menuIds", title = "菜单id列表") 32 | List menuIds; 33 | @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss") 34 | @Schema(name = Constants.CREATE_TIME, title = "创建时间", hidden = true) 35 | LocalDateTime createTime; 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/model/rbac/UserLoginContext.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.model.rbac; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * @Description 用户登录信息 9 | * @blame jmal 10 | * @Date 2021/1/9 2:13 下午 11 | */ 12 | @Data 13 | public class UserLoginContext { 14 | String userId; 15 | String username; 16 | /*** 17 | * 用户权限信息 18 | */ 19 | List authorities; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/ocr/IOcrService.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.ocr; 2 | 3 | public interface IOcrService { 4 | 5 | /** 6 | * 执行OCR识别 7 | * @param imagePath 图片路径 8 | * @param tempImagePath 临时图片路径, 用于存放预处理后的图片 9 | * @return 识别结果 10 | */ 11 | String doOCR(String imagePath, String tempImagePath); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/ocr/OcrEngine.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.ocr; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public enum OcrEngine { 7 | OCR_LITE_ONNX("ocrLiteOnnx"), 8 | TESSERACT("tesseract"); 9 | 10 | private final String ocrEngineName; 11 | 12 | OcrEngine(String ocrEngineName) { 13 | this.ocrEngineName = ocrEngineName; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/ocr/TesseractOcrConfig.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.ocr; 2 | 3 | import lombok.Data; 4 | import lombok.extern.slf4j.Slf4j; 5 | import net.sourceforge.tess4j.ITessAPI; 6 | import net.sourceforge.tess4j.Tesseract; 7 | import org.springframework.boot.context.properties.ConfigurationProperties; 8 | import org.springframework.context.annotation.Bean; 9 | import org.springframework.context.annotation.Configuration; 10 | import org.springframework.stereotype.Component; 11 | 12 | @Data 13 | @Component 14 | @Configuration 15 | @ConfigurationProperties(prefix = "tess4j") 16 | @Slf4j 17 | public class TesseractOcrConfig { 18 | 19 | private String dataPath; 20 | 21 | @Bean 22 | public ThreadLocal tesseractThreadLocal() { 23 | // 设置 Tess4J 的日志级别 24 | return ThreadLocal.withInitial(() -> { 25 | Tesseract tesseract = new Tesseract(); 26 | // 设置数据文件夹路径 27 | tesseract.setDatapath(dataPath); 28 | // 设置为中文简体 29 | tesseract.setLanguage("chi_sim"); 30 | tesseract.setOcrEngineMode(ITessAPI.TessOcrEngineMode.OEM_LSTM_ONLY); 31 | tesseract.setPageSegMode(ITessAPI.TessPageSegMode.PSM_AUTO); 32 | return tesseract; 33 | }); 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/office/OfficeHistory.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.office; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class OfficeHistory { 7 | private String created; 8 | private String key; 9 | private User user; 10 | private String version; 11 | 12 | @Data 13 | public static class User { 14 | private String id; 15 | private String name; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/office/callbacks/Callback.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.office.callbacks; 2 | 3 | import com.jmal.clouddisk.office.model.Track; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | 6 | /** 7 | * @author jmal 8 | * @Description OnlyOfficeService Callback 9 | * @date 2022/8/11 16:29 10 | */ 11 | public interface Callback { 12 | /** 13 | * 处理回调 14 | * @param body body 15 | * @return 返回码 16 | */ 17 | int handle(Track body); 18 | 19 | /** 20 | * 获取文档状态 21 | * @return Status 22 | */ 23 | int getStatus(); 24 | 25 | /** 26 | * 注册一个回调处理程序 27 | * @param callbackHandler CallbackHandler 28 | */ 29 | @Autowired 30 | default void selfRegistration(CallbackHandler callbackHandler){ 31 | callbackHandler.register(getStatus(), this); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/office/callbacks/CallbackHandler.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.office.callbacks; 2 | 3 | import com.jmal.clouddisk.office.model.Track; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.springframework.stereotype.Service; 6 | import java.util.HashMap; 7 | import java.util.Map; 8 | 9 | /** 10 | * @author jmal 11 | * @Description CallbackHandler 12 | * @date 2022/8/11 16:29 13 | */ 14 | @Service 15 | @Slf4j 16 | public class CallbackHandler { 17 | 18 | private final Map callbackHandlers = new HashMap<>(); 19 | 20 | public void register(int code, Callback callback){ 21 | // 注册一个回调处理程序 22 | callbackHandlers.put(code, callback); 23 | } 24 | 25 | public int handle(Track body){ 26 | Callback callback = callbackHandlers.get(body.getStatus()); 27 | if (callback == null){ 28 | log.warn("Callback status "+body.getStatus()+" is not supported yet"); 29 | return 0; 30 | } 31 | return callback.handle(body); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/office/callbacks/Status.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.office.callbacks; 2 | 3 | /** 4 | * @author jmal 5 | * @Description 文件状态 6 | * @date 2022/8/11 16:29 7 | */ 8 | public enum Status { 9 | /** 10 | * 正在编辑文件 11 | */ 12 | EDITING(1), 13 | /** 14 | * 文件已准备好保存 15 | */ 16 | SAVE(2), 17 | /** 18 | * 发生文件保存错误 19 | */ 20 | CORRUPTED(3), 21 | /** 22 | * 退出编辑但是什么都没做 23 | */ 24 | EDIT_NOTHING(4), 25 | /** 26 | * 正在编辑文档,但保存了当前文档状态 27 | */ 28 | MUST_FORCE_SAVE(6), 29 | /** 30 | * 强制保存文档时发生错误 31 | */ 32 | CORRUPTED_FORCE_SAVE(7); 33 | private final int code; 34 | Status(int code){ 35 | this.code = code; 36 | } 37 | public int getCode(){ 38 | return this.code; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/office/callbacks/implementations/EditCallback.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.office.callbacks.implementations; 2 | 3 | import com.jmal.clouddisk.office.callbacks.Callback; 4 | import com.jmal.clouddisk.office.callbacks.Status; 5 | import com.jmal.clouddisk.office.model.Track; 6 | import org.springframework.stereotype.Component; 7 | 8 | /** 9 | * @author jmal 10 | * @Description 在编辑文档时处理回调 11 | * @date 2022/8/11 16:29 12 | */ 13 | @Component 14 | public class EditCallback implements Callback { 15 | 16 | @Override 17 | public int handle(Track body) { 18 | return 0; 19 | } 20 | 21 | @Override 22 | public int getStatus() { 23 | // 1 -文件正在编辑中 24 | return Status.EDITING.getCode(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/office/callbacks/implementations/EditNothingCallback.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.office.callbacks.implementations; 2 | 3 | import com.jmal.clouddisk.office.callbacks.Callback; 4 | import com.jmal.clouddisk.office.callbacks.Status; 5 | import com.jmal.clouddisk.office.model.Track; 6 | import org.springframework.stereotype.Component; 7 | 8 | /** 9 | * @author jmal 10 | * @Description 在编辑文档时处理回调 11 | * @date 2022/8/11 16:29 12 | */ 13 | @Component 14 | public class EditNothingCallback implements Callback { 15 | 16 | @Override 17 | public int handle(Track body) { 18 | return 0; 19 | } 20 | 21 | @Override 22 | public int getStatus() { 23 | // 4 - 退出正在编辑的文件 24 | return Status.EDIT_NOTHING.getCode(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/office/callbacks/implementations/ForceSaveCallback.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.office.callbacks.implementations; 2 | 3 | import com.jmal.clouddisk.office.callbacks.Callback; 4 | import com.jmal.clouddisk.office.callbacks.Status; 5 | import com.jmal.clouddisk.office.model.Track; 6 | import org.springframework.stereotype.Component; 7 | 8 | /** 9 | * @author jmal 10 | * @Description 执行强制保存请求时处理回调 11 | * @date 2022/8/11 16:29 12 | */ 13 | @Component 14 | public class ForceSaveCallback implements Callback { 15 | 16 | @Override 17 | public int handle(Track body) { 18 | return 0; 19 | } 20 | 21 | @Override 22 | public int getStatus() { 23 | // 6 -正在编辑文档,但保存了当前文档状态 24 | return Status.MUST_FORCE_SAVE.getCode(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/office/model/Action.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.office.model; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.Setter; 7 | 8 | @Getter 9 | @Setter 10 | @AllArgsConstructor 11 | @NoArgsConstructor 12 | public class Action { 13 | private String userid; 14 | private com.jmal.clouddisk.office.model.enums.Action type; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/office/model/OfficeConfigDO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.office.model; 2 | 3 | import cn.hutool.crypto.symmetric.SymmetricAlgorithm; 4 | import cn.hutool.crypto.symmetric.SymmetricCrypto; 5 | import lombok.Data; 6 | import org.springframework.data.mongodb.core.mapping.Document; 7 | 8 | import java.util.List; 9 | 10 | @Data 11 | @Document(collection = "officeConfig") 12 | public class OfficeConfigDO { 13 | 14 | private String documentServer; 15 | 16 | private String callbackServer; 17 | 18 | private String encrypted; 19 | 20 | private String key; 21 | 22 | private Boolean tokenEnabled; 23 | 24 | private List format; 25 | 26 | public OfficeConfigDTO toOfficeConfigCache() { 27 | OfficeConfigDTO officeConfigDTO = new OfficeConfigDTO(); 28 | officeConfigDTO.setDocumentServer(this.documentServer); 29 | officeConfigDTO.setCallbackServer(this.callbackServer); 30 | officeConfigDTO.setFormat(this.format); 31 | officeConfigDTO.setTokenEnabled(this.tokenEnabled); 32 | if (this.tokenEnabled && this.encrypted != null && this.key != null) { 33 | SymmetricCrypto symmetricCrypto = new SymmetricCrypto(SymmetricAlgorithm.AES, this.key.getBytes()); 34 | String secret = symmetricCrypto.decryptStr(this.encrypted); 35 | officeConfigDTO.setSecret(secret); 36 | } 37 | return officeConfigDTO; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/office/model/enums/Action.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.office.model.enums; 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty; 4 | 5 | public enum Action { 6 | @JsonProperty("edit") 7 | edit, 8 | @JsonProperty("review") 9 | review, 10 | @JsonProperty("view") 11 | view, 12 | @JsonProperty("embedded") 13 | embedded, 14 | @JsonProperty("filter") 15 | filter, 16 | @JsonProperty("comment") 17 | comment, 18 | @JsonProperty("fillForms") 19 | fillForms, 20 | @JsonProperty("blockcontent") 21 | blockcontent; 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/oss/AbstractOssObject.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.oss; 2 | 3 | import java.io.Closeable; 4 | import java.io.FileNotFoundException; 5 | import java.io.IOException; 6 | import java.io.InputStream; 7 | 8 | /** 9 | * @author jmal 10 | * @Description AbstractOssObject 11 | * @date 2023/3/29 12:03 12 | */ 13 | public abstract class AbstractOssObject implements Closeable { 14 | 15 | public abstract InputStream getInputStream() throws FileNotFoundException; 16 | 17 | public abstract void closeObject() throws IOException; 18 | 19 | public abstract String getKey(); 20 | 21 | public abstract IOssService getOssService(); 22 | 23 | public abstract FileInfo getFileInfo(); 24 | 25 | public abstract long getContentLength(); 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/oss/BucketInfo.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.oss; 2 | 3 | import com.jmal.clouddisk.webdav.MyWebdavServlet; 4 | import lombok.Data; 5 | 6 | /** 7 | * @author jmal 8 | * @Description OSS BucketInfo 9 | * @date 2023/3/29 13:49 10 | */ 11 | @Data 12 | public class BucketInfo { 13 | String bucketName; 14 | String folderName; 15 | String username; 16 | PlatformOSS platform; 17 | 18 | public String getWebPathPrefix() { 19 | return MyWebdavServlet.getPathDelimiter(username, folderName); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/oss/OssInputStream.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.oss; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | import java.io.InputStream; 7 | import java.util.zip.CheckedInputStream; 8 | import java.util.zip.Checksum; 9 | 10 | /** 11 | * @author jmal 12 | * @Description OssInputStream 13 | * @date 2023/3/28 16:32 14 | */ 15 | public class OssInputStream extends CheckedInputStream { 16 | 17 | @Getter 18 | @Setter 19 | private AbstractOssObject abstractOssObject; 20 | 21 | public OssInputStream(InputStream in, Checksum checksum) { 22 | super(in, checksum); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/oss/PlatformOSS.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.oss; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * @author jmal 7 | * @Description platform 8 | * @date 2023/3/29 14:00 9 | */ 10 | public enum PlatformOSS { 11 | ALIYUN("aliyun", "阿里云OSS"), 12 | TENCENT("tencent", "腾讯云OSS"), 13 | MINIO("minio", "S3兼容"); 14 | 15 | @Getter 16 | private final String key; 17 | @Getter 18 | private final String value; 19 | 20 | PlatformOSS(String key, String value) { 21 | this.key = key; 22 | this.value = value; 23 | } 24 | 25 | public static PlatformOSS getPlatform(String key) { 26 | for (PlatformOSS platformOSS : values()) { 27 | if (platformOSS.getKey().equals(key)) { 28 | return platformOSS; 29 | } 30 | } 31 | return ALIYUN; 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/oss/S3ObjectSummary.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.oss; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.Date; 6 | 7 | /** 8 | * @author jmal 9 | * @Description S3ObjectSummary 10 | * @date 2023/4/6 11:08 11 | */ 12 | @Data 13 | public class S3ObjectSummary { 14 | private String bucketName; 15 | private String key; 16 | private String eTag; 17 | private long size; 18 | private Date lastModified; 19 | 20 | public S3ObjectSummary(long size, String key, String eTag, Date lastModified, String bucketName) { 21 | this.size = size; 22 | this.key = key; 23 | this.eTag = eTag; 24 | this.lastModified = lastModified; 25 | this.bucketName = bucketName; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/oss/web/STSObjectVO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.oss.web; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @author jmal 7 | * @Description STS 8 | * @date 2023/4/4 16:00 9 | */ 10 | @Data 11 | public class STSObjectVO { 12 | private String accessKeyId; 13 | private String accessKeySecret; 14 | private String securityToken; 15 | private String expiration; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/repository/DataSource.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.repository; 2 | 3 | /*** 4 | * @Description 数据源 5 | * @author jmal 6 | * @Date 2020/10/13 10:49 上午 7 | */ 8 | public enum DataSource { 9 | /** 10 | * mysql 11 | */ 12 | mysql, 13 | /** 14 | * h2 15 | */ 16 | h2, 17 | /** 18 | * mongodb 19 | */ 20 | mongodb 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/repository/IAuthDAO.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.repository; 2 | 3 | import com.jmal.clouddisk.model.UserAccessTokenDO; 4 | import com.jmal.clouddisk.model.UserAccessTokenDTO; 5 | import com.jmal.clouddisk.model.rbac.ConsumerDO; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * IAuthDAO 11 | * @author jmal 12 | */ 13 | public interface IAuthDAO { 14 | 15 | /** 16 | * 数据源 17 | * @return DataSource 18 | */ 19 | DataSource getDataSource(); 20 | 21 | /*** 22 | * 根据AccessToken获取用户名 23 | * @param accessToken accessToken 24 | * @return UserAccessTokenDO 25 | */ 26 | UserAccessTokenDO getUserNameByAccessToken(String accessToken); 27 | 28 | /*** 29 | * 创建accessToken 30 | * @param userAccessTokenDO userAccessTokenDO 31 | */ 32 | void generateAccessToken(UserAccessTokenDO userAccessTokenDO); 33 | 34 | /*** 35 | * 删除用户的token 36 | * @param userList userList 37 | */ 38 | void deleteAllByUser(List userList); 39 | 40 | /*** 41 | * accessToken列表 42 | * @param username 用户名 43 | * @return List 44 | */ 45 | List accessTokenList(String username); 46 | 47 | /** 48 | * 更新accessToken最近访问时间 49 | * @param username 用户名 50 | * @param token token 51 | */ 52 | void updateAccessToken(String username, String token); 53 | 54 | /*** 55 | * 删除accessToken 56 | * @param id accessTokenId 57 | */ 58 | void deleteAccessToken(String id); 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/util/MapUtils.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.util; 2 | 3 | import java.util.LinkedHashMap; 4 | import java.util.Map; 5 | 6 | /** 7 | * @Description Map工具类 8 | * @Date 2019-09-06 10:28 9 | * @author jmal 10 | */ 11 | public class MapUtils { 12 | 13 | /*** 14 | * 按value值倒序排序 15 | * @param map 16 | * @param 17 | * @param 18 | * @return 19 | */ 20 | public static > Map sortReverseByValue(Map map) { 21 | Map result = new LinkedHashMap<>(); 22 | 23 | map.entrySet().stream() 24 | .sorted(Map.Entry.comparingByValue() 25 | .reversed()).forEachOrdered(e -> result.put(e.getKey(), e.getValue())); 26 | return result; 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/util/MessageUtil.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.util; 2 | 3 | import lombok.RequiredArgsConstructor; 4 | import org.springframework.context.MessageSource; 5 | import org.springframework.context.NoSuchMessageException; 6 | import org.springframework.context.i18n.LocaleContextHolder; 7 | import org.springframework.stereotype.Component; 8 | 9 | import java.util.Locale; 10 | 11 | @Component 12 | @RequiredArgsConstructor 13 | public class MessageUtil { 14 | 15 | private final MessageSource messageSource; 16 | 17 | /** 18 | * 获取国际化消息 19 | * @param messageKey 消息的键 20 | * @return 国际化消息 21 | */ 22 | public String getMessage(String messageKey) { 23 | return getMessage(messageKey, LocaleContextHolder.getLocale()); 24 | } 25 | 26 | /** 27 | * 获取国际化消息 28 | * @param messageKey 消息的键 29 | * @param locale 语言 30 | * @return 国际化消息 31 | */ 32 | public String getMessage(String messageKey, Locale locale) { 33 | String result = messageKey; 34 | try { 35 | result = messageSource.getMessage(messageKey, null, locale); 36 | } catch (NoSuchMessageException ignored) { 37 | } 38 | return result; 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/util/ResponseResult.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.util; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import lombok.experimental.Accessors; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * ResponseResult 11 | * 12 | * @author jmal 13 | */ 14 | @Setter 15 | @Getter 16 | @Accessors(chain = true) 17 | public class ResponseResult { 18 | private int code; 19 | private Object message; 20 | private T data; 21 | private Object count; 22 | private Map props; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/util/StringUtil.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.util; 2 | 3 | /** 4 | * @author jmal 5 | * @Description StringUtil 6 | * @Date 2021/4/29 2:54 下午 7 | */ 8 | public class StringUtil { 9 | 10 | public static String escape(String s) { 11 | StringBuilder sb = new StringBuilder(); 12 | 13 | for(int i = 0; i < s.length(); ++i) { 14 | char c = s.charAt(i); 15 | if (c == '\\' || c == '+' || c == '-' || c == '!' || c == '(' || c == ')' || c == ':' || c == '^' || c == '[' || c == ']' || c == '"' || c == '{' || c == '}' || c == '~' || c == '*' || c == '?' || c == '#' || c == '|' || c == '&' || c == '/') { 16 | sb.append('\\'); 17 | } 18 | 19 | sb.append(c); 20 | } 21 | 22 | return sb.toString(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/webdav/MyDirResourceSet.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.webdav; 2 | 3 | import org.apache.catalina.WebResource; 4 | import org.apache.catalina.WebResourceRoot; 5 | import org.apache.catalina.webresources.DirResourceSet; 6 | 7 | public class MyDirResourceSet extends DirResourceSet { 8 | 9 | public MyDirResourceSet(WebResourceRoot root, String base) { 10 | super(root, "/", base, "/"); 11 | } 12 | 13 | @Override 14 | public WebResource getResource(String path) { 15 | checkPath(path); 16 | return super.getResource(path); 17 | } 18 | 19 | @Override 20 | public String[] list(String path) { 21 | checkPath(path); 22 | return super.list(path); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/webdav/MyStandardRoot.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.webdav; 2 | 3 | import com.jmal.clouddisk.webdav.resource.FileResourceSet; 4 | import org.apache.catalina.Context; 5 | import org.apache.catalina.WebResourceSet; 6 | import org.apache.catalina.webresources.StandardRoot; 7 | 8 | public class MyStandardRoot extends StandardRoot { 9 | public MyStandardRoot(Context context) { 10 | super(context); 11 | } 12 | 13 | @Override 14 | protected WebResourceSet createMainResourceSet() { 15 | FileResourceSet myDirResourceSet = null; 16 | for (WebResourceSet preResource : getPreResources()) { 17 | if (preResource instanceof FileResourceSet myDirResourceSet1) { 18 | myDirResourceSet = myDirResourceSet1; 19 | } 20 | } 21 | if (myDirResourceSet != null) { 22 | return myDirResourceSet; 23 | } 24 | return super.createMainResourceSet(); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/jmal/clouddisk/webdav/WebdavMethod.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.webdav; 2 | 3 | public enum WebdavMethod { 4 | HEAD("HEAD", false), 5 | PROPFIND("PROPFIND", false), 6 | PROPPATCH("PROPPATCH", true), 7 | MKCOL("MKCOL", true), 8 | MKCALENDAR("MKCALENDAR", true), 9 | COPY("COPY", true), 10 | MOVE("MOVE", true), 11 | LOCK("LOCK", true), 12 | UNLOCK("UNLOCK", true), 13 | DELETE("DELETE", true), 14 | GET("GET", false), 15 | OPTIONS("OPTIONS", false), 16 | POST("POST", true), 17 | PUT("PUT", true), 18 | TRACE("TRACE", false), 19 | ACL("ACL", true), 20 | CONNECT("CONNECT", true), 21 | CANCELUPLOAD("CANCELUPLOAD", true), 22 | REPORT("REPORT", false); 23 | 24 | public String getCode() { 25 | return code; 26 | } 27 | 28 | public final String code; 29 | public final boolean isWrite; 30 | 31 | WebdavMethod(String code, boolean isWrite) { 32 | this.code = code; 33 | this.isWrite = isWrite; 34 | } 35 | 36 | public static WebdavMethod getMethod(String method) { 37 | for (WebdavMethod webdavMethod : WebdavMethod.values()) { 38 | if (webdavMethod.code.equals(method)) { 39 | return webdavMethod; 40 | } 41 | } 42 | return WebdavMethod.HEAD; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/resources/META-INF/additional-spring-configuration-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "properties": [ 3 | { 4 | "name": "version", 5 | "type": "java.lang.String", 6 | "description": "Edition number." 7 | } 8 | ] } 9 | -------------------------------------------------------------------------------- /src/main/resources/application-dev.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | thymeleaf: # thymeleaf配置,开发环境不启用缓存,正式环境下请启用缓存,提高性能 3 | cache: false 4 | mode: HTML # thymeleaf对html元素格式要求严格,设置它的mode为HTML,忘记结束标签后不会报错 5 | data: 6 | mongodb: 7 | uri: mongodb://127.0.0.1:27017/jmalcloud 8 | web: 9 | resources: 10 | cache: 11 | cachecontrol: 12 | max-age: 0 13 | chain: 14 | cache: false 15 | logging: 16 | level: 17 | root: info 18 | -------------------------------------------------------------------------------- /src/main/resources/application-prod.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | thymeleaf: # thymeleaf配置,开发环境不启用缓存,正式环境下请启用缓存,提高性能 3 | cache: true 4 | mode: HTML # thymeleaf对html元素格式要求严格,设置它的mode为HTML,忘记结束标签后不会报错 5 | data: 6 | mongodb: 7 | uri: mongodb://localhost:27017/jmalcloud 8 | web: 9 | resources: 10 | chain: 11 | cache: true 12 | cache: 13 | cachecontrol: 14 | max-age: 604800 15 | # 日志级别,生产环境改为warn 16 | logging: 17 | level: 18 | root: warn 19 | -------------------------------------------------------------------------------- /src/main/resources/application-test.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | thymeleaf: # thymeleaf配置,开发环境不启用缓存,正式环境下请启用缓存,提高性能 3 | cache: true 4 | mode: HTML # thymeleaf对html元素格式要求严格,设置它的mode为HTML,忘记结束标签后不会报错 5 | data: 6 | mongodb: 7 | uri: mongodb://localhost:27017/jmalcloud 8 | web: 9 | resources: 10 | chain: 11 | cache: true 12 | cache: 13 | cachecontrol: 14 | max-age: 604800 15 | # 日志级别,生产环境改为warn 16 | logging: 17 | level: 18 | root: info 19 | -------------------------------------------------------------------------------- /src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8088 3 | servlet: 4 | encoding: 5 | force: true 6 | charset: UTF-8 7 | enabled: true 8 | forward-headers-strategy: native 9 | shutdown: immediate 10 | version: 2.14.0 11 | tess4j: 12 | data-path: /Users/jmal/studio/myProject/github/jmal-cloud-server/tess4j/datapath 13 | spring: 14 | application: 15 | name: jmalcloud 16 | main: 17 | allow-circular-references: true 18 | profiles: 19 | active: dev 20 | servlet: 21 | multipart: 22 | max-file-size: 50MB 23 | max-request-size: 100MB 24 | cache: 25 | type: caffeine 26 | caffeine: 27 | spec: initialCapacity=100,maximumSize=500,expireAfterWrite=3600s 28 | messages: 29 | basename: i18n/messages 30 | encoding: UTF-8 31 | springdoc: 32 | packages-to-scan: com.jmal.clouddisk.controller,com.jmal.clouddisk.oss 33 | api-docs: 34 | path: /public/api-docs 35 | version: openapi_3_0 36 | swagger-ui: 37 | path: /public/api 38 | doc-expansion: none 39 | -------------------------------------------------------------------------------- /src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | __ .___ ___. ___ __ ______ __ ______ __ __ _______ 2 | | | | \/ | / \ | | / || | / __ \ | | | | | \ 3 | | | | \ / | / ^ \ | | | ,----'| | | | | | | | | | | .--. | 4 | .--. | | | |\/| | / /_\ \ | | | | | | | | | | | | | | | | | | 5 | | `--' | | | | | / _____ \ | `----.| `----.| `----.| `--' | | `--' | | '--' | 6 | \______/ |__| |__| /__/ \__\ |_______| \______||_______| \______/ \______/ |_______/ 7 | 8 | :: jmalcloud :: (v${version}) 9 | :: Spring Boot :: (v${spring-boot.version}) 10 | :: JDK Version :: (v${java.version}) 11 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/css/independent.css: -------------------------------------------------------------------------------- 1 | #main_body { 2 | width: 100%; 3 | overflow: hidden; 4 | } -------------------------------------------------------------------------------- /src/main/resources/static/articles/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/favicon.ico -------------------------------------------------------------------------------- /src/main/resources/static/articles/font-awesome/free-6.4.2/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/font-awesome/free-6.4.2/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/font-awesome/free-6.4.2/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/font-awesome/free-6.4.2/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/font-awesome/free-6.4.2/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/font-awesome/free-6.4.2/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/font-awesome/free-6.4.2/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/font-awesome/free-6.4.2/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/font-awesome/free-6.4.2/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/font-awesome/free-6.4.2/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/font-awesome/free-6.4.2/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/font-awesome/free-6.4.2/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/font-awesome/free-6.4.2/webfonts/fa-v4compatibility.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/font-awesome/free-6.4.2/webfonts/fa-v4compatibility.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/font-awesome/free-6.4.2/webfonts/fa-v4compatibility.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/font-awesome/free-6.4.2/webfonts/fa-v4compatibility.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/img/beian.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/img/beian.png -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/css/modules/code.css: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.6 MIT License By https://www.layui.com */ 2 | html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none} -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/css/modules/layer/default/icon-ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/css/modules/layer/default/icon-ext.png -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/css/modules/layer/default/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/css/modules/layer/default/icon.png -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/css/modules/layer/default/loading-0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/css/modules/layer/default/loading-0.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/css/modules/layer/default/loading-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/css/modules/layer/default/loading-1.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/css/modules/layer/default/loading-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/css/modules/layer/default/loading-2.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/font/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/font/iconfont.eot -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/font/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/font/iconfont.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/font/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/font/iconfont.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/font/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/font/iconfont.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/0.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/1.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/10.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/10.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/11.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/11.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/12.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/12.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/13.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/13.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/14.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/14.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/15.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/15.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/16.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/16.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/17.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/17.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/18.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/18.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/19.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/19.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/2.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/20.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/20.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/21.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/21.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/22.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/22.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/23.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/23.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/24.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/24.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/25.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/25.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/26.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/26.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/27.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/27.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/28.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/28.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/29.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/29.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/3.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/30.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/30.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/31.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/31.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/32.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/32.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/33.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/33.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/34.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/34.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/35.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/35.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/36.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/36.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/37.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/37.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/38.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/38.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/39.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/39.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/4.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/40.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/40.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/41.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/41.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/42.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/42.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/43.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/43.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/44.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/44.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/45.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/45.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/46.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/46.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/47.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/47.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/48.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/48.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/49.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/49.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/5.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/50.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/50.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/51.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/51.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/52.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/52.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/53.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/53.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/54.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/54.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/55.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/55.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/56.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/56.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/57.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/57.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/58.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/58.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/59.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/59.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/6.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/60.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/60.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/61.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/61.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/62.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/62.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/63.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/63.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/64.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/64.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/65.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/65.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/66.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/66.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/67.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/67.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/68.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/68.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/69.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/69.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/7.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/70.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/70.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/71.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/71.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/8.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/images/face/9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/layui/images/face/9.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/layui/lay/modules/code.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.5.6 MIT License By https://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var a=layui.$,l="http://www.layui.com/doc/modules/code.html";e("code",function(e){var t=[];e=e||{},e.elem=a(e.elem||".layui-code"),e.about=!("about"in e)||e.about,e.elem.each(function(){t.push(this)}),layui.each(t.reverse(),function(t,i){var c=a(i),o=c.html();(c.attr("lay-encode")||e.encode)&&(o=o.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
  1. '+o.replace(/[\r\t\n]+/g,"
  2. ")+"
"),c.find(">.layui-code-h3")[0]||c.prepend('

'+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); -------------------------------------------------------------------------------- /src/main/resources/static/articles/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: /private/ 3 | Allow: * 4 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/b3log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/b3log.png -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/chainbook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/chainbook.png -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/doge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/doge.png -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/hacpai.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/hacpai.png -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/huaji.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/huaji.gif -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/latke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/latke.png -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/lute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/lute.png -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/octocat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/octocat.png -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/pipe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/pipe.png -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/solo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/solo.png -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/sym.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/sym.png -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/trollface.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/trollface.png -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/vditor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/vditor.png -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/wide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/wide.png -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/wulian.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/images/emoji/wulian.png -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/images/img-loading.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/images/logo.png -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_AMS-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_AMS-Regular.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_AMS-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_AMS-Regular.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_AMS-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_AMS-Regular.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Caligraphic-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Caligraphic-Bold.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Caligraphic-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Caligraphic-Bold.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Caligraphic-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Caligraphic-Bold.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Caligraphic-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Caligraphic-Regular.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Caligraphic-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Caligraphic-Regular.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Caligraphic-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Caligraphic-Regular.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Fraktur-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Fraktur-Bold.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Fraktur-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Fraktur-Bold.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Fraktur-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Fraktur-Bold.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Fraktur-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Fraktur-Regular.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Fraktur-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Fraktur-Regular.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Fraktur-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Fraktur-Regular.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-Bold.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-Bold.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-Bold.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-BoldItalic.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-BoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-BoldItalic.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-BoldItalic.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-Italic.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-Italic.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-Italic.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-Regular.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-Regular.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Main-Regular.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Math-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Math-BoldItalic.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Math-BoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Math-BoldItalic.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Math-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Math-BoldItalic.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Math-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Math-Italic.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Math-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Math-Italic.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Math-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Math-Italic.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_SansSerif-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_SansSerif-Bold.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_SansSerif-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_SansSerif-Bold.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_SansSerif-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_SansSerif-Bold.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_SansSerif-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_SansSerif-Italic.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_SansSerif-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_SansSerif-Italic.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_SansSerif-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_SansSerif-Italic.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_SansSerif-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_SansSerif-Regular.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_SansSerif-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_SansSerif-Regular.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_SansSerif-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_SansSerif-Regular.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Script-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Script-Regular.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Script-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Script-Regular.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Script-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Script-Regular.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size1-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size1-Regular.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size1-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size1-Regular.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size1-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size1-Regular.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size2-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size2-Regular.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size2-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size2-Regular.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size2-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size2-Regular.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size3-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size3-Regular.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size3-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size3-Regular.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size3-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size3-Regular.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size4-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size4-Regular.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size4-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size4-Regular.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size4-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Size4-Regular.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Typewriter-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Typewriter-Regular.ttf -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Typewriter-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Typewriter-Regular.woff -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Typewriter-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/src/main/resources/static/articles/vditor@3.9.3/dist/js/katex/fonts/KaTeX_Typewriter-Regular.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/js/mathjax/sre/sre-node.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var SRE = require("speech-rule-engine"); 4 | global.SRE = SRE; 5 | global.sre = Object.create(SRE); 6 | global.sre.Engine = { 7 | isReady: function () { 8 | return SRE.engineReady(); 9 | } 10 | }; 11 | //# sourceMappingURL=sre-node.js.map -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/constants.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | declare const _VDITOR_VERSION: string; 3 | export { _VDITOR_VERSION as VDITOR_VERSION }; 4 | export declare abstract class Constants { 5 | static readonly ZWSP: string; 6 | static readonly DROP_EDITOR: string; 7 | static readonly MOBILE_WIDTH: number; 8 | static readonly CLASS_MENU_DISABLED: string; 9 | static readonly EDIT_TOOLBARS: string[]; 10 | static readonly CODE_THEME: string[]; 11 | static readonly CODE_LANGUAGES: string[]; 12 | static readonly CDN: string; 13 | static readonly MARKDOWN_OPTIONS: { 14 | autoSpace: boolean; 15 | codeBlockPreview: boolean; 16 | fixTermTypo: boolean; 17 | footnotes: boolean; 18 | linkBase: string; 19 | linkPrefix: string; 20 | listStyle: boolean; 21 | mark: boolean; 22 | mathBlockPreview: boolean; 23 | paragraphBeginningSpace: boolean; 24 | sanitize: boolean; 25 | toc: boolean; 26 | }; 27 | static readonly HLJS_OPTIONS: { 28 | enable: boolean; 29 | lineNumber: boolean; 30 | defaultLang: string; 31 | style: string; 32 | }; 33 | static readonly MATH_OPTIONS: IMath; 34 | static readonly THEME_OPTIONS: { 35 | current: string; 36 | list: { 37 | "ant-design": string; 38 | dark: string; 39 | light: string; 40 | wechat: string; 41 | }; 42 | path: string; 43 | }; 44 | } 45 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/devtools/index.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare class DevTools { 3 | element: HTMLDivElement; 4 | private ASTChart; 5 | constructor(); 6 | renderEchart(vditor: IVditor): void; 7 | } 8 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/export/index.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const download: (vditor: IVditor, content: string, filename: string) => void; 3 | export declare const exportMarkdown: (vditor: IVditor) => void; 4 | export declare const exportPDF: (vditor: IVditor) => void; 5 | export declare const exportHTML: (vditor: IVditor) => void; 6 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/hint/index.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare class Hint { 3 | timeId: number; 4 | element: HTMLDivElement; 5 | recentLanguage: string; 6 | private splitChar; 7 | private lastIndex; 8 | constructor(hintExtends: IHintExtend[]); 9 | render(vditor: IVditor): void; 10 | genHTML(data: IHintData[], key: string, vditor: IVditor): void; 11 | fillEmoji: (element: HTMLElement, vditor: IVditor) => void; 12 | select(event: KeyboardEvent, vditor: IVditor): boolean; 13 | private getKey; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/ir/expandMarker.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const expandMarker: (range: Range, vditor: IVditor) => void; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/ir/highlightToolbarIR.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const highlightToolbarIR: (vditor: IVditor) => void; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/ir/index.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | declare class IR { 3 | range: Range; 4 | element: HTMLPreElement; 5 | processTimeoutId: number; 6 | hlToolbarTimeoutId: number; 7 | composingLock: boolean; 8 | preventInput: boolean; 9 | constructor(vditor: IVditor); 10 | private copy; 11 | private bindEvent; 12 | } 13 | export { IR }; 14 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/ir/input.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const input: (vditor: IVditor, range: Range, ignoreSpace?: boolean, event?: InputEvent) => void; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/ir/process.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const processHint: (vditor: IVditor) => void; 3 | export declare const processAfterRender: (vditor: IVditor, options?: { 4 | enableAddUndoStack: boolean; 5 | enableHint: boolean; 6 | enableInput: boolean; 7 | }) => void; 8 | export declare const processHeading: (vditor: IVditor, value: string) => void; 9 | export declare const processToolbar: (vditor: IVditor, actionBtn: Element, prefix: string, suffix: string) => void; 10 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/ir/processKeydown.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const processKeydown: (vditor: IVditor, event: KeyboardEvent) => boolean; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/abcRender.d.ts: -------------------------------------------------------------------------------- 1 | export declare const abcRender: (element?: (HTMLElement | Document), cdn?: string) => void; 2 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/anchorRender.d.ts: -------------------------------------------------------------------------------- 1 | export declare const anchorRender: (type: number) => void; 2 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/chartRender.d.ts: -------------------------------------------------------------------------------- 1 | export declare const chartRender: (element: (HTMLElement | Document), cdn: string, theme: string) => void; 2 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/codeRender.d.ts: -------------------------------------------------------------------------------- 1 | export declare const codeRender: (element: HTMLElement) => void; 2 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/flowchartRender.d.ts: -------------------------------------------------------------------------------- 1 | export declare const flowchartRender: (element: HTMLElement, cdn?: string) => void; 2 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/getHTML.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const getHTML: (vditor: IVditor) => string; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/getMarkdown.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const getMarkdown: (vditor: IVditor) => string; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/graphvizRender.d.ts: -------------------------------------------------------------------------------- 1 | export declare const graphvizRender: (element: HTMLElement, cdn?: string) => void; 2 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/highlightRender.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const highlightRender: (hljsOption?: IHljs, element?: HTMLElement | Document, cdn?: string) => void; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/lazyLoadImageRender.d.ts: -------------------------------------------------------------------------------- 1 | declare global { 2 | interface Window { 3 | vditorImageIntersectionObserver: IntersectionObserver; 4 | } 5 | } 6 | export declare const lazyLoadImageRender: (element?: (HTMLElement | Document)) => boolean; 7 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/markmapRender.d.ts: -------------------------------------------------------------------------------- 1 | export declare const markmapRender: (element: HTMLElement, cdn: string, theme: string) => void; 2 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/mathRender.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | declare global { 3 | interface Window { 4 | MathJax: any; 5 | } 6 | } 7 | export declare const mathRender: (element: HTMLElement, options?: { 8 | cdn?: string; 9 | math?: IMath; 10 | }) => void; 11 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/mediaRender.d.ts: -------------------------------------------------------------------------------- 1 | export declare const mediaRender: (element: HTMLElement) => void; 2 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/mermaidRender.d.ts: -------------------------------------------------------------------------------- 1 | export declare const mermaidRender: (element: HTMLElement, cdn: string, theme: string) => void; 2 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/mindmapRender.d.ts: -------------------------------------------------------------------------------- 1 | export declare const mindmapRender: (element: (HTMLElement | Document), cdn: string, theme: string) => void; 2 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/outlineRender.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const outlineRender: (contentElement: HTMLElement, targetElement: Element, vditor?: IVditor) => string; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/plantumlRender.d.ts: -------------------------------------------------------------------------------- 1 | export declare const plantumlRender: (element?: (HTMLElement | Document), cdn?: string) => void; 2 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/previewRender.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const md2html: (mdText: string, options?: IPreviewOptions) => Promise; 3 | export declare const previewRender: (previewElement: HTMLDivElement, markdown: string, options?: IPreviewOptions) => Promise; 4 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/setLute.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const setLute: (options: ILuteOptions) => Lute; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/markdown/speechRender.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | declare global { 3 | interface Window { 4 | vditorSpeechRange: Range; 5 | } 6 | } 7 | export declare const speechRender: (element: HTMLElement, lang?: keyof II18n) => void; 8 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/outline/index.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare class Outline { 3 | element: HTMLElement; 4 | constructor(outlineLabel: string); 5 | render(vditor: IVditor): string; 6 | toggle(vditor: IVditor, show?: boolean, focus?: boolean): void; 7 | } 8 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/preview/image.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const previewImage: (oldImgElement: HTMLImageElement, lang?: keyof II18n, theme?: string) => void; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/preview/index.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare class Preview { 3 | element: HTMLElement; 4 | private mdTimeoutId; 5 | constructor(vditor: IVditor); 6 | render(vditor: IVditor, value?: string): void; 7 | private afterRender; 8 | private copyToX; 9 | } 10 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/resize/index.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare class Resize { 3 | element: HTMLElement; 4 | constructor(vditor: IVditor); 5 | private bindEvent; 6 | } 7 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/sv/index.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | declare class Editor { 3 | range: Range; 4 | element: HTMLPreElement; 5 | composingLock: boolean; 6 | processTimeoutId: number; 7 | hlToolbarTimeoutId: number; 8 | preventInput: boolean; 9 | constructor(vditor: IVditor); 10 | private copy; 11 | private bindEvent; 12 | } 13 | export { Editor }; 14 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/sv/inputEvent.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const inputEvent: (vditor: IVditor, event?: InputEvent) => void; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/sv/process.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const processPaste: (vditor: IVditor, text: string) => void; 3 | export declare const getSideByType: (spanNode: Node, type: string, isPrevious?: boolean) => false | Element; 4 | export declare const processSpinVditorSVDOM: (html: string, vditor: IVditor) => string; 5 | export declare const processPreviousMarkers: (spanElement: HTMLElement) => string; 6 | export declare const processAfterRender: (vditor: IVditor, options?: { 7 | enableAddUndoStack: boolean; 8 | enableHint: boolean; 9 | enableInput: boolean; 10 | }) => void; 11 | export declare const processHeading: (vditor: IVditor, value: string) => void; 12 | export declare const processToolbar: (vditor: IVditor, actionBtn: Element, prefix: string, suffix: string) => void; 13 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/sv/processKeydown.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const processKeydown: (vditor: IVditor, event: KeyboardEvent) => boolean; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/tip/index.d.ts: -------------------------------------------------------------------------------- 1 | export declare class Tip { 2 | element: HTMLElement; 3 | constructor(); 4 | show(text: string, time?: number): void; 5 | hide(): void; 6 | } 7 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Both.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class Both extends MenuItem { 4 | constructor(vditor: IVditor, menuItem: IMenuItem); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Br.d.ts: -------------------------------------------------------------------------------- 1 | export declare class Br { 2 | element: HTMLElement; 3 | constructor(); 4 | } 5 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/CodeTheme.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class CodeTheme extends MenuItem { 4 | element: HTMLElement; 5 | constructor(vditor: IVditor, menuItem: IMenuItem); 6 | } 7 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/ContentTheme.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class ContentTheme extends MenuItem { 4 | element: HTMLElement; 5 | constructor(vditor: IVditor, menuItem: IMenuItem); 6 | } 7 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Counter.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare class Counter { 3 | element: HTMLElement; 4 | constructor(vditor: IVditor); 5 | render(vditor: IVditor, mdText: string): void; 6 | } 7 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Custom.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class Custom extends MenuItem { 4 | constructor(vditor: IVditor, menuItem: IMenuItem); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Devtools.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class Devtools extends MenuItem { 4 | constructor(vditor: IVditor, menuItem: IMenuItem); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Divider.d.ts: -------------------------------------------------------------------------------- 1 | export declare class Divider { 2 | element: HTMLElement; 3 | constructor(); 4 | } 5 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/EditMode.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare const setEditMode: (vditor: IVditor, type: string, event: Event | string) => void; 4 | export declare class EditMode extends MenuItem { 5 | element: HTMLElement; 6 | constructor(vditor: IVditor, menuItem: IMenuItem); 7 | _bindEvent(vditor: IVditor, panelElement: HTMLElement, menuItem: IMenuItem): void; 8 | } 9 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Emoji.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class Emoji extends MenuItem { 4 | element: HTMLElement; 5 | constructor(vditor: IVditor, menuItem: IMenuItem); 6 | private bindEvent; 7 | } 8 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Export.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class Export extends MenuItem { 4 | element: HTMLElement; 5 | constructor(vditor: IVditor, menuItem: IMenuItem); 6 | } 7 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Fullscreen.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class Fullscreen extends MenuItem { 4 | constructor(vditor: IVditor, menuItem: IMenuItem); 5 | _bindEvent(vditor: IVditor, menuItem: IMenuItem): void; 6 | } 7 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Headings.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class Headings extends MenuItem { 4 | element: HTMLElement; 5 | constructor(vditor: IVditor, menuItem: IMenuItem); 6 | _bindEvent(vditor: IVditor, panelElement: HTMLElement): void; 7 | } 8 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Help.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class Help extends MenuItem { 4 | constructor(vditor: IVditor, menuItem: IMenuItem); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Indent.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class Indent extends MenuItem { 4 | constructor(vditor: IVditor, menuItem: IMenuItem); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Info.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class Info extends MenuItem { 4 | constructor(vditor: IVditor, menuItem: IMenuItem); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/InsertAfter.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class InsertAfter extends MenuItem { 4 | constructor(vditor: IVditor, menuItem: IMenuItem); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/InsertBefore.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class InsertBefore extends MenuItem { 4 | constructor(vditor: IVditor, menuItem: IMenuItem); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/MenuItem.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare class MenuItem { 3 | element: HTMLElement; 4 | constructor(vditor: IVditor, menuItem: IMenuItem); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Outdent.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class Outdent extends MenuItem { 4 | constructor(vditor: IVditor, menuItem: IMenuItem); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Outline.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class Outline extends MenuItem { 4 | constructor(vditor: IVditor, menuItem: IMenuItem); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Preview.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class Preview extends MenuItem { 4 | constructor(vditor: IVditor, menuItem: IMenuItem); 5 | _bindEvent(vditor: IVditor): void; 6 | } 7 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Record.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class Record extends MenuItem { 4 | constructor(vditor: IVditor, menuItem: IMenuItem); 5 | _bindEvent(vditor: IVditor): void; 6 | } 7 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Redo.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class Redo extends MenuItem { 4 | constructor(vditor: IVditor, menuItem: IMenuItem); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Undo.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class Undo extends MenuItem { 4 | constructor(vditor: IVditor, menuItem: IMenuItem); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/Upload.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { MenuItem } from "./MenuItem"; 3 | export declare class Upload extends MenuItem { 4 | constructor(vditor: IVditor, menuItem: IMenuItem); 5 | _bindEvent(vditor: IVditor): void; 6 | } 7 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/index.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare class Toolbar { 3 | elements: { 4 | [key: string]: HTMLElement; 5 | }; 6 | element: HTMLElement; 7 | constructor(vditor: IVditor); 8 | private genItem; 9 | } 10 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/toolbar/setToolbar.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const removeCurrentToolbar: (toolbar: { 3 | [key: string]: HTMLElement; 4 | }, names: string[]) => void; 5 | export declare const setCurrentToolbar: (toolbar: { 6 | [key: string]: HTMLElement; 7 | }, names: string[]) => void; 8 | export declare const enableToolbar: (toolbar: { 9 | [key: string]: HTMLElement; 10 | }, names: string[]) => void; 11 | export declare const disableToolbar: (toolbar: { 12 | [key: string]: HTMLElement; 13 | }, names: string[]) => void; 14 | export declare const hideToolbar: (toolbar: { 15 | [key: string]: HTMLElement; 16 | }, names: string[]) => void; 17 | export declare const showToolbar: (toolbar: { 18 | [key: string]: HTMLElement; 19 | }, names: string[]) => void; 20 | export declare const hidePanel: (vditor: IVditor, panels: string[], exceptElement?: HTMLElement) => void; 21 | export declare const toggleSubMenu: (vditor: IVditor, panelElement: HTMLElement, actionBtn: Element, level: number) => void; 22 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/ui/initUI.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | declare global { 3 | interface Window { 4 | visualViewport: HTMLElement; 5 | } 6 | } 7 | export declare const initUI: (vditor: IVditor) => void; 8 | export declare const setPadding: (vditor: IVditor) => void; 9 | export declare const setTypewriterPosition: (vditor: IVditor) => void; 10 | export declare function UIUnbindListener(): void; 11 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/ui/setCodeTheme.d.ts: -------------------------------------------------------------------------------- 1 | export declare const setCodeTheme: (codeTheme: string, cdn?: string) => void; 2 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/ui/setContentTheme.d.ts: -------------------------------------------------------------------------------- 1 | export declare const setContentTheme: (contentTheme: string, path: string) => void; 2 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/ui/setPreviewMode.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const setPreviewMode: (mode: "both" | "editor", vditor: IVditor) => void; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/ui/setTheme.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const setTheme: (vditor: IVditor) => void; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/undo/index.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | declare class Undo { 3 | private stackSize; 4 | private dmp; 5 | private wysiwyg; 6 | private ir; 7 | private sv; 8 | constructor(); 9 | clearStack(vditor: IVditor): void; 10 | resetIcon(vditor: IVditor): void; 11 | undo(vditor: IVditor): void; 12 | redo(vditor: IVditor): void; 13 | recordFirstPosition(vditor: IVditor, event: KeyboardEvent): void; 14 | addToUndoStack(vditor: IVditor): void; 15 | private renderDiff; 16 | private resetStack; 17 | private addCaret; 18 | } 19 | export { Undo }; 20 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/upload/getElement.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const getElement: (vditor: IVditor) => HTMLPreElement; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/upload/index.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | declare class Upload { 3 | element: HTMLElement; 4 | isUploading: boolean; 5 | range: Range; 6 | constructor(); 7 | } 8 | declare const uploadFiles: (vditor: IVditor, files: FileList | DataTransferItemList | File[], element?: HTMLInputElement) => Promise; 9 | export { Upload, uploadFiles }; 10 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/upload/setHeaders.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const setHeaders: (vditor: IVditor, xhr: XMLHttpRequest) => void; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/util/Options.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare class Options { 3 | options: IOptions; 4 | private defaultOptions; 5 | constructor(options: IOptions); 6 | merge(): IOptions; 7 | private mergeToolbar; 8 | } 9 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/util/RecordMedia.d.ts: -------------------------------------------------------------------------------- 1 | export declare class RecordMedia { 2 | SAMPLE_RATE: number; 3 | DEFAULT_SAMPLE_RATE: number; 4 | isRecording: boolean; 5 | readyFlag: boolean; 6 | leftChannel: Float32List[]; 7 | rightChannel: Float32List[]; 8 | recordingLength: number; 9 | recorder: ScriptProcessorNode; 10 | constructor(e: MediaStream); 11 | cloneChannelData(leftChannelData: Float32List, rightChannelData: Float32List): void; 12 | startRecordingNewWavFile(): void; 13 | stopRecording(): void; 14 | buildWavFileBlob(): Blob; 15 | private downSampleBuffer; 16 | private mergeBuffers; 17 | private writeUTFBytes; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/util/addScript.d.ts: -------------------------------------------------------------------------------- 1 | export declare const addScriptSync: (path: string, id: string) => boolean; 2 | export declare const addScript: (path: string, id: string) => Promise; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/util/addStyle.d.ts: -------------------------------------------------------------------------------- 1 | export declare const addStyle: (url: string, id: string) => void; 2 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/util/code160to32.d.ts: -------------------------------------------------------------------------------- 1 | export declare const code160to32: (text: string) => string; 2 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/util/compatibility.d.ts: -------------------------------------------------------------------------------- 1 | export declare const isSafari: () => boolean; 2 | export declare const isFirefox: () => boolean; 3 | export declare const accessLocalStorage: () => boolean; 4 | export declare const getEventName: () => "click" | "touchstart"; 5 | export declare const isCtrl: (event: KeyboardEvent) => boolean; 6 | export declare const updateHotkeyTip: (hotkey: string) => string; 7 | export declare const isChrome: () => boolean; 8 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/util/editorCommonEvent.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const focusEvent: (vditor: IVditor, editorElement: HTMLElement) => void; 3 | export declare const dblclickEvent: (vditor: IVditor, editorElement: HTMLElement) => void; 4 | export declare const blurEvent: (vditor: IVditor, editorElement: HTMLElement) => void; 5 | export declare const dropEvent: (vditor: IVditor, editorElement: HTMLElement) => void; 6 | export declare const copyEvent: (vditor: IVditor, editorElement: HTMLElement, copy: (event: ClipboardEvent, vditor: IVditor) => void) => void; 7 | export declare const cutEvent: (vditor: IVditor, editorElement: HTMLElement, copy: (event: ClipboardEvent, vditor: IVditor) => void) => void; 8 | export declare const scrollCenter: (vditor: IVditor) => void; 9 | export declare const hotkeyEvent: (vditor: IVditor, editorElement: HTMLElement) => void; 10 | export declare const selectEvent: (vditor: IVditor, editorElement: HTMLElement) => void; 11 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/util/getSelectText.d.ts: -------------------------------------------------------------------------------- 1 | export declare const getSelectText: (editor: HTMLElement, range?: Range) => string; 2 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/util/hasClosest.d.ts: -------------------------------------------------------------------------------- 1 | export declare const hasTopClosestByClassName: (element: Node, className: string) => false | HTMLElement; 2 | export declare const hasTopClosestByAttribute: (element: Node, attr: string, value: string) => false | HTMLElement; 3 | export declare const hasTopClosestByTag: (element: Node, nodeName: string) => false | HTMLElement; 4 | export declare const getTopList: (element: Node) => false | HTMLElement; 5 | export declare const hasClosestByAttribute: (element: Node, attr: string, value: string) => false | HTMLElement; 6 | export declare const hasClosestBlock: (element: Node) => false | HTMLElement; 7 | export declare const hasClosestByMatchTag: (element: Node, nodeName: string) => false | HTMLElement; 8 | export declare const hasClosestByClassName: (element: Node, className: string) => false | HTMLElement; 9 | export declare const getLastNode: (node: Node) => Node; 10 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/util/hasClosestByHeadings.d.ts: -------------------------------------------------------------------------------- 1 | export declare const hasClosestByTag: (element: Node, nodeName: string) => false | HTMLElement; 2 | export declare const hasClosestByHeadings: (element: Node) => false | HTMLElement; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/util/highlightToolbar.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const highlightToolbar: (vditor: IVditor) => void; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/util/hotKey.d.ts: -------------------------------------------------------------------------------- 1 | export declare const matchHotKey: (hotKey: string, event: KeyboardEvent) => boolean; 2 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/util/log.d.ts: -------------------------------------------------------------------------------- 1 | export declare const log: (method: string, content: string, type: string, print: boolean) => void; 2 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/util/merge.d.ts: -------------------------------------------------------------------------------- 1 | export declare const merge: (...options: any[]) => any; 2 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/util/processCode.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const processPasteCode: (html: string, text: string, type?: string) => string | false; 3 | export declare const processCodeRender: (previewPanel: HTMLElement, vditor: IVditor) => void; 4 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/util/selection.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const getEditorRange: (vditor: IVditor) => Range; 3 | export declare const getCursorPosition: (editor: HTMLElement) => { 4 | left: number; 5 | top: number; 6 | }; 7 | export declare const selectIsEditor: (editor: HTMLElement, range?: Range) => boolean; 8 | export declare const setSelectionFocus: (range: Range) => void; 9 | export declare const getSelectPosition: (selectElement: HTMLElement, editorElement: HTMLElement, range?: Range) => { 10 | end: number; 11 | start: number; 12 | }; 13 | export declare const setSelectionByPosition: (start: number, end: number, editor: HTMLElement) => Range; 14 | export declare const setRangeByWbr: (element: HTMLElement, range: Range) => void; 15 | export declare const insertHTML: (html: string, vditor: IVditor) => void; 16 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/util/toc.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const renderToc: (vditor: IVditor) => void; 3 | export declare const clickToc: (event: MouseEvent & { 4 | target: HTMLElement; 5 | }, vditor: IVditor) => void; 6 | export declare const keydownToc: (blockElement: HTMLElement, vditor: IVditor, event: KeyboardEvent, range: Range) => boolean; 7 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/wysiwyg/afterRenderEvent.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const afterRenderEvent: (vditor: IVditor, options?: { 3 | enableAddUndoStack: boolean; 4 | enableHint: boolean; 5 | enableInput: boolean; 6 | }) => void; 7 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/wysiwyg/highlightToolbarWYSIWYG.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const highlightToolbarWYSIWYG: (vditor: IVditor) => void; 3 | export declare const genLinkRefPopover: (vditor: IVditor, linkRefElement: HTMLElement, range?: Range) => void; 4 | export declare const genAPopover: (vditor: IVditor, aElement: HTMLElement, range: Range) => void; 5 | export declare const genImagePopover: (event: Event, vditor: IVditor) => void; 6 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/wysiwyg/index.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | declare class WYSIWYG { 3 | range: Range; 4 | element: HTMLPreElement; 5 | popover: HTMLDivElement; 6 | selectPopover: HTMLDivElement; 7 | afterRenderTimeoutId: number; 8 | hlToolbarTimeoutId: number; 9 | preventInput: boolean; 10 | composingLock: boolean; 11 | commentIds: string[]; 12 | private scrollListener; 13 | constructor(vditor: IVditor); 14 | getComments(vditor: IVditor, getData?: boolean): ICommentsData[]; 15 | triggerRemoveComment(vditor: IVditor): void; 16 | showComment(): void; 17 | hideComment(): void; 18 | unbindListener(): void; 19 | private copy; 20 | private bindEvent; 21 | } 22 | export { WYSIWYG }; 23 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/wysiwyg/inlineTag.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const previoueIsEmptyA: (node: Node) => false | HTMLElement; 3 | export declare const nextIsCode: (range: Range) => boolean; 4 | export declare const getNextHTML: (node: Node) => string; 5 | export declare const getPreviousHTML: (node: Node) => string; 6 | export declare const getRenderElementNextNode: (blockCodeElement: HTMLElement) => ChildNode; 7 | export declare const splitElement: (range: Range) => { 8 | afterHTML: string; 9 | beforeHTML: string; 10 | }; 11 | export declare const modifyPre: (vditor: IVditor, range: Range) => void; 12 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/wysiwyg/input.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const input: (vditor: IVditor, range: Range, event?: InputEvent) => void; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/wysiwyg/processKeydown.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const processKeydown: (vditor: IVditor, event: KeyboardEvent) => boolean; 3 | export declare const removeBlockElement: (vditor: IVditor, event: KeyboardEvent) => boolean; 4 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/wysiwyg/renderDomByMd.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const renderDomByMd: (vditor: IVditor, md: string, options?: { 3 | enableAddUndoStack: boolean; 4 | enableHint: boolean; 5 | enableInput: boolean; 6 | }) => void; 7 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/wysiwyg/setHeading.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const setHeading: (vditor: IVditor, tagName: string) => void; 3 | export declare const removeHeading: (vditor: IVditor) => void; 4 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/wysiwyg/showCode.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const showCode: (previewElement: HTMLElement, vditor: IVditor, first?: boolean) => void; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/articles/vditor@3.9.3/dist/ts/wysiwyg/toolbarEvent.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | export declare const toolbarEvent: (vditor: IVditor, actionBtn: Element, event: Event) => void; 3 | -------------------------------------------------------------------------------- /src/main/resources/static/banner.txt: -------------------------------------------------------------------------------- 1 | 2 | ___ ___ __ 3 | __ /\_ \ /\_ \ /\ \ 4 | /\_\ ___ ___ __ \//\ \ ___\//\ \ ___ __ __ \_\ \ 5 | \/\ \ /' __` __`\ /'__`\ \ \ \ /'___\\ \ \ / __`\/\ \/\ \ /'_` \ 6 | \ \ \/\ \/\ \/\ \/\ \L\.\_ \_\ \_/\ \__/ \_\ \_/\ \L\ \ \ \_\ \/\ \L\ \ 7 | _\ \ \ \_\ \_\ \_\ \__/.\_\/\____\ \____\/\____\ \____/\ \____/\ \___,_\ 8 | /\ \_\ \/_/\/_/\/_/\/__/\/_/\/____/\/____/\/____/\/___/ \/___/ \/__,_ / 9 | \ \____/ 10 | \/___/ 11 | -------------------------------------------------------------------------------- /src/main/resources/templates/component/article-tail.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 | 9 |
10 |
11 | 12 |
13 |
14 |
15 |
16 | 19 |
20 |
21 | 22 |
23 |
24 |
25 |
26 | -------------------------------------------------------------------------------- /src/main/resources/templates/component/footer.html: -------------------------------------------------------------------------------- 1 |
2 | 12 |
13 |
14 | -------------------------------------------------------------------------------- /src/test/java/com/jmal/clouddisk/GridFSTest.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk; 2 | 3 | import cn.hutool.core.lang.Console; 4 | import com.jmal.clouddisk.service.IFileVersionService; 5 | import org.junit.jupiter.api.Test; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.boot.test.context.SpringBootTest; 8 | 9 | import java.io.BufferedReader; 10 | import java.io.IOException; 11 | import java.io.InputStream; 12 | import java.io.InputStreamReader; 13 | import java.nio.charset.StandardCharsets; 14 | 15 | /** 16 | * @author jmal 17 | * @Description GridFSTest 18 | * @date 2023/5/10 17:47 19 | */ 20 | @SpringBootTest 21 | class GridFSTest { 22 | 23 | @Autowired 24 | IFileVersionService fileVersionService; 25 | 26 | @Test 27 | void read() throws IOException { 28 | String fileId = "645b693fd03da37e89bb6ed8"; 29 | try (InputStream inputStream = fileVersionService.readFileVersion(fileId); 30 | InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); 31 | BufferedReader bufferedReader = new BufferedReader(inputStreamReader);) { 32 | String line; 33 | while ((line = bufferedReader.readLine()) != null) { 34 | Console.log(line); 35 | } 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/com/jmal/clouddisk/InitSysDBText.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk; 2 | 3 | import com.jmal.clouddisk.service.impl.MenuService; 4 | import com.jmal.clouddisk.service.impl.RoleService; 5 | import org.junit.jupiter.api.Test; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.boot.test.context.SpringBootTest; 8 | 9 | /** 10 | * @author jmal 11 | * @Description 初始化系统管理数据库 12 | * @Date 2021/1/12 9:19 上午 13 | */ 14 | @SpringBootTest 15 | class InitSysDBText { 16 | 17 | @Autowired 18 | MenuService menuService; 19 | 20 | @Autowired 21 | RoleService roleService; 22 | 23 | /*** 24 | * 通过json文件初始化菜单数据 25 | */ 26 | @Test 27 | void initMenu() { 28 | menuService.initMenus(); 29 | } 30 | 31 | /*** 32 | * 通过json文件初始化角色数据 33 | */ 34 | @Test 35 | void initRole() { 36 | roleService.initRoles(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/test/java/com/jmal/clouddisk/RBACText.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk; 2 | 3 | import cn.hutool.core.lang.Console; 4 | import com.jmal.clouddisk.service.IUserService; 5 | import org.junit.jupiter.api.Test; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.boot.test.context.SpringBootTest; 8 | 9 | /** 10 | * @author jmal 11 | * @Description rbac 12 | * @Date 2021/1/12 3:11 下午 13 | */ 14 | @SpringBootTest 15 | class RBACText { 16 | 17 | @Autowired 18 | IUserService userService; 19 | 20 | @Test 21 | void getAuthorities(){ 22 | Console.log("admin", userService.getAuthorities("admin")); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/test/java/com/jmal/clouddisk/UpdateJDKTest.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk; 2 | 3 | import cn.hutool.core.io.FileUtil; 4 | import cn.hutool.core.io.file.PathUtil; 5 | import org.junit.jupiter.api.Test; 6 | import org.springframework.boot.test.context.SpringBootTest; 7 | 8 | import java.io.File; 9 | import java.io.IOException; 10 | import java.nio.file.Files; 11 | import java.nio.file.Path; 12 | import java.nio.file.Paths; 13 | 14 | /** 15 | * @Description updateJdk17Test 16 | * @blame jmal 17 | * @Date 2023/3/3 23:12 18 | */ 19 | 20 | @SpringBootTest 21 | class UpdateJDKTest { 22 | 23 | 24 | @Test 25 | void moveFile() throws IOException { 26 | Path fromPath = Paths.get("/Users/jmal/Downloads/UU-macOS-2.7.0(237).dmg"); 27 | Path outputFile = Paths.get("/Users/jmal/Downloads/move/"); 28 | if (!Files.exists(outputFile)) { 29 | Files.createFile(outputFile); 30 | } 31 | PathUtil.move(fromPath, outputFile, true); 32 | } 33 | 34 | @Test 35 | void copyFile() { 36 | File fromFile = Paths.get("/Users/jmal/Downloads/move/UU-macOS-2.7.0(237).dmg").toFile(); 37 | File toFile = Paths.get("/Users/jmal/Downloads/数据列表excel6401e11321a0e1.07995309.xlsx").toFile(); 38 | FileUtil.copy(fromFile, toFile, true); 39 | } 40 | 41 | @Test 42 | void copyDir() { 43 | File fromFile = Paths.get("/Users/jmal/temp/filetest/rootpath/jmal/新建文件夹1/新建文件夹[]--/").toFile(); 44 | File toFile = Paths.get("/Users/jmal/temp/filetest/rootpath/jmal/").toFile(); 45 | FileUtil.copy(fromFile, toFile, true); 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/test/java/com/jmal/clouddisk/WebpTest.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk; 2 | 3 | import com.luciad.imageio.webp.WebPWriteParam; 4 | 5 | import javax.imageio.IIOImage; 6 | import javax.imageio.ImageIO; 7 | import javax.imageio.ImageWriter; 8 | import javax.imageio.stream.FileImageOutputStream; 9 | import java.awt.image.BufferedImage; 10 | import java.io.File; 11 | import java.io.IOException; 12 | 13 | /** 14 | * @author jmal 15 | * @Description webp 16 | * @Date 2020/12/24 10:20 上午 17 | */ 18 | public class WebpTest { 19 | public static void main(String args[]) throws IOException { 20 | String inputJpgPath = "/Users/jmal/Pictures/截图/截屏 19.png"; 21 | String outputWebpPath = "/Users/jmal/Pictures/截图/截屏 19.webp.png"; 22 | 23 | // 从某处获取图像进行编码 24 | BufferedImage image = ImageIO.read(new File(inputJpgPath)); 25 | 26 | // 获取一个WebP ImageWriter实例 27 | ImageWriter writer = ImageIO.getImageWritersByMIMEType("image/webp").next(); 28 | 29 | // 配置编码参数 30 | WebPWriteParam writeParam = new WebPWriteParam(writer.getLocale()); 31 | writeParam.setCompressionMode(WebPWriteParam.MODE_DEFAULT); 32 | 33 | // 在ImageWriter上配置输出 34 | writer.setOutput(new FileImageOutputStream(new File(outputWebpPath))); 35 | 36 | // 编码 37 | writer.write(null, new IIOImage(image, null, null), writeParam); 38 | 39 | } 40 | } -------------------------------------------------------------------------------- /src/test/java/com/jmal/clouddisk/lucene/ExcelSaxReader.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.lucene; 2 | 3 | import cn.hutool.core.lang.Console; 4 | import cn.hutool.poi.excel.ExcelUtil; 5 | import cn.hutool.poi.excel.sax.handler.RowHandler; 6 | 7 | import java.util.List; 8 | 9 | public class ExcelSaxReader { 10 | public static void main(String[] args) throws Exception { 11 | ExcelUtil.readBySax("/Users/jmal/Downloads/欣薇尔工厂-数据报表 (4).xlsx", 0, createRowHandler()); 12 | } 13 | 14 | private static RowHandler createRowHandler() { 15 | return new RowHandler() { 16 | @Override 17 | public void handle(int sheetIndex, long rowIndex, List rowlist) { 18 | Console.log("[{}] [{}] {}", sheetIndex, rowIndex, rowlist); 19 | } 20 | }; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/test/java/com/jmal/clouddisk/lucene/ReadExcel.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.lucene; 2 | 3 | import org.apache.poi.ss.usermodel.Cell; 4 | import org.apache.poi.ss.usermodel.Row; 5 | import org.apache.poi.xssf.usermodel.XSSFSheet; 6 | import org.apache.poi.xssf.usermodel.XSSFWorkbook; 7 | 8 | import java.io.File; 9 | import java.io.FileInputStream; 10 | import java.io.IOException; 11 | 12 | public class ReadExcel { 13 | public static void main(String[] args) { 14 | try { 15 | FileInputStream fis = new FileInputStream(new File("/Users/jmal/Downloads/数据报表 (3).xlsx")); 16 | XSSFWorkbook workbook = new XSSFWorkbook(fis); 17 | XSSFSheet sheet = workbook.getSheetAt(0); 18 | for (Row row : sheet) { 19 | for (Cell cell : row) { 20 | String cellValue = cell.toString(); 21 | System.out.println("Cell Value: " + cellValue); 22 | } 23 | } 24 | fis.close(); 25 | workbook.close(); 26 | } catch (IOException e) { 27 | e.printStackTrace(); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/test/java/com/jmal/clouddisk/lucene/ReadPPTX.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.lucene; 2 | 3 | import org.apache.poi.xslf.usermodel.XMLSlideShow; 4 | import org.apache.poi.xslf.usermodel.XSLFShape; 5 | import org.apache.poi.xslf.usermodel.XSLFSlide; 6 | import org.apache.poi.xslf.usermodel.XSLFTextShape; 7 | 8 | import java.io.FileInputStream; 9 | import java.io.IOException; 10 | 11 | public class ReadPPTX { 12 | public static void main(String[] args) { 13 | try { 14 | FileInputStream fis = new FileInputStream("/Users/jmal/Downloads/未命名文件.pptx"); 15 | XMLSlideShow ppt = new XMLSlideShow(fis); 16 | 17 | for (XSLFSlide slide : ppt.getSlides()) { 18 | for (XSLFShape shape : slide.getShapes()) { 19 | if (shape instanceof XSLFTextShape textShape) { 20 | System.out.println(textShape.getText()); 21 | } 22 | } 23 | } 24 | 25 | fis.close(); 26 | ppt.close(); 27 | } catch (IOException e) { 28 | e.printStackTrace(); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/test/java/com/jmal/clouddisk/lucene/ReadWord.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.lucene; 2 | 3 | import org.apache.poi.xwpf.usermodel.XWPFDocument; 4 | import org.apache.poi.xwpf.usermodel.XWPFParagraph; 5 | 6 | import java.io.FileInputStream; 7 | import java.io.IOException; 8 | import java.util.List; 9 | 10 | public class ReadWord { 11 | public static void main(String[] args) { 12 | try { 13 | FileInputStream fis = new FileInputStream("/Users/jmal/Downloads/2023.4.17_副本.docx"); 14 | XWPFDocument document = new XWPFDocument(fis); 15 | List paragraphs = document.getParagraphs(); 16 | 17 | for (XWPFParagraph para : paragraphs) { 18 | System.out.println(para.getText()); 19 | } 20 | fis.close(); 21 | document.close(); 22 | } catch (IOException e) { 23 | e.printStackTrace(); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/test/java/com/jmal/clouddisk/lucene/SheetHandler.java: -------------------------------------------------------------------------------- 1 | package com.jmal.clouddisk.lucene; 2 | 3 | import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler; 4 | import org.apache.poi.xssf.usermodel.XSSFComment; 5 | 6 | class SheetHandler implements XSSFSheetXMLHandler.SheetContentsHandler { 7 | 8 | @Override 9 | public void startRow(int i) { 10 | } 11 | 12 | @Override 13 | public void endRow(int i) { 14 | } 15 | 16 | @Override 17 | public void cell(String s, String s1, XSSFComment xssfComment) { 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /tess4j/datapath/chi_sim.traineddata: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jamebal/jmal-cloud-server/9362b275494e1ca36c2583fda9fc73e44c6e250b/tess4j/datapath/chi_sim.traineddata --------------------------------------------------------------------------------