1
0
mirror of https://github.com/ZeroCatDev/Classworks.git synced 2025-10-22 02:03:10 +00:00
Classworks/src/pages/DataMigration.vue
copilot-swe-agent[bot] 92a2019566 Use kvToken instead of siteKey in examschedule button cloud URL
Co-authored-by: Sunwuyuan <88357633+Sunwuyuan@users.noreply.github.com>
2025-10-14 10:21:58 +00:00

235 lines
6.4 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<v-container>
<v-row>
<v-col cols="12">
<div class="d-flex align-center mb-6">
<v-icon
size="x-large"
color="primary"
class="mr-3"
>
mdi-database-sync
</v-icon>
<div>
<h1 class="text-h4">
数据迁移工具
</h1>
<div class="text-subtitle-1 text-grey">
将现有数据迁移至 KV 存储系统
</div>
</div>
</div>
<v-card
class="mb-6"
variant="tonal"
color="info"
density="compact"
>
<v-card-text class="d-flex align-center">
<v-icon
color="info"
class="mr-2"
>
mdi-information-outline
</v-icon>
<span>使用此工具可以将数据从旧存储系统迁移到新的 KV
存储系统选择本地或云端迁移以确保数据不会丢失</span>
</v-card-text>
</v-card>
<MigrationTool ref="migrationTool" />
</v-col>
</v-row>
<!-- 一键迁移对话框 -->
<v-dialog
v-model="showMigrationDialog"
max-width="500"
persistent
>
<v-card>
<v-card-title class="text-h5 d-flex align-center">
<v-icon
color="primary"
size="large"
class="mr-3"
>
mdi-database-sync
</v-icon>
一键数据迁移
</v-card-title>
<v-card-text class="mt-4">
<p>
系统将自动读取您的配置并将过去半年的数据迁移至Classworks
KV数据库中
</p>
<v-alert
color="info"
variant="outlined"
density="compact"
class="mt-4"
icon="mdi-information-outline"
>
<ul class="ml-3 mt-1">
<li>数据源: {{ dataSourceText }}</li>
<li>班级: {{ classNumber }}</li>
<li>服务器: {{ serverDomain || "本地存储" }}</li>
<li>
迁移范围: {{ formatDate(sixMonthsAgo) }}
{{ formatDate(today) }}
</li>
</ul>
</v-alert>
</v-card-text>
<v-card-actions>
<v-spacer />
<v-btn
color="grey-darken-1"
variant="text"
@click="showMigrationDialog = false"
>
稍后再说
</v-btn>
<v-btn
color="primary"
size="large"
variant="elevated"
:loading="isAutoMigrating"
:disabled="isAutoMigrating"
@click="startAutoMigration"
>
<v-icon
left
class="mr-2"
>
mdi-database-export
</v-icon>
开始一键迁移
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-container>
</template>
<script>
import MigrationTool from "@/components/MigrationTool.vue";
import { getSetting, setSetting } from "@/utils/settings";
export default {
name: "DataMigrationPage",
components: {
MigrationTool,
},
data() {
const today = new Date();
const sixMonthsAgo = new Date();
sixMonthsAgo.setMonth(today.getMonth() - 3);
return {
showMigrationDialog: false,
isAutoMigrating: false,
today,
sixMonthsAgo,
classNumber: "",
serverDomain: "",
dataProvider: "",
};
},
computed: {
dataSourceText() {
switch (this.dataProvider) {
case "server":
return "服务器";
case "indexeddb":
return "本地数据库";
case "kv-local":
return "本地 KV 存储";
case "kv-server":
return "远程 KV 存储";
case "classworkscloud":
return "Classworks 云";
default:
return "未知来源";
}
},
},
async mounted() {
this.loadSettings();
if (this.serverDomain == "https://class.wuyuan.dev") {
await this.startAutoMigration();
this.$router.push("/");
}
},
methods: {
loadSettings() {
this.classNumber = getSetting("server.classNumber");
this.serverDomain = getSetting("server.domain");
this.dataProvider = getSetting("server.provider");
this.showMigrationDialog =
this.dataProvider === "server" || this.dataProvider === "indexeddb";
},
formatDate(date) {
return date.toLocaleDateString();
},
async startAutoMigration() {
if (!this.$refs.migrationTool) {
console.error("MigrationTool组件引用不可用");
return;
}
this.isAutoMigrating = true;
try {
// 设置迁移工具的参数
const migrationTool = this.$refs.migrationTool;
migrationTool.classNumber = this.classNumber;
migrationTool.migrationType =
this.dataProvider === "server" ? "server" : "local";
migrationTool.serverUrl = this.serverDomain;
migrationTool.targetStorage = "kv-server";
//migrationTool.targetServerUrl = this.serverDomain;
// 设置半年的日期范围
migrationTool.startDate = this.formatDateString(this.sixMonthsAgo);
migrationTool.endDate = this.formatDateString(this.today);
// 根据数据源类型进行相应操作
if (this.dataProvider === "server") {
// 预览服务器数据
await migrationTool.previewServerData();
} else {
// 扫描本地数据库
await migrationTool.scanLocalDatabase();
}
// 开始迁移
if (migrationTool.displayItems.length > 0) {
await migrationTool.startMigration();
} else {
console.warn("没有找到可迁移的数据");
}
setSetting("server.provider", "classworkscloud");
} catch (error) {
console.error("自动迁移失败:", error);
} finally {
this.isAutoMigrating = false;
this.showMigrationDialog = false;
}
},
formatDateString(date) {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, "0");
const day = String(date.getDate()).padStart(2, "0");
return `${year}-${month}-${day}`;
},
},
metaInfo: {
title: "数据迁移工具",
},
};
</script>