Skip to content

Commit a542e9b

Browse files
committed
Implement data migration tool and enhance KV storage support. Add automatic redirection for legacy data providers, improve user interface for migration settings, and update data handling for Classworks cloud storage. Refactor components for better integration with new storage options.
1 parent c0e33dc commit a542e9b

File tree

11 files changed

+355
-204
lines changed

11 files changed

+355
-204
lines changed

src/App.vue

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,51 @@
1010
</template>
1111

1212
<script setup>
13-
import { onMounted } from 'vue';
13+
import { onMounted, watch } from 'vue';
1414
import { useTheme } from 'vuetify';
1515
import { getSetting } from '@/utils/settings';
16+
import { useRouter, useRoute } from 'vue-router';
1617
1718
const theme = useTheme();
19+
const router = useRouter();
20+
const route = useRoute();
1821
1922
onMounted(() => {
2023
// 应用保存的主题设置
2124
const savedTheme = getSetting('theme.mode');
2225
theme.global.name.value = savedTheme;
26+
27+
// 检查存储提供者类型
28+
checkProviderType();
2329
});
30+
31+
// 检查存储提供者类型,如果是已废弃的类型则重定向
32+
function checkProviderType() {
33+
const currentProvider = getSetting('server.provider');
34+
35+
// 如果是旧的提供者类型且当前不在迁移页面,则重定向到数据迁移页面
36+
if ((currentProvider === 'server' || currentProvider === 'indexedDB') &&
37+
route.path !== '/datamigration') {
38+
console.log('检测到旧的数据提供者类型,正在重定向到数据迁移页面...');
39+
router.push({
40+
path: '/datamigration',
41+
query: {
42+
reason: 'legacy_provider',
43+
provider: currentProvider
44+
}
45+
});
46+
}
47+
}
48+
49+
// 当路由变化时再次检查,确保用户不会绕过重定向
50+
watch(
51+
() => route.path,
52+
(newPath) => {
53+
if (newPath !== '/datamigration') {
54+
checkProviderType();
55+
}
56+
}
57+
);
2458
</script>
2559
<style>
2660

src/components/MigrationTool.vue

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,14 @@
8282
<!-- 统一的数据显示卡片 -->
8383
<v-card class="mb-6">
8484
<v-card-title class="d-flex align-center">
85-
<span>{{ migrationType === 'local' ? '本地数据库内容' : '服务器数据预览' }}</span>
85+
<span>{{ migrationType === 'local' ? '本地数据库内容' : '服务器数据内容' }}</span>
8686
<v-spacer></v-spacer>
8787
<v-btn
8888
color="primary"
8989
@click="migrationType === 'local' ? scanLocalDatabase() : previewServerData()"
9090
:loading="loading || scanning"
9191
>
92-
{{ migrationType === 'local' ? '扫描数据' : '预览数据' }}
92+
{{ migrationType === 'local' ? '扫描数据' : '加载数据' }}
9393
</v-btn>
9494
</v-card-title>
9595
<v-card-text>
@@ -99,7 +99,7 @@
9999
>
100100
{{ migrationType === 'local'
101101
? '尚未扫描本地数据或未找到可迁移的数据。点击"扫描数据"按钮开始扫描。'
102-
: '尚未预览服务器数据或未找到可迁移的数据。点击"预览数据"按钮开始查询。'
102+
: '尚未预览服务器数据或未找到可迁移的数据。点击"加载数据"按钮开始查询。'
103103
}}
104104
</v-alert>
105105

@@ -478,7 +478,8 @@ export default {
478478
const res = await axios.get(homeworkUrl, {
479479
headers: this.getRequestHeaders()
480480
});
481-
if (res.data) {
481+
if (res.data&&res.data.status!=false) {
482+
console.log(res.data);
482483
this.serverItems.push({
483484
type: 'homework',
484485
key: `homework_${this.classNumber}_${dateStr}`,
@@ -624,7 +625,7 @@ export default {
624625
625626
if (itemType === 'config') {
626627
// 配置键名: classNumber/classworks-config
627-
await db.put("kv", JSON.stringify(value), `${this.classNumber}/classworks-config`);
628+
await db.put("kv", JSON.stringify(value), `classworks-config`);
628629
return { success: true, message: '配置已迁移' };
629630
} else {
630631
// 数据键名: classNumber/classworks-data-YYYYMMDD
@@ -644,7 +645,7 @@ export default {
644645
}
645646
}
646647
647-
await db.put("kv", JSON.stringify(value), `${this.classNumber}/classworks-data-${dateStr}`);
648+
await db.put("kv", JSON.stringify(value), `classworks-data-${dateStr}`);
648649
return { success: true, message: `${dateStr} 数据已迁移` };
649650
}
650651
} catch (error) {

src/components/settings/SettingItem.vue

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,10 +169,9 @@ export default {
169169
'dark': '深色'
170170
},
171171
'server.provider': {
172-
'server': '远程服务器',
173-
'indexedDB': '本地存储',
174172
'kv-local': 'KV本地存储',
175-
'kv-server': 'KV远程服务器'
173+
'kv-server': 'KV远程服务器',
174+
'classworkscloud': 'Classworks云端存储'
176175
}
177176
},
178177
// 默认图标映射,按设置类型

src/components/settings/cards/DataProviderSettingsCard.vue

Lines changed: 20 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<settings-card title="数据源设置" icon="mdi-database-cog">
33
<v-list>
44
<!-- 服务器模式设置 -->
5-
<template v-if="currentProvider === 'server' || currentProvider === 'kv-server'">
5+
<template v-if="currentProvider === 'kv-server' || currentProvider === 'classworkscloud'">
66
<v-list-item>
77
<template #prepend>
88
<v-icon icon="mdi-lan-connect" class="mr-3" />
@@ -13,17 +13,29 @@
1313
测试连接
1414
</v-btn>
1515
</template>
16+
</v-list-item><!-- 数据迁移,仅对KV本地存储有效 -->
17+
<v-list-item>
18+
<template #prepend>
19+
<v-icon icon="mdi-database-import" class="mr-3" />
20+
</template>
21+
<v-list-item-title>迁移旧数据</v-list-item-title>
22+
<v-list-item-subtitle>将旧的存储格式数据转移到新的KV存储</v-list-item-subtitle>
23+
<template #append>
24+
<v-btn :loading="migrateLoading" variant="tonal" @click="migrateData">
25+
迁移
26+
</v-btn>
27+
</template>
1628
</v-list-item>
1729
</template>
1830

19-
<!-- IndexedDB设置 -->
20-
<template v-if="currentProvider === 'indexedDB' || currentProvider === 'kv-local'">
31+
<!-- 本地存储设置 -->
32+
<template v-if="currentProvider === 'kv-local'">
2133
<v-list-item>
2234
<template #prepend>
2335
<v-icon icon="mdi-database" class="mr-3" />
2436
</template>
2537
<v-list-item-title>清除数据库缓存</v-list-item-title>
26-
<v-list-item-subtitle>这将清除所有IndexedDB中的数据</v-list-item-subtitle>
38+
<v-list-item-subtitle>这将清除所有本地数据库中的数据</v-list-item-subtitle>
2739
<template #append>
2840
<v-btn color="error" variant="tonal" @click="confirmClearIndexedDB">
2941
清除
@@ -40,8 +52,8 @@
4052
</template>
4153
</v-list-item>
4254

43-
<!-- 显示机器ID,仅对KV本地存储有效 -->
44-
<v-list-item v-if="currentProvider === 'kv-local'">
55+
<!-- 显示机器ID -->
56+
<v-list-item>
4557
<template #prepend>
4658
<v-icon icon="mdi-identifier" class="mr-3" />
4759
</template>
@@ -76,31 +88,6 @@
7688
</v-btn>
7789
</template>
7890
</v-list-item>
79-
80-
<v-list-item>
81-
<template #prepend>
82-
<v-icon icon="mdi-database-sync" class="mr-3" />
83-
</template>
84-
<v-list-item-title>高级数据迁移工具</v-list-item-title>
85-
<v-list-item-subtitle>更强大的数据迁移工具,支持从本地或服务器迁移到KV存储</v-list-item-subtitle>
86-
<template #append>
87-
<v-btn variant="tonal" color="primary" to="/datamigration">
88-
打开
89-
</v-btn>
90-
</template>
91-
</v-list-item>
92-
93-
<v-list-item>
94-
<template #prepend>
95-
<v-icon icon="mdi-lan-connect" class="mr-3" />
96-
</template>
97-
<v-list-item-title>CSES转WakeUP工具</v-list-item-title>
98-
<template #append>
99-
<v-btn variant="tonal" to="/cses2wakeup">
100-
查看
101-
</v-btn>
102-
</template>
103-
</v-list-item>
10491
</v-list>
10592

10693
<!-- 确认对话框 -->
@@ -122,7 +109,6 @@
122109
import SettingsCard from "@/components/SettingsCard.vue";
123110
import { getSetting } from "@/utils/settings";
124111
import axios from "axios";
125-
import { getMachineId } from "@/utils/providers/kvProvider";
126112
127113
export default {
128114
name: "DataProviderSettingsCard",
@@ -147,15 +133,15 @@ export default {
147133
},
148134
149135
isKvProvider() {
150-
return this.currentProvider === 'kv-local' || this.currentProvider === 'kv-server';
136+
return this.currentProvider === 'kv-local' || this.currentProvider === 'kv-server' || this.currentProvider === 'classworkscloud';
151137
}
152138
},
153139
154140
async created() {
155141
// 如果是KV本地存储,获取机器ID
156142
if (this.currentProvider === 'kv-local') {
157143
try {
158-
this.machineId = await getMachineId();
144+
this.machineId = getSetting('device.uuid');
159145
} catch (error) {
160146
console.error("获取机器ID失败:", error);
161147
}

src/components/settings/cards/ServerSettingsCard.vue

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,18 @@
1212
</p>
1313
</v-alert>
1414

15+
<v-alert v-if="isClassworksCloud" type="info" color="success" variant="tonal" class="my-2">
16+
<v-alert-title>Classworks云端存储</v-alert-title>
17+
<p>Classworks云端存储是官方提供的存储解决方案,自动配置了最优的访问设置。</p>
18+
<p>使用此选项时,服务器域名和网站令牌将自动配置,无需手动设置。</p>
19+
</v-alert>
20+
1521
<v-divider class="my-2" />
16-
<setting-item setting-key="server.domain" title="服务器域名" />
22+
<setting-item setting-key="server.domain" title="服务器域名" :disabled="isClassworksCloud" />
1723
<v-divider class="my-2" />
1824
<setting-item setting-key="server.classNumber" title="班号" />
1925
<v-divider class="my-2" />
20-
<setting-item setting-key="server.siteKey" title="网站令牌">
26+
<setting-item setting-key="server.siteKey" title="网站令牌" :disabled="isClassworksCloud">
2127
<template #description>
2228
用于后端验证请求的安全令牌。如需要,请从系统管理员获取。
2329
</template>
@@ -53,8 +59,11 @@ export default {
5359
isKvProvider() {
5460
return this.currentProvider === 'kv-local' || this.currentProvider === 'kv-server';
5561
},
62+
isClassworksCloud() {
63+
return this.currentProvider === 'classworkscloud';
64+
},
5665
useServer() {
57-
return this.currentProvider === 'server' || this.currentProvider === 'kv-server';
66+
return this.currentProvider === 'server' || this.currentProvider === 'kv-server' || this.currentProvider === 'classworkscloud';
5867
}
5968
}
6069
};

0 commit comments

Comments
 (0)