Skip to content

Commit 3c72287

Browse files
committed
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.
1 parent a542e9b commit 3c72287

File tree

8 files changed

+216
-551
lines changed

8 files changed

+216
-551
lines changed

src/components/MigrationTool.vue

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -624,8 +624,27 @@ export default {
624624
const itemType = this.getItemType(item);
625625
626626
if (itemType === 'config') {
627-
// 配置键名: classNumber/classworks-config
628-
await db.put("kv", JSON.stringify(value), `classworks-config`);
627+
// Handle student list migration
628+
if (value.studentList && Array.isArray(value.studentList)) {
629+
// Extract studentList from config and save it separately
630+
const formattedStudentList = value.studentList.map((name, index) => ({
631+
id: index + 1,
632+
name
633+
}));
634+
635+
// Store the student list under the new key
636+
await db.put("kv", JSON.stringify(formattedStudentList), 'classworks-list-main');
637+
638+
// Remove studentList from config
639+
const configWithoutStudentList = { ...value };
640+
delete configWithoutStudentList.studentList;
641+
642+
// Save the modified config
643+
await db.put("kv", JSON.stringify(configWithoutStudentList), `classworks-config`);
644+
} else {
645+
// Just store the config as is
646+
await db.put("kv", JSON.stringify(value), `classworks-config`);
647+
}
629648
return { success: true, message: '配置已迁移' };
630649
} else {
631650
// 数据键名: classNumber/classworks-data-YYYYMMDD
@@ -661,10 +680,33 @@ export default {
661680
const itemType = this.getItemType(item);
662681
663682
if (itemType === 'config') {
664-
// 配置
665-
await axios.post(`${this.targetServerUrl}/${this.machineId}/classworks-config`, value, {
666-
headers: this.getRequestHeaders()
667-
});
683+
// Handle student list migration
684+
if (value.studentList && Array.isArray(value.studentList)) {
685+
// Extract studentList from config
686+
const formattedStudentList = value.studentList.map((name, index) => ({
687+
id: index + 1,
688+
name
689+
}));
690+
691+
// Store the student list under the new key
692+
await axios.post(`${this.targetServerUrl}/${this.machineId}/classworks-list-main`, formattedStudentList, {
693+
headers: this.getRequestHeaders()
694+
});
695+
696+
// Remove studentList from config
697+
const configWithoutStudentList = { ...value };
698+
delete configWithoutStudentList.studentList;
699+
700+
// Save the modified config
701+
await axios.post(`${this.targetServerUrl}/${this.machineId}/classworks-config`, configWithoutStudentList, {
702+
headers: this.getRequestHeaders()
703+
});
704+
} else {
705+
// Just store the config as is
706+
await axios.post(`${this.targetServerUrl}/${this.machineId}/classworks-config`, value, {
707+
headers: this.getRequestHeaders()
708+
});
709+
}
668710
return { success: true, message: '配置已迁移到服务器' };
669711
} else {
670712
// 数据

src/pages/index.vue

Lines changed: 35 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,6 @@
625625
import MessageLog from "@/components/MessageLog.vue";
626626
import RandomPicker from "@/components/RandomPicker.vue"; // 导入随机点名组件
627627
import dataProvider from "@/utils/dataProvider";
628-
import { kvProvider } from "@/utils/providers/kvProvider";
629628
import {
630629
getSetting,
631630
watchSettings,
@@ -635,9 +634,9 @@ import {
635634
import { useDisplay } from "vuetify";
636635
import "../styles/index.scss";
637636
import "../styles/transitions.scss"; // 添加新的样式导入
638-
import { debounce, throttle } from "@/utils/debounce";
639637
import "../styles/global.scss";
640638
import { pinyin } from "pinyin-pro";
639+
import { debounce, throttle } from "@/utils/debounce";
641640
642641
export default {
643642
name: "Classworks 作业板",
@@ -811,7 +810,13 @@ export default {
811810
return getSetting("edit.blockNonTodayAutoSave");
812811
},
813812
isToday() {
814-
const today = new Date().toISOString().split("T")[0];
813+
const today = (() => {
814+
const now = new Date();
815+
const yyyy = now.getFullYear();
816+
const mm = String(now.getMonth() + 1).padStart(2, "0");
817+
const dd = String(now.getDate()).padStart(2, "0");
818+
return `${yyyy}${mm}${dd}`;
819+
})();
815820
return this.state.dateString === today;
816821
},
817822
canAutoSave() {
@@ -1044,7 +1049,7 @@ export default {
10441049
const year = date.getFullYear();
10451050
const month = String(date.getMonth() + 1).padStart(2, "0");
10461051
const day = String(date.getDate()).padStart(2, "0");
1047-
return `${year}-${month}-${day}`;
1052+
return `${year}${month}${day}`;
10481053
},
10491054
10501055
getToday() {
@@ -1055,17 +1060,6 @@ export default {
10551060
// 尝试从URL读取配置
10561061
const configApplied = await this.parseUrlConfig();
10571062
1058-
// 如果没有从URL应用配置,使用本地设置
1059-
if (!configApplied) {
1060-
this.provider = getSetting("server.provider");
1061-
const domain = getSetting("server.domain");
1062-
const classNum = getSetting("server.classNumber");
1063-
1064-
this.dataKey =
1065-
this.provider === "server" ? `${domain}/${classNum}` : classNum;
1066-
this.state.classNumber = classNum;
1067-
}
1068-
10691063
// 从 URL 获取日期,如果没有则使用今天的日期
10701064
const urlParams = new URLSearchParams(window.location.search);
10711065
const dateFromUrl = urlParams.get("date");
@@ -1077,7 +1071,13 @@ export default {
10771071
this.state.selectedDate = this.state.dateString;
10781072
this.state.isToday =
10791073
this.formatDate(currentDate) === this.formatDate(today);
1074+
// 如果没有从URL应用配置,使用本地设置
1075+
if (!configApplied) {
1076+
this.provider = getSetting("server.provider");
1077+
const classNum = getSetting("server.classNumber");
10801078
1079+
this.state.classNumber = classNum;
1080+
}
10811081
await Promise.all([this.downloadData(), this.loadConfig()]);
10821082
},
10831083
@@ -1087,8 +1087,7 @@ export default {
10871087
try {
10881088
this.loading.download = true;
10891089
const response = await dataProvider.loadData(
1090-
this.dataKey,
1091-
this.state.dateString
1090+
"classworks-data-" + this.state.dateString
10921091
);
10931092
10941093
if (!response.success) {
@@ -1192,9 +1191,8 @@ export default {
11921191
try {
11931192
this.loading.upload = true;
11941193
const response = await dataProvider.saveData(
1195-
this.dataKey,
1196-
this.state.boardData,
1197-
this.state.dateString
1194+
"classworks-data-" + this.state.dateString,
1195+
this.state.boardData
11981196
);
11991197
12001198
if (!response.success) {
@@ -1210,22 +1208,23 @@ export default {
12101208
12111209
async loadConfig() {
12121210
try {
1213-
// 使用新的kvProvider直接加载配置
1214-
const provider = getSetting("server.provider");
1215-
const useServer = provider === "kv-server" || provider === "classworkscloud";
1216-
let response;
1217-
1218-
if (useServer) {
1219-
response = await kvProvider.server.loadConfig();
1220-
} else {
1221-
response = await kvProvider.local.loadConfig();
1222-
}
1223-
1224-
if (!response.success) {
1225-
throw new Error(response.error.message);
1211+
try {
1212+
// Try to get student list from the dedicated key
1213+
const response = await dataProvider.loadData("classworks-list-main");
1214+
1215+
if (response.success && Array.isArray(response.data)) {
1216+
// Transform the data into a simple list of names
1217+
this.state.studentList = response.data.map(
1218+
(student) => student.name
1219+
);
1220+
return;
1221+
}
1222+
} catch (error) {
1223+
console.warn(
1224+
"Failed to load student list from dedicated key, falling back to config",
1225+
error
1226+
);
12261227
}
1227-
1228-
this.state.studentList = response.data.studentList || [];
12291228
} catch (error) {
12301229
console.error("加载配置失败:", error);
12311230
this.$message.error("加载配置失败", error.message);
@@ -1326,11 +1325,10 @@ export default {
13261325
13271326
updateBackendUrl() {
13281327
const provider = getSetting("server.provider");
1329-
const domain = getSetting("server.domain");
13301328
const classNum = getSetting("server.classNumber");
13311329
13321330
this.provider = provider;
1333-
this.dataKey = provider === "server" || provider === "classworkscloud" ? `${domain}/${classNum}` : classNum;
1331+
13341332
this.state.classNumber = classNum;
13351333
},
13361334

src/pages/settings.vue

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,8 @@ import '../styles/settings.scss';
190190
import { kvProvider } from '@/utils/providers/kvProvider';
191191
import SettingsExplorer from '@/components/settings/SettingsExplorer.vue';
192192
import SettingsLinkGenerator from '@/components/SettingsLinkGenerator.vue';
193+
import dataProvider from '@/utils/dataProvider';
194+
193195
export default {
194196
name: 'Settings',
195197
components: {
@@ -376,25 +378,36 @@ export default {
376378
throw new Error('请先设置班号');
377379
}
378380
379-
const provider = getSetting('server.provider');
380-
const useServer = provider === 'kv-server' || provider === 'classworkscloud';
381-
let response;
382381
383-
if (useServer) {
384-
response = await kvProvider.server.loadConfig();
385-
} else {
386-
response = await kvProvider.local.loadConfig();
382+
try {
383+
// Try to get student list from the dedicated key
384+
const response = await dataProvider.loadData('classworks-list-main');
385+
386+
if (response.success && Array.isArray(response.data)) {
387+
// Transform the data into a simple list of names
388+
this.studentData.list = response.data.map(student => student.name);
389+
this.studentData.text = this.studentData.list.join('\n');
390+
this.lastSavedData = [...this.studentData.list];
391+
this.hasUnsavedChanges = false;
392+
return;
393+
}
394+
} catch (error) {
395+
console.warn('Failed to load student list from dedicated key, falling back to config', error);
387396
}
388397
389-
if (!response.success) {
390-
throw new Error(response.error.message);
391-
}
398+
// Fall back to retrieving from config if the dedicated key is not available
399+
const response = await kvProvider.local.loadConfig();
392400
393-
if (response.data && Array.isArray(response.data.studentList)) {
401+
if (response.success && response.data && Array.isArray(response.data.studentList)) {
394402
this.studentData.list = response.data.studentList;
395403
this.studentData.text = response.data.studentList.join('\n');
396404
this.lastSavedData = [...response.data.studentList];
397405
this.hasUnsavedChanges = false;
406+
} else {
407+
// If no student list is found anywhere, initialize with empty list
408+
this.studentData.list = [];
409+
this.studentData.text = '';
410+
this.lastSavedData = [];
398411
}
399412
} catch (error) {
400413
console.error('加载学生列表失败:', error);
@@ -413,22 +426,18 @@ export default {
413426
throw new Error('请先设置班号');
414427
}
415428
416-
const provider = getSetting('server.provider');
417-
const useServer = provider === 'kv-server' || provider === 'classworkscloud';
418-
let response;
419429
420-
if (useServer) {
421-
response = await kvProvider.server.saveConfig({
422-
studentList: this.studentData.list,
423-
});
424-
} else {
425-
response = await kvProvider.local.saveConfig({
426-
studentList: this.studentData.list,
427-
});
428-
}
430+
// Convert the list of names to the new format with IDs
431+
const formattedStudentList = this.studentData.list.map((name, index) => ({
432+
id: index + 1,
433+
name
434+
}));
435+
436+
// Save the student list to the dedicated key
437+
const response = await dataProvider.saveData("classworks-list-main", formattedStudentList);
429438
430439
if (!response.success) {
431-
throw new Error(response.error.message);
440+
throw new Error(response.error?.message || "保存失败");
432441
}
433442
434443
// 更新保存状态

src/utils/dataProvider.js

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,27 @@ export const formatError = (message, code = "UNKNOWN_ERROR") => ({
1515
// Main data provider with simplified API
1616
export default {
1717
// Provider API methods
18-
loadData: async (key, date) => {
18+
loadData: async (key) => {
1919
const provider = getSetting("server.provider");
20-
const useServer = provider === "kv-server" || provider === "classworkscloud";
20+
const useServer =
21+
provider === "kv-server" || provider === "classworkscloud";
2122

2223
if (useServer) {
23-
return kvProvider.server.loadData(key, date);
24+
return kvProvider.server.loadData(key);
2425
} else {
25-
return kvProvider.local.loadData(date);
26+
return kvProvider.local.loadData(key);
2627
}
2728
},
2829

29-
saveData: async (key, data, date) => {
30+
saveData: async (key, data) => {
3031
const provider = getSetting("server.provider");
31-
const useServer = provider === "kv-server" || provider === "classworkscloud";
32+
const useServer =
33+
provider === "kv-server" || provider === "classworkscloud";
3234

3335
if (useServer) {
34-
return kvProvider.server.saveData(key, data, date);
36+
return kvProvider.server.saveData(key, data);
3537
} else {
36-
return kvProvider.local.saveData(data, date);
38+
return kvProvider.local.saveData(key, data);
3739
}
3840
},
3941
};

0 commit comments

Comments
 (0)