diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.mts similarity index 90% rename from docs/.vitepress/config.ts rename to docs/.vitepress/config.mts index d64815c..55a53bb 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.mts @@ -3,7 +3,7 @@ import { defineConfig } from "vitepress"; // https://vitepress.dev/reference/site-config export default defineConfig({ lang: "zh-CN", - title: "HaloPluginMigrate", + title: "Halo 迁移插件", description: "多平台迁移至 Halo 2.x 的迁移插件使用文档", head: [["link", { rel: "icon", href: "/halo-favicon.webp" }]], lastUpdated: true, @@ -20,7 +20,10 @@ export default defineConfig({ sidebar: [ { - text: "Provider", + items: [{ text: "介绍", link: "/" }], + }, + { + text: "迁移", items: [ { text: "Halo 1.x", link: "/provider/halo" }, { text: "WordPress", link: "/provider/wordpress" }, diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css new file mode 100644 index 0000000..a2ccd55 --- /dev/null +++ b/docs/.vitepress/theme/custom.css @@ -0,0 +1,13 @@ +p > img { + border-radius: 0.4rem; + box-shadow: 2px 2px 0.4rem 2px rgba(0, 0, 0, 0.3); + overflow: hidden; +} + +.medium-zoom-overlay { + z-index: 20; +} + +.medium-zoom-image { + z-index: 21; +} diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts new file mode 100644 index 0000000..fe6ff99 --- /dev/null +++ b/docs/.vitepress/theme/index.ts @@ -0,0 +1,23 @@ +import DefaultTheme from "vitepress/theme"; +import { onMounted, watch, nextTick } from "vue"; +import "./custom.css"; +import mediumZoom from "medium-zoom"; +import { useRoute } from "vitepress/client"; + +export default { + ...DefaultTheme, + + setup() { + const route = useRoute(); + const initZoom = () => { + mediumZoom("[data-zoomable]", { background: "var(--vp-c-bg)" }); + }; + onMounted(() => { + initZoom(); + }); + watch( + () => route.path, + () => nextTick(() => initZoom()) + ); + }, +}; diff --git a/docs/extend/provider.md b/docs/extend/provider.md index 1f342ca..b457035 100644 --- a/docs/extend/provider.md +++ b/docs/extend/provider.md @@ -14,38 +14,38 @@ 2. 在新建的文件夹中,创建一个 `vue` 文件,用于展示导入数据的界面以及处理、转换导入的数据,如 `HaloMigrateDataParser.vue` 文件。 3. 编写 `HaloMigrateDataParser.vue` 文件,此 vue 模板接收一个 [MigrateData](#migratedata) 类型的数据,用户最终解析完成导入数据后,需要更新此数据以进行下一步操作。后续操作将基于 **MigrateData** 进行。例如 -```ts -defineProps<{ - data: MigrateData; -}>(); - -const emit = defineEmits<{ - (event: "update:data", value: MigrateData): void; -}>(); - -/** - * 必要操作:处理数据处理完成之后,触发 update:data 事件来更新 data。 - */ -const handleDataChange = (data: MigrateData) => { - emit("update:data", data); -}; -``` + ```ts + defineProps<{ + data: MigrateData; + }>(); + + const emit = defineEmits<{ + (event: "update:data", value: MigrateData): void; + }>(); + + /** + * 必要操作:处理数据处理完成之后,触发 update:data 事件来更新 data。 + */ + const handleDataChange = (data: MigrateData) => { + emit("update:data", data); + }; + ``` 4. 在 **console/src/modules** 目录下的 **index.ts** 文件中,为 `providerItems` 新增一个 [Provider](#provider) 对象,例如 -```json - { - name: "Halo", - icon: "https://halo.run/logo", - description: "Halo 1.5 / 1.6 数据迁移", - importComponent: defineAsyncComponent( - () => import("./halo/HaloMigrateDataParser.vue") // 扩展文件 - ), - options: { - attachmentFolderPath: "migrate-from-1.x", // 附件迁移文件夹 - }, - }, -``` + ```json + { + name: "Halo", + icon: "https://halo.run/logo", + description: "Halo 1.5 / 1.6 数据迁移", + importComponent: defineAsyncComponent( + () => import("./halo/HaloMigrateDataParser.vue") // 扩展文件 + ), + options: { + attachmentFolderPath: "migrate-from-1.x", // 附件迁移文件夹 + } + } + ``` ## MigrateData diff --git a/docs/extend/steps.md b/docs/extend/steps.md index 066b1af..632cc5b 100644 --- a/docs/extend/steps.md +++ b/docs/extend/steps.md @@ -9,29 +9,29 @@ 1. 在 `console/src/view/MigrateView.vue` 文件中,找到 **stepItems** 属性,为其新增 [Step](#step) 字段,以 设置附件存储策略 为例如下所示: -```ts - { - key: "attachmentPolicy", // step item slot - name: "设置附件存储策略", // 步骤名称,将会展示在步骤条上 - next: { // 下一步按钮设置 - disabled: computed(() => { // 是否禁止下一步 - return policyMap.value.size === 0; - }), - disabledMessage: "未设置附件存储策略", // 无法进行下一步时,出现的提示 - }, - visible: computed(() => { // 在步骤条中展示当前步骤的条件 - return migrateData.value?.attachments != undefined; - }), - } -``` + ```ts + { + key: "attachmentPolicy", // step item slot + name: "设置附件存储策略", // 步骤名称,将会展示在步骤条上 + next: { // 下一步按钮设置 + disabled: computed(() => { // 是否禁止下一步 + return policyMap.value.size === 0; + }), + disabledMessage: "未设置附件存储策略", // 无法进行下一步时,出现的提示 + }, + visible: computed(() => { // 在步骤条中展示当前步骤的条件 + return migrateData.value ? .attachments != undefined; + }), + } + ``` 2. 设置完上述步骤属性之后,还需要增加目标步骤的界面,在 **MigrateView.vue** 文件中,找到 `Steps` 组件,新建例如 attachmentPolicy 的 slot content,如下所示 -```html - -``` + ```vue + + ``` 在其中编写页面模板及代码逻辑即可。 diff --git a/docs/index.md b/docs/index.md index 8f70e59..e168659 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,61 +1,60 @@ ---- -# https://vitepress.dev/reference/default-theme-home-page -layout: home - -hero: - name: "迁移插件使用文档" - tagline: "Halo 官方迁移插件,支持从 Halo 1.x, WordPress, RSS 等多种导入数据至 Halo 中。" - actions: - - theme: brand - text: 快速开始 - link: /provider/halo - - theme: alt - text: 在 Github 上查看 - link: https://github.com/halo-sigs/plugin-migrate ---- - - - - - - +# plugin-migrate + +支持多种平台的数据迁移,目前已支持: + +1. Halo 1.5 / 1.6 +2. WordPress +3. RSS / Atom 订阅链接 + +## 使用方式 + +1. 下载,目前提供以下两个下载方式: + - GitHub Releases:访问 [Releases](https://github.com/halo-sigs/plugin-migrate/releases) 下载 Assets 中的 JAR 文件。 + - Halo 应用市场: +2. 安装,插件安装和更新方式可参考: +3. 启动插件之后,即可在 Console 的左侧菜单栏看到**迁移**的菜单。 + +## 开发环境 + +```bash +git clone git@github.com:halo-sigs/plugin-migrate.git + +# 或者当你 fork 之后 + +git clone git@github.com:{your_github_id}/plugin-migrate.git +``` + +```bash +cd path/to/plugin-migrate +``` + +```bash +# macOS / Linux +./gradlew pnpmInstall + +# Windows +./gradlew.bat pnpmInstall +``` + +```bash +# macOS / Linux +./gradlew build + +# Windows +./gradlew.bat build +``` + +修改 Halo 配置文件: + +```yaml +halo: + plugin: + runtime-mode: development + classes-directories: + - "build/classes" + - "build/resources" + lib-directories: + - "libs" + fixedPluginPath: + - "/path/to/plugin-migrate" +``` diff --git a/docs/package.json b/docs/package.json index 862145e..b19d9b8 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,10 +1,12 @@ { "scripts": { - "docs:dev": "vitepress dev ", - "docs:build": "vitepress build ", - "docs:preview": "vitepress preview " + "docs:dev": "vitepress dev", + "docs:build": "vitepress build", + "docs:preview": "vitepress preview" }, "dependencies": { - "vitepress": "1.0.0-beta.7" + "medium-zoom": "^1.0.8", + "vitepress": "1.0.0-rc.10", + "vue": "^3.3.4" } } diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index 2cd0c60..9d38cae 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -5,9 +5,15 @@ settings: excludeLinksFromLockfile: false dependencies: + medium-zoom: + specifier: ^1.0.8 + version: 1.0.8 vitepress: - specifier: 1.0.0-beta.7 - version: 1.0.0-beta.7(@algolia/client-search@4.19.1)(search-insights@2.7.0) + specifier: 1.0.0-rc.10 + version: 1.0.0-rc.10(@algolia/client-search@4.19.1)(search-insights@2.7.0) + vue: + specifier: ^3.3.4 + version: 3.3.4 packages: @@ -172,14 +178,14 @@ packages: to-fast-properties: 2.0.0 dev: false - /@docsearch/css@3.5.1: - resolution: {integrity: sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA==} + /@docsearch/css@3.5.2: + resolution: {integrity: sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==} dev: false - /@docsearch/js@3.5.1(@algolia/client-search@4.19.1)(search-insights@2.7.0): - resolution: {integrity: sha512-EXi8de5njxgP6TV3N9ytnGRLG9zmBNTEZjR4VzwPcpPLbZxxTLG2gaFyJyKiFVQxHW/DPlMrDJA3qoRRGEkgZw==} + /@docsearch/js@3.5.2(@algolia/client-search@4.19.1)(search-insights@2.7.0): + resolution: {integrity: sha512-p1YFTCDflk8ieHgFJYfmyHBki1D61+U9idwrLh+GQQMrBSP3DLGKpy0XUJtPjAOPltcVbqsTjiPFfH7JImjUNg==} dependencies: - '@docsearch/react': 3.5.1(@algolia/client-search@4.19.1)(search-insights@2.7.0) + '@docsearch/react': 3.5.2(@algolia/client-search@4.19.1)(search-insights@2.7.0) preact: 10.16.0 transitivePeerDependencies: - '@algolia/client-search' @@ -189,12 +195,13 @@ packages: - search-insights dev: false - /@docsearch/react@3.5.1(@algolia/client-search@4.19.1)(search-insights@2.7.0): - resolution: {integrity: sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ==} + /@docsearch/react@3.5.2(@algolia/client-search@4.19.1)(search-insights@2.7.0): + resolution: {integrity: sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' react: '>= 16.8.0 < 19.0.0' react-dom: '>= 16.8.0 < 19.0.0' + search-insights: '>= 1 < 3' peerDependenciesMeta: '@types/react': optional: true @@ -202,14 +209,16 @@ packages: optional: true react-dom: optional: true + search-insights: + optional: true dependencies: '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1)(search-insights@2.7.0) '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1) - '@docsearch/css': 3.5.1 + '@docsearch/css': 3.5.2 algoliasearch: 4.19.1 + search-insights: 2.7.0 transitivePeerDependencies: - '@algolia/client-search' - - search-insights dev: false /@esbuild/android-arm64@0.18.20: @@ -418,17 +427,6 @@ packages: resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==} dev: false - /@vitejs/plugin-vue@4.2.3(vite@4.4.9)(vue@3.3.4): - resolution: {integrity: sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.0.0 - vue: ^3.2.25 - dependencies: - vite: 4.4.9 - vue: 3.3.4 - dev: false - /@vue/compiler-core@3.3.4: resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} dependencies: @@ -516,20 +514,20 @@ packages: resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} dev: false - /@vueuse/core@10.3.0(vue@3.3.4): - resolution: {integrity: sha512-BEM5yxcFKb5btFjTSAFjTu5jmwoW66fyV9uJIP4wUXXU8aR5Hl44gndaaXp7dC5HSObmgbnR2RN+Un1p68Mf5Q==} + /@vueuse/core@10.4.1(vue@3.3.4): + resolution: {integrity: sha512-DkHIfMIoSIBjMgRRvdIvxsyboRZQmImofLyOHADqiVbQVilP8VVHDhBX2ZqoItOgu7dWa8oXiNnScOdPLhdEXg==} dependencies: '@types/web-bluetooth': 0.0.17 - '@vueuse/metadata': 10.3.0 - '@vueuse/shared': 10.3.0(vue@3.3.4) + '@vueuse/metadata': 10.4.1 + '@vueuse/shared': 10.4.1(vue@3.3.4) vue-demi: 0.14.5(vue@3.3.4) transitivePeerDependencies: - '@vue/composition-api' - vue dev: false - /@vueuse/integrations@10.3.0(focus-trap@7.5.2)(vue@3.3.4): - resolution: {integrity: sha512-Jgiv7oFyIgC6BxmDtiyG/fxyGysIds00YaY7sefwbhCZ2/tjEx1W/1WcsISSJPNI30in28+HC2J4uuU8184ekg==} + /@vueuse/integrations@10.4.1(focus-trap@7.5.2)(vue@3.3.4): + resolution: {integrity: sha512-uRBPyG5Lxoh1A/J+boiioPT3ELEAPEo4t8W6Mr4yTKIQBeW/FcbsotZNPr4k9uz+3QEksMmflWloS9wCnypM7g==} peerDependencies: async-validator: '*' axios: '*' @@ -569,8 +567,8 @@ packages: universal-cookie: optional: true dependencies: - '@vueuse/core': 10.3.0(vue@3.3.4) - '@vueuse/shared': 10.3.0(vue@3.3.4) + '@vueuse/core': 10.4.1(vue@3.3.4) + '@vueuse/shared': 10.4.1(vue@3.3.4) focus-trap: 7.5.2 vue-demi: 0.14.5(vue@3.3.4) transitivePeerDependencies: @@ -578,12 +576,12 @@ packages: - vue dev: false - /@vueuse/metadata@10.3.0: - resolution: {integrity: sha512-Ema3YhNOa4swDsV0V7CEY5JXvK19JI/o1szFO1iWxdFg3vhdFtCtSTP26PCvbUpnUtNHBY2wx5y3WDXND5Pvnw==} + /@vueuse/metadata@10.4.1: + resolution: {integrity: sha512-2Sc8X+iVzeuMGHr6O2j4gv/zxvQGGOYETYXEc41h0iZXIRnRbJZGmY/QP8dvzqUelf8vg0p/yEA5VpCEu+WpZg==} dev: false - /@vueuse/shared@10.3.0(vue@3.3.4): - resolution: {integrity: sha512-kGqCTEuFPMK4+fNWy6dUOiYmxGcUbtznMwBZLC1PubidF4VZY05B+Oht7Jh7/6x4VOWGpvu3R37WHi81cKpiqg==} + /@vueuse/shared@10.4.1(vue@3.3.4): + resolution: {integrity: sha512-vz5hbAM4qA0lDKmcr2y3pPdU+2EVw/yzfRsBdu+6+USGa4PxqSQRYIUC9/NcT06y+ZgaTsyURw2I9qOFaaXHAg==} dependencies: vue-demi: 0.14.5(vue@3.3.4) transitivePeerDependencies: @@ -614,10 +612,6 @@ packages: resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} dev: false - /body-scroll-lock@4.0.0-beta.0: - resolution: {integrity: sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==} - dev: false - /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} dev: false @@ -685,6 +679,10 @@ packages: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} dev: false + /medium-zoom@1.0.8: + resolution: {integrity: sha512-CjFVuFq/IfrdqesAXfg+hzlDKu6A2n80ZIq0Kl9kWjoHh9j1N9Uvk5X0/MmN0hOfm5F9YBswlClhcwnmtwz7gA==} + dev: false + /minisearch@6.1.0: resolution: {integrity: sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg==} dev: false @@ -783,17 +781,15 @@ packages: fsevents: 2.3.2 dev: false - /vitepress@1.0.0-beta.7(@algolia/client-search@4.19.1)(search-insights@2.7.0): - resolution: {integrity: sha512-P9Rw+FXatKIU4fVdtKxqwHl6fby8E/8zE3FIfep6meNgN4BxbWqoKJ6yfuuQQR9IrpQqwnyaBh4LSabyll6tWg==} + /vitepress@1.0.0-rc.10(@algolia/client-search@4.19.1)(search-insights@2.7.0): + resolution: {integrity: sha512-+MsahIWqq5WUEmj6MR4obcKYbT7im07jZPCQPdNJExkeOSbOAJ4xypSLx88x7rvtzWHhHc5aXbOhCRvGEGjFrw==} hasBin: true dependencies: - '@docsearch/css': 3.5.1 - '@docsearch/js': 3.5.1(@algolia/client-search@4.19.1)(search-insights@2.7.0) - '@vitejs/plugin-vue': 4.2.3(vite@4.4.9)(vue@3.3.4) + '@docsearch/css': 3.5.2 + '@docsearch/js': 3.5.2(@algolia/client-search@4.19.1)(search-insights@2.7.0) '@vue/devtools-api': 6.5.0 - '@vueuse/core': 10.3.0(vue@3.3.4) - '@vueuse/integrations': 10.3.0(focus-trap@7.5.2)(vue@3.3.4) - body-scroll-lock: 4.0.0-beta.0 + '@vueuse/core': 10.4.1(vue@3.3.4) + '@vueuse/integrations': 10.4.1(focus-trap@7.5.2)(vue@3.3.4) focus-trap: 7.5.2 mark.js: 8.11.1 minisearch: 6.1.0 diff --git a/docs/provider/halo.md b/docs/provider/halo.md index ad749b8..c2e3684 100644 --- a/docs/provider/halo.md +++ b/docs/provider/halo.md @@ -33,7 +33,7 @@ 在 Halo 1.5.x / 1.6.x 后台的小工具中提供了数据导出的功能,将最新的数据进行备份,然后下载即可。这个数据文件包含了数据库所有的数据,后续我们在 2.0 的导入插件中就是通过这个文件进行数据导入。 -![halo-data-export.png](../img/halo-provider-data-export.png) +![halo-data-export.png](../img/halo-provider-data-export.png){data-zoomable} ## 移动附件 @@ -63,7 +63,8 @@ 1. 点击左侧菜单的迁移进入迁移页面。 2. 在选择渠道步骤中,选择 **Halo**,点击下一步。 - ![halo-provider-migrate-plugin](../img/halo-provider-migrate-plugin.png) + + ![halo-provider-migrate-plugin](../img/halo-provider-migrate-plugin.png){data-zoomable} 3. 在导入数据步骤中,点击 **选择文件** 按钮,选择在 Halo 1.5.x / 1.6.x 导出的数据文件(JSON 格式),之后点击下一步。 4. 如果存在需要迁移的附件,则会出现 **设置附件存储策略** 步骤,此时选择之前创建的存储策略即可。完成之后点击下一步。