提交 df1d24e1 authored 作者: lhh's avatar lhh

报名申请

上级 ef502893
No preview for this file type
<template>
<nav class="app-menu">
<ul>
<tree-item :item="item" v-for="(item, index) in list" :key="index" class="first"></tree-item>
<!-- <tree-item :item="item" v-for="(item, index) in list" :key="index" class="first"></tree-item> -->
</ul>
</nav>
</template>
......
......@@ -85,7 +85,7 @@ export default {
children: [
{ name: '学习费用', path: '/apply/tab1' },
{ name: '申请流程', path: '/apply/tab2' },
{ name: '在线报名', path: '/my' }
{ name: '在线报名', path: '/my/account' }
]
},
// 项目优势
......
......@@ -3,35 +3,51 @@
<header class="header">
<div class="inner">
<div class="logo">
<router-link to="/"><img src="https://webapp-pub.ezijing.com/project/application/images/ezijing-logo.png"/></router-link>
<router-link to="/home"
><img src="https://webapp-pub.ezijing.com/project/application/images/ezijing-logo.png"
/></router-link>
</div>
</div>
</header>
<nav class="nav"><h1 class="title">斯蒂文斯理工学院工程管理硕士保研项目推荐信</h1></nav>
<nav class="nav">
<h1 class="title">巴黎PPA商学院DBA项目推荐信<br />PPA DBA Recommendation Letter</h1>
</nav>
<section class="content">
<el-form :model="ruleForm" :rules="rules" ref="form" label-width="100px" :label-position="labelPosition" @submit.native.prevent style="max-width: 680px">
<el-form-item label="姓名" prop="provider_name">
<el-form
:model="ruleForm"
:rules="rules"
ref="form"
label-width="130px"
label-position="top"
@submit.native.prevent
>
<el-form-item label="推荐人姓名/Name of Referrer" prop="provider_name">
<el-input v-model="ruleForm.provider_name" @blur="onBlur('provider_name')"></el-input>
</el-form-item>
<el-form-item label="推荐信内容" prop="letter_content">
<el-input type="textarea" :autosize="{ minRows: 6 }" v-model="ruleForm.letter_content" @blur="onBlur('letter_content')"></el-input>
<el-form-item label="推荐信内容/Content of Recommendation Letter" prop="letter_content">
<el-input
type="textarea"
:autosize="{ minRows: 6 }"
v-model="ruleForm.letter_content"
@blur="onBlur('letter_content')"
></el-input>
</el-form-item>
<el-form-item label="手机号" prop="provider_phone_number">
<el-form-item label="推荐人手机号/Contact Number of Referrer" prop="provider_phone_number">
<el-input v-model="ruleForm.provider_phone_number"></el-input>
</el-form-item>
<el-form-item label="工作单位" prop="provider_company_name">
<el-form-item label="推荐人工作单位/Work Place of Referrer" prop="provider_company_name">
<el-input v-model="ruleForm.provider_company_name" @blur="onBlur('provider_company_name')"></el-input>
</el-form-item>
<el-form-item label="职务" prop="provider_job_title">
<el-form-item label="推荐人职务/Position/Title of Referrer" prop="provider_job_title">
<el-input v-model="ruleForm.provider_job_title" @blur="onBlur('provider_job_title')"></el-input>
</el-form-item>
</el-form>
<div class="buttons">
<el-button type="primary" @click="handleSubmit">确认提交</el-button>
<el-button type="primary" @click="handleSubmit">确认提交/Submit</el-button>
</div>
</section>
<el-dialog title="推荐信提交成功" :visible.sync="dialogVisible" :center="true" width="400px">
<el-dialog title="推荐信提交成功" :visible.sync="dialogVisible" :center="true" width="348px">
<div style="text-align: center">
<img src="https://webapp-pub.ezijing.com/project/application/images/icon_success.png" />
</div>
......@@ -138,10 +154,11 @@ export default {
.nav {
background-color: var(--main-color);
.title {
padding: 15px 0;
font-size: 24px;
font-weight: 600;
color: #fff;
line-height: 60px;
line-height: 30px;
text-align: center;
}
}
......@@ -169,7 +186,7 @@ export default {
}
.buttons {
border-top: 1px solid #f1f1f1;
padding: 20px 100px;
padding: 20px 0;
}
@media (max-width: 767px) {
.logo {
......
......@@ -2,20 +2,21 @@
<div class="my">
<div class="card">
<div class="result">
<div class="result-left"><img src="https://webapp-pub.ezijing.com/project/application/images/my_icon.png" />招生办反馈</div>
<!-- <div class="result-right">{{ result.submit_status_desc || '未收到报名信息' }}</div> -->
<div class="result-left">
<img src="https://webapp-pub.ezijing.com/project/application/images/my_icon.png" />招生办反馈
</div>
<div class="result-right">{{ result.submit_status_desc || '未收到报名信息' }}</div>
</div>
</div>
<div class="card" style="min-height: 360px">
<ul class="nav">
<li class="nav-application" @click="toApplication"></li>
<li class="nav-interview" @click="toInterview"></li>
<li class="nav-review" @click="toReview"></li>
<li class="nav-admission" @click="toAdmission"></li>
</ul>
<div class="progress">
<el-steps :active="activeProgress" finish-status="success" align-center>
<el-step v-for="(item, index) in 4" :key="index">
<el-step v-for="(item, index) in 3" :key="index">
<template #title>{{ getProgressStatusText(index) }}</template>
</el-step>
</el-steps>
......@@ -28,7 +29,7 @@
<img src="https://webapp-pub.ezijing.com/project/application/images/welcome.png" width="350" />
<div class="welcome-content">
<h1>欢迎您报考</h1>
<h2>斯蒂文斯理工学院</h2>
<h2>巴黎PPA商学院</h2>
<div class="welcome-button" @click="handleStart">马上开始</div>
</div>
</div>
......@@ -48,11 +49,10 @@ export default {
material: {},
progress: {},
submissionStage: {
0: ['FILLING'],
1: ['INTERVIEW_APPLICATION', 'AUDITION', 'INTERVIEW', 'PREPAYMENT'],
2: ['REGISTRATION', 'PAYMENT'],
3: ['CLOSED'],
4: ['FINISHED']
0: ['FILLING', 'PREPAYMENT'],
1: ['INTERVIEW_APPLICATION', 'AUDITION', 'INTERVIEW', 'PAYMENT'],
2: ['REGISTRATION'],
3: ['CLOSED']
},
result: {},
welcomeShow: false
......@@ -66,19 +66,10 @@ export default {
for (const key in this.submissionStage) {
const list = this.submissionStage[key]
if (list.includes(this.material.submission_stage)) {
// if (key === '3' && !this.isPay) {
// return 2
// }
return parseInt(key)
}
}
return 0
},
isPay() {
const records = this.material?.payment_records || []
return !!records.find(item => {
return item.bill_type === 'APPLICATION_FEE' && item.payment_status === 'SUCCESS'
})
}
},
methods: {
......@@ -116,7 +107,7 @@ export default {
},
// 报名申请
toApplication() {
this.$router.push('/my/application')
this.$router.push('/my/application?active=application_info')
},
// 申请面试
toInterview() {
......@@ -126,17 +117,10 @@ export default {
}
this.$router.push('/my/interview')
},
toReview() {
if (this.activeProgress < 2) {
this.$message.warning('请等待面试结果')
return
}
this.$router.push('/my/review')
},
// 办理入学
toAdmission() {
if (this.activeProgress < 3) {
this.$message.warning('请完成综合评审')
if (this.activeProgress < 2) {
this.$message.warning('请等待面试结果')
return
}
this.$router.push('/my/admission')
......@@ -180,18 +164,10 @@ export default {
position: 'bottom-right'
}
},
{
element: '.nav-review',
popover: {
title: '第三步:',
description: '点击<span style="color:#af1b40">综合评审</span>,进入综合评审材料的上传。',
position: 'bottom-right'
}
},
{
element: '.nav-admission',
popover: {
title: '第步:',
title: '第步:',
description: '点击<span style="color:#af1b40">办理入学</span>,进入办理入学材料的上传。',
position: 'bottom-right'
}
......@@ -212,7 +188,6 @@ export default {
.card {
background: #fff;
border-radius: 5px;
margin: 0;
}
.card + .card {
margin-top: 10px;
......@@ -243,13 +218,6 @@ export default {
background-image: url('https://webapp-pub.ezijing.com/project/application/images/my_02_hover.png');
}
}
.nav-review {
background-image: url('https://webapp-pub.ezijing.com/project/application/images/my_review.png');
&:hover {
background-image: url('https://webapp-pub.ezijing.com/project/application/images/my_review_hover.png');
}
}
.nav-admission {
background-image: url('https://webapp-pub.ezijing.com/project/application/images/my_03.png');
&:hover {
......
// import xy from './xy'
import xfjn from './xfjn'
import xy from './xy'
// import xfjn from './xfjn'
export default function (_this) {
export default function(_this) {
return {
id: 'admission',
title: '入学办理',
children: [
xfjn(_this)
// xy(_this)
]
children: [xy(_this)]
}
}
export default function (_this) {
return {
required: true,
id: 'admission_xfjn',
title: '缴费凭证',
// visible() {
// return _this.hasPay
// },
get: {
callback(data) {
const { attachments = [] } = _this.detail.material
const PAYMENT_VOUCHER = attachments.filter(item => {
return item.file_type_id === 'PAYMENT_VOUCHER'
})
return { PAYMENT_VOUCHER }
}
},
update: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/submit/${process.env.projectId}`,
beforeRequest(data) {
return { submission_stage: 'CLOSED' }
},
callback() {
_this.$message({ type: 'success', message: '提交成功' })
_this.getApplication()
this.form.options.disabled = true
},
errorCallback() {
_this.completeVisible = true
}
},
form: {
// next: { to: { query: { active: 'admission_xy' } } },
submitText: '提交',
options: { 'label-position': 'top' },
// prepend: `
// <p><strong>一、对公收款银行信息:</strong></p>
// <p>户名:清控紫荆( 北京)教育科技股份有限公司</p>
// <p>帐号:694485289</p>
// <p>开户行:中国民生银行股份有限公司北京魏公村支行</p>
// <p style="margin-top:30px;"><strong>二、支付宝收款账户信息:</strong></p>
// <p>支付宝账号:service@ezijing.com</p>
// <p>支付宝户名:清控紫荆(北京)教育科技股份有限公司</p>`,
items: [
{
required: true,
type: 'v-upload',
model: 'PAYMENT_VOUCHER',
label: '上传缴费凭证',
rules: [{ required: true, message: '请上传', trigger: 'change' }],
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'PAYMENT_VOUCHER' }
},
append: `申请者可将转账/支付缴费凭证截图或拍照后提交。<br>
上传多个文件,请打印出来检查无误后再上传。用A4纸打印后内容需显示完整、格式整齐、字迹清晰可辨。上传文件仅限“jpg,jpeg,pdf,png”格式,文件小于10Mb。`
}
]
}
}
export default {
id: 'admission_xfjn',
title: '学费缴纳',
html: `
<p><strong>一、对公收款银行信息:</strong></p>
<p>户名:清控紫荆( 北京)教育科技股份有限公司</p>
<p>帐号:694485289</p>
<p>开户行:中国民生银行股份有限公司北京魏公村支行</p>
<p style="margin-top:30px;"><strong>二、支付宝收款账户信息:</strong></p>
<p>支付宝账号:service@ezijing.com</p>
<p>支付宝户名:清控紫荆(北京)教育科技股份有限公司</p>
`
}
export default function (_this) {
export default function(_this) {
return {
id: 'admission_xy',
title: '入学协议',
required: true,
get: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}`,
callback(data) {
const { attachments = [] } = _this.detail.material
const { attachments = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
const stageList = [
'FILLING',
'PREPAYMENT',
'INTERVIEW_APPLICATION',
'AUDITION',
'INTERVIEW',
'PAYMENT',
'REGISTRATION',
'CLOSED'
]
this.form.options.disabled = stageList.findIndex(item => item === submissionStage) > 6
const ADMISSION_AGREEMENT = attachments.filter(item => {
return item.file_type_id === 'ADMISSION_AGREEMENT'
})
......@@ -15,11 +26,9 @@ export default function (_this) {
update: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/submit/${process.env.projectId}`,
beforeRequest(data) {
return { submission_stage: 'CLOSED' }
return { submission_stage: 'REGISTRATION' }
},
callback() {
_this.$message({ type: 'success', message: '提交成功' })
_this.getApplication()
this.form.options.disabled = true
},
errorCallback() {
......@@ -27,25 +36,21 @@ export default function (_this) {
}
},
form: {
// next: { to: { query: { active: 'admission_xfjn' } } },
submitText: '提交',
options: { 'label-position': 'top' },
options: { disabled: false },
items: [
{
type: 'v-upload',
required: true,
label: '入学协议',
model: 'ADMISSION_AGREEMENT',
rules: [{ required: true, message: '请上传', trigger: 'change' }],
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'ADMISSION_AGREEMENT' }
},
prepend:
// <p><a href="https://webapp-pub.ezijing.com/project/sbu-plus/%E5%85%A5%E5%AD%A6%E5%8D%8F%E8%AE%AE.pdf" target="_blank" download="入学协议">下载入学协议</a></p>
`<p>申请者可将签字后的入学协议原件扫描或拍照后提交。</p>
<p>学员应仔细阅读《入学协议》以及课程介绍,如对入学协议或课程有异议,请第一时间与课程顾问咨询确认。请用A4纸打印后,在入学协议上签上姓名和日期,内容需显示完整、格式整齐、字迹清晰可辨。上传文件仅限“jpg,jpeg,pdf,png”格式,文件小于10Mb。</p>
`
rules: [{ type: 'array', required: true, message: '请上传入学协议', trigger: 'change' }],
prepend: `<p>请将签字后的入学协议原件扫描或拍照后提交,完成入学。点击下方按钮,上传文件</p>`
}
]
}
......
......@@ -2,14 +2,15 @@
<app-layout>
<vue-form
:menus="menus"
:disabled="isSubmitted"
:default-active="currentActive"
@page-change="handlePageChange"
@success="handleSuccess"
@error="handleError"
@back="$router.push('/my/account')"
@prev="handlePrev"
@next="handleNext"
@uploaded="getApplication"
v-if="detail">
>
<template #aside-append>
<div class="aside-payment"><a href="https://accounts.ezijing.com/payment" target="_blank">查看缴费记录</a></div>
<div class="aside-logout" @click="$store.dispatch('logout')"><span>退出登录</span></div>
......@@ -19,17 +20,22 @@
<app-xy />
</template> -->
</vue-form>
<el-dialog title="办理入学资料提交成功" :visible.sync="dialogVisible" :center="true" :close-on-click-modal="false" width="400px">
<!-- <el-dialog
title="办理入学资料提交成功"
:visible.sync="dialogVisible"
:center="true"
:close-on-click-modal="false"
width="348px"
>
<div class="dialog-tips">
<!-- <p>请确认是否已缴费,如未缴费点击下方缴费按钮 <br />(已缴费,请忽略)</p> -->
<p>请确认是否已缴费,如未缴费点击下方缴费按钮 <br />(已缴费,请忽略)</p>
<div class="icon"><img src="https://webapp-pub.ezijing.com/project/application/images/icon_success.png" /></div>
</div>
<template #footer>
<!-- <el-button type="primary" @click="toPay">立即缴费</el-button> -->
<el-button type="primary" @click="toPay">立即缴费</el-button>
<el-button type="primary" @click="dialogVisible = false">忽略</el-button>
</template>
</el-dialog>
<app-complete :type="3" v-model="completeVisible"></app-complete>
</el-dialog> -->
</app-layout>
</template>
......@@ -38,19 +44,15 @@ import AppLayout from '../layout.vue'
import getMenu from './form'
import * as api from '@/api/my'
import AppXy from './xy'
import AppComplete from '../application/complete.vue'
import { STAGE_LIST } from '../index'
export default {
components: { AppLayout, AppXy, AppComplete },
components: { AppLayout, AppXy },
data() {
const menus = getMenu(this)
return {
menus: [menus],
currentActive: 'admission_xfjn',
currentActive: 'admission_xy',
dialogVisible: false,
detail: null,
completeVisible: false
detail: null
}
},
watch: {
......@@ -58,51 +60,36 @@ export default {
immediate: true,
handler(route) {
const { query = {} } = route
this.currentActive = query.active || 'admission_xfjn'
this.currentActive = query.active || 'admission_xy'
}
},
showSubmittedDialog(value) {
showSubmitedDialog(value) {
this.dialogVisible = value
}
},
computed: {
isSubmitted() {
isSubmited() {
if (this.detail) {
return STAGE_LIST.findIndex(item => item === this.detail.material.submission_stage) > 7
return !!this.detail.material.attachments.find(item => item.file_type_id === 'ADMISSION_AGREEMENT')
}
return false
},
showSubmittedDialog() {
return this.isSubmitted && this.currentActive === 'admission_byzs'
},
user() {
return this.$store.state.user
},
hasPay() {
if (this.detail) {
return this.detail.material.submission_stage === 'CLOSED'
}
return false
showSubmitedDialog() {
return this.isSubmited && this.currentActive === 'admission_xy'
}
},
methods: {
// 获取报名信息
getApplication() {
api.getApplication().then(res => {
this.detail = res.data
api.getApplication().then(response => {
const { data, error, message } = response
if (error.toString() === '0') {
this.detail = data
} else {
this.$message.error(message)
}
})
},
changeSubmissionStage(callback) {
api
.changeSubmissionStage({ submission_stage: 'REGISTRATION' })
.then(() => {
this.getApplication()
callback && callback()
})
.catch(() => {
this.completeVisible = true
})
},
handlePageChange(value) {
this.currentActive = value
this.$router.push({ path: this.$route.path, query: { active: value } })
......@@ -116,44 +103,15 @@ export default {
console.log('提交失败了', data)
this.$message({ type: 'error', message: data.message })
},
handlePrev(to) {
this.$router.push(to)
},
handleNext(to) {
this.$router.push(to)
},
toPay() {
this.dialogVisible = false
this.$router.push({ path: '/my/admission', query: { active: 'admission_xfjn' } })
},
// 更换推荐人
changeProvider(data) {
api.updateProvider(data.id, data).then(response => {
const { error, message } = response
if (error.toString() === '0') {
this.sendToProvider(data)
// this.$message({ type: 'success', message })
} else {
this.$message.error(message)
}
})
},
// 再次邀请推荐
sendToProvider(data) {
api.sendToProvider(data.id).then(response => {
const { error, message } = response
if (error.toString() === '0') {
this.$message({ type: 'success', message })
} else {
this.$message.error(message)
}
})
},
// 发送推荐信
sendToProviders() {
api.sendToProviders().then(response => {
const { error, message } = response
if (error.toString() === '0') {
this.$message({ type: 'success', message })
} else {
this.$message.error(message)
}
})
}
},
beforeMount() {
......
......@@ -46,12 +46,12 @@
<p>2.<b>入学项目:</b></p>
<p>
<b
>项目课程为【紫荆教育-索菲亚金融方向工商管理硕士(FMBA)2021年春季班】。该项目学制为【2】年,自当期项目课程开课之日起计算。</b
>如学员因个人原因需要延长学习期限的,须至少提前<b>3</b>个月申请延期,批准后方可延期毕业。最长可延期<b>【12】</b>个月,自所报名的项目课程原定毕业之日起算。
>项目课程为【紫荆-瑞士酒店管理大学工商管理硕士MBA第1期】。该项目学制为【2】年,自当期项目课程开课之日起计算。</b
>如学员因个人原因需要延长学习期限的,须至少提前<b>4</b>个月申请延期,批准后方可延期毕业。最长可延期<b>【12】</b>个月,自所报名的项目课程原定毕业之日起算。
</p>
<p>
<b>课程的总学分为【48】学分,其中必修课【48】学分。先修课3门,不计入学分</b
>课程成绩未通过需要重修或选修其它课程。重修或选修超规定的学分的,需按学分单价缴纳相关费用。
<b>课程的总学分为【30】学分,其中必修课【30】学分,选修课【0】分。课程成绩未通过需要重修或选修其它课程</b
>重修或选修超规定的学分的,需按学分单价缴纳相关费用。
</p>
<app-collapse>
<template #title>3.<b>教学说明:</b></template>
......@@ -61,7 +61,7 @@
<p>(2)授课教师安排及调整。我们可能会调整相关课程的任课教师,该教师如与宣传材料不符以实际任课教师为准。</p>
</app-collapse>
<app-collapse>
<template #title>4.<b>费用。</b>本项目学费共计人民币【71000】元整,包含授课费用、证书费用,不包含:</template>
<template #title>4.<b>费用。</b>本项目学费共计人民币【120000】元整,包含授课费用、证书费用,不包含:</template>
<p>学习期间的交通费、食宿费、邮寄费、书本费等费用;</p>
<p>海外学习、海外毕业典礼等费用;</p>
<p>毕业服装、纪念品、校友会活动等相关费用;</p>
......@@ -161,7 +161,7 @@ export default {
},
methods: {
createSign() {
api.createSign({ type: 'marywood-agreement' }).then(response => {
api.createSign({ type: 'shms-agreement' }).then(response => {
const { code, data } = response
if (code === 1) {
this.sign = data
......@@ -172,7 +172,7 @@ export default {
})
},
getSignDocument(flowid) {
return api.getSignDocument({ flowid, type: 'marywood-agreement' }).then(response => {
return api.getSignDocument({ flowid, type: 'shms-agreement' }).then(response => {
const { code, data } = response
if (code === 1) {
this.documentUrl = data.url
......
<template>
<el-dialog
title="您当前完成进度如下:"
width="448px"
width="348px"
:center="true"
:close-on-click-modal="false"
:visible.sync="dialogVisible"
......@@ -11,13 +11,13 @@
<div>
<ul v-if="detail">
<li
v-for="(item, index) in currentOptions"
:class="progress(item.code) ? 'is-success' : 'is-error'"
:key="index"
v-for="item in currentOptions"
:class="progress[item.code].progress === 1 ? 'is-success' : 'is-error'"
:key="item.code"
>
<span class="name">{{ item.title }}</span>
<span class="line"></span>
<span class="status">{{ progress(item.code) ? '已完成' : '未完成' }}</span>
<span class="status">{{ progress[item.code].progress === 1 ? '已完成' : '未完成' }}</span>
<span class="view" @click="handleView(item.view.to)">立即查看</span>
</li>
</ul>
......@@ -29,7 +29,6 @@
</template>
<script>
import { get } from 'lodash'
import * as api from '@/api/my'
export default {
props: { value: { type: Boolean, default: false }, type: { type: Number, default: 0 } },
......@@ -37,109 +36,45 @@ export default {
return {
dialogVisible: false,
detail: null,
progress: {},
options: [
[
{
title: '个人资料',
code: 'FILLING.total_progress',
code: 'applicaitonInfo',
view: { to: { path: '/my/application', query: { active: 'application_info' } } }
}
],
[
{
title: '英文简历',
code: 'INTERVIEW_APPLICATION.attachments.missed_required_list.RESUME_EN',
view: { to: { path: '/my/interview', query: { active: 'interview_ywjl' } } }
},
{
title: '成绩单',
code: [
'INTERVIEW_APPLICATION.attachments.missed_required_list.REPORT_CARD_CN',
'INTERVIEW_APPLICATION.attachments.missed_required_list.REPORT_CARD_EN',
'INTERVIEW_APPLICATION.basic_info.missed_required_list.gpa_score',
'INTERVIEW_APPLICATION.basic_info.missed_required_list.average_score'
],
view: { to: { path: '/my/interview', query: { active: 'interview_cjd' } } }
},
{
title: '语言能力证明',
code: 'INTERVIEW_APPLICATION.attachments.missed_required_list.INTERNATIONAL_LANGUAGE_SCORE',
view: { to: { path: '/my/interview', query: { active: 'interview_yynl' } } }
},
{
title: '推荐信',
code: [
'INTERVIEW_APPLICATION.attachments.missed_required_list.RECOMMENDATION_LETTER',
'INTERVIEW_APPLICATION.attachments.missed_required_list.RECOMMENDATION_LETTER_2'
],
view: { to: { path: '/my/interview', query: { active: 'interview_tjx' } } }
},
{
title: '个人陈述',
code: 'INTERVIEW_APPLICATION.attachments.missed_required_list.PERSONAL_STATEMENT',
view: { to: { path: '/my/interview', query: { active: 'interview_grcs' } } }
},
{
title: '毕业证或在读证明',
code: [
'INTERVIEW_APPLICATION.attachments.missed_required_list.DIPLOMA_CN',
'INTERVIEW_APPLICATION.attachments.missed_required_list.DEGREE_CERT_CN',
'INTERVIEW_APPLICATION.attachments.missed_required_list.PROOF_READING'
],
view: { to: { path: '/my/interview', query: { active: 'interview_byzs' } } }
},
{
title: '申请表格',
code: 'INTERVIEW_APPLICATION.attachments.missed_required_list.APPLICATION_FORM',
view: { to: { path: '/my/interview', query: { active: 'interview_form' } } }
code: 'applicationTjx',
view: { to: { path: '/my/application', query: { active: 'application_tjx' } } }
}
// {
// title: '无犯罪证明',
// code: 'applicationWfzzm',
// view: { to: { path: '/my/application', query: { active: 'application_wfzzm' } } }
// }
],
[
{
title: '成绩单',
code: 'REGISTRATION.attachments.missed_required_list.REPORT_CARD_EN',
view: { to: { path: '/my/review', query: { active: 'admission_cjd' } } }
title: '毕业证书',
code: 'interviewByz',
view: { to: { path: '/my/interview', query: { active: 'interview_byz' } } }
},
{
title: '推荐信',
code: [
'REGISTRATION.attachments.missed_required_list.RECOMMENDATION_LETTER',
'REGISTRATION.attachments.missed_required_list.RECOMMENDATION_LETTER_2'
],
view: { to: { path: '/my/review', query: { active: 'admission_tjx' } } }
},
{
title: '个人陈述',
code: 'REGISTRATION.attachments.missed_required_list.PERSONAL_STATEMENT',
view: { to: { path: '/my/review', query: { active: 'admission_grcs' } } }
},
{
title: '毕业证或在读证明',
code: [
'REGISTRATION.attachments.missed_required_list.DIPLOMA_CN',
'REGISTRATION.attachments.missed_required_list.DEGREE_CERT_CN',
'REGISTRATION.attachments.missed_required_list.PROOF_READING'
],
view: { to: { path: '/my/review', query: { active: 'admission_byzs' } } }
title: '成绩单',
code: 'interviewCjd',
view: { to: { path: '/my/interview', query: { active: 'interview_cjd' } } }
},
{
title: '申请表格',
code: 'INTERVIEW_APPLICATION.attachments.missed_required_list.APPLICATION_FORM',
view: { to: { path: '/my/review', query: { active: 'admission_form' } } }
}
],
[
{
title: '缴费凭证',
code: 'CLOSED.attachments.missed_required_list.PAYMENT_VOUCHER',
view: { to: { path: '/my/admission', query: { active: 'admission_xfjn' } } }
title: '2寸照片',
code: 'interviewZp',
view: { to: { path: '/my/interview', query: { active: 'interview_zp' } } }
},
{
title: '入学协议',
code: 'CLOSED.attachments.missed_required_list.ADMISSION_AGREEMENT',
view: { to: { path: '/my/admission', query: { active: 'admission_xy' } } }
title: '推荐信',
code: 'interviewTjx',
view: { to: { path: '/my/application', query: { active: 'application_tjx' } } }
}
]
]
......@@ -161,23 +96,67 @@ export default {
methods: {
// 获取报名信息
getApplication() {
api.getApplication().then(response => {
api.getApplication(this.$route.query).then(response => {
const { data, error, message } = response
if (error.toString() === '0') {
const { progress } = data
this.detail = data
const fillingMissedRequiredList = progress.FILLING.attachments.missed_required_list
// 个人资料
const applicaitonInfo = { progress: 0 }
const infoRequriedList = ['basic_info', 'educations', 'careers', 'answers']
for (const key of infoRequriedList) {
if (progress.FILLING[key].progress < 1) {
applicaitonInfo.progress = 0
break
}
applicaitonInfo.progress = 1
}
if (applicaitonInfo.progress === 1 && !fillingMissedRequiredList.ID_CARD_PHOTO) {
applicaitonInfo.progress = 1
} else {
applicaitonInfo.progress = 0
}
// 推荐信
const applicationTjx = { progress: 0 }
applicationTjx.progress = progress.FILLING.reco_letters ? progress.FILLING.reco_letters.progress : 0
// 无犯罪证明
const applicationWfzzm = { progress: 0 }
applicationWfzzm.progress = fillingMissedRequiredList.NO_CRIMINAL_CERT ? 0 : 1
const missedRequiredList = progress.INTERVIEW_APPLICATION.attachments.missed_required_list
// 毕业证书
const interviewByz = { progress: 0 }
interviewByz.progress = missedRequiredList.DIPLOMA_CN ? 0 : 1
// 学位证书
const interviewXwzs = { progress: 0 }
interviewXwzs.progress = missedRequiredList.DEGREE_CERT_CN ? 0 : 1
// 成绩单
const interviewCjd = { progress: 0 }
interviewCjd.progress = missedRequiredList.REPORT_CARD_CN || missedRequiredList.REPORT_CARD_EN ? 0 : 1
// 2寸照片
const interviewZp = { progress: 0 }
interviewZp.progress = missedRequiredList.PERSONAL_PHOTO_FOR_ID ? 0 : 1
// 推荐信
const interviewTjx = { progress: 0 }
interviewTjx.progress = progress.INTERVIEW_APPLICATION.reco_letters.progress
this.progress = {
applicaitonInfo,
applicationTjx,
applicationWfzzm,
interviewByz,
interviewXwzs,
interviewCjd,
interviewZp,
interviewTjx
}
} else {
this.$message.error(message)
}
})
},
progress(prop) {
if (Array.isArray(prop)) {
return !prop.some(item => {
return get(this.detail.progress, item)
})
}
return !get(this.detail.progress, prop)
},
handleView(to) {
this.dialogVisible = false
this.$router.push(to)
......@@ -199,7 +178,7 @@ li {
align-items: center;
}
.name {
width: 190px;
width: 80px;
text-align: right;
}
.line {
......
......@@ -6,7 +6,7 @@
</div>
<h1>欢迎您</h1>
<p class="t1">
申请斯蒂文斯理工学院工程管理硕士保研项目,本项目的申请费为<span>700</span>元,请扫描二维码以完成报名。
申请巴黎PPA商学院DBA项目,本项目的注册费,申请费共计<span>2000</span>元,请扫描二维码缴费以完成报名。
</p>
</div>
<div class="qrcode-error" v-if="qrcodeError">
......@@ -14,7 +14,7 @@
</div>
<div class="qrcode" v-else>
<qrcode-vue :value="qrcodeValue" size="100"></qrcode-vue>
<span @click="getOrder"><i class="el-icon-refresh" style="font-size:20px" title="刷新"></i></span>
<span @click="getOrder">刷新</span>
</div>
</div>
</template>
......
......@@ -2,7 +2,7 @@
* 申请声明
*/
export default function (_this) {
export default function(_this) {
return {
id: 'application_declare',
title: '申请声明',
......@@ -10,25 +10,41 @@ export default function (_this) {
return _this.visible
},
get: {
callback() {
return _this.isSubmitted ? { isAgree: [1] } : { isAgree: [] }
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}`,
callback(data) {
const { submission_stage: submissionStage = 'FILLING' } = data.data.material
const isSubmited = submissionStage !== 'FILLING'
this.form.options.disabled = isSubmited
if (isSubmited) {
return { isAgree: [1] }
}
return { isAgree: [] }
}
},
onUpdate() {
_this.handleSubmit()
update: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/submit/${process.env.projectId}`,
callback() {
_this.getApplication()
this.form.options.disabled = true
_this.$router.push({ path: this.$route.path, query: { active: 'application_pay' } })
},
errorCallback() {
_this.completeVisible = true
}
},
form: {
prev: { to: { query: { active: 'application_tjx' } } },
submitText: '提交报名申请',
model: { isAgree: [] },
options: {},
items: [
{
type: 'v-checkbox',
values: [{ label: '同意', value: 1 }],
model: 'isAgree',
rules: [{ required: true, message: '请阅读协议', trigger: 'change' }],
prepend: `<p>1、本人知晓此申请表及所附文件将作为申请斯蒂文斯理工学院工程管理硕士面试和背景评估的参考依据,一旦成功录取,有关资料将作为学生信息存档。</p>
<p>2、本人声明所填资料正确无误,知晓任何不真实的信息或不诚信的行为,均会影响申请结果,已取得的成绩和资格会被取消。我理解并同意所有报名材料归紫荆教育所有,无论考生录取与否均不退回。我授权紫荆教育使用报名表中的信息查询本人学习和工作记录。</p>`
prepend:
'<p>本人自愿申请巴黎PPA商学院DBA项目,所有申请表内填写的内容属实,本科/硕士学位属实,没有弄虚作假的行为。如有虚假,愿承担一切法律责任。</p>'
}
]
}
......
import info from './info'
// import tjx from './tjx'
import tjx from './tjx'
// import wfzsm from './wfzzm'
import declare from './declare'
export default function (_this) {
export default function(_this) {
return {
id: 'application',
title: '报名申请',
children: [
info(_this),
// tjx(_this),
tjx(_this),
// wfzsm(_this),
declare(_this),
{
id: 'application_pay',
title: '缴报名费',
show: false,
visible() {
return _this.visible && _this.hasPay
return _this.visible
}
}
]
......
......@@ -2,7 +2,7 @@
* 学习目的
*/
export default function (_this) {
export default function(_this) {
return {
id: 'application_info_answer',
title: '学习目的',
......@@ -11,21 +11,24 @@ export default function (_this) {
return _this.visible
},
get: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}`,
callback(data) {
const { answers = [], submission_stage: submissionStage = 'FILLING' } = _this.detail.material
const { answers = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
const [first = {}, second = {}] = answers
return {
qid1: first.qid || '1',
question1: '您为什么要申请斯蒂文斯理工学院工程管理硕士保研项目?',
question1: '这个DBA项目对你将来的职业发展有什么好处?你的职业发展目标是什么?',
answer1: first.answer,
qid2: second.qid || '2',
question2: '您的短期和长期职业发展目标是什么?您打算如何达成此愿景?',
question2: '您参加过其他的培训项目有哪些?请列出来。你是如何从这些学习经验中获益的?',
answer2: second.answer
}
}
},
update: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}/put`,
beforeRequest(data) {
return {
answers: [
......@@ -36,10 +39,13 @@ export default function (_this) {
}
},
form: {
prev: { to: { query: { active: 'application_info', tab: 'application_info_career' } }, isSubmit: true },
next: { to: { query: { active: 'application_info', tab: 'application_info_training' } }, isSubmit: true },
options: {},
items: [
{
type: 'v-input',
label: '您为什么要申请斯蒂文斯理工学院工程管理硕士保研项目?(60字以上,1000字以内)',
label: '这个DBA项目对你将来的职业发展有什么好处?你的职业发展目标是什么?',
model: 'answer1',
attrs: { type: 'textarea', rows: '8', maxlength: '1000', style: 'width:100%' },
rules: [
......@@ -49,7 +55,7 @@ export default function (_this) {
},
{
type: 'v-input',
label: '您的短期和长期职业发展目标是什么?您打算如何达成此愿景?(60字以上,1000字以内)',
label: '您参加过其他的培训项目有哪些?请列出来。你是如何从这些学习经验中获益的?',
model: 'answer2',
attrs: { type: 'textarea', rows: '8', maxlength: '1000', style: 'width:100%' },
rules: [
......
......@@ -2,24 +2,35 @@
* 工作经验
*/
export default function (_this) {
export default function(_this) {
return {
id: 'application_info_career',
title: '工作经验',
// required: true,
required: true,
visible() {
return _this.visible
},
get: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}`,
callback(data) {
const { careers: list = [] } = _this.detail.material
const { careers: list = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
return list.length ? list : [{}]
}
},
update: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}/put`,
beforeRequest(data) {
const careers = data.map(item => {
return ['start_date', 'end_date', 'company_name_cn', 'industry', 'dept_cn', 'position_cn', 'job_desc_cn'].reduce((result, key) => {
return [
'start_date',
'end_date',
'company_name_cn',
'industry',
'dept_cn',
'position_cn',
'job_desc_cn'
].reduce((result, key) => {
result[key] = item[key]
return result
}, {})
......@@ -28,9 +39,10 @@ export default function (_this) {
}
},
form: {
prev: { to: { query: { active: 'application_info', tab: 'application_info_education' } }, isSubmit: true },
next: { to: { query: { active: 'application_info', tab: 'application_info_answer' } }, isSubmit: true },
hasAdd: true,
options: { labelWidth: '140px' },
prepend: '<p style="color:#606266;padding-left:70px">无工作经验学生可不填写</p>',
items: [
{
type: 'v-datepicker',
......@@ -40,8 +52,8 @@ export default function (_this) {
type: 'month',
placeholder: '请选择工作开始时间',
valueFormat: 'yyyy-MM'
}
// rules: [{ required: true, message: '请选择工作开始时间', trigger: 'blur' }]
},
rules: [{ required: true, message: '请选择工作开始时间', trigger: 'blur' }]
},
{
type: 'v-datepicker',
......@@ -51,15 +63,15 @@ export default function (_this) {
type: 'month',
placeholder: '请选择工作结束时间',
valueFormat: 'yyyy-MM'
}
// rules: [{ required: true, message: '请选择工作结束时间', trigger: 'blur' }]
},
rules: [{ required: true, message: '请选择工作结束时间', trigger: 'blur' }]
},
{
type: 'v-input',
label: '工作单位',
model: 'company_name_cn',
attrs: { placeholder: '请输入工作单位' }
// rules: [{ required: true, message: '请输入工作单位', trigger: 'blur' }]
attrs: { placeholder: '请输入工作单位' },
rules: [{ required: true, message: '请输入工作单位', trigger: 'blur' }]
},
{
type: 'v-select',
......@@ -112,22 +124,22 @@ export default function (_this) {
{ value: '其他' }
],
label: '行业类别',
model: 'industry'
// rules: [{ required: true, message: '请选择行业类别', trigger: 'change' }]
model: 'industry',
rules: [{ required: true, message: '请选择行业类别', trigger: 'change' }]
},
{
type: 'v-input',
label: '工作部门',
model: 'dept_cn',
attrs: { placeholder: '请输入工作部门' }
// rules: [{ required: true, message: '请输入工作部门', trigger: 'blur' }]
attrs: { placeholder: '请输入工作部门' },
rules: [{ required: true, message: '请输入工作部门', trigger: 'blur' }]
},
{
type: 'v-input',
label: '工作职位',
model: 'position_cn',
attrs: { placeholder: '请输入工作职位' }
// rules: [{ required: true, message: '请输入工作职位', trigger: 'blur' }]
attrs: { placeholder: '请输入工作职位' },
rules: [{ required: true, message: '请输入工作职位', trigger: 'blur' }]
},
{
type: 'v-input',
......@@ -138,8 +150,8 @@ export default function (_this) {
placeholder: '请输入工作描述',
rows: '8',
maxlength: '3000'
}
// rules: [{ required: true, message: '请输入工作描述', trigger: 'blur' }]
},
rules: [{ required: true, message: '请输入工作描述', trigger: 'blur' }]
}
]
}
......
......@@ -2,7 +2,7 @@
* 教育背景
*/
export default function (_this) {
export default function(_this) {
return {
id: 'application_info_education',
title: '教育背景',
......@@ -11,42 +11,30 @@ export default function (_this) {
return _this.visible
},
get: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}`,
callback(data) {
const { basic_info: basicInfo = {}, educations: list = [] } = _this.detail.material
if (list.length > 0) {
list[0].education_status = basicInfo.education_status
}
const { educations: list = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
return list.length ? list : [{}]
}
},
update: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}/put`,
beforeRequest(data) {
const educations = data.map(item => {
return ['start_date', 'end_date', 'school_type', 'school_name_cn', 'major_cn', 'degree'].reduce((result, key) => {
return ['start_date', 'end_date', 'school_name_cn', 'major_cn', 'degree'].reduce((result, key) => {
result[key] = item[key]
return result
}, {})
})
const basicInfo = { education_status: data[0].education_status }
return { basic_info: basicInfo, educations }
},
callback() {
_this.getApplication()
return { educations }
}
},
form: {
prev: { to: { query: { active: 'application_info', tab: 'application_info_profile' } }, isSubmit: true },
next: { to: { query: { active: 'application_info', tab: 'application_info_career' } }, isSubmit: true },
hasAdd: true,
options: { labelWidth: '140px' },
appendItems: [
{
type: 'v-input',
label: '当前教育状态',
model: 'education_status',
attrs: { placeholder: '请填写当前教育状态' },
rules: [{ required: true, message: '请填写当前教育状态', trigger: 'blur' }],
append: '<p style="color:#606266">当前教育状态(填写示例:本科在读/大四)</p>'
}
],
items: [
{
type: 'v-datepicker',
......@@ -68,15 +56,7 @@ export default function (_this) {
placeholder: '请选择教育结束时间',
valueFormat: 'yyyy-MM'
},
rules: [{ required: true, message: '请选择教育结束时间', trigger: 'blur' }],
append: '<p style="color:#606266">在读学生填写预计毕业时间</p>'
},
{
type: 'v-select',
values: [{ value: '985院校' }, { value: '211院校' }, { value: '省重点' }, { value: '普通本科' }, { value: '专科院校' }],
label: '学校类型',
model: 'school_type',
rules: [{ required: true, message: '请选择学校类型', trigger: 'change' }]
rules: [{ required: true, message: '请选择教育结束时间', trigger: 'blur' }]
},
{
type: 'v-input',
......
......@@ -2,7 +2,7 @@
* 个人信息
*/
export default function (_this) {
export default function(_this) {
return {
id: 'application_info_first',
title: '个人信息',
......@@ -11,8 +11,14 @@ export default function (_this) {
return this.tabActive === 'application_info_first'
},
get: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}`,
callback(data) {
const { basic_info: basicInfo = {}, attachments = [] } = _this.detail.material
const {
basic_info: basicInfo = {},
attachments = [],
submission_stage: submissionStage = 'FILLING'
} = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
const attachment = attachments.reduce(
(result, item) => {
......@@ -31,6 +37,7 @@ export default function (_this) {
}
},
update: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}/put`,
beforeRequest(data) {
const basicInfo = ['phone_number', 'email', 'id_type'].reduce((result, key) => {
result[key] = data[key]
......@@ -40,7 +47,8 @@ export default function (_this) {
}
},
form: {
submitText: '下一步',
hasButton: false,
next: { to: { query: { active: 'application_info', tab: 'application_info_profile' } }, isSubmit: true },
options: { labelWidth: '140px' },
items: [
{
......@@ -76,7 +84,7 @@ export default function (_this) {
data: { file_type: 'ID_CARD_BACK' },
limit: 1,
accept: 'image/*',
image: 'https://zws-imgs-pub.ezijing.com/pc/cu/id_card_back.png'
image: 'https://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/pc/cu/id_card_back.png'
},
rules: [{ type: 'array', required: true, message: '请上传身份证照片人像面', trigger: 'change' }],
isShow(data) {
......@@ -94,7 +102,7 @@ export default function (_this) {
data: { file_type: 'ID_CARD_FRONT' },
limit: 1,
accept: 'image/*',
image: 'https://zws-imgs-pub.ezijing.com/pc/cu/id_card_front.png'
image: 'https://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/pc/cu/id_card_front.png'
},
rules: [{ type: 'array', required: true, message: '请上传身份证照片国徽面', trigger: 'change' }],
isShow(data) {
......
......@@ -2,7 +2,7 @@
* 荣誉奖励
*/
export default function (_this) {
export default function(_this) {
return {
id: 'application_info_honor',
title: '荣誉奖励',
......@@ -10,15 +10,15 @@ export default function (_this) {
return _this.visible
},
get: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}`,
callback(data) {
const { attachments = [], honors: list = [] } = _this.detail.material
const CERTIFICATE_OF_HONOR = attachments.filter(item => {
return item.file_type_id === 'CERTIFICATE_OF_HONOR'
})
return list.length ? list.map(item => Object.assign({}, item, { CERTIFICATE_OF_HONOR })) : [{ CERTIFICATE_OF_HONOR }]
const { honors: list = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
return list.length ? list : [{}]
}
},
update: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}/put`,
beforeRequest(data) {
const honors = data.map(item => {
return ['time', 'title', 'institution_cn'].reduce((result, key) => {
......@@ -30,6 +30,8 @@ export default function (_this) {
}
},
form: {
prev: { to: { query: { active: 'application_info', tab: 'application_info_training' } }, isSubmit: true },
next: { to: { query: { active: 'application_tjx' } }, isSubmit: true },
hasAdd: true,
options: { labelWidth: '140px' },
items: [
......@@ -54,21 +56,6 @@ export default function (_this) {
attrs: { placeholder: '请输入证书颁发机构' }
// rules: [{ required: true, message: '请输入证书颁发机构', trigger: 'blur' }]
}
],
appendItems: [
// 推荐信附件
{
type: 'v-upload',
label: '荣誉证书附件',
model: 'CERTIFICATE_OF_HONOR',
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'CERTIFICATE_OF_HONOR' },
accept: 'image/*'
},
class: 'upload-attachments'
}
]
}
}
......
......@@ -4,7 +4,7 @@
import country from './country'
export default function (_this) {
export default function(_this) {
return {
id: 'application_info_profile',
title: '个人信息',
......@@ -13,8 +13,15 @@ export default function (_this) {
return _this.visible
},
get: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}`,
callback(data) {
const { basic_info: basicInfo = {}, attachments = [] } = _this.detail.material
const {
basic_info: basicInfo = {},
attachments = [],
submission_stage: submissionStage = 'FILLING'
} = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
const attachment = attachments.reduce(
(result, item) => {
const types = ['ID_CARD_FRONT', 'ID_CARD_BACK', 'HK_ID_CARD', 'PASSPORT', 'OTHER_ID_CARD_PHOTO']
......@@ -32,7 +39,11 @@ export default function (_this) {
}
},
update: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}/put`,
beforeRequest(data) {
// let [province, city] = data.city.split('-')
// data.address_province = province
// data.address_city = city
const basicInfo = [
'phone_number',
'email',
......@@ -57,6 +68,8 @@ export default function (_this) {
}
},
form: {
prev: { to: { query: { active: 'application_info', tab: 'application_info_first' } } },
next: { to: { query: { active: 'application_info', tab: 'application_info_education' } }, isSubmit: true },
options: { labelWidth: '140px' },
items: [
{
......@@ -72,7 +85,7 @@ export default function (_this) {
model: 'email',
attrs: { placeholder: '请输入邮箱' },
rules: [{ type: 'email', required: true, message: '请输入邮箱', trigger: 'blur' }],
append: '(后续报名信息将发送至此邮箱,请认真填写)'
hint: '(后续报名信息将发送至此邮箱,请认真填写)'
},
{
type: 'v-select',
......@@ -93,7 +106,7 @@ export default function (_this) {
data: { file_type: 'ID_CARD_BACK' },
limit: 1,
accept: 'image/*',
image: 'https://zws-imgs-pub.ezijing.com/pc/cu/id_card_back.png'
image: 'https://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/pc/cu/id_card_back.png'
},
rules: [{ type: 'array', required: true, message: '请上传身份证照片人像面', trigger: 'change' }],
isShow(data) {
......@@ -111,7 +124,7 @@ export default function (_this) {
data: { file_type: 'ID_CARD_FRONT' },
limit: 1,
accept: 'image/*',
image: 'https://zws-imgs-pub.ezijing.com/pc/cu/id_card_front.png'
image: 'https://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/pc/cu/id_card_front.png'
},
rules: [{ type: 'array', required: true, message: '请上传身份证照片国徽面', trigger: 'change' }],
isShow(data) {
......
......@@ -2,7 +2,7 @@
* 所受培训
*/
export default function (_this) {
export default function(_this) {
return {
id: 'application_info_training',
title: '所受培训',
......@@ -10,12 +10,15 @@ export default function (_this) {
return _this.visible
},
get: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}`,
callback(data) {
const { trainings: list = [] } = _this.detail.material
const { trainings: list = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
return list.length ? list : [{}]
}
},
update: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}/put`,
beforeRequest(data) {
const trainings = data.map(item => {
return ['start_date', 'end_date', 'institution_cn', 'course_cn'].reduce((result, key) => {
......@@ -27,6 +30,8 @@ export default function (_this) {
}
},
form: {
prev: { to: { query: { active: 'application_info', tab: 'application_info_answer' } }, isSubmit: true },
next: { to: { query: { active: 'application_info', tab: 'application_info_honor' } }, isSubmit: true },
hasAdd: true,
options: { labelWidth: '140px' },
items: [
......
import { STAGE_LIST } from '../../index'
/**
* 推荐信
*/
export default function (_this) {
export default function(_this) {
return {
id: 'application_tjx',
title: '推荐信',
......@@ -12,20 +10,47 @@ export default function (_this) {
return _this.visible
},
get: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}`,
callback(data) {
const list = _this.detail.material.reco_letters || []
return list.length ? list : [{}, {}]
const { submission_stage: submissionStage = 'FILLING' } = data.data.material
const stageList = [
'FILLING',
'PREPAYMENT',
'INTERVIEW_APPLICATION',
'AUDITION',
'INTERVIEW',
'PAYMENT',
'REGISTRATION',
'CLOSED'
]
this.form.options.disabled = stageList.findIndex(item => item === submissionStage) > 3
const list = data.data.material.reco_letters || []
return list.length ? list : [{}, {}, {}]
}
},
update: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}/put`,
beforeRequest(data) {
// const recoLetters = data.map(item => {
// return ['provider_name', 'provider_phone_number', 'provider_email', 'provider_relationship'].reduce(
// (result, key) => {
// result[key] = item[key]
// return result
// },
// {}
// )
// })
return { reco_letters: data }
}
},
form: {
minlength: 2,
minlength: 3,
prev: { to: { query: { active: 'application_info', tab: 'application_info_honor' } }, isSubmit: true },
next: { to: { query: { active: 'application_declare' } }, isSubmit: true },
hasAdd: true,
disabled(data) {
return !!data.letter_content
},
aside: {
prepend: {
html: '<p style="color:#33C011;">推荐人已完成</p>',
......@@ -37,7 +62,9 @@ export default function (_this) {
{
text: '再次邀请',
visible(data) {
const editable = ['PREPAYMENT', 'INTERVIEW_APPLICATION', 'AUDITION'].includes(_this.detail.material.submission_stage)
const editable = ['PREPAYMENT', 'INTERVIEW_APPLICATION', 'AUDITION'].includes(
_this.detail.material.submission_stage
)
return data.id && !data.letter_content && editable
},
onClick(data) {
......@@ -47,7 +74,9 @@ export default function (_this) {
{
text: '更换推荐人',
visible(data) {
const editable = ['PREPAYMENT', 'INTERVIEW_APPLICATION', 'AUDITION'].includes(_this.detail.material.submission_stage)
const editable = ['PREPAYMENT', 'INTERVIEW_APPLICATION', 'AUDITION'].includes(
_this.detail.material.submission_stage
)
return data.id && !data.letter_content && editable
},
onClick(data, $form) {
......@@ -84,7 +113,15 @@ export default function (_this) {
},
{
type: 'v-select',
values: [{ value: '老师/导师' }, { value: '领导' }, { value: '同学' }, { value: '同事' }, { value: '亲属' }, { value: '朋友' }, { value: '其他' }],
values: [
{ value: '老师/导师' },
{ value: '领导' },
{ value: '同学' },
{ value: '同事' },
{ value: '亲属' },
{ value: '朋友' },
{ value: '其他' }
],
label: '与推荐人关系',
model: 'provider_relationship',
rules: [{ required: true, message: '请选择与推荐人关系', trigger: 'change' }]
......
export default function (_this) {
export default function(_this) {
return {
id: 'application_wfzzm',
title: '无犯罪证明',
......@@ -6,8 +6,10 @@ export default function (_this) {
return _this.visible
},
get: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}`,
callback(data) {
const { attachments = [] } = _this.detail.material
const { attachments = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
const NO_CRIMINAL_CERT = attachments.filter(item => {
return item.file_type_id === 'NO_CRIMINAL_CERT'
......@@ -16,6 +18,9 @@ export default function (_this) {
}
},
form: {
prev: { to: { query: { active: 'application_tjx' } } },
next: { to: { query: { active: 'application_declare' } } },
hasButton: false,
options: {},
items: [
{
......@@ -30,7 +35,7 @@ export default function (_this) {
},
prepend: `
<p>第一步:点击下载按键获取无犯罪证明模板</p>
<p><a href="https://zws-imgs-pub.ezijing.com/pc/cu/%E6%97%A0%E7%8A%AF%E7%BD%AA%E8%AE%B0%E5%BD%95%E8%AF%81%E6%98%8E.docx" target="_blank" download>下载模板</a></p>
<p><a href="https://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/pc/cu/%E6%97%A0%E7%8A%AF%E7%BD%AA%E8%AE%B0%E5%BD%95%E8%AF%81%E6%98%8E.docx" target="_blank" download>下载模板</a></p>
<p>第二步:打印文件后填写内容并签字上传至电脑,点击下方按钮上传文件</p>
`
}
......
......@@ -2,16 +2,17 @@
<app-layout>
<vue-form
:menus="menus"
:disabled="isSubmitted"
:default-active="currentActive"
:tab-active="tabActive"
@page-change="handlePageChange"
@tab-change="handleTabChange"
@update="handleUpdate"
@success="handleSuccess"
@error="handleError"
@back="$router.push('/my/account')"
v-if="detail">
@prev="handlePrev"
@next="handleNext"
v-if="detail"
>
<template #aside-append>
<div class="aside-preview" @click="dialogVisible = true" v-if="visible">预览全部</div>
<div class="aside-payment"><a href="https://accounts.ezijing.com/payment" target="_blank">查看缴费记录</a></div>
......@@ -48,8 +49,7 @@ export default {
tabActive: 'application_info_profile',
dialogVisible: false,
detail: null,
completeVisible: false,
hasPay: false
completeVisible: false
}
},
watch: {
......@@ -65,66 +65,57 @@ export default {
computed: {
visible() {
return this.currentActive !== 'application_info' || this.tabActive !== 'application_info_first'
},
isSubmitted() {
const { submission_stage: submissionStage = 'FILLING' } = this.detail?.material
return submissionStage !== 'FILLING'
}
},
methods: {
// 获取报名信息
getApplication() {
api.getApplication().then(res => {
const { data } = res
this.detail = data
if (!data.progress.FILLING.attachments || data.progress.FILLING.attachments.missed_required_list.ID_CARD_PHOTO) {
this.tabActive = 'application_info_first'
api.getApplication().then(response => {
const { data, error, message } = response
if (error.toString() === '0') {
this.detail = data
if (
!data.progress.FILLING.attachments ||
data.progress.FILLING.attachments.missed_required_list.ID_CARD_PHOTO
) {
this.tabActive = 'application_info_first'
}
const { submission_stage: submissionStage = 'FILLING' } = data.material
if (submissionStage !== 'FILLING') {
this.menus[0].children.forEach(item => {
if (item.id === 'application_pay') {
item.show = true
}
})
}
} else {
this.$message.error(message)
}
})
},
// 更新报名信息
handleUpdate(data) {
api.updateApplication(data).then(res => {
if (this.tabActive === 'application_info_first') this.tabActive = 'application_info_profile'
this.detail = res.data
this.$message.success('保存成功')
})
},
handleSubmit(callback, params) {
api
.changeSubmissionStage(params)
.then(() => {
callback && callback()
this.getApplication()
if (this.hasPay) {
this.$router.push({ path: this.$route.path, query: { active: 'application_pay' } })
} else {
this.$router.push({ path: '/my/interview' })
}
})
.catch(() => {
this.completeVisible = true
})
},
handlePageChange(value) {
this.currentActive = value
this.$router.push({ path: this.$route.path, query: { active: value } })
console.log('页面切换了', value)
},
handleTabChange(value) {
this.tabActive = value
const query = Object.assign({}, this.$route.query, { tab: value })
this.$router.push({ path: this.$route.path, query })
this.$router.push({ query })
},
handleSuccess(data) {
console.log('提交成功了', data)
if (this.tabActive === 'application_info_first') this.tabActive = 'application_info_profile'
this.$message({ type: 'success', message: '提交成功' })
},
handleError(data) {
console.log('提交失败了', data)
this.$message({ type: 'error', message: data.message })
},
handlePrev(to) {
this.$router.push(to)
},
handleNext(to) {
this.$router.push(to)
},
handlePreviewEdit(to) {
this.$router.push(to)
this.dialogVisible = false
......@@ -172,19 +163,4 @@ export default {
padding: 0;
}
}
::v-deep .upload-attachments {
border-top: 1px solid #f1f1f1;
margin-top: 20px;
padding-top: 20px;
.el-form-item__label {
width: auto !important;
float: none !important;
font-size: 14px;
font-weight: 700;
color: #222;
}
.el-form-item__content {
margin: 0 !important;
}
}
</style>
......@@ -3,9 +3,17 @@
<h5-pay @update="handleUpdateOrder" v-if="isWechat"></h5-pay>
<qrcode-pay @update="handleUpdateOrder" v-else></qrcode-pay>
<div class="pay-ft">
<p class="t2">注释:<br />此处为微信二维码<br />成功提交700元申请费后,申请人还需上传并提交最高学历(学位)证书 (注:申请费不退还)</p>
<p class="t2">注释:在提交2000元申请费后,申请人还需上传并提交如下文件。</p>
<p class="t2">①最高学历(学位)证书、②最高学历(学位)中文或英文成绩单、③个人证件照(2寸、免冠、白底、彩色)</p>
<p class="t2">该申请费不退,请慎重缴费!</p>
</div>
<el-dialog title="报名费缴费成功" :visible.sync="dialogVisible" :center="true" :close-on-click-modal="false" width="400px">
<el-dialog
title="报名费缴费成功"
:visible.sync="dialogVisible"
:center="true"
:close-on-click-modal="false"
width="348px"
>
<div class="dialog-pay">
<p>请填写申请面试的材料,材料齐全后<br />招生办老师将给您致电预约面试日期与时间</p>
<div class="icon"><img src="https://webapp-pub.ezijing.com/project/application/images/icon_success.png" /></div>
......@@ -83,9 +91,6 @@ export default {
},
// 检查支付状态
checkPay(order) {
if (!order || !order.id) {
return
}
const userId = this.user.id
api.checkPay(order.id, { user_id: userId }).then(response => {
if (response.data.payment_status === 'SUCCESS') {
......
export const STAGE_LIST = [
'FILLING',
'PREPAYMENT',
'INTERVIEW_APPLICATION',
'AUDITION',
'INTERVIEW',
'REGISTRATION',
'PAYMENT',
'CLOSED',
'FINISHED'
]
<template>
<div class="h5pay">
<el-button type="primary" @click="handlePay">去支付</el-button>
</div>
</template>
<script>
import * as api from '@/api/my'
export default {
data() {
return {
openId: window.localStorage.getItem('open_id')
}
},
computed: {
pageUrl() {
return window.location.origin + this.$route.path + '?active=application_pay'
}
},
methods: {
// 获取订单
getOrder(callback) {
api.getOrder({ wx_open_id: this.openId, payment_method: 'WX_PAY' }).then(response => {
const { data, error, message } = response
if (error.toString() === '0') {
this.order = data
this.$emit('update', this.order)
callback && callback(this.order)
} else {
this.$message.error(message)
}
})
},
// 获取微信code
getCode() {
const redirectURI = `https://pages.ezijing.com/given/auth.html?redirect_uri=${encodeURIComponent(this.pageUrl)}`
window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx451c01d40d090d7a&redirect_uri=${redirectURI}&response_type=code&scope=snsapi_base#wechat_redirect`
},
// 获取微信openid
getOpenId(code) {
api.getOpenId({ code, identity: 'ezijing' }).then(response => {
if (response.code === 0) {
this.openId = response.openid
window.localStorage.setItem('open_id', this.openId)
this.getOrder()
} else {
this.getCode()
}
})
},
// 去支付
handlePay() {
this.getOrder(() => {
window.location.href = `https://web-pay.ezijing.com/wxpay/h5?prepay_id=${this.order.wx_prepay_id}&open_id=${
this.openId
}&redirect_uri=${encodeURIComponent(this.pageUrl)}`
})
}
},
beforeMount() {
if (!this.openId) {
const { code } = this.$route.query
code ? this.getOpenId(code) : this.getCode()
}
}
}
</script>
<style scoped>
.h5pay {
padding: 40px;
text-align: center;
}
</style>
<template>
<div class="qrpay">
<div class="qrpay-hd">
<div class="pic">
<img src="https://webapp-pub.ezijing.com/project/application/images/my_pay_01.png" />
</div>
<h1>欢迎您</h1>
<p class="t1">
申请斯蒂文斯理工学院工程管理硕士保研项目,本项目的申请费为<span>700</span>元,请扫描二维码以完成报名。
</p>
</div>
<div class="qrcode-error" v-if="qrcodeError">
生成二维码失败请刷新<i class="el-icon-refresh-left" @click="getOrder" title="刷新"></i>
</div>
<div class="qrcode" v-else>
<qrcode-vue :value="qrcodeValue" size="100"></qrcode-vue>
<span @click="getOrder"><i class="el-icon-refresh" style="font-size:20px" title="刷新"></i></span>
</div>
</div>
</template>
<script>
import QrcodeVue from 'qrcode.vue'
import * as api from '@/api/my'
export default {
components: { QrcodeVue },
data() {
return {
order: { id: '', payment_url: '' },
qrcodeError: false
}
},
computed: {
// 二维码地址
qrcodeValue() {
return this.order.payment_url
}
},
methods: {
// 获取订单
getOrder() {
api.getOrder({ payment_method: 'WX_PAY_QR' }).then(response => {
const { data, error, message } = response
this.qrcodeError = error.toString() === '1'
if (error.toString() === '0') {
this.order = data
this.$emit('update', this.order)
} else {
this.$message.error(message)
}
})
}
},
beforeMount() {
this.getOrder()
}
}
</script>
<style lang="scss" scoped>
.qrpay-hd {
.pic {
text-align: center;
}
h1 {
padding: 10px 0;
font-size: 24px;
font-weight: 500;
color: #222;
line-height: 1;
text-align: center;
}
}
.qrcode {
padding: 20px 0;
text-align: center;
span {
margin-top: 10px;
font-size: 12px;
color: #999;
cursor: pointer;
}
}
.qrcode-error {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
width: 100px;
height: 100px;
padding: 10px;
margin: 20px auto;
color: var(--main-color);
border-style: dashed;
border-width: 1px;
border-color: var(--main-color);
box-sizing: border-box;
text-align: center;
i {
margin-top: 10px;
cursor: pointer;
}
}
.t1 {
font-size: 14px;
color: #303030;
line-height: 20px;
text-align: center;
span {
color: #ffa448;
}
}
</style>
export default {
id: 'interview_xwzs',
title: '学位证书',
id: 'interview_byz',
title: '毕业证书',
get: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}`,
callback(data) {
const { attachments = [] } = _this.detail.material
const DEGREE_CERT_CN = attachments.filter(item => {
return item.file_type_id === 'DEGREE_CERT_CN'
const { attachments = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
const stageList = [
'FILLING',
'PREPAYMENT',
'INTERVIEW_APPLICATION',
'AUDITION',
'INTERVIEW',
'PAYMENT',
'REGISTRATION',
'CLOSED'
]
this.form.options.disabled = stageList.findIndex(item => item === submissionStage) > 2
const DIPLOMA_CN = attachments.filter(item => {
return item.file_type_id === 'DIPLOMA_CN'
})
return { DEGREE_CERT_CN }
return { DIPLOMA_CN }
}
},
form: {
hasSubmit: false,
next: { to: { query: { active: 'interview_cjd' } } },
hasButton: false,
options: {},
items: [
{
type: 'v-upload',
required: true,
model: 'DEGREE_CERT_CN',
model: 'DIPLOMA_CN',
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'DEGREE_CERT_CN' }
data: { file_type: 'DIPLOMA_CN' }
},
append: '申请者需要将学位证书原件扫描或者拍照后提交。<br>可上传多个文件,请确保证书号码清晰可辨。<br>上传文件仅限“jpg,jpeg,png”格式,文件小于10MB。'
append: '注意事项:需要将证书原件扫描或拍照后提交,请确保证书内容清晰可辨。'
}
]
}
......
export default function (_this) {
return {
required: true,
id: 'interview_byzs',
title: '毕业证书或在读证明',
get: {
callback(data) {
const { basic_info: basicInfo = {}, attachments = [] } = _this.detail.material
const attachment = attachments.reduce(
(result, item) => {
if (item.file_type_id === 'DIPLOMA_CN') {
result.DIPLOMA_CN.push(item)
}
if (item.file_type_id === 'DEGREE_CERT_CN') {
result.DEGREE_CERT_CN.push(item)
}
if (item.file_type_id === 'PROOF_READING') {
result.PROOF_READING.push(item)
}
return result
},
{ DIPLOMA_CN: [], DEGREE_CERT_CN: [], PROOF_READING: [] }
)
return Object.assign({ learn_status: basicInfo.learn_status }, attachment)
}
},
update: {
beforeRequest(data) {
const basicInfo = ['learn_status'].reduce((result, key) => {
result[key] = data[key]
return result
}, {})
return { basic_info: basicInfo }
}
},
form: {
options: { 'label-position': 'top' },
items: [
{
type: 'v-select',
values: [{ value: '已毕业' }, { value: '未毕业' }],
label: '您当前的学习状态',
model: 'learn_status',
rules: [{ required: true, message: '请选择', trigger: 'change' }],
append: `
提示:<br />
1、请同时上传毕业证书及学位证书(中英文)<br />
2、如尚未毕业,请上传在读证明(中英文)`
},
{
required: true,
label: '毕业证书',
type: 'v-upload',
model: 'DIPLOMA_CN',
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'DIPLOMA_CN' }
},
rules: { required: true, message: '请上传毕业证书' },
append:
'申请者需要将本科或以上毕业证书原件扫描或者拍照后提交。<br> 可上传多个文件,请确保证书号码清晰可辨。<br> 上传文件仅限“jpg,jpeg,png”格式,文件小于10MB。',
isShow(ruleForm) {
return ruleForm.learn_status === '已毕业'
}
},
{
required: true,
label: '学位证书',
type: 'v-upload',
model: 'DEGREE_CERT_CN',
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'DEGREE_CERT_CN' }
},
rules: { required: true, message: '请上传学位证书' },
append: '已毕业学员请提交学位证书<br />申请者需要将本科或以上的学位证书原件扫描或拍照后提交<br />可上传多个文件,请确保公章清晰可辨。',
isShow(ruleForm) {
return ruleForm.learn_status === '已毕业'
}
},
{
required: true,
label: '在读证明',
type: 'v-upload',
model: 'PROOF_READING',
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'PROOF_READING' }
},
rules: { required: true, message: '请上传在读证明' },
append: '未毕业学员提交加盖公章的在读证明<br/>申请者需要将本科或以上在读证明原件扫描或拍照后提交。<br> 可上传多个文件,请确保公章清晰可辨。',
isShow(ruleForm) {
return ruleForm.learn_status === '未毕业'
}
}
]
}
}
}
export default function (_this) {
return {
required: true,
id: 'interview_cjd',
title: '成绩单',
get: {
callback(data) {
const { basic_info: basicInfo = {}, attachments = [] } = _this.detail.material
const attachment = attachments.reduce(
(result, item) => {
if (item.file_type_id === 'REPORT_CARD_CN') {
result.REPORT_CARD_CN.push(item)
}
if (item.file_type_id === 'REPORT_CARD_EN') {
result.REPORT_CARD_EN.push(item)
}
return result
},
{ REPORT_CARD_CN: [], REPORT_CARD_EN: [] }
)
return Object.assign({}, basicInfo, attachment)
}
},
update: {
beforeRequest(data) {
const basicInfo = ['gpa_score', 'average_score'].reduce((result, key) => {
result[key] = data[key]
return result
}, {})
return { basic_info: basicInfo }
}
},
form: {
options: { 'label-position': 'top' },
items: [
{
type: 'v-input',
label: 'GPA成绩 (填写示例:3.9 / 5.0)',
model: 'gpa_score',
attrs: { placeholder: '请填写您的GPA成绩' },
rules: [{ required: true, message: '请填写您的GPA成绩', trigger: 'blur' }]
},
{
type: 'v-input',
label: '百分制平均成绩',
model: 'average_score',
attrs: { placeholder: '请填写百分制平均成绩' },
rules: [{ required: true, message: '请填写百分制平均成绩', trigger: 'blur' }]
},
{
required: true,
type: 'v-upload',
label: '中文成绩单',
model: 'REPORT_CARD_CN',
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'REPORT_CARD_CN' }
export default {
id: 'interview_cjd',
title: '成绩单(中/英)',
get: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}`,
callback(data) {
const { attachments = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
const stageList = [
'FILLING',
'PREPAYMENT',
'INTERVIEW_APPLICATION',
'AUDITION',
'INTERVIEW',
'PAYMENT',
'REGISTRATION',
'CLOSED'
]
this.form.options.disabled = stageList.findIndex(item => item === submissionStage) > 2
return attachments.reduce(
(result, item) => {
if (item.file_type_id === 'REPORT_CARD_CN') {
result.REPORT_CARD_CN.push(item)
}
if (item.file_type_id === 'REPORT_CARD_EN') {
result.REPORT_CARD_EN.push(item)
}
return result
},
{
required: true,
type: 'v-upload',
label: '英文成绩单',
model: 'REPORT_CARD_EN',
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'REPORT_CARD_EN' }
},
append: `
<p>已毕业学生需提交完整成绩单,未毕业学生提交现有成绩单,成绩单需要加盖学校公章</p>
<p>请将成绩单原件扫描或者拍照后提交。</p>
<p>获取途径:联系大学时就读学校相关部门(档案馆/教务处)获取成绩单。</p>`
}
]
{ REPORT_CARD_CN: [], REPORT_CARD_EN: [] }
)
}
},
form: {
prev: { to: { query: { active: 'interview_byz' } } },
next: { to: { query: { active: 'interview_zp' } } },
hasButton: false,
options: { 'label-position': 'top' },
hint: `
<p>成绩单:中/英文成绩单上传一个或多个。</p>
<p>注意事项:需要将证书原件扫描或拍照后提交,请确保证书内容清晰可辨。</p>
`,
items: [
{
type: 'v-upload',
label: '中/英文成绩单',
required: true,
model: 'REPORT_CARD_CN',
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'REPORT_CARD_CN' }
}
}
]
}
}
export default function (_this) {
return {
required: true,
id: 'interview_form',
title: '申请表格',
get: {
callback(data) {
const { basic_info: basicInfo = {}, attachments = [] } = _this.detail.material
const attachment = attachments.reduce(
(result, item) => {
if (item.file_type_id === 'APPLICATION_FORM') {
result.APPLICATION_FORM.push(item)
}
return result
},
{ APPLICATION_FORM: [] }
)
return Object.assign({}, basicInfo, attachment)
}
},
form: {
hasSubmit: false,
items: [
{
required: true,
type: 'v-upload',
model: 'APPLICATION_FORM',
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'APPLICATION_FORM' },
limit: 1
},
rules: [{ required: true, message: '请上传', trigger: 'change' }],
prepend: `<p>请下载填写申请表格(First Year Application Form)模板后上传 <a href="https://webapp-pub.ezijing.com/project/sit-plus/First%20Year%20Application.docx" target="_blank" download="申请表格" style="color:#aa1941;">[下载模板]</a></p>`
}
]
}
}
}
export default function (_this) {
return {
required: true,
id: 'interview_grcs',
title: '个人陈述',
get: {
callback(data) {
const { attachments = [] } = _this.detail.material
const PERSONAL_STATEMENT = attachments.filter(item => {
return item.file_type_id === 'PERSONAL_STATEMENT'
})
return { PERSONAL_STATEMENT }
}
},
form: {
hasSubmit: false,
items: [
{
type: 'v-upload',
required: true,
model: 'PERSONAL_STATEMENT',
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'PERSONAL_STATEMENT' },
limit: 1
},
append: '请上传您的个人陈述(英文)'
}
]
}
}
}
import byz from './byz'
import cjd from './cjd'
import yynl from './yynl'
// import xwzs from './xwzs'
import ywjl from './ywjl'
// import zp from './zp'
import ywcjd from './ywcjd'
import tjx from './tjx'
import grcs from './grcs'
import byzs from './byzs'
import form from './form'
import zp from './zp'
export default function(_this) {
return {
id: 'interview',
title: '申请面试',
children: [
ywjl(_this),
cjd(_this),
yynl(_this),
tjx(_this),
grcs(_this),
byzs(_this),
form(_this),
{
required: true,
id: 'application_pay',
title: '缴报名费'
}
// ywcjd(_this), tjx(_this), grcs(_this), byzs(_this), form(_this)
]
children: [byz, cjd, zp(_this)]
}
}
export default function (_this) {
return {
required: true,
id: 'interview_tjx',
title: '推荐信',
get: {
callback(data) {
const { attachments = [] } = _this.detail.material
return attachments.reduce(
(result, item) => {
item.disabled = item.upload_operator_user_id !== _this.user?.id
if (item.file_type_id === 'RECOMMENDATION_LETTER') {
result.RECOMMENDATION_LETTER.push(item)
}
if (item.file_type_id === 'RECOMMENDATION_LETTER_2') {
result.RECOMMENDATION_LETTER_2.push(item)
}
return result
},
{ RECOMMENDATION_LETTER: [], RECOMMENDATION_LETTER_2: [] }
)
}
},
form: {
hasSubmit: false,
prepend: '请上传两封推荐人署名的推荐信原件照片或扫描件(英文)',
items: [
{
type: 'v-upload',
model: 'RECOMMENDATION_LETTER',
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'RECOMMENDATION_LETTER' },
accept: 'image/*',
limit: 1
}
},
{
type: 'v-upload',
model: 'RECOMMENDATION_LETTER_2',
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'RECOMMENDATION_LETTER_2' },
accept: 'image/*',
limit: 1
}
}
]
}
}
}
export default {
id: 'interview_xwzsywzm',
title: '学位证书英文证明',
get: {
callback(data) {
const { attachments = [] } = _this.detail.material
const DEGREE_CERT_EN = attachments.filter(item => {
return item.file_type_id === 'DEGREE_CERT_EN'
})
return { DEGREE_CERT_EN }
}
},
form: {
hasSubmit: false,
items: [
{
type: 'v-upload',
required: true,
model: 'DEGREE_CERT_EN',
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'DEGREE_CERT_EN' }
},
append: '请将学校出具的学位证书英文证明原件扫描或者拍照后提交。'
}
]
}
}
export default function (_this) {
return {
id: 'interview_ywcjd',
title: '英文成绩单',
get: {
callback(data) {
const { attachments = [] } = _this.detail.material
return attachments.reduce(
(result, item) => {
if (item.file_type_id === 'REPORT_CARD_CN') {
result.REPORT_CARD_CN.push(item)
}
if (item.file_type_id === 'REPORT_CARD_EN') {
result.REPORT_CARD_EN.push(item)
}
return result
},
{ REPORT_CARD_CN: [], REPORT_CARD_EN: [] }
)
}
},
form: {
hasSubmit: false,
options: { 'label-position': 'top' },
prepend: `
<p>已毕业学生需提交完整成绩单,未毕业学生提交现有成绩单,成绩单需要加盖学校公章</p>
<p>请将英文成绩单原件扫描或者拍照后提交。</p>
<p>获取途径:联系大学时就读学校相关部门(档案馆/教务处)获取成绩单。</p>
`,
items: [
{
required: true,
type: 'v-upload',
label: '英文成绩单',
model: 'REPORT_CARD_EN',
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'REPORT_CARD_EN' }
}
}
]
}
}
}
export default function (_this) {
return {
required: true,
id: 'interview_ywjl',
title: '英文简历',
get: {
callback(data) {
const { attachments = [] } = _this.detail.material
const RESUME_EN = attachments.filter(item => item.file_type_id === 'RESUME_EN')
return { RESUME_EN }
}
},
form: {
hasSubmit: false,
items: [
{
required: true,
type: 'v-upload',
model: 'RESUME_EN',
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'RESUME_EN' }
},
append: `
<p>请下载填写英文简历模板后上传 [<a href="https://webapp-pub.ezijing.com/project/sit-plus/%E8%8B%B1%E6%96%87%E7%AE%80%E5%8E%86%E6%A8%A1%E6%9D%BF--SIT.doc" target="_blank" download="英文简历模板">下载模板</a>]</p>
<p>请将英文简历填写完存为"pdf"格式上传,文件小于10MB。</p>`
}
]
}
}
}
export default function (_this) {
return {
required: true,
id: 'interview_yynl',
title: '语言能力证明',
get: {
callback(data) {
const { basic_info: basicInfo = {}, attachments = [] } = _this.detail.material
const attachment = attachments.reduce(
(result, item) => {
if (item.file_type_id === 'INTERNATIONAL_LANGUAGE_SCORE') {
result.INTERNATIONAL_LANGUAGE_SCORE.push(item)
}
return result
},
{ INTERNATIONAL_LANGUAGE_SCORE: [] }
)
return Object.assign({}, basicInfo, attachment)
}
},
update: {
beforeRequest(data) {
const basicInfo = ['language_score'].reduce((result, key) => {
result[key] = data[key]
return result
}, {})
return { basic_info: basicInfo }
}
},
form: {
options: { 'label-position': 'top' },
items: [
{
type: 'v-input',
label: '语言成绩(填写示例:大学英语六级/550)',
model: 'language_score',
attrs: { placeholder: '请填写您的语言成绩' },
rules: [{ required: true, message: '请填写您的语言成绩', trigger: 'blur' }]
},
{
required: true,
type: 'v-upload',
label: '语言成绩单',
model: 'INTERNATIONAL_LANGUAGE_SCORE',
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'INTERNATIONAL_LANGUAGE_SCORE' }
},
rules: [{ required: true, message: '请上传', trigger: 'change' }],
append: '成绩单类型包括:CET-4,CET-6,TOEFL,IELTS等'
}
]
}
}
}
export default function (_this) {
export default function(_this) {
return {
id: 'interview_zp',
title: '个人照片',
title: '2寸照片',
get: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/${process.env.projectId}`,
callback(data) {
const { attachments = [] } = _this.detail.material
const { attachments = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
const stageList = [
'FILLING',
'PREPAYMENT',
'INTERVIEW_APPLICATION',
'AUDITION',
'INTERVIEW',
'PAYMENT',
'REGISTRATION',
'CLOSED'
]
this.form.options.disabled = stageList.findIndex(item => item === submissionStage) > 2
const PERSONAL_PHOTO_FOR_ID = attachments.filter(item => {
return item.file_type_id === 'PERSONAL_PHOTO_FOR_ID'
})
return { PERSONAL_PHOTO_FOR_ID }
}
},
update: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/submit/${process.env.projectId}`,
beforeRequest(data) {
return { submission_stage: 'INTERVIEW_APPLICATION' }
},
callback() {
this.form.options.disabled = true
_this.dialogVisible = true
_this.getApplication()
},
errorCallback() {
_this.completeVisible = true
}
},
form: {
prev: { to: { query: { active: 'interview_cjd' } } },
submitText: '申请面试',
model: { submission_stage: 'INTERVIEW_APPLICATION' },
options: {},
items: [
{
type: 'v-upload',
......@@ -21,10 +49,10 @@ export default function (_this) {
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'PERSONAL_PHOTO_FOR_ID' },
limit: 1
data: { file_type: 'PERSONAL_PHOTO_FOR_ID' }
},
append: '申请者需提交白底两寸个人照片<br> 确保图片清晰可辨。<br> 上传文件仅限“jpg,jpeg,png”格式,文件小于5MB'
prepend: '2寸照片:以电子版的形式上传文件',
append: '注意事项:需要将证书原件扫描或拍照后提交,请确保证书内容清晰可辨。'
}
]
}
......
......@@ -2,26 +2,29 @@
<app-layout>
<vue-form
:menus="menus"
:disabled="isSubmitted"
:default-active="currentActive"
@page-change="handlePageChange"
@update="handleUpdate"
@success="handleSuccess"
@error="handleError"
@back="$router.push('/my/account')"
v-if="detail">
@prev="handlePrev"
@next="handleNext"
>
<template #aside-append>
<div class="aside-payment"><a href="https://accounts.ezijing.com/payment" target="_blank">查看缴费记录</a></div>
<div class="aside-logout" @click="$store.dispatch('logout')"><span>退出登录</span></div>
</template>
<!-- 报名缴费 -->
<template #content v-if="currentActive === 'application_pay'">
<app-pay :disabled="isSubmitted" @submit="handleSubmit" />
</template>
</vue-form>
<app-complete :type="1" v-model="completeVisible"></app-complete>
<el-dialog title="您的申请资料已提交成功" :visible.sync="dialogVisible" :center="true" :close-on-click-modal="false" width="348px">
<el-dialog
title="资料提交成功"
:visible.sync="dialogVisible"
:center="true"
:close-on-click-modal="false"
width="348px"
>
<div class="dialog-tips">
<p>请注意接听招办老师的邀约电话</p>
<div class="icon"><img src="https://webapp-pub.ezijing.com/project/application/images/icon_success.png" /></div>
</div>
<template #footer>
......@@ -35,17 +38,15 @@
import AppLayout from '../layout.vue'
import getMenu from './form'
import AppComplete from '../application/complete.vue'
import AppPay from './pay.vue'
import * as api from '@/api/my'
import { STAGE_LIST } from '../index'
export default {
components: { AppLayout, AppComplete, AppPay },
components: { AppLayout, AppComplete },
data() {
const menus = getMenu(this)
return {
menus: [menus],
currentActive: 'interview_ywjl',
currentActive: 'interview_byz',
completeVisible: false,
dialogVisible: false,
detail: null
......@@ -56,53 +57,46 @@ export default {
immediate: true,
handler(route) {
const { query = {} } = route
this.currentActive = query.active || 'interview_ywjl'
this.currentActive = query.active || 'interview_byz'
}
},
showSubmittedDialog(value) {
showSubmitedDialog(value) {
this.dialogVisible = value
}
},
computed: {
isSubmitted() {
isSubmited() {
const stageList = [
'FILLING',
'PREPAYMENT',
'INTERVIEW_APPLICATION',
'AUDITION',
'INTERVIEW',
'PAYMENT',
'REGISTRATION',
'CLOSED'
]
if (this.detail) {
return STAGE_LIST.findIndex(item => item === this.detail.material.submission_stage) > 2
return stageList.findIndex(item => item === this.detail.material.submission_stage) > 2
}
return false
},
showSubmittedDialog() {
return this.isSubmitted
},
user() {
return this.$store.state.user
showSubmitedDialog() {
return this.isSubmited && this.currentActive === 'interview_zp'
}
},
methods: {
// 获取报名信息
getApplication() {
api.getApplication().then(res => {
this.detail = res.data
})
},
// 更新报名信息
handleUpdate(data) {
api.updateApplication(data).then(res => {
this.detail = res.data
this.$message.success('保存成功')
api.getApplication().then(response => {
const { data, error, message } = response
if (error.toString() === '0') {
this.detail = data
} else {
this.$message.error(message)
}
})
},
handleSubmit(callback, params = { submission_stage: 'INTERVIEW_APPLICATION' }) {
api
.changeSubmissionStage(params)
.then(response => {
this.dialogVisible = true
this.getApplication()
callback && callback()
})
.catch(() => {
this.completeVisible = true
})
},
handlePageChange(value) {
this.currentActive = value
this.$router.push({ path: this.$route.path, query: { active: value } })
......@@ -116,6 +110,12 @@ export default {
handleError(data) {
console.log('提交失败了', data)
this.$message({ type: 'error', message: data.message })
},
handlePrev(to) {
this.$router.push(to)
},
handleNext(to) {
this.$router.push(to)
}
},
beforeMount() {
......
<template>
<div>
<div class="pay" v-if="!dialogVisible">
<h5-pay @update="handleUpdateOrder" v-if="isWechat"></h5-pay>
<qrcode-pay @update="handleUpdateOrder" v-else></qrcode-pay>
<div class="pay-ft">
<p class="t2">注释:<br />此处为微信二维码<br />申请费不退还</p>
</div>
<!-- <el-dialog title="报名费缴费成功" :visible.sync="dialogVisible" :center="true" :close-on-click-modal="false" width="348px">
<div class="dialog-pay">
<div class="icon"><img src="https://webapp-pub.ezijing.com/project/application/images/icon_success.png" /></div>
<p>报名费已成功缴纳,请点击申请面试并等待招生办进一步通知</p>
</div>
<template #footer>
<el-button type="primary" @click="$emit('submit')">申请面试</el-button>
</template>
</el-dialog> -->
</div>
<div v-else>
<div class="dialog-pay">
<div class="icon"><img src="https://webapp-pub.ezijing.com/project/application/images/icon_success.png" /></div>
<p>报名费已成功缴纳,请点击申请面试并等待招生办进一步通知</p>
<el-button type="primary" :disabled="disabled" @click="$emit('submit')">申请面试</el-button>
</div>
</div>
</div>
</template>
<script>
import * as api from '@/api/my'
import qrcodePay from './components/qrcodePay'
import h5Pay from './components/h5Pay'
export default {
name: 'AppPay',
components: { qrcodePay, h5Pay },
props: { disabled: { type: Boolean, default: false } },
data() {
const UA = window.navigator.userAgent
const isMobile = /android|iphone|ipad|ipod/i.test(UA)
return {
isWechat: isMobile && /micromessenger/i.test(UA),
order: { id: '', payment_url: '' },
dialogVisible: false,
timer: null,
paymentRecords: [] // 所有订单
}
},
computed: {
user() {
return this.$store.state.user
},
// 二维码地址
qrcodeValue() {
return this.order.payment_url
},
// 支付成功
paySuccess() {
return this.order.payment_status === 'SUCCESS'
},
// 待支付订单
orderList() {
// 筛选待支付订单
const list = this.paymentRecords.filter(item => {
return item.bill_type === 'APPLICATION_FEE' && item.payment_status === 'WAITING_FOR_PAY'
})
// 待支付订单是否有当前订单
const found = list.find(item => item.id === this.order.id)
return found ? list : [...list, this.order]
}
},
methods: {
// 获取报名信息
async getApplication() {
await api.getApplication().then(response => {
const { payment_records: paymentRecords = [] } = response.data.material
// 获取支付订单
this.paymentRecords = paymentRecords
if (paymentRecords && paymentRecords.length) {
// 获取支付成功的订单
const orderPaySuccess = paymentRecords.find(item => {
return item.bill_type === 'APPLICATION_FEE' && item.payment_status === 'SUCCESS'
})
if (orderPaySuccess) {
this.order = orderPaySuccess
this.dialogVisible = true
return
}
// 获取最后一个订单
const [lastPayment] = paymentRecords.reverse()
this.order = lastPayment
}
})
},
// 检查支付状态
checkPay(order) {
if (!order || !order.id) {
return
}
const userId = this.user.id
api.checkPay(order.id, { user_id: userId }).then(response => {
if (response.data.payment_status === 'SUCCESS') {
this.timer && clearInterval(this.timer)
this.dialogVisible = true
}
})
},
// 检测支付状态定时器
setCheckPayTimer() {
this.timer && clearInterval(this.timer)
this.timer = setInterval(() => {
if (this.paySuccess) {
this.timer && clearInterval(this.timer)
return
}
this.orderList.forEach(order => this.checkPay(order))
}, 3000)
},
// 填写个人资料
toApplication() {
this.$router.push('/my/application?active=application_info')
},
// 申请面试
toInterview() {
this.$router.push('/my/interview')
},
handleUpdateOrder(order) {
this.order = order
}
},
async mounted() {
await this.getApplication()
this.setCheckPayTimer()
},
destroyed() {
this.timer && clearInterval(this.timer)
}
}
</script>
<style lang="scss" scoped>
.pay {
max-width: 562px;
margin: 0 auto;
padding: 40px 0;
}
.t1 {
font-size: 14px;
color: #303030;
line-height: 20px;
text-align: center;
span {
color: #ffa448;
}
}
.t2 {
font-size: 12px;
color: #999;
line-height: 20px;
}
.dialog-pay {
text-align: center;
p {
margin: 10px 0 20px;
color: #262626;
line-height: 20px;
}
.icon {
margin-top: 80px;
text-align: center;
}
}
</style>
<template>
<div style="background-color: #eee">
<div style="background-color: #eee;min-width: 1200px;">
<div class="layout">
<div class="layout-hd">
<slot name="header">
......@@ -12,6 +12,7 @@
</div>
</div>
</template>
<script>
export default {
head: {
......@@ -41,7 +42,7 @@ export default {
}
::v-deep .v-layout-aside {
position: relative;
min-height: 440px;
min-height: 410px;
align-self: flex-start;
.aside-logout {
span {
......@@ -73,11 +74,5 @@ export default {
color: #57acff;
text-align: center;
}
.v-menu__title{
padding-left:40px;
}
.v-submenu__item{
padding-left:44px;
}
}
</style>
<template>
<div class="collapse" :class="classes">
<div class="collapse-hd">
<div class="collapse-icon" @click="toggle">
<i class="el-icon-remove-outline" v-if="isActive"></i>
<i class="el-icon-circle-plus-outline" v-else></i>
</div>
<div class="collapse-title">
<slot name="title">{{ title }}</slot>
</div>
</div>
<div class="collapse-bd" v-show="isActive">
<slot>{{ content }}</slot>
</div>
</div>
</template>
<script>
export default {
props: {
value: { type: Boolean, default: false },
title: { type: String },
content: { type: String }
},
data() {
return {
isActive: false
}
},
computed: {
classes() {
return { 'is-active': this.isActive }
}
},
methods: {
toggle() {
this.isActive = !this.isActive
this.$emit('input', this.isActive)
}
}
}
</script>
<style lang="scss" scoped>
.collapse {
margin-top: 10px;
}
.collapse-hd {
display: flex;
font-size: 14px;
line-height: 20px;
color: #222;
}
.collapse-icon {
margin-right: 6px;
font-size: 14px;
cursor: pointer;
color: #999;
}
.collapse-bd {
padding-left: 20px;
color: #666;
p {
color: #666 !important;
}
}
</style>
<template>
<div class="h5pay">
<el-button type="primary" @click="handlePay">去支付</el-button>
</div>
</template>
<script>
import * as api from '@/api/my'
export default {
data() {
return {
openId: window.localStorage.getItem('open_id')
}
},
computed: {
pageUrl() {
return window.location.origin + this.$route.path + '?active=application_pay'
}
},
methods: {
// 获取订单
getOrder(callback) {
api.getOrder({ wx_open_id: this.openId, payment_method: 'WX_PAY' }, 'TUITION').then(response => {
const { data, error, message } = response
if (error.toString() === '0') {
this.order = data
this.$emit('update', this.order)
callback && callback(this.order)
} else {
this.$message.error(message)
}
})
},
// 获取微信code
getCode() {
const redirectURI = `https://pages.ezijing.com/given/auth.html?redirect_uri=${encodeURIComponent(this.pageUrl)}`
window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx451c01d40d090d7a&redirect_uri=${redirectURI}&response_type=code&scope=snsapi_base#wechat_redirect`
},
// 获取微信openid
getOpenId(code) {
api.getOpenId({ code, identity: 'ezijing' }).then(response => {
if (response.code === 0) {
this.openId = response.openid
window.localStorage.setItem('open_id', this.openId)
this.getOrder()
} else {
this.getCode()
}
})
},
// 去支付
handlePay() {
this.getOrder(() => {
window.location.href = `https://web-pay.ezijing.com/wxpay/h5?prepay_id=${this.order.wx_prepay_id}&open_id=${this.openId}&redirect_uri=${encodeURIComponent(this.pageUrl)}`
})
}
},
beforeMount() {
if (!this.openId) {
const { code } = this.$route.query
code ? this.getOpenId(code) : this.getCode()
}
}
}
</script>
<style scoped>
.h5pay {
padding: 40px;
text-align: center;
}
</style>
<template>
<div class="qrpay">
<div class="qrpay-hd">
<div class="pic">
<img src="https://webapp-pub.ezijing.com/project/application/images/my_pay_01.png" />
</div>
<h1>欢迎您</h1>
<p class="t1">
申请斯蒂文斯理工学院工程管理硕士保研项目,需缴纳留位费<span>20000</span>元,请扫描二维码以完成缴费。
</p>
</div>
<div class="qrcode-error" v-if="qrcodeError">生成二维码失败请刷新<i class="el-icon-refresh-left" @click="getOrder" title="刷新"></i></div>
<div class="qrcode" v-else>
<qrcode-vue :value="qrcodeValue" size="100"></qrcode-vue>
<span @click="getOrder"><i class="el-icon-refresh" style="font-size:20px" title="刷新"></i></span>
</div>
</div>
</template>
<script>
import QrcodeVue from 'qrcode.vue'
import * as api from '@/api/my'
export default {
components: { QrcodeVue },
data() {
return {
order: { id: '', payment_url: '' },
qrcodeError: false
}
},
computed: {
// 二维码地址
qrcodeValue() {
return this.order.payment_url
}
},
methods: {
// 获取订单
getOrder() {
api.getOrder({ payment_method: 'WX_PAY_QR' }, 'TUITION').then(response => {
const { data, error, message } = response
this.qrcodeError = error.toString() === '1'
if (error.toString() === '0') {
this.order = data
this.$emit('update', this.order)
} else {
this.$message.error(message)
}
})
}
},
beforeMount() {
this.getOrder()
}
}
</script>
<style lang="scss" scoped>
.qrpay-hd {
.pic {
text-align: center;
}
h1 {
padding: 10px 0;
font-size: 24px;
font-weight: 500;
color: #222;
line-height: 1;
text-align: center;
}
}
.qrcode {
padding: 20px 0;
text-align: center;
span {
margin-top: 10px;
font-size: 12px;
color: #999;
cursor: pointer;
}
}
.qrcode-error {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
width: 100px;
height: 100px;
padding: 10px;
margin: 20px auto;
color: var(--main-color);
border-style: dashed;
border-width: 1px;
border-color: var(--main-color);
box-sizing: border-box;
text-align: center;
i {
margin-top: 10px;
cursor: pointer;
}
}
.t1 {
font-size: 14px;
color: #303030;
line-height: 20px;
text-align: center;
span {
color: #ffa448;
}
}
</style>
import xy from './xy'
export default function (_this) {
return {
id: 'admission',
title: '综合评审',
children: [
{
required: true,
id: 'application_pay',
title: '缴纳留位费'
// visible() {
// return _this.hasPay
// }
},
xy(_this)
]
}
}
export default function (_this) {
return {
required: true,
id: 'admission_xy',
title: '入学协议',
// visible() {
// return _this.hasPay
// },
get: {
callback(data) {
const { attachments = [] } = _this.detail.material
const ADMISSION_AGREEMENT = attachments.filter(item => {
return item.file_type_id === 'ADMISSION_AGREEMENT'
})
return { ADMISSION_AGREEMENT }
}
},
form: {
hasButton: false,
options: { 'label-position': 'top' },
items: [
{
type: 'v-upload',
required: true,
label: '入学协议',
model: 'ADMISSION_AGREEMENT',
attrs: {
action: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/put`,
deleteAction: `${process.env.baseURL}/api/enrollment/v1.0/application-materials/attachments/${process.env.projectId}/delete`,
data: { file_type: 'ADMISSION_AGREEMENT' }
},
prepend:
// <p><a href="https://webapp-pub.ezijing.com/project/sbu-plus/%E5%85%A5%E5%AD%A6%E5%8D%8F%E8%AE%AE.pdf" target="_blank" download="入学协议">下载入学协议</a></p>
`<p>申请者可将签字后的入学协议原件扫描或拍照后提交。</p>
<p>学员应仔细阅读《入学协议》以及课程介绍,如对入学协议或课程有异议,请第一时间与课程顾问咨询确认。请用A4纸打印后,在入学协议上签上姓名和日期,内容需显示完整、格式整齐、字迹清晰可辨。上传文件仅限“jpg,jpeg,pdf,png”格式,文件小于10Mb。</p>
`
}
]
}
}
}
<template>
<app-layout>
<vue-form
:menus="menus"
:disabled="isSubmitted"
:default-active="currentActive"
@page-change="handlePageChange"
@update="handleUpdate"
@success="handleSuccess"
@error="handleError"
@back="$router.push('/my/account')"
@uploaded="getApplication"
v-if="detail">
<template #aside-append>
<div class="aside-payment"><a href="https://accounts.ezijing.com/payment" target="_blank">查看缴费记录</a></div>
<div class="aside-logout" @click="$store.dispatch('logout')"><span>退出登录</span></div>
</template>
<!-- 报名缴费 -->
<template #content v-if="currentActive === 'application_pay'">
<app-pay @success="isPay = true" />
</template>
<!-- 入学协议 -->
<!-- <template #content v-if="currentActive === 'admission_xy'">
<app-xy />
</template> -->
</vue-form>
<el-dialog title="综合评审资料提交成功" :visible.sync="dialogVisible" :center="true" :close-on-click-modal="false" width="400px">
<div class="dialog-tips">
<div class="icon"><img src="https://webapp-pub.ezijing.com/project/application/images/icon_success.png" /></div>
<p>材料补充已完成,请等待招生办进一步通知。</p>
</div>
<template #footer>
<el-button type="primary" @click="toPay" v-if="hasPay">缴纳留位费</el-button>
<!-- <el-button type="primary" @click="dialogVisible = false">确定</el-button> -->
</template>
</el-dialog>
<app-complete :type="2" v-model="completeVisible"></app-complete>
</app-layout>
</template>
<script>
import AppLayout from '../layout.vue'
import getMenu from './form'
import * as api from '@/api/my'
import AppXy from './xy'
import AppComplete from '../application/complete.vue'
import AppPay from './pay.vue'
import { STAGE_LIST } from '../index'
export default {
components: { AppLayout, AppXy, AppComplete, AppPay },
data() {
const menus = getMenu(this)
return {
menus: [menus],
currentActive: 'application_pay',
dialogVisible: false,
detail: null,
completeVisible: false,
isPay: true
}
},
watch: {
$route: {
immediate: true,
handler(route) {
const { query = {} } = route
this.currentActive = query.active || 'application_pay'
}
},
showSubmittedDialog(value) {
this.dialogVisible = value
}
},
computed: {
isSubmitted() {
if (this.detail) {
return STAGE_LIST.findIndex(item => item === this.detail.material.submission_stage) > 6
}
return false
},
showSubmittedDialog() {
return this.isSubmitted && this.currentActive === 'admission_form'
},
user() {
return this.$store.state.user
},
hasPay() {
if (this.detail && this.detail.material) {
return this.detail.material.basic_info.sit_can_pay === '1'
}
return false
}
},
methods: {
// 获取报名信息
getApplication() {
api.getApplication().then(res => {
this.detail = res.data
})
},
// 更新报名信息
handleUpdate(data) {
api.updateApplication(data).then(res => {
this.detail = res.data
this.$message.success('保存成功')
})
},
changeSubmissionStage(callback, params = { submission_stage: 'REGISTRATION' }) {
api
.changeSubmissionStage({ submission_stage: 'REGISTRATION' })
.then(() => {
this.getApplication()
callback && callback()
})
.catch(() => {
this.completeVisible = true
})
},
handlePageChange(value) {
this.currentActive = value
this.$router.push({ path: this.$route.path, query: { active: value } })
console.log('页面切换了', value)
},
handleSuccess(data) {
console.log('提交成功了', data)
this.$message({ type: 'success', message: data.message })
},
handleError(data) {
console.log('提交失败了', data)
this.$message({ type: 'error', message: data.message })
},
toPay() {
this.dialogVisible = false
this.$router.push({ path: '/my/review', query: { active: 'application_pay' } })
},
// 更换推荐人
changeProvider(data) {
api.updateProvider(data.id, data).then(response => {
const { error, message } = response
if (error.toString() === '0') {
this.sendToProvider(data)
// this.$message({ type: 'success', message })
} else {
this.$message.error(message)
}
})
},
// 再次邀请推荐
sendToProvider(data) {
api.sendToProvider(data.id).then(response => {
const { error, message } = response
if (error.toString() === '0') {
this.$message({ type: 'success', message })
} else {
this.$message.error(message)
}
})
},
// 发送推荐信
sendToProviders() {
api.sendToProviders().then(response => {
const { error, message } = response
if (error.toString() === '0') {
this.$message({ type: 'success', message })
} else {
this.$message.error(message)
}
})
}
},
beforeMount() {
this.getApplication()
}
}
</script>
<style lang="scss" scoped>
.dialog-tips {
text-align: center;
p {
color: #262626;
line-height: 20px;
}
.icon {
margin-bottom: 20px;
text-align: center;
}
}
</style>
<template>
<div class="pay">
<h5-pay @update="handleUpdateOrder" v-if="isWechat"></h5-pay>
<qrcode-pay @update="handleUpdateOrder" v-else></qrcode-pay>
<div class="pay-ft">
<p class="t2">注:20,000元人民币的留位费将在您完成入学流程后作为学费扣除。因此,缴纳留位费后,您只需交纳第一年学费的剩余部分即可选修第一年的课程。</p>
</div>
<el-dialog title="缴费成功" :visible.sync="dialogVisible" :center="true" :close-on-click-modal="false" width="400px">
<div class="dialog-pay">
<div class="icon"><img src="https://webapp-pub.ezijing.com/project/application/images/icon_success.png" /></div>
<p>留位费已成功缴纳,请根据招生办邮件指示办理入学手续</p>
</div>
</el-dialog>
</div>
</template>
<script>
import * as api from '@/api/my'
import qrcodePay from './components/qrcodePay'
import h5Pay from './components/h5Pay'
export default {
name: 'AppPay',
components: { qrcodePay, h5Pay },
data() {
const UA = window.navigator.userAgent
const isMobile = /android|iphone|ipad|ipod/i.test(UA)
return {
isWechat: isMobile && /micromessenger/i.test(UA),
order: { id: '', payment_url: '' },
dialogVisible: false,
timer: null,
paymentRecords: [] // 所有订单
}
},
computed: {
user() {
return this.$store.state.user
},
// 二维码地址
qrcodeValue() {
return this.order.payment_url
},
// 支付成功
paySuccess() {
return this.order.payment_status === 'SUCCESS'
},
// 待支付订单
orderList() {
// 筛选待支付订单
const list = this.paymentRecords.filter(item => {
return item.bill_type === 'TUITION' && item.payment_status === 'WAITING_FOR_PAY'
})
// 待支付订单是否有当前订单
const found = list.find(item => item.id === this.order.id)
return found ? list : [...list, this.order]
}
},
watch: {
paySuccess: {
handler(value) {
value && this.$emit('success')
},
immediate: true
}
},
methods: {
// 获取报名信息
async getApplication() {
await api.getApplication().then(response => {
const { payment_records: paymentRecords = [] } = response.data.material
// 获取支付订单
this.paymentRecords = paymentRecords
if (paymentRecords && paymentRecords.length) {
// 获取支付成功的订单
const orderPaySuccess = paymentRecords.find(item => {
return item.bill_type === 'TUITION' && item.payment_status === 'SUCCESS'
})
if (orderPaySuccess) {
this.order = orderPaySuccess
this.dialogVisible = true
return
}
// 获取最后一个订单
const [lastPayment] = paymentRecords.reverse()
this.order = lastPayment
}
})
},
// 检查支付状态
checkPay(order) {
if (!order || !order.id) {
return
}
const userId = this.user.id
api.checkPay(order.id, { user_id: userId }, 'TUITION').then(response => {
if (response.data.payment_status === 'SUCCESS') {
this.timer && clearInterval(this.timer)
this.dialogVisible = true
}
})
},
// 检测支付状态定时器
setCheckPayTimer() {
this.timer && clearInterval(this.timer)
this.timer = setInterval(() => {
if (this.paySuccess) {
this.timer && clearInterval(this.timer)
return
}
this.orderList.forEach(order => this.checkPay(order))
}, 3000)
},
handleUpdateOrder(order) {
this.order = order
}
},
async mounted() {
await this.getApplication()
this.setCheckPayTimer()
},
destroyed() {
this.timer && clearInterval(this.timer)
}
}
</script>
<style lang="scss" scoped>
.pay {
max-width: 562px;
margin: 0 auto;
padding: 40px 0;
}
.t1 {
font-size: 14px;
color: #303030;
line-height: 20px;
text-align: center;
span {
color: #ffa448;
}
}
.t2 {
font-size: 12px;
color: #999;
line-height: 20px;
}
.dialog-pay {
text-align: center;
p {
color: #262626;
line-height: 20px;
}
.icon {
margin-bottom: 20px;
text-align: center;
}
}
</style>
差异被折叠。
<template>
<div class="h5pay">
<el-button type="primary" @click="handlePay">去支付</el-button>
</div>
</template>
<script>
import * as api from '@/api/my'
export default {
data() {
return {
openId: window.localStorage.getItem('open_id')
}
},
computed: {
pageUrl() {
return window.location.origin + this.$route.path
}
},
methods: {
// 获取订单
getOrder(callback) {
api.getOrder({ wx_open_id: this.openId, payment_method: 'WX_PAY' }).then(response => {
const { data, error, message } = response
if (error.toString() === '0') {
this.order = data
this.$emit('update', this.order)
callback && callback(this.order)
} else {
this.$message.error(message)
}
})
},
// 获取微信code
getCode() {
const redirectURI = `https://pages.ezijing.com/given/auth.html?redirect_uri=${encodeURIComponent(this.pageUrl)}`
window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx451c01d40d090d7a&redirect_uri=${redirectURI}&response_type=code&scope=snsapi_base#wechat_redirect`
},
// 获取微信openid
getOpenId(code) {
api.getOpenId({ code, identity: 'ezijing' }).then(response => {
if (response.code === 0) {
this.openId = response.openid
window.localStorage.setItem('open_id', this.openId)
this.getOrder()
} else {
this.getCode()
}
})
},
// 去支付
handlePay() {
this.getOrder(() => {
window.location.href = `https://web-pay.ezijing.com/wxpay/h5?prepay_id=${this.order.wx_prepay_id}&open_id=${
this.openId
}&redirect_uri=${encodeURIComponent(this.pageUrl)}`
})
}
},
beforeMount() {
if (!this.openId) {
const { code } = this.$route.query
code ? this.getOpenId(code) : this.getCode()
}
}
}
</script>
<style scoped>
.h5pay {
padding: 40px;
text-align: center;
}
</style>
<template>
<div class="qrpay">
<div class="qrpay-hd">
<div class="pic">
<img src="https://webapp-pub.ezijing.com/project/application/images/my_pay_02.png" height="160" />
</div>
<h1>请使用微信扫描下方二维码</h1>
</div>
<div class="qrcode-error" v-if="qrcodeError">
生成二维码失败请刷新<i class="el-icon-refresh-left" @click="getOrder" title="刷新"></i>
</div>
<div class="qrcode" v-else>
<qrcode-vue :value="qrcodeValue" size="100"></qrcode-vue>
<span @click="getOrder">刷新</span>
</div>
</div>
</template>
<script>
import QrcodeVue from 'qrcode.vue'
import * as api from '@/api/my'
export default {
components: { QrcodeVue },
data() {
return {
order: { id: '', payment_url: '' },
qrcodeError: false
}
},
computed: {
// 二维码地址
qrcodeValue() {
return this.order.payment_url
}
},
methods: {
// 获取订单
getOrder() {
api.getOrder({ payment_method: 'WX_PAY_QR' }).then(response => {
const { data, error, message } = response
this.qrcodeError = error.toString() === '1'
if (error.toString() === '0') {
this.order = data
this.$emit('update', this.order)
} else {
this.$message.error(message)
}
})
}
},
beforeMount() {
this.getOrder()
}
}
</script>
<style lang="scss" scoped>
.qrpay-hd {
.pic {
text-align: center;
}
h1 {
margin-top: 40px;
font-size: 24px;
font-weight: 500;
color: #222;
line-height: 1;
text-align: center;
}
}
.qrcode {
padding: 20px 0;
text-align: center;
span {
margin-top: 10px;
font-size: 12px;
color: #999;
cursor: pointer;
}
}
.qrcode-error {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
width: 100px;
height: 100px;
padding: 10px;
margin: 20px auto;
color: var(--main-color);
border-style: dashed;
border-width: 1px;
border-color: var(--main-color);
box-sizing: border-box;
text-align: center;
i {
margin-top: 10px;
cursor: pointer;
}
}
</style>
<template>
<div v-if="loaded">
<index-welcome @update="handleUpdate" v-if="!isSubmitted" />
<index-pay v-else />
</div>
</template>
<script>
import IndexWelcome from './indexWelcome.vue'
import IndexPay from './indexPay.vue'
import * as api from '@/api/my'
export default {
components: { IndexWelcome, IndexPay },
data() {
return {
loaded: false,
progress: {}
}
},
methods: {
// 获取报名信息
getApplication() {
this.loaded = false
api.getApplication().then(response => {
const { progress = {} } = response.data
this.progress = progress
// 缴费成功
if (progress.PREPAYMENT.total_progress) {
this.$router.push('/my/account')
} else {
this.loaded = true
}
})
},
handleUpdate(data) {
const { progress } = data
this.progress = progress
}
},
computed: {
isSubmitted() {
const { FILLING = {} } = this.progress
if (FILLING && FILLING.basic_info) {
return !!FILLING.basic_info.progress
}
return false
}
},
beforeCreate() {
document.body.style.background = '#fff'
},
created() {
this.$router.replace('/my/account')
},
beforeMount() {
// this.getApplication()
},
destroyed() {
document.body.style = ''
}
}
</script>
<template>
<div class="pay">
<h5-pay @update="handleUpdateOrder" v-if="isWechat"></h5-pay>
<qrcode-pay @update="handleUpdateOrder" v-else></qrcode-pay>
<div class="pay-ft">
<p class="t2">
欢迎您申请斯蒂文斯理工学院工程管理硕士<br />
申请流程:①支付报名费②填写报名资料并提供相关材料(身份证扫描件、毕业证书扫描件、2寸照片)③参加面试④获得录取⑤缴纳学费并签署入学协议⑥入学学习(办
理入学手续:提供成绩单、学籍注册等)<br />申请费提交后不予退还
</p>
</div>
<el-dialog title="报名费缴费成功" :visible.sync="dialogVisible" :center="true" :show-close="false" :close-on-click-modal="false" width="400px">
<div class="dialog-pay">
<p>请按照要求填写报名所需材料,完成“提交报名申请”及“申请面试”</p>
<div class="icon"><img src="https://webapp-pub.ezijing.com/project/application/images/icon_success.png" /></div>
</div>
<template #footer>
<el-button type="primary" @click="toApplication">立即预约</el-button>
</template>
</el-dialog>
</div>
</template>
<script>
import * as api from '@/api/my'
import qrcodePay from './components/qrcodePay'
import h5Pay from './components/h5Pay'
export default {
name: 'AppPay',
components: { qrcodePay, h5Pay },
data() {
const UA = window.navigator.userAgent
const isMobile = /android|iphone|ipad|ipod/i.test(UA)
return {
isWechat: isMobile && /micromessenger/i.test(UA),
order: { id: '', payment_url: '' },
dialogVisible: false,
timer: null,
paymentRecords: [] // 所有订单
}
},
computed: {
user() {
return this.$store.state.user
},
// 二维码地址
qrcodeValue() {
return this.order.payment_url
},
// 支付成功
paySuccess() {
return this.order.payment_status === 'SUCCESS'
},
// 待支付订单
orderList() {
// 筛选待支付订单
const list = this.paymentRecords.filter(item => {
return item.bill_type === 'APPLICATION_FEE' && item.payment_status === 'WAITING_FOR_PAY'
})
// 待支付订单是否有当前订单
const found = list.find(item => item.id === this.order.id)
return found ? list : [...list, this.order]
}
},
methods: {
// 获取报名信息
async getApplication() {
await api.getApplication().then(response => {
const { payment_records: paymentRecords = [] } = response.data.material
// 获取支付订单
this.paymentRecords = paymentRecords
if (paymentRecords && paymentRecords.length) {
// 获取支付成功的订单
const orderPaySuccess = paymentRecords.find(item => {
return item.bill_type === 'APPLICATION_FEE' && item.payment_status === 'SUCCESS'
})
if (orderPaySuccess) {
this.order = orderPaySuccess
this.dialogVisible = true
return
}
// 获取最后一个订单
const [lastPayment] = paymentRecords.reverse()
this.order = lastPayment
}
})
},
// 检查支付状态
checkPay(order) {
const userId = this.user.id
api.checkPay(order.id, { user_id: userId }).then(response => {
if (response.data.payment_status === 'SUCCESS') {
this.timer && clearInterval(this.timer)
this.dialogVisible = true
}
})
},
// 检测支付状态定时器
setCheckPayTimer() {
this.timer && clearInterval(this.timer)
this.timer = setInterval(() => {
if (this.paySuccess) {
this.timer && clearInterval(this.timer)
return
}
this.orderList.forEach(order => this.checkPay(order))
}, 3000)
},
// 填写个人资料
toApplication() {
this.$router.push('/my/account')
},
handleUpdateOrder(order) {
this.order = order
}
},
async mounted() {
await this.getApplication()
this.setCheckPayTimer()
},
destroyed() {
this.timer && clearInterval(this.timer)
}
}
</script>
<style lang="scss" scoped>
.pay {
max-width: 562px;
margin: 0 auto;
padding: 40px 0;
}
.t1 {
font-size: 14px;
color: #303030;
line-height: 20px;
text-align: center;
span {
color: #ffa448;
}
}
.t2 {
font-size: 12px;
color: #999;
line-height: 20px;
}
.dialog-pay {
text-align: center;
p {
color: #262626;
line-height: 20px;
}
.icon {
margin-top: 20px;
text-align: center;
}
}
</style>
<template>
<div class="welcome">
<div class="top">
<div class="pic">
<img src="https://webapp-pub.ezijing.com/project/application/images/my_pay_01.png" />
</div>
<h1>欢迎您</h1>
<p class="t1">
申请斯蒂文斯理工学院工程管理硕士保研项目,请在填写以下内容并<br />
提交报名申请后,扫码支付本项目的申请费共计<span>700</span>元。
</p>
</div>
<div class="form">
<el-form :model="ruleForm" :rules="rules" label-width="70px" ref="ruleForm">
<el-form-item label="姓名" prop="real_name_cn">
<el-input v-model="ruleForm.real_name_cn"></el-input>
</el-form-item>
<el-form-item label="手机号" prop="phone_number">
<el-input v-model="ruleForm.phone_number" :maxlength="11"></el-input>
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="ruleForm.email"></el-input>
</el-form-item>
<div class="buttons">
<el-button type="primary" class="button-submit" @click="handleSubmit">提交</el-button>
</div>
</el-form>
</div>
</div>
</template>
<script>
import * as api from '@/api/my'
export default {
data() {
return {
material: {},
progress: {},
ruleForm: {
real_name_cn: '',
phone_number: '',
email: ''
},
rules: {
real_name_cn: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
phone_number: [{ required: true, pattern: /^1[3-9]\d{9}$/, message: '请输入手机号', trigger: 'blur' }],
email: [{ type: 'email', required: true, message: '请输入邮箱', trigger: 'blur' }]
}
}
},
methods: {
handleSubmit() {
this.$refs.ruleForm.validate().then(this.handleSubmitRequest)
},
handleSubmitRequest() {
const params = {
basic_info: this.ruleForm
}
api.updateApplication(params).then(response => {
if (response.error === '0') {
this.$emit('update', response.data)
} else {
this.$message({ type: 'error', message: response.message })
}
})
}
}
}
</script>
<style lang="scss" scoped>
.welcome {
margin: 0 auto;
padding: 20px 0;
}
.top {
padding: 40px 0;
.pic {
text-align: center;
}
h1 {
padding: 20px 0;
font-size: 24px;
font-weight: 500;
color: #222;
line-height: 1;
text-align: center;
}
}
.t1 {
font-size: 14px;
color: #262626;
line-height: 20px;
text-align: center;
span {
color: #ffa448;
}
}
.buttons {
text-align: center;
}
.button-submit {
width: 100px;
margin: 0 auto;
}
.form {
max-width: 350px;
margin: 0 auto;
}
</style>
......@@ -17,7 +17,7 @@ export default {
}),
// Global page headers: https://go.nuxtjs.dev/config-head
head: {
title: '斯蒂文斯理工学院工程管理硕士保研项目',
title: '巴黎PPA商学院DBA项目',
htmlAttrs: {
lang: 'en'
},
......@@ -26,12 +26,12 @@ export default {
{ hid: 'viewport', name: 'viewport', content: 'width=device-width, initial-scale=1' },
{
name: 'keywords',
content: '国际留学,美国留学,留学,预科留学,硕士留学,留学保研项目'
content: '国际留学,留学,预科留学,硕士留学,留学保研项目'
},
{
name: 'description',
content:
'斯蒂文斯理工学院创办于1870年,和麻省理工、加州理工、伦斯勒理工学院并称为美国四大理工学院,是美国历史最为悠久的理工学院之一。斯蒂文斯理工学院是一所在美国的教育和研究领域中位居前沿的理工类大学,长年位列U.S. News & World Report全美Top100。斯蒂文斯理工学院下设四大学院,提供35个本科、58个硕士及20个博士学位专业。'
content: ''
// '斯蒂文斯理工学院创办于1870年,和麻省理工、加州理工、伦斯勒理工学院并称为美国四大理工学院,是美国历史最为悠久的理工学院之一。斯蒂文斯理工学院是一所在美国的教育和研究领域中位居前沿的理工类大学,长年位列U.S. News & World Report全美Top100。斯蒂文斯理工学院下设四大学院,提供35个本科、58个硕士及20个博士学位专业。'
}
],
link: [
......
......@@ -24,7 +24,7 @@ export default {
slider: [
{ name: '学习费用', path: '/apply/tab1' },
{ name: '申请流程', path: '/apply/tab2' },
{ name: '在线报名', path: '/my' }
{ name: '在线报名', path: '/my/account' }
]
}
}
......
......@@ -46,7 +46,7 @@ export default {
slider: [
{ name: '学习费用', path: '/apply/tab1' },
{ name: '申请流程', path: '/apply/tab2' },
{ name: '在线报名', path: '/my' }
{ name: '在线报名', path: '/my/account' }
]
}
}
......
......@@ -9,12 +9,6 @@ export default (routes, resolve) => {
component: resolve(__dirname, '../layouts/normal.vue'),
props: { hasFooter: false },
children: [
{
name: 'apply',
path: '',
component: resolve(__dirname, '../modules/my/welcome/index.vue'),
meta: { requiredLogin: true }
},
{
name: 'account',
path: 'account',
......@@ -31,11 +25,6 @@ export default (routes, resolve) => {
component: resolve(__dirname, '../modules/my/interview/index.vue'),
meta: { requiredLogin: true }
},
{
path: 'review',
component: resolve(__dirname, '../modules/my/review/index.vue'),
meta: { requiredLogin: true }
},
{
path: 'admission',
component: resolve(__dirname, '../modules/my/admission/index.vue'),
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论