1
0
mirror of https://github.com/ZeroCatDev/Classworks.git synced 2025-07-04 18:39:22 +00:00
This commit is contained in:
SunWuyuan 2025-02-28 21:37:25 +08:00
parent 9f3920e8b7
commit a3decdb6d8
No known key found for this signature in database
GPG Key ID: A6A54CF66F56BB64

View File

@ -32,10 +32,99 @@
<v-col cols="12"> <v-col cols="12">
<v-card> <v-card>
<v-card-title>云端学生列表设置</v-card-title> <v-card-title class="d-flex align-center">
学生列表设置
<v-spacer />
<v-btn
variant="text"
prepend-icon="mdi-code-braces"
@click="showAdvancedEdit = !showAdvancedEdit"
>
{{ showAdvancedEdit ? '基础编辑' : '高级编辑' }}
</v-btn>
</v-card-title>
<v-card-text> <v-card-text>
<v-textarea v-model="students" label="学生列表" required /> <v-expand-transition>
<v-btn color="primary" @click="saveStudents">保存</v-btn> <div v-if="!showAdvancedEdit">
<v-row class="mb-4">
<v-col cols="12" sm="6" md="4">
<v-text-field
v-model="newStudent"
label="添加学生"
placeholder="输入学生姓名"
hide-details
@keyup.enter="addStudent"
>
<template #append>
<v-btn
icon="mdi-plus"
variant="text"
:disabled="!newStudent.trim()"
@click="addStudent"
/>
</template>
</v-text-field>
</v-col>
</v-row>
<v-row>
<v-col
v-for="(student, index) in studentsList"
:key="index"
cols="12"
sm="6"
md="4"
lg="3"
>
<v-card variant="outlined" class="student-card">
<v-card-text class="d-flex align-center">
<span class="mr-2">{{ index + 1 }}.</span>
<span class="text-body-1 flex-grow-1">{{ student }}</span>
<v-btn
icon="mdi-delete"
variant="text"
color="error"
size="small"
@click="removeStudent(index)"
/>
</v-card-text>
</v-card>
</v-col>
</v-row>
</div>
</v-expand-transition>
<v-expand-transition>
<div v-if="showAdvancedEdit">
<v-textarea
v-model="students"
label="学生列表(每行一个名字)"
hint="使用文本编辑模式批量编辑学生名单"
persistent-hint
/>
</div>
</v-expand-transition>
<v-row class="mt-4">
<v-col cols="12" class="d-flex gap-2">
<v-btn
color="primary"
prepend-icon="mdi-content-save"
@click="saveStudents"
>
保存
</v-btn>
<v-btn
color="error"
variant="outlined"
prepend-icon="mdi-refresh"
@click="reloadStudentList"
>
重置
</v-btn>
</v-col>
</v-row>
</v-card-text> </v-card-text>
</v-card> </v-card>
</v-col> </v-col>
@ -189,6 +278,8 @@ export default {
fontSize: '28', fontSize: '28',
autoSave: false, autoSave: false,
refreshBeforeEdit: false, refreshBeforeEdit: false,
showAdvancedEdit: false,
newStudent: '',
}; };
}, },
@ -196,6 +287,21 @@ export default {
this.loadSettings(); this.loadSettings();
}, },
watch: {
students: {
handler(newVal) {
this.studentsList = newVal.split('\n').filter(s => s.trim());
},
immediate: true
},
studentsList: {
handler(newVal) {
this.students = newVal.join('\n');
},
deep: true
}
},
methods: { methods: {
loadSettings() { loadSettings() {
const savedDomain = localStorage.getItem('backendServerDomain'); const savedDomain = localStorage.getItem('backendServerDomain');
@ -210,6 +316,7 @@ export default {
if (localStorage.getItem('studentList')) { if (localStorage.getItem('studentList')) {
this.students = localStorage.getItem('studentList').replace(/,/g, '\n'); this.students = localStorage.getItem('studentList').replace(/,/g, '\n');
this.studentsList = this.students.split('\n').filter(s => s.trim());
} }
this.autoRefresh = localStorage.getItem('autoRefresh') === 'true'; this.autoRefresh = localStorage.getItem('autoRefresh') === 'true';
@ -252,16 +359,23 @@ export default {
async saveStudents() { async saveStudents() {
try { try {
this.studentsList = this.students.split('\n'); const domain = localStorage.getItem('backendServerDomain');
await axios.put(`${this.serverDomain}/students`, { const classNum = localStorage.getItem('classNumber');
if (!domain || !classNum) {
throw new Error('请先设置服务器域名和班号');
}
await axios.put(`${domain}/${classNum}/students`, {
studentList: this.studentsList, studentList: this.studentsList,
id: 1, id: 1,
}); });
localStorage.setItem('studentList', this.students);
localStorage.setItem('studentList', this.studentsList.join(','));
this.showMessage('保存成功'); this.showMessage('保存成功');
} catch (error) { } catch (error) {
console.error(error); console.error(error);
this.showMessage('保存失败,请检查学生列表'); this.showMessage(error.message || '保存失败,请检查服务器设置和学生列表');
} }
}, },
@ -303,6 +417,28 @@ export default {
); );
}, },
addStudent() {
const student = this.newStudent.trim();
if (student && !this.studentsList.includes(student)) {
this.studentsList.push(student);
this.newStudent = '';
}
},
removeStudent(index) {
this.studentsList.splice(index, 1);
},
reloadStudentList() {
const savedList = localStorage.getItem('studentList');
if (savedList) {
this.students = savedList.replace(/,/g, '\n');
} else {
this.students = '';
this.studentsList = [];
}
},
showMessage(text) { showMessage(text) {
this.snackbarText = text; this.snackbarText = text;
this.snackbar = true; this.snackbar = true;
@ -312,6 +448,14 @@ export default {
</script> </script>
<style scoped> <style scoped>
.student-card {
transition: all 0.3s ease;
}
.student-card:hover {
background-color: rgba(var(--v-theme-primary), 0.05);
}
.gap-2 { .gap-2 {
gap: 8px; gap: 8px;
} }