Refactor MigrationTool and data handling to support student list migration. Update index.vue and settings.vue to streamline configuration loading and improve data provider integration. Remove deprecated local and server storage providers for cleaner architecture.

This commit is contained in:
SunWuyuan
2025-05-10 21:49:18 +08:00
parent a542e9b91f
commit 3c722875dd
8 changed files with 209 additions and 544 deletions
+34 -36
View File
@@ -625,7 +625,6 @@
import MessageLog from "@/components/MessageLog.vue";
import RandomPicker from "@/components/RandomPicker.vue"; // 导入随机点名组件
import dataProvider from "@/utils/dataProvider";
import { kvProvider } from "@/utils/providers/kvProvider";
import {
getSetting,
watchSettings,
@@ -635,9 +634,9 @@ import {
import { useDisplay } from "vuetify";
import "../styles/index.scss";
import "../styles/transitions.scss"; // 添加新的样式导入
import { debounce, throttle } from "@/utils/debounce";
import "../styles/global.scss";
import { pinyin } from "pinyin-pro";
import { debounce, throttle } from "@/utils/debounce";
export default {
name: "Classworks 作业板",
@@ -811,7 +810,13 @@ export default {
return getSetting("edit.blockNonTodayAutoSave");
},
isToday() {
const today = new Date().toISOString().split("T")[0];
const today = (() => {
const now = new Date();
const yyyy = now.getFullYear();
const mm = String(now.getMonth() + 1).padStart(2, "0");
const dd = String(now.getDate()).padStart(2, "0");
return `${yyyy}${mm}${dd}`;
})();
return this.state.dateString === today;
},
canAutoSave() {
@@ -1044,7 +1049,7 @@ export default {
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}`;
return `${year}${month}${day}`;
},
getToday() {
@@ -1055,17 +1060,6 @@ export default {
// 尝试从URL读取配置
const configApplied = await this.parseUrlConfig();
// 如果没有从URL应用配置,使用本地设置
if (!configApplied) {
this.provider = getSetting("server.provider");
const domain = getSetting("server.domain");
const classNum = getSetting("server.classNumber");
this.dataKey =
this.provider === "server" ? `${domain}/${classNum}` : classNum;
this.state.classNumber = classNum;
}
// 从 URL 获取日期,如果没有则使用今天的日期
const urlParams = new URLSearchParams(window.location.search);
const dateFromUrl = urlParams.get("date");
@@ -1077,7 +1071,13 @@ export default {
this.state.selectedDate = this.state.dateString;
this.state.isToday =
this.formatDate(currentDate) === this.formatDate(today);
// 如果没有从URL应用配置,使用本地设置
if (!configApplied) {
this.provider = getSetting("server.provider");
const classNum = getSetting("server.classNumber");
this.state.classNumber = classNum;
}
await Promise.all([this.downloadData(), this.loadConfig()]);
},
@@ -1087,8 +1087,7 @@ export default {
try {
this.loading.download = true;
const response = await dataProvider.loadData(
this.dataKey,
this.state.dateString
"classworks-data-" + this.state.dateString
);
if (!response.success) {
@@ -1192,9 +1191,8 @@ export default {
try {
this.loading.upload = true;
const response = await dataProvider.saveData(
this.dataKey,
this.state.boardData,
this.state.dateString
"classworks-data-" + this.state.dateString,
this.state.boardData
);
if (!response.success) {
@@ -1210,22 +1208,23 @@ export default {
async loadConfig() {
try {
// 使用新的kvProvider直接加载配置
const provider = getSetting("server.provider");
const useServer = provider === "kv-server" || provider === "classworkscloud";
let response;
try {
// Try to get student list from the dedicated key
const response = await dataProvider.loadData("classworks-list-main");
if (useServer) {
response = await kvProvider.server.loadConfig();
} else {
response = await kvProvider.local.loadConfig();
if (response.success && Array.isArray(response.data)) {
// Transform the data into a simple list of names
this.state.studentList = response.data.map(
(student) => student.name
);
return;
}
} catch (error) {
console.warn(
"Failed to load student list from dedicated key, falling back to config",
error
);
}
if (!response.success) {
throw new Error(response.error.message);
}
this.state.studentList = response.data.studentList || [];
} catch (error) {
console.error("加载配置失败:", error);
this.$message.error("加载配置失败", error.message);
@@ -1326,11 +1325,10 @@ export default {
updateBackendUrl() {
const provider = getSetting("server.provider");
const domain = getSetting("server.domain");
const classNum = getSetting("server.classNumber");
this.provider = provider;
this.dataKey = provider === "server" || provider === "classworkscloud" ? `${domain}/${classNum}` : classNum;
this.state.classNumber = classNum;
},
+33 -24
View File
@@ -190,6 +190,8 @@ import '../styles/settings.scss';
import { kvProvider } from '@/utils/providers/kvProvider';
import SettingsExplorer from '@/components/settings/SettingsExplorer.vue';
import SettingsLinkGenerator from '@/components/SettingsLinkGenerator.vue';
import dataProvider from '@/utils/dataProvider';
export default {
name: 'Settings',
components: {
@@ -376,25 +378,36 @@ export default {
throw new Error('请先设置班号');
}
const provider = getSetting('server.provider');
const useServer = provider === 'kv-server' || provider === 'classworkscloud';
let response;
if (useServer) {
response = await kvProvider.server.loadConfig();
} else {
response = await kvProvider.local.loadConfig();
try {
// Try to get student list from the dedicated key
const response = await dataProvider.loadData('classworks-list-main');
if (response.success && Array.isArray(response.data)) {
// Transform the data into a simple list of names
this.studentData.list = response.data.map(student => student.name);
this.studentData.text = this.studentData.list.join('\n');
this.lastSavedData = [...this.studentData.list];
this.hasUnsavedChanges = false;
return;
}
} catch (error) {
console.warn('Failed to load student list from dedicated key, falling back to config', error);
}
if (!response.success) {
throw new Error(response.error.message);
}
// Fall back to retrieving from config if the dedicated key is not available
const response = await kvProvider.local.loadConfig();
if (response.data && Array.isArray(response.data.studentList)) {
if (response.success && response.data && Array.isArray(response.data.studentList)) {
this.studentData.list = response.data.studentList;
this.studentData.text = response.data.studentList.join('\n');
this.lastSavedData = [...response.data.studentList];
this.hasUnsavedChanges = false;
} else {
// If no student list is found anywhere, initialize with empty list
this.studentData.list = [];
this.studentData.text = '';
this.lastSavedData = [];
}
} catch (error) {
console.error('加载学生列表失败:', error);
@@ -413,22 +426,18 @@ export default {
throw new Error('请先设置班号');
}
const provider = getSetting('server.provider');
const useServer = provider === 'kv-server' || provider === 'classworkscloud';
let response;
if (useServer) {
response = await kvProvider.server.saveConfig({
studentList: this.studentData.list,
});
} else {
response = await kvProvider.local.saveConfig({
studentList: this.studentData.list,
});
}
// Convert the list of names to the new format with IDs
const formattedStudentList = this.studentData.list.map((name, index) => ({
id: index + 1,
name
}));
// Save the student list to the dedicated key
const response = await dataProvider.saveData("classworks-list-main", formattedStudentList);
if (!response.success) {
throw new Error(response.error.message);
throw new Error(response.error?.message || "保存失败");
}
// 更新保存状态