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. 如果存在需要迁移的附件,则会出现 **设置附件存储策略** 步骤,此时选择之前创建的存储策略即可。完成之后点击下一步。