halo-admin/src/views/system/Installation.vue

265 lines
16 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<a-row align="middle" class="h-screen" justify="center" type="flex">
<a-col :lg="16" :md="20" :sm="20" :xl="12" :xs="23" :xxl="8">
<div class="card-container animated fadeIn">
<a-card :bordered="false" style="box-shadow: rgba(99, 99, 99, 0.2) 0 2px 8px 0">
<div class="halo-logo">
<img
alt="Halo Logo"
src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj48c3ZnIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIHZpZXdCb3g9IjAgMCAyMTQ0IDg3NyIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxuczpzZXJpZj0iaHR0cDovL3d3dy5zZXJpZi5jb20vIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjI7Ij48cGF0aCBkPSJNMTAyOC4xNiwzMzkuMzMxYzE0OC4yNDksMCAyNjguNjA5LDEyMC4zNiAyNjguNjA5LDI2OC42MDljLTAsMTQ4LjI0OSAtMTIwLjM2LDI2OC42MDggLTI2OC42MDksMjY4LjYwOGMtMTQ4LjI0OSwwIC0yNjguNjA4LC0xMjAuMzU5IC0yNjguNjA4LC0yNjguNjA4Yy0wLC0xNDguMjQ5IDEyMC4zNTksLTI2OC42MDkgMjY4LjYwOCwtMjY4LjYwOVptMCwxMTkuMTUyYzgyLjQ4OCwwIDE0OS40NTcsNjYuOTY5IDE0OS40NTcsMTQ5LjQ1N2MtMCw4Mi40ODcgLTY2Ljk2OSwxNDkuNDU2IC0xNDkuNDU3LDE0OS40NTZjLTgyLjQ4NywwIC0xNDkuNDU2LC02Ni45NjkgLTE0OS40NTYsLTE0OS40NTZjLTAsLTgyLjQ4OCA2Ni45NjksLTE0OS40NTcgMTQ5LjQ1NiwtMTQ5LjQ1N1oiIHN0eWxlPSJmaWxsOnVybCgjX0xpbmVhcjEpOyIvPjxwYXRoIGQ9Ik0xODc0LjU4LDMzOS4zMzFjMTQ4LjI0OSwwIDI2OC42MDgsMTIwLjM2IDI2OC42MDgsMjY4LjYwOWMwLDE0OC4yNDkgLTEyMC4zNTksMjY4LjYwOCAtMjY4LjYwOCwyNjguNjA4Yy0xNDguMjQ5LDAgLTI2OC42MDksLTEyMC4zNTkgLTI2OC42MDksLTI2OC42MDhjMCwtMTQ4LjI0OSAxMjAuMzYsLTI2OC42MDkgMjY4LjYwOSwtMjY4LjYwOVptLTAsMTE5LjE1MmM4Mi40ODcsMCAxNDkuNDU2LDY2Ljk2OSAxNDkuNDU2LDE0OS40NTdjMCw4Mi40ODcgLTY2Ljk2OSwxNDkuNDU2IC0xNDkuNDU2LDE0OS40NTZjLTgyLjQ4OCwwIC0xNDkuNDU3LC02Ni45NjkgLTE0OS40NTcsLTE0OS40NTZjMCwtODIuNDg4IDY2Ljk2OSwtMTQ5LjQ1NyAxNDkuNDU3LC0xNDkuNDU3WiIgc3R5bGU9ImZpbGw6dXJsKCNfTGluZWFyMik7Ii8+PHBhdGggZD0iTTEzMDkuMjcsMzc3LjU4NWMtMCwtMTAuMDgzIC03LjIyMiwtMTguNzE5IC0xNy4xNDYsLTIwLjUwNGMtMTkuNjE4LC0zLjUyOCAtNTEuOSwtOS4zMzQgLTc0LjE3MiwtMTMuMzRjLTYuMDczLC0xLjA5MiAtMTIuMzE4LDAuNTY0IC0xNy4wNTIsNC41MjJjLTQuNzM0LDMuOTU5IC03LjQ2OSw5LjgxMiAtNy40NjksMTUuOTgzYy0wLDkxLjM3NCAtMCw0MDcuMTUzIC0wLDQ5MS40NjljLTAsNS41MjUgMi4xOTUsMTAuODI0IDYuMTAyLDE0LjczMWMzLjkwNywzLjkwNyA5LjIwNiw2LjEwMiAxNC43MzEsNi4xMDJjMjAuOTg3LDAgNTMuMTg2LDAgNzQuMTczLDBjNS41MjUsMCAxMC44MjQsLTIuMTk1IDE0LjczMSwtNi4xMDJjMy45MDcsLTMuOTA3IDYuMTAyLC05LjIwNiA2LjEwMiwtMTQuNzMxYy0wLC04NC40MjUgLTAsLTQwMC4yODYgLTAsLTQ3OC4xM1oiIHN0eWxlPSJmaWxsOnVybCgjX0xpbmVhcjMpOyIvPjxwYXRoIGQ9Ik0xNTQyLjU5LDcyLjAzM2MwLC04LjI4OCAtMy4yOTIsLTE2LjIzNyAtOS4xNTMsLTIyLjA5N2MtNS44NiwtNS44NjEgLTEzLjgwOSwtOS4xNTMgLTIyLjA5NywtOS4xNTNjLTIzLjg2NywtMCAtNTYuNjA5LC0wIC04MC40NzcsLTBjLTguMjg4LC0wIC0xNi4yMzYsMy4yOTIgLTIyLjA5Nyw5LjE1M2MtNS44Niw1Ljg2IC05LjE1MywxMy44MDkgLTkuMTUzLDIyLjA5N2MwLDEzMS43OSAwLDY0MS40NzUgMCw3NzMuMjY1YzAsOC4yODggMy4yOTMsMTYuMjM3IDkuMTUzLDIyLjA5N2M1Ljg2MSw1Ljg2MSAxMy44MDksOS4xNTMgMjIuMDk3LDkuMTUzYzIzLjg2OCwwIDU2LjYxLDAgODAuNDc3LDBjOC4yODgsMCAxNi4yMzcsLTMuMjkyIDIyLjA5NywtOS4xNTNjNS44NjEsLTUuODYgOS4xNTMsLTEzLjgwOSA5LjE1MywtMjIuMDk3YzAsLTEzMS43OSAwLC02NDEuNDc1IDAsLTc3My4yNjVaIiBzdHlsZT0iZmlsbDp1cmwoI19MaW5lYXI0KTtmaWxsLXJ1bGU6bm9uemVybzsiLz48Zz48cGF0aCBkPSJNNTA2LjQwOSw4MjIuMDYzYy0wLDEzLjgxNSA1LjQ5NCwyNy4wNjIgMTUuMjcxLDM2LjgyMWM5Ljc3Nyw5Ljc2IDIzLjAzNCwxNS4yMyAzNi44NDgsMTUuMjA2YzE4LjY3NCwtMC4wMzQgMzkuNzExLC0wLjA3MiA1OC4zNjksLTAuMTA1YzI4LjY5NiwtMC4wNTIgNTEuOTMyLC0yMy4zMjkgNTEuOTMyLC01Mi4wMjZsMCwtNzY5LjU4NmMwLC0xMy43OTggLTUuNDgxLC0yNy4wMzEgLTE1LjIzOCwtMzYuNzg4Yy05Ljc1NiwtOS43NTcgLTIyLjk5LC0xNS4yMzggLTM2Ljc4OCwtMTUuMjM4bC01OC4zNjgsLTBjLTEzLjc5OCwtMCAtMjcuMDMxLDUuNDgxIC0zNi43ODgsMTUuMjM4Yy05Ljc1Nyw5Ljc1NyAtMTUuMjM4LDIyLjk5IC0xNS4yMzgsMzYuNzg4Yy0wLDE1NS4yODYgLTAsNjE0LjI4MyAtMCw3NjkuNjlaIiBzdHlsZT0iZmlsbDp1cmwoI19MaW5lYXI1KTtmaWxsLXJ1bGU6bm9uemVybzsiLz48cGF0aCBkPSJNNjE2Ljc0NiwzMjIuNjYyYzEzLjgxMywwIDI3LjA2MSw1LjQ4NyAzNi44MjksMTUuMjU1YzkuNzY3LDkuNzY4IDE1LjI1NCwyMy4wMTUgMTUuMjU0LDM2LjgyOWMwLDEwNS4xODUgMCwzNDEuODc3IDAsNDQ3LjA2MmMwLDEzLjgxNCAtNS40ODcsMjcuMDYxIC0xNS4yNTQsMzYuODI5Yy05Ljc2OCw5Ljc2NyAtMjMuMDE2LDE1LjI1NSAtMzYuODI5LDE1LjI1NWMtMTguNjMyLC0wIC0zOS42MjIsLTAgLTU4LjI1NCwtMGMtMTMuODEzLC0wIC0yNy4wNjEsLTUuNDg4IC0zNi44MjgsLTE1LjI1NWMtOS43NjgsLTkuNzY4IC0xNS4yNTUsLTIzLjAxNSAtMTUuMjU1LC0zNi44MjljLTAsLTY4LjIyMyAtMCwtMTg3LjE1OSAtMCwtMjU1LjM4M2MtMCwtMTMuODEzIC01LjQ4NywtMjcuMDYxIC0xNS4yNTUsLTM2LjgyOGMtOS43NjcsLTkuNzY4IC0yMy4wMTUsLTE1LjI1NSAtMzYuODI4LC0xNS4yNTVjLTEyOS4yNDksLTAgLTQ1NC4zMjYsLTAgLTQ1NC4zMjYsLTBsMCwtMTkxLjY4bDYxNi43NDYsMFoiIHN0eWxlPSJmaWxsOiMwMDUxYjA7ZmlsbC1ydWxlOm5vbnplcm87Ii8+PHBhdGggZD0iTS0wLDgyMi4xMDFjMCwxMy44MTcgNS40OTcsMjcuMDY3IDE1LjI3NywzNi44MjdjOS43ODEsOS43NiAyMy4wNDMsMTUuMjI5IDM2Ljg2LDE1LjE5OWMxOC42NzUsLTAuMDQgMzkuNzEzLC0wLjA4NSA1OC4zNjgsLTAuMTI0YzI4LjY5LC0wLjA2MiA1MS45MTYsLTIzLjMzNyA1MS45MTYsLTUyLjAyN2MtMCwtMTU1LjIwNSAtMCwtNjE0LjUwOSAtMCwtNzY5LjcxNGMtMCwtMjguNjkgLTIzLjIyNiwtNTEuOTY1IC01MS45MTYsLTUyLjAyNmMtMTguNjU1LC0wLjA0IC0zOS42OTMsLTAuMDg1IC01OC4zNjgsLTAuMTI1Yy0xMy44MTcsLTAuMDI5IC0yNy4wNzksNS40MzkgLTM2Ljg2LDE1LjE5OWMtOS43OCw5Ljc2IC0xNS4yNzcsMjMuMDEgLTE1LjI3NywzNi44MjdsLTAsNzY5Ljk2NFoiIHN0eWxlPSJmaWxsOnVybCgjX0xpbmVhcjYpO2ZpbGwtcnVsZTpub256ZXJvOyIvPjwvZz48ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9Il9MaW5lYXIxIiB4MT0iMCIgeTE9IjAiIHgyPSIxIiB5Mj0iMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNS4xOTgxNGUtMTQsLTg0OC45MjEsODQ4LjkyMSw1LjE5ODE0ZS0xNCwxMzA4LjgsODc1LjM5NykiPjxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwNTBiNTtzdG9wLW9wYWNpdHk6MSIvPjxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzBiODdmZDtzdG9wLW9wYWNpdHk6MSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJfTGluZWFyMiIgeDE9IjAiIHkxPSIwIiB4Mj0iMSIgeTI9IjAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDUuMTk4MTRlLTE0LC04NDguOTIxLDg0OC45MjEsNS4xOTgxNGUtMTQsMTMwOC44LDg3NS4zOTcpIj48c3RvcCBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwMDUwYjU7c3RvcC1vcGFjaXR5OjEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiMwYjg3ZmQ7c3RvcC1vcGFjaXR5OjEiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iX0xpbmVhcjMiIHgxPSIwIiB5MT0iMCIgeDI9IjEiIHkyPSIwIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCg1LjE5ODE0ZS0xNCwtODQ4LjkyMSw4NDguOTIxLDUuMTk4MTRlLTE0LDEzMDguOCw4NzUuMzk3KSI+PHN0b3Agb2Zmc2V0PSIwIiBzdHlsZT0ic3RvcC1jb2xvcjojMDA1MGI1O3N0b3Atb3BhY2l0eToxIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojMGI4N2ZkO3N0b3Atb3BhY2l0eToxIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9Il9MaW5lYXI0IiB4MT0iMCIgeTE9IjAiIHgyPSIxIiB5Mj0iMCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoNS4xOTgxNGUtMTQsLTg0OC45MjEsODQ4LjkyMSw1LjE5ODE0ZS0xNCwxMzA4LjgsODc1LjM5NykiPjxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwNTBiNTtzdG9wLW9wYWNpdHk6MSIvPjxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzBiODdmZDtzdG9wLW9wYWNpdHk6MSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJfTGluZWFyNSIgeDE9IjAiIHkxPSIwIiB4Mj0iMSIgeTI9IjAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0zLjkxODg1ZS0xMyw0NzIuNDU5LC00NzMuODk1LC0zLjkwNjk4ZS0xMyw1ODcuNjE5LC0wLjg2MTY1MSkiPjxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzAwNDhhZjtzdG9wLW9wYWNpdHk6MSIvPjxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzAwMzU4MDtzdG9wLW9wYWNpdHk6MSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJfTGluZWFyNiIgeDE9IjAiIHkxPSIwIiB4Mj0iMSIgeTI9IjAiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDUuNTE4NDhlLTE0LDg5OC41MDYsLTkwMS4yMzYsNS41MDE3NmUtMTQsMTYyLjQyMSwtMTIuMTMzNykiPjxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBiODlmZjtzdG9wLW9wYWNpdHk6MSIvPjxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6IzAwNGViMjtzdG9wLW9wYWNpdHk6MSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjwvc3ZnPg=="
/>
<span>安装向导</span>
</div>
<a-alert :message="`欢迎使用 Halo您正在安装的是 Halo ${VERSION}。`" show-icon type="success" />
<!-- Blogger info -->
<div class="mt-5 mb-5">
<a-radio-group v-model="installationMode">
<a-radio-button value="new"> 全新安装</a-radio-button>
<a-radio-button value="import"> 数据导入</a-radio-button>
</a-radio-group>
</div>
<a-form-model
v-show="isInstallMode"
ref="installationForm"
:model="form.model"
:rules="form.rules"
class="installationForm animated fadeIn"
layout="horizontal"
>
<a-divider dashed orientation="left"> 管理员信息</a-divider>
<a-form-model-item prop="username">
<a-input v-model="form.model.username" placeholder="用户名">
<a-icon slot="prefix" style="color: rgba(0, 0, 0, 0.25)" type="user" />
</a-input>
</a-form-model-item>
<a-form-model-item prop="username">
<a-input v-model="form.model.nickname" placeholder="用户昵称">
<a-icon slot="prefix" style="color: rgba(0, 0, 0, 0.25)" type="user" />
</a-input>
</a-form-model-item>
<a-form-model-item prop="email">
<a-input v-model="form.model.email" placeholder="用户邮箱">
<a-icon slot="prefix" style="color: rgba(0, 0, 0, 0.25)" type="mail" />
</a-input>
</a-form-model-item>
<a-form-model-item prop="password">
<a-input v-model="form.model.password" placeholder="登录密码8-100位" type="password">
<a-icon slot="prefix" style="color: rgba(0, 0, 0, 0.25)" type="lock" />
</a-input>
</a-form-model-item>
<a-form-model-item prop="confirmPassword">
<a-input v-model="form.model.confirmPassword" placeholder="确认登录密码" type="password">
<a-icon slot="prefix" style="color: rgba(0, 0, 0, 0.25)" type="lock" />
</a-input>
</a-form-model-item>
<a-divider dashed orientation="left"> 站点信息</a-divider>
<a-form-model-item prop="url">
<a-input v-model="form.model.url" placeholder="博客地址">
<a-icon slot="prefix" style="color: rgba(0, 0, 0, 0.25)" type="link" />
</a-input>
</a-form-model-item>
<a-form-model-item prop="title">
<a-input v-model="form.model.title" placeholder="博客标题">
<a-icon slot="prefix" style="color: rgba(0, 0, 0, 0.25)" type="book" />
</a-input>
</a-form-model-item>
</a-form-model>
<!-- Data migration -->
<div v-show="isImportMode" class="animated fadeIn">
<FilePondUpload
ref="upload"
:accepts="['application/json']"
:multiple="false"
:uploadHandler="onImportUpload"
label="拖拽或点击选择数据文件<br>请确认是否为 Halo 后台导出的文件。"
name="file"
></FilePondUpload>
</div>
<div class="mt-8">
<ReactiveButton
v-if="isInstallMode"
:errored="form.installErrored"
:loading="form.installing"
block
erroredText="安装失败"
icon="check"
loadedText="安装成功"
size="large"
text="安装"
type="primary"
@callback="handleInstallCallback"
@click="handleInstall"
></ReactiveButton>
<ReactiveButton
v-if="isImportMode"
:errored="form.importErrored"
:loading="form.importing"
block
erroredText="导入失败"
icon="import"
loadedText="导入成功"
size="large"
text="导入"
type="primary"
@callback="handleImportCallback"
@click="handleImport"
></ReactiveButton>
</div>
</a-card>
</div>
</a-col>
</a-row>
</template>
<script>
import apiClient from '@/utils/api-client'
import { mapActions } from 'vuex'
export default {
data() {
const confirmPasswordValidate = (rule, value, callback) => {
if (value !== this.form.model.password) {
callback(new Error('确认密码与所输入的密码不一致'))
} else {
callback()
}
}
return {
installationMode: 'new', // new or import
form: {
model: {},
rules: {
username: [
{ required: true, message: '* 用户名不能为空', trigger: ['change'] },
{ max: 50, message: '* 用户名的字符长度不能超过 50', trigger: ['change'] }
],
nickname: [
{ required: true, message: '* 用户昵称不能为空', trigger: ['change'] },
{ max: 255, message: '* 用户昵称的字符长度不能超过 255', trigger: ['change'] }
],
email: [
{ required: true, message: '* 电子邮件地址不能为空', trigger: ['change'] },
{ max: 127, message: '* 电子邮件地址的字符长度不能超过 127', trigger: ['change'] },
{
pattern: /\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/g,
message: '* 电子邮件地址的格式不正确',
trigger: ['change']
}
],
password: [
{ required: true, message: '* 密码不能为空', trigger: ['change'] },
{ min: 8, max: 100, message: '* 密码的字符长度必须在 8 - 100 之间', trigger: ['change'] }
],
confirmPassword: [
{ required: true, message: '* 确认密码不能为空', trigger: ['change'] },
{ validator: confirmPasswordValidate, trigger: ['change'] }
],
url: [{ required: true, message: '* 博客地址不能为空', trigger: ['change'] }],
title: [{ required: true, message: '* 博客标题不能为空', trigger: ['change'] }]
},
installing: false,
installErrored: false,
importing: false,
importErrored: false,
importData: null
}
}
},
beforeMount() {
this.$set(this.form.model, 'url', window.location.protocol + '//' + window.location.host)
},
computed: {
isInstallMode() {
return this.installationMode === 'new'
},
isImportMode() {
return this.installationMode === 'import'
}
},
methods: {
...mapActions(['installCleanToken', 'fetchIsInstalled']),
handleInstall() {
this.$refs.installationForm.validate(valid => {
if (valid) {
this.form.installing = true
this.installCleanToken(this.form.model)
.then(response => {
this.$log.debug('Installation response', response)
})
.catch(() => {
this.form.installErrored = true
})
.finally(() => {
setTimeout(() => {
this.form.installing = false
}, 400)
this.fetchIsInstalled()
})
}
})
},
handleInstallCallback() {
if (this.form.installErrored) {
this.form.installErrored = false
} else {
this.$message.success('安装成功!')
this.$router.push({ name: 'Login' })
}
},
onImportUpload(data) {
this.$log.debug('Selected data', data)
this.form.importData = data
return new Promise(resolve => {
this.$log.debug('Handle uploading')
resolve()
})
},
handleImport() {
if (!this.form.importData) {
this.$message.warning('请先上传数据文件!')
return
}
this.form.importing = true
apiClient.migration
.migrate(this.form.importData)
.then(() => {
this.$log.debug('Migrated successfully')
})
.catch(() => {
this.form.importErrored = true
})
.finally(() => {
setTimeout(() => {
this.form.importing = false
}, 400)
this.fetchIsInstalled()
})
},
handleImportCallback() {
if (this.form.importErrored) {
this.form.importErrored = false
} else {
this.$message.success('导入成功!')
this.$router.replace({ name: 'Login' })
}
}
}
}
</script>
<style lang="less" scoped>
::v-deep .installationForm {
.ant-divider {
.ant-divider-inner-text {
padding-left: 0;
}
&::before {
width: 0;
}
}
}
</style>