Implement comprehensive academic workflow enhancements

This commit is contained in:
biss committed 2026-08-17 11:32:37 +08:00
1 parent b4e5663c28
commit 9f533ad02a
12 files changed
+7420 -13

No files matched your search

+3 -1
View File
@@ -148,7 +148,7 @@ function resetForm(row?: Row) {
grade: new Date().getFullYear(), counselorUserId: undefined,
academicYear: `${new Date().getFullYear()}-${new Date().getFullYear() + 1}`,
season: 'Autumn', startDate: '', endDate: '', isCurrent: false,
capacity: 60, roomType: '普通教室', teachingVenueNatures: [1], equipment: '',
capacity: 60, floor: 1, roomType: '普通教室', teachingVenueNatures: [1], equipment: '',
}, row ?? {})
if (active.value === 'classrooms') {
const value = venueNatureValue((row as any)?.teachingVenueNature ?? 1)
@@ -540,6 +540,7 @@ watch(
</el-table-column>
<el-table-column v-if="active === 'buildings'" prop="campusName" label="所属校区" min-width="140" />
<el-table-column v-if="active === 'classrooms'" prop="buildingName" label="教学楼" min-width="130" />
<el-table-column v-if="active === 'classrooms'" prop="floor" label="楼层" width="80"><template #default="{ row }">{{ row.floor }} 层</template></el-table-column>
<el-table-column v-if="active === 'classrooms'" prop="capacity" label="容量" width="90" />
<el-table-column v-if="active === 'classrooms'" label="场地性质" min-width="180">
<template #default="{ row }">{{ venueNatureLabel(row.teachingVenueNature) }}</template>
@@ -665,6 +666,7 @@ watch(
</el-form-item>
<div v-if="active === 'classrooms'" class="form-grid">
<el-form-item label="容量"><el-input-number v-model="form.capacity" :min="1" :max="1000" /></el-form-item>
<el-form-item label="所在楼层"><el-input-number v-model="form.floor" :min="1" :max="99" /></el-form-item>
<el-form-item label="教室类型"><el-input v-model="form.roomType" /></el-form-item>
</div>
<el-form-item v-if="active === 'classrooms'" label="教学场地性质" required>
+21 -3
View File
@@ -110,6 +110,16 @@ const teacherStatusLabels: Record<string, string> = {
const studentStatusLabels: Record<string, string> = {
Active: '在籍', Suspended: '休学', Graduated: '毕业', Withdrawn: '退学',
}
const specialTagOptions = [
'肢体残疾', '行动不便', '轮椅使用者', '视力障碍', '听力障碍',
'言语障碍', '学习支持', '健康关注',
]
function splitSpecialTags(value: unknown) {
return typeof value === 'string'
? value.split(/[,,;;、]/).map((item) => item.trim()).filter(Boolean)
: []
}
function resetForm(row?: any) {
Object.keys(form).forEach((key) => delete form[key])
@@ -159,6 +169,7 @@ function resetForm(row?: any) {
biography: '',
notes: '',
}, row ?? {})
form.specialTags = splitSpecialTags(form.specialTags)
}
}
@@ -298,8 +309,11 @@ async function save() {
}
try {
const path = `/personnel/${active.value}`
if (editingId.value) await http.put(`${path}/${editingId.value}`, form)
else await http.post(path, form)
const payload = active.value === 'students'
? { ...form, specialTags: (form.specialTags ?? []).join(',') }
: form
if (editingId.value) await http.put(`${path}/${editingId.value}`, payload)
else await http.post(path, payload)
ElMessage.success(editingId.value ? '档案已更新' : '档案已建立')
dialogVisible.value = false
await load()
@@ -640,7 +654,11 @@ watch(active, async () => {
<el-form-item label="与本人关系"><el-input v-model="form.emergencyContactRelationship" /></el-form-item>
<el-form-item label="紧急联系电话"><el-input v-model="form.emergencyContactPhone" /></el-form-item>
</div>
<el-form-item label="特殊标记"><el-input v-model="form.specialTags" placeholder="多个标记可用逗号分隔" /></el-form-item>
<el-form-item label="特殊标记">
<el-select v-model="form.specialTags" multiple filterable placeholder="请选择需要关注的情况">
<el-option v-for="tag in specialTagOptions" :key="tag" :label="tag" :value="tag" />
</el-select>
</el-form-item>
<el-form-item label="特殊情况说明"><el-input v-model="form.specialNeeds" type="textarea" :rows="3" /></el-form-item>
<el-form-item label="个人简介"><el-input v-model="form.biography" type="textarea" :rows="3" /></el-form-item>
</template>
+24 -3
View File
@@ -15,6 +15,10 @@ const genderLabels: Record<string, string> = {
const statusLabels: Record<string, string> = {
Active: '在籍', Suspended: '休学', Graduated: '毕业', Withdrawn: '退学',
}
const specialTagOptions = [
'肢体残疾', '行动不便', '轮椅使用者', '视力障碍', '听力障碍',
'言语障碍', '学习支持', '健康关注',
]
const editableFields = [
'gender', 'dateOfBirth', 'englishName', 'idCardNumber', 'nationality',
@@ -24,8 +28,18 @@ const editableFields = [
'emergencyContactPhone', 'specialTags', 'specialNeeds', 'biography',
]
function splitSpecialTags(value: unknown) {
return typeof value === 'string'
? value.split(/[,,;;、]/).map((item) => item.trim()).filter(Boolean)
: []
}
function copyToForm() {
for (const key of editableFields) form[key] = profile[key] ?? ''
for (const key of editableFields) {
form[key] = key === 'specialTags'
? splitSpecialTags(profile[key])
: (profile[key] ?? '')
}
}
async function load() {
@@ -53,7 +67,10 @@ function cancelEdit() {
async function save() {
saving.value = true
try {
await http.put('/student/profile', form)
await http.put('/student/profile', {
...form,
specialTags: (form.specialTags ?? []).join(','),
})
ElMessage.success('个人信息已保存,无需审核。')
editing.value = false
await load()
@@ -133,7 +150,11 @@ onMounted(load)
<el-form-item label="紧急联系人"><el-input v-model="form.emergencyContactName" maxlength="50" /></el-form-item>
<el-form-item label="与本人关系"><el-input v-model="form.emergencyContactRelationship" maxlength="30" /></el-form-item>
<el-form-item label="紧急联系电话"><el-input v-model="form.emergencyContactPhone" maxlength="30" /></el-form-item>
<el-form-item label="特殊标记"><el-input v-model="form.specialTags" maxlength="300" placeholder="多个标记可用逗号分隔" /></el-form-item>
<el-form-item label="特殊标记">
<el-select v-model="form.specialTags" multiple filterable placeholder="请选择需要关注的情况">
<el-option v-for="tag in specialTagOptions" :key="tag" :label="tag" :value="tag" />
</el-select>
</el-form-item>
<el-form-item label="特殊情况说明" class="span-2"><el-input v-model="form.specialNeeds" type="textarea" :rows="4" maxlength="1000" show-word-limit placeholder="例如学习支持、健康与安全方面需教师留意的事项" /></el-form-item>
<el-form-item label="个人简介" class="span-2"><el-input v-model="form.biography" type="textarea" :rows="4" maxlength="1000" show-word-limit /></el-form-item>
</div>