Implement comprehensive academic workflow enhancements
This commit is contained in:
1 parent
b4e5663c28
commit
9f533ad02a
12 files changed
+7420
-13
No files matched your search
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in new issue
Block a user