学年学期页面新增“设为当前”“归档”“撤销归档”,当前学期不能归档、删除或直接取消;已归档学期需先撤销才能重新设为当前。[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:
biss committed 2026-07-26 11:14:05 +08:00
1 parent 3b73292d93
commit c91d826169
32 files changed
+752 -73

No files matched your search

+7 -6
View File
@@ -3,6 +3,7 @@ import { computed, onMounted, reactive, ref } from 'vue'
import { Plus, Refresh } 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 isReviewer = computed(() =>
@@ -56,7 +57,7 @@ async function load() {
function openSubmit() {
Object.assign(form, {
academicTermId: filters.academicTermId ??
terms.value.find((item) => item.isCurrent)?.id,
defaultAcademicTermId(terms.value),
courseId: undefined,
statement: '',
})
@@ -118,7 +119,7 @@ async function review() {
function openAssignment() {
Object.assign(assignmentForm, {
academicTermId: filters.academicTermId ??
terms.value.find((item) => item.isCurrent)?.id,
defaultAcademicTermId(terms.value),
teacherId: undefined,
courseId: undefined,
comment: '',
@@ -158,7 +159,7 @@ onMounted(async () => {
courses.value = optionRes?.data?.courses ?? []
teachers.value = optionRes?.data?.teachers ?? []
}
filters.academicTermId = terms.value.find((item) => item.isCurrent)?.id
filters.academicTermId = defaultAcademicTermId(terms.value)
await load()
})
</script>
@@ -195,7 +196,7 @@ onMounted(async () => {
<section class="data-card">
<div class="filter-bar">
<el-select v-model="filters.academicTermId" clearable placeholder="全部学期" @change="load">
<el-option v-for="item in terms" :key="item.id" :label="item.name" :value="item.id" />
<el-option v-for="item in terms" :key="item.id" :label="academicTermLabel(item)" :value="item.id" :class="academicTermOptionClass(item)" />
</el-select>
<el-select v-model="filters.status" clearable placeholder="全部状态" @change="load">
<el-option v-for="(label, value) in statusLabels" :key="value" :label="label" :value="value" />
@@ -241,7 +242,7 @@ onMounted(async () => {
<div class="form-grid">
<el-form-item label="学期" required>
<el-select v-model="form.academicTermId">
<el-option v-for="item in terms" :key="item.id" :label="item.name" :value="item.id" />
<el-option v-for="item in terms" :key="item.id" :label="academicTermLabel(item)" :value="item.id" :class="academicTermOptionClass(item)" />
</el-select>
</el-form-item>
<el-form-item label="拟授课程" required>
@@ -286,7 +287,7 @@ onMounted(async () => {
<el-form label-position="top" style="margin-top: 18px">
<el-form-item label="学期" required>
<el-select v-model="assignmentForm.academicTermId" style="width: 100%">
<el-option v-for="item in terms" :key="item.id" :label="item.name" :value="item.id" />
<el-option v-for="item in terms" :key="item.id" :label="academicTermLabel(item)" :value="item.id" :class="academicTermOptionClass(item)" />
</el-select>
</el-form-item>
<div class="form-grid">