学年学期页面新增“设为当前”“归档”“撤销归档”,当前学期不能归档、删除或直接取消;已归档学期需先撤销才能重新设为当前。[BaseDataController.cs (line 286)](/E:/jiaowu/src/Jiaowu.Api/Controllers/BaseDataController.cs:286)
切换后,其他学期自动变为历史态;已归档学期进一步弱化。所有主要学期选择器统一默认当前,并显示“当前 / 历史 / 已归档”。[academicTerms.ts (line 1)](/E:/jiaowu/web/src/utils/academicTerms.ts:1) 桌面使用分层表格,390px 手机端改为独立学期卡片,操作不会再挤压表格。[BaseDataView.vue (line 211)](/E:/jiaowu/web/src/views/BaseDataView.vue:211) 归档定义为“历史显示状态”,不是成绩冻结:补考成绩仍可录入并回写,已发布成绩仍可走成绩更正审批。 已加入 SQLite 开发迁移、MySQL 正式迁移和切换/归档/撤销测试。[20260726143000_AcademicTermArchiving.cs (line 1)](/E:/jiaowu/src/Jiaowu.Api/Infrastructure/Persistence/Migrations/MySql/20260726143000_AcademicTermArchiving.cs:1)
This commit is contained in:
@@ -3,6 +3,7 @@ import { computed, onMounted, reactive, ref } from 'vue'
|
||||
import { Plus, Promotion, Refresh, UserFilled, Setting } from '@element-plus/icons-vue'
|
||||
import http, { apiErrorMessage } from '../api/http'
|
||||
import { useAuthStore } from '../stores/auth'
|
||||
import { academicTermLabel, academicTermOptionClass, defaultAcademicTermId } from '../utils/academicTerms'
|
||||
|
||||
const auth = useAuthStore()
|
||||
const isManager = computed(() =>
|
||||
@@ -53,7 +54,9 @@ async function load() {
|
||||
return
|
||||
}
|
||||
plans.value = (await http.get('/exams/plans')).data
|
||||
const plan = plans.value.find((x) => x.id === selected.value?.id) ?? plans.value[0]
|
||||
const plan = plans.value.find((x) => x.id === selected.value?.id)
|
||||
?? plans.value.find((x) => x.termIsCurrent)
|
||||
?? plans.value[0]
|
||||
if (plan) await selectPlan(plan.id)
|
||||
} catch (error) { ElMessage.error(apiErrorMessage(error)) }
|
||||
finally { loading.value = false }
|
||||
@@ -63,7 +66,7 @@ async function selectPlan(id: string) {
|
||||
}
|
||||
function openPlan() {
|
||||
Object.assign(planForm, {
|
||||
academicTermId: terms.value.find((x) => x.isCurrent)?.id,
|
||||
academicTermId: defaultAcademicTermId(terms.value),
|
||||
name: '', notes: '',
|
||||
})
|
||||
planDialog.value = true
|
||||
@@ -196,7 +199,7 @@ onMounted(async () => {
|
||||
|
||||
<template v-if="isManager">
|
||||
<section class="exam-plan-strip">
|
||||
<button v-for="plan in plans" :key="plan.id" :class="{ active: selected?.id === plan.id }" @click="selectPlan(plan.id)">
|
||||
<button v-for="plan in plans" :key="plan.id" :class="{ active: selected?.id === plan.id, 'historical-record': !plan.termIsCurrent && !plan.termIsArchived, 'archived-record': plan.termIsArchived }" @click="selectPlan(plan.id)">
|
||||
<span>{{ plan.termName }}</span><b>{{ plan.name }}</b>
|
||||
<small>{{ plan.sessionCount }} 个场次</small><i>{{ statusLabels[plan.status] }}</i>
|
||||
</button>
|
||||
@@ -271,7 +274,7 @@ onMounted(async () => {
|
||||
<el-form label-position="top">
|
||||
<el-form-item label="学期">
|
||||
<el-select v-model="planForm.academicTermId">
|
||||
<el-option v-for="x in terms" :key="x.id" :label="x.name" :value="x.id" />
|
||||
<el-option v-for="x in terms" :key="x.id" :label="academicTermLabel(x)" :value="x.id" :class="academicTermOptionClass(x)" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="计划名称"><el-input v-model="planForm.name" maxlength="120" /></el-form-item>
|
||||
|
||||
Reference in New Issue
Block a user