学年学期页面新增“设为当前”“归档”“撤销归档”,当前学期不能归档、删除或直接取消;已归档学期需先撤销才能重新设为当前。[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, Refresh, Search } 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 isSuperAdmin = computed(() => auth.user?.roles.includes('SuperAdmin') ?? false)
|
||||
@@ -283,11 +284,10 @@ function resetFilters() {
|
||||
|
||||
function resetForm(detail?: any) {
|
||||
Object.keys(form).forEach((key) => delete form[key])
|
||||
const currentTerm = terms.value.find((item) => item.isCurrent)
|
||||
Object.assign(form, {
|
||||
taskNumber: '',
|
||||
name: '',
|
||||
academicTermId: currentTerm?.id,
|
||||
academicTermId: defaultAcademicTermId(terms.value),
|
||||
courseId: undefined,
|
||||
capacity: 60,
|
||||
startWeek: 1,
|
||||
@@ -499,9 +499,8 @@ async function batchAction(
|
||||
}
|
||||
|
||||
function openGeneration() {
|
||||
const currentTerm = terms.value.find((item) => item.isCurrent)
|
||||
Object.assign(generationForm, {
|
||||
academicTermId: query.academicTermId ?? currentTerm?.id,
|
||||
academicTermId: query.academicTermId ?? defaultAcademicTermId(terms.value),
|
||||
courseId: undefined,
|
||||
classesPerTask: 3,
|
||||
startWeek: 1,
|
||||
@@ -576,7 +575,7 @@ onMounted(async () => {
|
||||
courses.value = courseRes.data
|
||||
classes.value = classRes.data
|
||||
majors.value = majorRes.data
|
||||
query.academicTermId = terms.value.find((item) => item.isCurrent)?.id
|
||||
query.academicTermId = defaultAcademicTermId(terms.value)
|
||||
await load()
|
||||
})
|
||||
</script>
|
||||
@@ -604,7 +603,7 @@ onMounted(async () => {
|
||||
<div class="filter-bar">
|
||||
<el-input v-model="query.keyword" :prefix-icon="Search" clearable placeholder="搜索任务编号、教学班或课程" @keyup.enter="query.page = 1; load()" />
|
||||
<el-select v-model="query.academicTermId" clearable placeholder="全部学期">
|
||||
<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="query.status" clearable placeholder="全部状态">
|
||||
<el-option v-for="(label, value) in statusLabels" :key="value" :label="label" :value="value" />
|
||||
@@ -712,7 +711,7 @@ onMounted(async () => {
|
||||
<el-form-item label="教学班名称" required><el-input v-model="form.name" /></el-form-item>
|
||||
</div>
|
||||
<div class="form-grid">
|
||||
<el-form-item label="开课学期" required><el-select v-model="form.academicTermId" @change="loadManualEligibleTeachers"><el-option v-for="item in terms" :key="item.id" :label="item.name" :value="item.id" /></el-select></el-form-item>
|
||||
<el-form-item label="开课学期" required><el-select v-model="form.academicTermId" @change="loadManualEligibleTeachers"><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>
|
||||
<el-select v-model="form.courseId" filterable @change="form.teacherIds = []; form.primaryTeacherId = undefined; loadManualEligibleTeachers()">
|
||||
<el-option v-for="item in filteredManageableCourses" :key="item.id" :label="`${item.code} · ${item.name}(${item.totalHours} 学时)`" :value="item.id" />
|
||||
@@ -807,7 +806,7 @@ onMounted(async () => {
|
||||
<div class="form-grid">
|
||||
<el-form-item label="开课学期" required>
|
||||
<el-select v-model="generationForm.academicTermId" @change="loadEligibleTeachers">
|
||||
<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>
|
||||
|
||||
Reference in New Issue
Block a user