更新项目

This commit is contained in:
LiuQAQQWQ 2026-01-27 16:44:07 +08:00
parent 09f7175f82
commit 1357b3fbf4
10 changed files with 74 additions and 672 deletions

View File

@ -2,25 +2,25 @@ import request from '@/utils/request'
// 资产信息列表 // 资产信息列表
export function infoLists(params?: Record<string, any>) { export function infoLists(params?: Record<string, any>) {
return request.get({ url: '/info/list', params }) return request.get({ url: '/asset/info/list', params })
} }
// 资产信息详情 // 资产信息详情
export function infoDetail(params: Record<string, any>) { export function infoDetail(params: Record<string, any>) {
return request.get({ url: '/info/detail', params }) return request.get({ url: '/asset/info/detail', params })
} }
// 资产信息新增 // 资产信息新增
export function infoAdd(params: Record<string, any>) { export function infoAdd(params: Record<string, any>) {
return request.post({ url: '/info/add', params }) return request.post({ url: '/asset/info/add', params })
} }
// 资产信息编辑 // 资产信息编辑
export function infoEdit(params: Record<string, any>) { export function infoEdit(params: Record<string, any>) {
return request.post({ url: '/info/edit', params }) return request.post({ url: '/asset/info/edit', params })
} }
// 资产信息删除 // 资产信息删除
export function infoDelete(params: Record<string, any>) { export function infoDelete(params: Record<string, any>) {
return request.post({ url: '/info/del', params }) return request.post({ url: '/asset/info/del', params })
} }

View File

@ -47,10 +47,6 @@ export function useDictOptions<T = any>(options: Options) {
} }
} }
// useDictData<{
// dict: any[]
// }>(['dict'])
export function useDictData<T = any>(id: number) { export function useDictData<T = any>(id: number) {
const dictData: any = reactive({}) const dictData: any = reactive({})
const refresh = async () => { const refresh = async () => {
@ -59,10 +55,11 @@ export function useDictData<T = any>(id: number) {
}) })
Object.assign(dictData, data.lists) Object.assign(dictData, data.lists)
} }
refresh() const initPromise = refresh()
return { return {
dictData: dictData as T, dictData: dictData as T,
refresh refresh,
initPromise
} }
} }

View File

@ -19,7 +19,7 @@
> >
<el-option label="全部" value="" /> <el-option label="全部" value="" />
<el-option <el-option
v-for="(item, index) in dictData.asset_classification" v-for="(item, index) in dictData"
:key="index" :key="index"
:label="item.name" :label="item.name"
:value="item.value" :value="item.value"
@ -27,7 +27,15 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="是否为固定资产" prop="isFixedAsset"> <el-form-item label="是否为固定资产" prop="isFixedAsset">
<el-input class="w-[280px]" v-model="queryParams.isFixedAsset" /> <el-select
v-model="queryParams.isFixedAsset"
class="w-[280px]"
clearable
>
<el-option label="全部" value="" />
<el-option label="固定资产" :value="0"/>
<el-option label="非固定资产" :value="1"/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="非固定资产库存信息ID" prop="consumableId"> <el-form-item label="非固定资产库存信息ID" prop="consumableId">
<el-input class="w-[280px]" v-model="queryParams.consumableId" /> <el-input class="w-[280px]" v-model="queryParams.consumableId" />
@ -56,11 +64,7 @@
<el-table-column label="资产名称" prop="assetName" min-width="100" /> <el-table-column label="资产名称" prop="assetName" min-width="100" />
<el-table-column label="规格型号" prop="model" min-width="100" /> <el-table-column label="规格型号" prop="model" min-width="100" />
<el-table-column label="品牌" prop="brand" min-width="100" /> <el-table-column label="品牌" prop="brand" min-width="100" />
<el-table-column label="资产类别" prop="category" min-width="100"> <el-table-column label="资产类别" prop="category" min-width="100" />
<template #default="{ row }">
<dict-value :options="dictData.asset_classification" :value="row.category" />
</template>
</el-table-column>
<el-table-column label="是否为固定资产" prop="isFixedAsset" min-width="100" /> <el-table-column label="是否为固定资产" prop="isFixedAsset" min-width="100" />
<el-table-column label="非固定资产库存信息ID" prop="consumableId" min-width="100" /> <el-table-column label="非固定资产库存信息ID" prop="consumableId" min-width="100" />
<el-table-column label="资产描述" prop="description" min-width="100" /> <el-table-column label="资产描述" prop="description" min-width="100" />
@ -94,7 +98,6 @@
<edit-popup <edit-popup
v-if="showEdit" v-if="showEdit"
ref="editRef" ref="editRef"
:dict-data="dictData"
@success="getLists" @success="getLists"
@close="showEdit = false" @close="showEdit = false"
/> />
@ -116,16 +119,13 @@ const queryParams = reactive({
isFixedAsset: '', isFixedAsset: '',
consumableId: '', consumableId: '',
}) })
const dictLoading = ref(false)
const { pager, getLists, resetPage, resetParams } = usePaging({ const { pager, getLists, resetPage, resetParams } = usePaging({
fetchFun: infoLists, fetchFun: infoLists,
params: queryParams params: queryParams
}) })
const { dictData } = useDictData<{ const { dictData } = useDictData<Array<{name: string, value: any}>>(7)
asset_classification: any[]
}>(7)
const handleAdd = async () => { const handleAdd = async () => {
showEdit.value = true showEdit.value = true

View File

@ -24,7 +24,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="所属专业" prop="majorId"> <el-form-item label="所属专业" prop="majorId">
<el-select v-model="queryParams.majorId" class="w-[280px]" clearable> <el-select v-model="queryParams.majorId" class="w-[280px]" clearable @change="getLists">
<el-option <el-option
v-for="college in getMajorLists.lists" v-for="college in getMajorLists.lists"
:key="college.id" :key="college.id"
@ -33,9 +33,6 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="班主任用户ID" prop="headTeacherId">
<el-input class="w-[280px]" v-model="queryParams.headTeacherId" />
</el-form-item>
<el-form-item label="班级状态" prop="classStatus"> <el-form-item label="班级状态" prop="classStatus">
<el-select <el-select
v-model="queryParams.classStatus" v-model="queryParams.classStatus"
@ -123,7 +120,6 @@ const { pager, getLists, resetPage, resetParams } = usePaging({
for (const cls of classData.lists) { for (const cls of classData.lists) {
try { try {
const progressRes = await taskSearch({ classId: cls.id }) const progressRes = await taskSearch({ classId: cls.id })
// progressResstatus
cls.progress = progressRes.arrangementProgress cls.progress = progressRes.arrangementProgress
} catch (err) { } catch (err) {
console.error(`获取班级${cls.id}进度失败`, err) console.error(`获取班级${cls.id}进度失败`, err)
@ -148,6 +144,7 @@ const fetchMajorLists = async () => {
try { try {
const res = await majorLists(queryParams) const res = await majorLists(queryParams)
getMajorLists.value = res getMajorLists.value = res
await getLists()
} catch (err) { } catch (err) {
feedback.msgError('获取专业列表失败') feedback.msgError('获取专业列表失败')
} }

View File

@ -93,7 +93,7 @@
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { FormInstance } from 'element-plus' import type { FormInstance, UploadFile, UploadFiles } from 'element-plus'
import type { PropType } from 'vue' import type { PropType } from 'vue'
import { courseAdd, courseDetail, courseEdit, courseUploadFile } from '@/api/course' import { courseAdd, courseDetail, courseEdit, courseUploadFile } from '@/api/course'
@ -180,11 +180,15 @@ const fetchCourseTypeLists = async () => {
} }
} }
const handleUploadChange = async (file: { raw: string | Blob }) => { const handleUploadChange = async (uploadFile: UploadFile, uploadFiles: UploadFiles) => {
if (!file) return // raw
if (!uploadFile.raw) {
console.error('上传文件不存在')
return
}
try { try {
const formData = new FormData() const formData = new FormData()
formData.append('file', file.raw) formData.append('file', uploadFile.raw)
const raw = await courseUploadFile(formData) const raw = await courseUploadFile(formData)
// //
console.log(raw.data.code) console.log(raw.data.code)

View File

@ -83,7 +83,7 @@ html, body {
top: 0; top: 0;
left: 0; left: 0;
right: 0; right: 0;
z-index: 9999; /* 提高层级,避免被其他元素覆盖 */ z-index: 10; /* 提高层级,避免被其他元素覆盖 */
width: 100%; width: 100%;
} }

View File

@ -68,7 +68,6 @@ export class Request {
const result = await response.json() const result = await response.json()
// 执行响应拦截器
let finalResult = { ...result, status: response.status } let finalResult = { ...result, status: response.status }
for (const interceptor of this.interceptors.response) { for (const interceptor of this.interceptors.response) {
finalResult = await interceptor(finalResult) finalResult = await interceptor(finalResult)
@ -110,7 +109,6 @@ request.useRequestInterceptor(async (config) => {
config.headers.Authorization = `Bearer ${token}` config.headers.Authorization = `Bearer ${token}`
} }
// 示例:对特定接口的身份证号进行格式验证
if (config.url.includes('/enrollment/') && config.params?.idCard) { if (config.url.includes('/enrollment/') && config.params?.idCard) {
const idCardRegex = /(^\d{18}$)|(^\d{17}(\d|X|x)$)/ const idCardRegex = /(^\d{18}$)|(^\d{17}(\d|X|x)$)/
if (!idCardRegex.test(config.params.idCard)) { if (!idCardRegex.test(config.params.idCard)) {
@ -128,7 +126,6 @@ request.useResponseInterceptor(async (response) => {
// 处理业务错误 // 处理业务错误
switch (response.code) { switch (response.code) {
case 401: case 401:
// token过期跳转到登录页
window.location.href = '/login' window.location.href = '/login'
break break
case 403: case 403:
@ -137,14 +134,12 @@ request.useResponseInterceptor(async (response) => {
throw new Error(response.message || '请求失败') throw new Error(response.message || '请求失败')
} }
} }
return response
return response.data || response
}) })
// 添加错误处理拦截器 // 添加错误处理拦截器
request.useResponseInterceptor(async (response) => { request.useResponseInterceptor(async (response) => {
// 你可以在这里添加更多的错误处理逻辑
return response return response
}) // true 表示添加到拦截器数组末尾 })
export default request export default request

View File

@ -1,594 +0,0 @@
<template>
<div class="px-[30px] py-5 user-info min-h-full flex flex-col">
<!-- 标签页切换 -->
<el-tabs v-model="activeTab" type="card" class="mb-6">
<el-tab-pane label="新生报名" name="enroll">
<!-- 报名表单区域 -->
<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="请输入姓名"
:disabled="submission"
/>
</el-form-item>
<el-form-item label="性别">
<el-radio-group
v-model="studentData.baseInfo.gender"
:disabled="submission"
>
<el-radio :label="0"></el-radio>
<el-radio :label="1"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="身份证号">
<el-input
v-model="studentData.baseInfo.idCard"
placeholder="请输入18位身份证号"
:disabled="submission"
/>
</el-form-item>
<el-form-item label="出生日期">
<el-date-picker
v-model="studentData.baseInfo.birthday"
type="datetime"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
placeholder="请输入出生日期"
:disabled="submission"
/>
</el-form-item>
<el-form-item label="联系方式">
<el-input
v-model="studentData.baseInfo.phone"
placeholder="请输入手机号码"
:disabled="submission"
/>
</el-form-item>
<el-form-item label="电子邮箱">
<el-input
v-model="studentData.baseInfo.email"
placeholder="请输入电子邮箱"
:disabled="submission"
/>
</el-form-item>
<el-form-item label="籍贯">
<el-input
v-model="studentData.baseInfo.nativePlace"
placeholder="请输入籍贯"
:disabled="submission"
/>
</el-form-item>
<el-form-item label="民族">
<el-input
v-model="studentData.baseInfo.nationality"
placeholder="请输入民族"
:disabled="submission"
/>
</el-form-item>
<el-form-item label="政治面貌">
<el-select
v-model="studentData.baseInfo.politicalStatus"
clearable
:disabled="submission"
>
<el-option label="群众" :value="0" />
<el-option label="团员" :value="1" />
<el-option label="党员" :value="2" />
<el-option label="其他" :value="3" />
</el-select>
</el-form-item>
<el-form-item label="毕业年份">
<el-input-number
v-model="studentData.baseInfo.graduationYear"
placeholder="请输入毕业年份"
:disabled="submission"
/>
</el-form-item>
<el-form-item label="毕业院校">
<el-input
v-model="studentData.baseInfo.previousSchool"
placeholder="请输入毕业院校"
:disabled="submission"
/>
</el-form-item>
<el-form-item label="学校类型">
<el-select
v-model="studentData.baseInfo.schoolType"
clearable
:disabled="submission"
>
<el-option label="普通高中" :value="1" />
<el-option label="职业高中" :value="2" />
<el-option label="中专" :value="3" />
<el-option label="大专" :value="4" />
<el-option label="本科" :value="5" />
<el-option label="其他" :value="6" />
</el-select>
</el-form-item>
<el-form-item
label="家庭住址"
class="md:col-span-2"
>
<el-input
v-model="studentData.baseInfo.homeAddress"
placeholder="请输入详细家庭住址"
type="textarea"
:rows="3"
:disabled="submission"
/>
</el-form-item>
<el-form-item label="紧急联系人">
<el-input
v-model="studentData.baseInfo.emergencyContact"
placeholder="请输入紧急联系人姓名"
:disabled="submission"
/>
</el-form-item>
<el-form-item label="紧急联系电话">
<el-input
v-model="studentData.baseInfo.emergencyPhone"
placeholder="请输入紧急联系人电话"
:disabled="submission"
/>
</el-form-item>
<el-form-item label="与紧急联系人关系">
<el-input
v-model="studentData.baseInfo.relationship"
placeholder="请输入与紧急联系人的关系"
:disabled="submission"
/>
</el-form-item>
</div>
</el-form>
</el-card>
</div>
</el-card>
<!-- 提交按钮 -->
<el-card class="!border-none mb-4 flex-1" shadow="never">
<div v-if="!submission" class="mt-6">
<el-button
class="ml-4"
type="primary"
block
@click="handleConfirmSubmit"
:disabled="statusConfig.steps[0].completed"
>
提交报名
</el-button>
</div>
</el-card>
</el-tab-pane>
<el-tab-pane label="查询进度" name="query">
<!-- 查询进度区域 -->
<div class="border-b border-br pb-5">
<span class="text-2xl font-medium">查询报名进度</span>
</div>
<!-- 查询表单 -->
<el-card class="!border-none mb-6" shadow="never">
<el-form
:model="queryForm"
:rules="queryRules"
ref="queryFormRef"
label-width="100px"
class="mt-4"
>
<el-form-item label="身份证号" prop="idCard">
<el-input
v-model="queryForm.idCard"
placeholder="请输入18位身份证号"
maxlength="18"
@input="handleIdCardInput"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuerySubmit" :loading="isQueryLoading">
查询
</el-button>
</el-form-item>
</el-form>
</el-card>
<!-- 进度展示区域 -->
<div v-if="submission" class="border-b border-br pb-5">
<span class="text-2xl font-medium">注册状态</span>
</div>
<el-card
v-if="submission"
class="!border-none mb-4 flex-1"
shadow="never"
>
<div class="status-info mt-4">
<!-- 步骤条展示 -->
<div class="mb-6">
<div class="text-tx-secondary text-sm mb-4">状态进度</div>
<el-steps
:active="activeStep"
finish-status="success"
class="w-full"
style="text-align: left"
>
<el-step
v-for="(step, index) in statusConfig.steps"
:key="index"
:title="stepTitles[index]"
:description="getStepDescription(index)"
:status="getStepStatus(index)"
/>
</el-steps>
</div>
<!-- 显示拒绝原因 -->
<div v-if="rejectionReason" class="text-danger mt-4">
<i class="el-icon-error mr-2"></i>
拒绝原因{{ rejectionReason }}
</div>
</div>
</el-card>
</el-tab-pane>
</el-tabs>
<!-- 查询进度弹窗保持全局可访问 -->
<el-dialog
v-model="isQueryDialogOpen"
title="查询报名进度"
width="500px"
:close-on-click-modal="false"
>
<el-form
:model="queryForm"
:rules="queryRules"
ref="queryFormRef"
label-width="100px"
class="mt-4"
>
<el-form-item label="身份证号" prop="idCard">
<el-input
v-model="queryForm.idCard"
placeholder="请输入18位身份证号"
maxlength="18"
@input="handleIdCardInput"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="isQueryDialogOpen = false">取消</el-button>
<el-button type="primary" @click="handleQuerySubmit" :loading="isQueryLoading">
查询
</el-button>
</template>
</el-dialog>
</div>
</template>
<script lang="ts" setup>
import { reactive, computed, onMounted, ref, unref } from 'vue'
import { ElButton, ElMessage, ElForm, ElFormItem, ElInput, ElDialog, ElTabs, ElTabPane } from 'element-plus'
import {
getEnrollmentProcessStatus,
submitEnrollmentInfo
} from '@/api/enrollment'
//
const activeTab = ref('enroll') //
//
const stepTitles = ['报名', '材料审核', '录取', '缴费']
const submission = ref(false) //
const rejectionReason = ref('') //
//
const isQueryDialogOpen = ref(false) //
const isQueryLoading = ref(false) //
const queryFormRef = ref<InstanceType<typeof ElForm> | null>(null) //
//
const queryForm = reactive({
idCard: ''
})
//
const queryRules = reactive({
idCard: [
{ required: true, message: '请输入身份证号', trigger: 'blur' },
{
pattern: /(^\d{18}$)|(^\d{17}(\d|X|x)$)/,
message: '请输入有效的18位身份证号',
trigger: 'blur'
}
]
})
//
const studentData = reactive({
baseInfo: {
name: '',
gender: 0,
idCard: '',
birthday: '',
nationality: '',
phone: '',
email: '',
homeAddress: '',
nativePlace: '',
invitationCode: '',
politicalStatus: 0,
previousSchool: '',
schoolType: '',
graduationYear: 2025,
emergencyContact: '',
emergencyPhone: '',
relationship: ''
}
})
//
const statusConfig = reactive({
steps: [
{ completed: false, time: 0, status: 0 }, //
{ completed: false, time: 0, status: 0 }, //
{ completed: false, time: 0, status: 0 }, //
{ completed: false, time: 0, status: 0 } //
],
applicationNumber: '' //
})
//
const formatTime = (timestamp: number) => {
if (!timestamp) return ''
const date = new Date(timestamp)
return date.toLocaleDateString()
}
//
const getStepDescription = (index: number) => {
const step = statusConfig.steps[index]
const timeStr = formatTime(step.time)
if (index === 0) {
return step.completed ? `已完成${timeStr}` : '状态异常'
} else if (index === 1) {
if (step.status === 0) return '待审核'
if (step.status === 1) return `审核通过 ${timeStr}`
if (step.status === 2) return `审核不通过 ${timeStr}`
} else if (index === 2) {
if (step.status === 0) return '待审核'
if (step.status === 1) return `已录取 ${timeStr}`
if (step.status === 2) return `未录取 ${timeStr}`
} else if (index === 3) {
if (step.status === 0) return '未缴费'
if (step.status === 1) return `已缴费 ${timeStr}`
}
return ''
}
//
const handleConfirmSubmit = async () => {
try {
//
if (!/(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(studentData.baseInfo.idCard)) {
ElMessage.warning('请输入有效的18位身份证号')
return
}
await submitEnrollmentInfo(studentData.baseInfo)
submission.value = true
ElMessage.success('报名提交成功')
//
activeTab.value = 'query'
//
await loadProcessStatus(studentData.baseInfo.idCard)
} catch (error) {
ElMessage.error('报名提交失败,请稍后重试')
console.error('提交报名信息失败:', error)
}
}
//
const openQueryDialog = () => {
queryForm.idCard = ''
if (queryFormRef.value) {
queryFormRef.value.clearValidate()
}
isQueryDialogOpen.value = true
}
//
const handleIdCardInput = () => {
let idCardStr = String(queryForm.idCard || '')
idCardStr = idCardStr.replace(/[^0-9Xx]/g, '')
idCardStr = idCardStr.toUpperCase()
if (idCardStr.length > 18) {
idCardStr = idCardStr.slice(0, 18)
}
queryForm.idCard = idCardStr
}
//
const handleQuerySubmit = async () => {
const formRef = unref(queryFormRef)
if (!formRef) return
try {
await formRef.validate()
isQueryLoading.value = true
const statusRes = await getEnrollmentProcessStatus(queryForm)
if (statusRes) {
isQueryDialogOpen.value = false
submission.value = true
statusConfig.applicationNumber = statusRes.applicationNumber || ''
rejectionReason.value = statusRes.rejectionReason || ''
statusConfig.steps[0] = {
completed: statusRes.applicationNumber ? true : false,
time: statusRes.applicationTime || 0,
status: statusRes.applicationTime > 0 ? 1 : 0
}
statusConfig.steps[1] = {
completed: statusRes.approvalStatus === 1,
time: statusRes.approvalTime || 0,
status: statusRes.approvalStatus || 0
}
statusConfig.steps[2] = {
completed: statusRes.admissionStatus === 1,
time: statusRes.admissionTime || 0,
status: statusRes.admissionStatus || 0
}
statusConfig.steps[3] = {
completed: statusRes.paymentStatus === 1,
time: statusRes.paymentTime || 0,
status: statusRes.paymentStatus || 0
}
ElMessage.success('查询成功')
} else {
ElMessage.info('未查询到相关报名记录')
resetStatusConfig()
}
} catch (error) {
console.error('查询进度失败:', error)
ElMessage.error('查询失败,请稍后重试')
} finally {
isQueryLoading.value = false
}
}
//
const loadProcessStatus = async (idCard?: string) => {
const cardNo = idCard || studentData.baseInfo.idCard
if (!cardNo || typeof cardNo !== 'string') return
try {
const statusRes = await getEnrollmentProcessStatus(cardNo)
if (statusRes) {
submission.value = true
statusConfig.applicationNumber = statusRes.data.applicationNumber || ''
rejectionReason.value = statusRes.data.rejectionReason || ''
statusConfig.steps[0] = {
completed: statusRes.data.applicationNumber ? true : false,
time: statusRes.data.applicationTime || 0,
status: statusRes.data.applicationTime > 0 ? 1 : 0
}
statusConfig.steps[1] = {
completed: statusRes.data.approvalStatus === 1,
time: statusRes.data.approvalTime || 0,
status: statusRes.data.approvalStatus || 0
}
statusConfig.steps[2] = {
completed: statusRes.data.admissionStatus === 1,
time: statusRes.data.admissionTime || 0,
status: statusRes.data.admissionStatus || 0
}
statusConfig.steps[3] = {
completed: statusRes.data.paymentStatus === 1,
time: statusRes.data.paymentTime || 0,
status: statusRes.data.paymentStatus || 0
}
}
} catch (error) {
console.error('刷新状态失败:', error)
}
}
//
const resetStatusConfig = () => {
statusConfig.steps = [
{ completed: false, time: 0, status: 0 },
{ completed: false, time: 0, status: 0 },
{ completed: false, time: 0, status: 0 },
{ completed: false, time: 0, status: 0 }
]
statusConfig.applicationNumber = ''
rejectionReason.value = ''
submission.value = false
const graduationYear = studentData.baseInfo.graduationYear
Object.assign(studentData.baseInfo, {
name: '',
gender: 0,
idCard: '',
birthday: '',
nationality: '',
phone: '',
email: '',
homeAddress: '',
nativePlace: '',
politicalStatus: 0,
previousSchool: '',
schoolType: '',
graduationYear,
emergencyContact: '',
emergencyPhone: '',
relationship: ''
})
}
//
const activeStep = computed(() => {
if (
statusConfig.steps[1].status === 2 ||
statusConfig.steps[2].status === 2
) {
return statusConfig.steps[1].status === 2 ? 1 : 2
}
const count = completedStepCount.value
return count >= statusConfig.steps.length
? statusConfig.steps.length - 1
: count
})
//
const getStepStatus = (index: number) => {
if (statusConfig.steps[index].completed) {
return 'finish'
}
if (
(index === 1 && statusConfig.steps[index].status === 2) ||
(index === 2 && statusConfig.steps[index].status === 2)
) {
return 'error'
}
return index === activeStep.value ? 'process' : 'wait'
}
//
const completedStepCount = computed(() => {
return statusConfig.steps.filter((step) => step.completed).length
})
//
onMounted(() => {
const idCard = studentData.baseInfo.idCard
if (idCard && typeof idCard === 'string') {
loadProcessStatus(idCard)
}
})
</script>
<style lang="scss" scoped>
.el-dialog__body {
padding: 20px;
}
.el-form-item {
margin-bottom: 20px;
}
.el-tabs {
margin-bottom: 20px;
}
</style>

View File

@ -158,6 +158,9 @@ import { ElButton, ElMessage, ElForm, ElFormItem, ElInput } from 'element-plus'
import { import {
submitEnrollmentInfo submitEnrollmentInfo
} from '@/api/enrollment' } from '@/api/enrollment'
import { useRouter } from 'vue-router'
const router = useRouter()
// //
const studentData = reactive({ const studentData = reactive({
@ -190,8 +193,16 @@ const handleConfirmSubmit = async () => {
ElMessage.warning('请输入有效的18位身份证号') ElMessage.warning('请输入有效的18位身份证号')
return return
} }
await submitEnrollmentInfo(studentData.baseInfo) const data = await submitEnrollmentInfo(studentData.baseInfo)
ElMessage.success('报名提交成功') console.log(data)
if(data.code === 1){
ElMessage.success('报名提交成功')
router.push({
path: '/query',
query: { idCard: studentData.baseInfo.idCard }
})
}
else ElMessage.error(data.msg)
} catch (error) { } catch (error) {
ElMessage.error('报名提交失败,请稍后重试') ElMessage.error('报名提交失败,请稍后重试')
console.error('提交报名信息失败:', error) console.error('提交报名信息失败:', error)

View File

@ -104,23 +104,20 @@
import { reactive, computed, onMounted, ref, unref } from 'vue' import { reactive, computed, onMounted, ref, unref } from 'vue'
import { ElButton, ElMessage, ElForm, ElFormItem, ElInput, ElDialog, ElTabs, ElTabPane } from 'element-plus' import { ElButton, ElMessage, ElForm, ElFormItem, ElInput, ElDialog, ElTabs, ElTabPane } from 'element-plus'
import { import {
getEnrollmentProcessStatus, getEnrollmentProcessStatus
submitEnrollmentInfo
} from '@/api/enrollment' } from '@/api/enrollment'
import { useRoute } from 'vue-router'
//
const activeTab = ref('enroll') // const activeTab = ref('enroll') //
const route = useRoute()
// //
const stepTitles = ['报名', '材料审核', '录取', '缴费'] const stepTitles = ['报名', '缴费', '等待录取']
const submission = ref(false) // const submission = ref(false) //
const rejectionReason = ref('') // const rejectionReason = ref('') //
// //
const isQueryDialogOpen = ref(false) // const isQueryDialogOpen = ref(false) //
const isQueryLoading = ref(false) // const isQueryLoading = ref(false) //
const queryFormRef = ref<InstanceType<typeof ElForm> | null>(null) // const queryFormRef = ref<InstanceType<typeof ElForm> | null>(null) //
// //
const queryForm = reactive({ const queryForm = reactive({
idCard: '' idCard: ''
@ -165,9 +162,8 @@ const studentData = reactive({
const statusConfig = reactive({ const statusConfig = reactive({
steps: [ steps: [
{ completed: false, time: 0, status: 0 }, // { completed: false, time: 0, status: 0 }, //
{ completed: false, time: 0, status: 0 }, // { completed: false, time: 0, status: 0 }, //
{ completed: false, time: 0, status: 0 }, // { completed: false, time: 0, status: 0 }, //
{ completed: false, time: 0, status: 0 } //
], ],
applicationNumber: '' // applicationNumber: '' //
}) })
@ -186,16 +182,12 @@ const getStepDescription = (index: number) => {
if (index === 0) { if (index === 0) {
return step.completed ? `已完成${timeStr}` : '状态异常' return step.completed ? `已完成${timeStr}` : '状态异常'
} else if (index === 1) { } else if (index === 1) {
if (step.status === 0) return '待审核'
if (step.status === 1) return `审核通过 ${timeStr}`
if (step.status === 2) return `审核不通过 ${timeStr}`
} else if (index === 2) {
if (step.status === 0) return '待审核'
if (step.status === 1) return `已录取 ${timeStr}`
if (step.status === 2) return `未录取 ${timeStr}`
} else if (index === 3) {
if (step.status === 0) return '未缴费' if (step.status === 0) return '未缴费'
if (step.status === 1) return `已缴费 ${timeStr}` if (step.status === 1) return `已缴费 ${timeStr}`
} else if (index === 2) {
if (step.status === 0) return '等待录取通知'
if (step.status === 1) return `录取通知已发送 ${timeStr}`
if (step.status === 2) return `未录取 ${timeStr}`
} }
return '' return ''
} }
@ -220,7 +212,8 @@ const handleQuerySubmit = async () => {
await formRef.validate() await formRef.validate()
isQueryLoading.value = true isQueryLoading.value = true
const statusRes = await getEnrollmentProcessStatus(queryForm) const data = await getEnrollmentProcessStatus(queryForm)
const statusRes = data.data
if (statusRes) { if (statusRes) {
isQueryDialogOpen.value = false isQueryDialogOpen.value = false
@ -240,15 +233,10 @@ const handleQuerySubmit = async () => {
status: statusRes.approvalStatus || 0 status: statusRes.approvalStatus || 0
} }
statusConfig.steps[2] = { statusConfig.steps[2] = {
completed: statusRes.admissionStatus === 1, completed: statusRes.admissionStatus === 6,
time: statusRes.admissionTime || 0, time: statusRes.admissionTime || 0,
status: statusRes.admissionStatus || 0 status: statusRes.admissionStatus || 0
} }
statusConfig.steps[3] = {
completed: statusRes.paymentStatus === 1,
time: statusRes.paymentTime || 0,
status: statusRes.paymentStatus || 0
}
ElMessage.success('查询成功') ElMessage.success('查询成功')
} else { } else {
@ -290,11 +278,6 @@ const loadProcessStatus = async (idCard?: string) => {
time: statusRes.data.admissionTime || 0, time: statusRes.data.admissionTime || 0,
status: statusRes.data.admissionStatus || 0 status: statusRes.data.admissionStatus || 0
} }
statusConfig.steps[3] = {
completed: statusRes.data.paymentStatus === 1,
time: statusRes.data.paymentTime || 0,
status: statusRes.data.paymentStatus || 0
}
} }
} catch (error) { } catch (error) {
console.error('刷新状态失败:', error) console.error('刷新状态失败:', error)
@ -304,7 +287,6 @@ const loadProcessStatus = async (idCard?: string) => {
// //
const resetStatusConfig = () => { const resetStatusConfig = () => {
statusConfig.steps = [ statusConfig.steps = [
{ completed: false, time: 0, status: 0 },
{ completed: false, time: 0, status: 0 }, { completed: false, time: 0, status: 0 },
{ completed: false, time: 0, status: 0 }, { completed: false, time: 0, status: 0 },
{ completed: false, time: 0, status: 0 } { completed: false, time: 0, status: 0 }
@ -371,9 +353,19 @@ const completedStepCount = computed(() => {
// //
onMounted(() => { onMounted(() => {
const idCard = studentData.baseInfo.idCard //
if (idCard && typeof idCard === 'string') { const idCardFromRoute = route.query.idCard as string
loadProcessStatus(idCard) if (idCardFromRoute) {
queryForm.idCard = idCardFromRoute
//
setTimeout(() => {
handleQuerySubmit()
}, 100)
} else {
const idCard = studentData.baseInfo.idCard
if (idCard && typeof idCard === 'string') {
loadProcessStatus(idCard)
}
} }
}) })
</script> </script>