2025-11-28 07:29:47 +00:00
|
|
|
|
<template>
|
|
|
|
|
|
<div class="px-[30px] py-5 user-info min-h-full flex flex-col">
|
|
|
|
|
|
<div class="border-b border-br pb-5">
|
|
|
|
|
|
<span class="text-2xl font-medium">新生报名</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<el-card class="!border-none mb-4" shadow="never">
|
|
|
|
|
|
<div class="lg:flex gap-6">
|
|
|
|
|
|
<!-- 基本信息表单 -->
|
|
|
|
|
|
<el-card class="!border-none flex-1" shadow="never">
|
|
|
|
|
|
<el-form
|
|
|
|
|
|
layout="vertical"
|
|
|
|
|
|
:model="studentData.baseInfo"
|
|
|
|
|
|
class="mt-4"
|
|
|
|
|
|
>
|
|
|
|
|
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
|
|
|
|
<el-form-item label="学生姓名">
|
|
|
|
|
|
<el-input
|
|
|
|
|
|
v-model="studentData.baseInfo.name"
|
|
|
|
|
|
placeholder="请输入姓名"
|
|
|
|
|
|
/>
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
<el-form-item label="性别">
|
|
|
|
|
|
<el-radio-group
|
|
|
|
|
|
v-model="studentData.baseInfo.gender"
|
|
|
|
|
|
>
|
|
|
|
|
|
<el-radio label="male">男</el-radio>
|
|
|
|
|
|
<el-radio label="female">女</el-radio>
|
|
|
|
|
|
</el-radio-group>
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
<el-form-item label="身份证号">
|
|
|
|
|
|
<el-input
|
|
|
|
|
|
v-model="studentData.baseInfo.idCard"
|
|
|
|
|
|
placeholder="请输入18位身份证号"
|
|
|
|
|
|
/>
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
<el-form-item label="联系方式">
|
|
|
|
|
|
<el-input
|
|
|
|
|
|
v-model="studentData.baseInfo.phone"
|
|
|
|
|
|
placeholder="请输入手机号码"
|
|
|
|
|
|
/>
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
<el-form-item
|
|
|
|
|
|
label="家庭住址"
|
|
|
|
|
|
class="md:col-span-2"
|
|
|
|
|
|
>
|
|
|
|
|
|
<el-input
|
|
|
|
|
|
v-model="studentData.baseInfo.address"
|
|
|
|
|
|
placeholder="请输入详细家庭住址"
|
|
|
|
|
|
type="textarea"
|
|
|
|
|
|
rows="3"
|
|
|
|
|
|
/>
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
<el-form-item label="紧急联系人">
|
|
|
|
|
|
<el-input
|
|
|
|
|
|
v-model="
|
|
|
|
|
|
studentData.baseInfo.emergencyContact
|
|
|
|
|
|
"
|
|
|
|
|
|
placeholder="请输入紧急联系人姓名"
|
|
|
|
|
|
/>
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
<el-form-item label="紧急联系电话">
|
|
|
|
|
|
<el-input
|
|
|
|
|
|
v-model="
|
|
|
|
|
|
studentData.baseInfo.emergencyPhone
|
|
|
|
|
|
"
|
|
|
|
|
|
placeholder="请输入紧急联系人电话"
|
|
|
|
|
|
/>
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</el-form>
|
|
|
|
|
|
</el-card>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</el-card>
|
|
|
|
|
|
<!-- 注册状态信息 -->
|
|
|
|
|
|
<el-card class="!border-none mb-4 flex-1" shadow="never">
|
|
|
|
|
|
<template #header>
|
|
|
|
|
|
<span>注册状态</span>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
<div class="status-info mt-4">
|
|
|
|
|
|
<div class="mb-6">
|
|
|
|
|
|
<div class="text-tx-secondary text-sm mb-2">当前状态</div>
|
|
|
|
|
|
<el-tag :type="statusConfig.type">{{
|
|
|
|
|
|
statusConfig.label
|
|
|
|
|
|
}}</el-tag>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="mb-6">
|
|
|
|
|
|
<div class="text-tx-secondary text-sm mb-2">状态进度</div>
|
|
|
|
|
|
<el-progress
|
|
|
|
|
|
:percentage="statusConfig.progress"
|
|
|
|
|
|
:stroke-width="6"
|
|
|
|
|
|
/>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="space-y-3">
|
|
|
|
|
|
<div class="flex items-center">
|
|
|
|
|
|
<el-checkbox
|
|
|
|
|
|
v-model="statusConfig.steps[0].completed"
|
|
|
|
|
|
disabled
|
|
|
|
|
|
>
|
|
|
|
|
|
已报名
|
|
|
|
|
|
</el-checkbox>
|
|
|
|
|
|
<span> {{ statusConfig.steps[0].time }} </span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="flex items-center">
|
|
|
|
|
|
<el-checkbox
|
|
|
|
|
|
v-model="statusConfig.steps[1].completed"
|
|
|
|
|
|
disabled
|
|
|
|
|
|
>
|
|
|
|
|
|
材料审核
|
|
|
|
|
|
</el-checkbox>
|
|
|
|
|
|
<span>
|
|
|
|
|
|
{{ statusConfig.steps[1].time || '待完成' }}
|
|
|
|
|
|
</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="flex items-center">
|
|
|
|
|
|
<el-checkbox
|
|
|
|
|
|
v-model="statusConfig.steps[2].completed"
|
|
|
|
|
|
disabled
|
|
|
|
|
|
>
|
|
|
|
|
|
已录取
|
|
|
|
|
|
</el-checkbox>
|
|
|
|
|
|
<span>
|
|
|
|
|
|
{{ statusConfig.steps[2].time || '待完成' }}
|
|
|
|
|
|
</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="flex items-center">
|
|
|
|
|
|
<el-checkbox
|
|
|
|
|
|
v-model="statusConfig.steps[3].completed"
|
|
|
|
|
|
disabled
|
|
|
|
|
|
>
|
|
|
|
|
|
已入学
|
|
|
|
|
|
</el-checkbox>
|
|
|
|
|
|
<span>
|
|
|
|
|
|
{{ statusConfig.steps[3].time || '待完成' }}
|
|
|
|
|
|
</span>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="mt-6">
|
2025-12-02 03:21:42 +00:00
|
|
|
|
<el-button type="primary" block @click="handleSave"
|
|
|
|
|
|
>保存信息</el-button
|
2025-11-28 07:29:47 +00:00
|
|
|
|
>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</el-card>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
|
|
|
import { reactive } from 'vue'
|
|
|
|
|
|
import { ElButton } from 'element-plus'
|
2025-12-02 03:21:42 +00:00
|
|
|
|
import {
|
|
|
|
|
|
getStudentBaseInfo,
|
|
|
|
|
|
updateStudentBaseInfo,
|
|
|
|
|
|
getEnrollmentProcessStatus
|
|
|
|
|
|
} from '@/api/enrollment'
|
2025-11-28 07:29:47 +00:00
|
|
|
|
|
|
|
|
|
|
definePageMeta({
|
|
|
|
|
|
module: 'personal',
|
|
|
|
|
|
auth: true
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
// 学生信息数据
|
|
|
|
|
|
const studentData = reactive({
|
|
|
|
|
|
baseInfo: {
|
|
|
|
|
|
name: '',
|
|
|
|
|
|
gender: 'male',
|
|
|
|
|
|
idCard: '',
|
|
|
|
|
|
phone: '',
|
|
|
|
|
|
address: '',
|
|
|
|
|
|
emergencyContact: '',
|
|
|
|
|
|
emergencyPhone: ''
|
|
|
|
|
|
},
|
|
|
|
|
|
additionalInfo: {
|
|
|
|
|
|
enrollYear: '',
|
|
|
|
|
|
major: '',
|
|
|
|
|
|
education: ''
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
// 状态配置
|
|
|
|
|
|
type TagType = '' | 'info' | 'success' | 'warning' | 'danger'
|
|
|
|
|
|
const statusConfig = reactive<{
|
|
|
|
|
|
label: string
|
|
|
|
|
|
type: TagType
|
|
|
|
|
|
progress: number
|
|
|
|
|
|
steps: { completed: boolean; time: string }[]
|
|
|
|
|
|
}>({
|
2025-12-02 03:21:42 +00:00
|
|
|
|
label: '未报名',
|
2025-11-28 07:29:47 +00:00
|
|
|
|
type: 'info',
|
2025-12-02 03:21:42 +00:00
|
|
|
|
get progress() {
|
|
|
|
|
|
const completedCount = this.steps.filter(
|
|
|
|
|
|
(step: { completed: any }) => step.completed
|
|
|
|
|
|
).length
|
|
|
|
|
|
return (completedCount / this.steps.length) * 100
|
|
|
|
|
|
},
|
2025-11-28 07:29:47 +00:00
|
|
|
|
steps: [
|
2025-12-02 03:21:42 +00:00
|
|
|
|
{ completed: false, time: '' },
|
2025-11-28 07:29:47 +00:00
|
|
|
|
{ completed: false, time: '' },
|
|
|
|
|
|
{ completed: false, time: '' },
|
|
|
|
|
|
{ completed: false, time: '' }
|
|
|
|
|
|
]
|
|
|
|
|
|
})
|
2025-12-02 03:21:42 +00:00
|
|
|
|
|
|
|
|
|
|
const handleSave = async () => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
// 调用更新API,传入表单数据(studentData.baseInfo)
|
|
|
|
|
|
const res = await updateStudentBaseInfo(studentData.baseInfo)
|
|
|
|
|
|
// 接口返回成功时提示
|
|
|
|
|
|
if (res.data.success) {
|
|
|
|
|
|
ElMessage.success(res.data.message || '信息保存成功')
|
|
|
|
|
|
} else {
|
|
|
|
|
|
ElMessage.warning(res.data.message || '保存失败,请检查数据')
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
// 处理提交失败(如网络错误)
|
|
|
|
|
|
ElMessage.error('保存失败,请稍后重试')
|
|
|
|
|
|
console.error('更新信息失败:', error)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
onMounted(async () => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
// 1. 获取学生基本信息并赋值
|
|
|
|
|
|
const studentInfoRes = await getStudentBaseInfo()
|
|
|
|
|
|
Object.assign(studentData.baseInfo, studentInfoRes.data)
|
|
|
|
|
|
// 2. 获取报名流程状态并赋值
|
|
|
|
|
|
const statusRes = await getEnrollmentProcessStatus()
|
|
|
|
|
|
// 将接口返回的状态合并到statusConfig
|
|
|
|
|
|
Object.assign(statusConfig, statusRes.data)
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
// 处理接口调用失败(如网络错误、后端异常)
|
|
|
|
|
|
ElMessage.error('数据加载失败,请稍后重试')
|
|
|
|
|
|
console.error('获取初始数据失败:', error)
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
2025-11-28 07:29:47 +00:00
|
|
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped></style>
|