提交 e79161e1 authored 作者: lihuihui's avatar lihuihui

1+x项目站

上级 8b2fa17f
...@@ -1710,7 +1710,7 @@ ...@@ -1710,7 +1710,7 @@
"dependencies": { "dependencies": {
"debug": { "debug": {
"version": "2.6.9", "version": "2.6.9",
"resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502873540&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz",
"integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
"dev": true, "dev": true,
"requires": { "requires": {
...@@ -3450,6 +3450,11 @@ ...@@ -3450,6 +3450,11 @@
"integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=",
"dev": true "dev": true
}, },
"dayjs": {
"version": "1.9.7",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.9.7.tgz",
"integrity": "sha512-IC877KBdMhBrCfBfJXHQlo0G8keZ0Opy7YIIq5QKtUbCuHMzim8S4PyiVK4YmihI3iOF9lhfUBW4AQWHTR5WHA=="
},
"de-indent": { "de-indent": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npm.taobao.org/de-indent/download/de-indent-1.0.2.tgz", "resolved": "https://registry.npm.taobao.org/de-indent/download/de-indent-1.0.2.tgz",
...@@ -4379,7 +4384,7 @@ ...@@ -4379,7 +4384,7 @@
"dependencies": { "dependencies": {
"debug": { "debug": {
"version": "2.6.9", "version": "2.6.9",
"resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", "resolved": "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1600502873540&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz",
"integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
"dev": true, "dev": true,
"requires": { "requires": {
...@@ -5670,7 +5675,7 @@ ...@@ -5670,7 +5675,7 @@
}, },
"html-tags": { "html-tags": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/html-tags/download/html-tags-2.0.0.tgz", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz",
"integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=" "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos="
}, },
"html-webpack-plugin": { "html-webpack-plugin": {
...@@ -6633,7 +6638,7 @@ ...@@ -6633,7 +6638,7 @@
}, },
"lodash.kebabcase": { "lodash.kebabcase": {
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npm.taobao.org/lodash.kebabcase/download/lodash.kebabcase-4.1.1.tgz", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
"integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=" "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY="
}, },
"loglevel": { "loglevel": {
...@@ -9931,7 +9936,7 @@ ...@@ -9931,7 +9936,7 @@
}, },
"svg-tags": { "svg-tags": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/svg-tags/download/svg-tags-1.0.0.tgz", "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
"integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=" "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q="
}, },
"swiper": { "swiper": {
...@@ -10740,6 +10745,15 @@ ...@@ -10740,6 +10745,15 @@
} }
} }
}, },
"vue-mobile-calendar": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/vue-mobile-calendar/-/vue-mobile-calendar-3.3.0.tgz",
"integrity": "sha512-sxtAP8MFYHLX1RIrPiQ6enBu89/4ztCJbBCUfwN8zVP9Wm7Ls6vV5HBE/UF0ztRGd/By6SeinpBUUzMq14w6IQ==",
"requires": {
"dayjs": "^1.8.10",
"vue": "^2.5.22"
}
},
"vue-router": { "vue-router": {
"version": "3.4.9", "version": "3.4.9",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.4.9.tgz", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.4.9.tgz",
...@@ -10992,7 +11006,7 @@ ...@@ -10992,7 +11006,7 @@
}, },
"eslint-scope": { "eslint-scope": {
"version": "4.0.3", "version": "4.0.3",
"resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-4.0.3.tgz", "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-4.0.3.tgz?cache=0&sync_timestamp=1599933677754&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-scope%2Fdownload%2Feslint-scope-4.0.3.tgz",
"integrity": "sha1-ygODMxD2iJoyZHgaqC5j65z+eEg=", "integrity": "sha1-ygODMxD2iJoyZHgaqC5j65z+eEg=",
"dev": true, "dev": true,
"requires": { "requires": {
......
...@@ -91,6 +91,7 @@ ...@@ -91,6 +91,7 @@
"vue-i18n": "^8.22.2", "vue-i18n": "^8.22.2",
"vue-loader": "^15.9.5", "vue-loader": "^15.9.5",
"vue-meta-info": "^0.1.7", "vue-meta-info": "^0.1.7",
"vue-mobile-calendar": "^3.3.0",
"vue-router": "^3.4.9", "vue-router": "^3.4.9",
"vue-template-compiler": "^2.6.12", "vue-template-compiler": "^2.6.12",
"vuex": "^3.6.0" "vuex": "^3.6.0"
......
...@@ -3,7 +3,8 @@ ...@@ -3,7 +3,8 @@
<div class="app-footer-main"> <div class="app-footer-main">
<div class="inner"> <div class="inner">
<div class="left"> <div class="left">
<img src="../../assets/img/head/ezijing-logo2.png" class="logo" /> <h3>公司信息</h3>
<!-- <img src="../../assets/img/head/ezijing-logo2.png" class="logo" /> -->
<ul class="menu"> <ul class="menu">
<li v-for="item in menuList" :key="item.href"> <li v-for="item in menuList" :key="item.href">
<a :href="item.href" target="_blank">{{ item.title }}</a> <a :href="item.href" target="_blank">{{ item.title }}</a>
...@@ -23,9 +24,8 @@ ...@@ -23,9 +24,8 @@
</p> </p>
</div> </div>
<div class="qrcode"> <div class="qrcode">
<h3>关注我们</h3>
<img src="https://zws-imgs-pub.ezijing.com/static/public/29ce10d35376f24ae1ecaccd57215d5c.jpg" alt="" /> <img src="https://zws-imgs-pub.ezijing.com/static/public/29ce10d35376f24ae1ecaccd57215d5c.jpg" alt="" />
<p>扫二维码关注官方微信</p>
<p>微信公众号zijingedu</p>
</div> </div>
</div> </div>
</div> </div>
...@@ -62,13 +62,22 @@ export default { ...@@ -62,13 +62,22 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.app-footer { .app-footer {
.inner { .inner {
max-width: 970px; max-width: 800px;
margin: 0 auto; margin: 0 auto;
.left{
margin-top: 20px;
h3 {
font-size: 16px;
color: #222;
line-height: 1;
margin-bottom: 15px;
}
}
} }
.app-footer-main { .app-footer-main {
padding: 40px 0; padding: 10px 0;
color: #a7a7a7; color: #222;
background-color: #212223; background-color: #f9f9f9;
.inner { .inner {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
...@@ -79,7 +88,7 @@ export default { ...@@ -79,7 +88,7 @@ export default {
margin-top: 10px; margin-top: 10px;
line-height: 30px; line-height: 30px;
font-size: 12px; font-size: 12px;
color: #7d7d7d; color: #222;
} }
.right { .right {
display: flex; display: flex;
...@@ -87,17 +96,23 @@ export default { ...@@ -87,17 +96,23 @@ export default {
.contact { .contact {
h3 { h3 {
font-size: 16px; font-size: 16px;
color: #fff; color: #222;
line-height: 1; line-height: 1;
margin-bottom: 15px; margin-bottom: 15px;
} }
p { p {
font-size: 12px; font-size: 12px;
color: #a7a7a7; color: #222;
line-height: 24px; line-height: 24px;
} }
} }
.qrcode { .qrcode {
h3 {
font-size: 16px;
color: #222;
line-height: 1;
margin-bottom: 15px;
}
width: 128px; width: 128px;
margin-left: 80px; margin-left: 80px;
img { img {
...@@ -113,8 +128,8 @@ export default { ...@@ -113,8 +128,8 @@ export default {
.copyright { .copyright {
height: 40px; height: 40px;
line-height: 40px; line-height: 40px;
color: #fff; color: #666;
background: #ccc; background: #f9f9f9;
.inner2{ .inner2{
width: 100%; width: 100%;
justify-content: center; justify-content: center;
......
<template> <template>
<header class="app-header"> <header class="app-header">
<section class="app-header-bar">
<div class="inner">
<div class="login">
<template v-if="isLogin">
<div>{{ user.nickname || user.realname }}</div>
<span>|</span>
<div @click="handleLogout">退出</div>
</template>
<template v-else>
<div @click="handleRegister">注册</div>
<span>|</span>
<div @click="handleLogin">登录</div>
</template>
</div>
</div>
</section>
<section class="app-header-main"> <section class="app-header-main">
<div class="hd"> <div class="poster"></div>
<div class="hd-left"> <div class="handle-btn">
<a href="/"><img src="../../assets/img/head/ezijing-logo.png" class="logo" /></a> <span @click="isLogin = true">用户登录</span>
<h1 class="title">{{ title }}</h1> <span>\</span>
</div> <span @click="$router.push({ path: '/register' })">注册</span>
<div class="hd-right">
<img src="https://zws-imgs-pub.ezijing.com/2f4e4eba3c1e93a220425382aa0f4977.png" />
</div>
</div>
<div class="bd">
<ul class="nav">
<li v-for="item in navList" :key="item.path">
<router-link :to="item.path">{{ item.title }}</router-link>
</li>
</ul>
<div class="search">
<div class="lang">EN</div>
<input type="text" placeholder="Search" class="search-input" />
<div class="search-button">搜索</div>
</div>
</div> </div>
</section> </section>
<section class="app-header-menu">
<ul>
<template v-for="(item, index) in navList">
<router-link :to="item.path" :key="index">
<li
:class="isClassShow(item)"
>
{{ item.title }}
</li>
</router-link>
</template>
</ul>
</section>
<vue-passport ref="passport" @ready="onReady" :options="options"></vue-passport> <vue-passport ref="passport" @ready="onReady" :options="options"></vue-passport>
<login v-if="isLogin" @closeMask="closeMask"></login>
</header> </header>
</template> </template>
<script> <script>
import login from './login'
export default { export default {
components: {
login
},
data() { data() {
return { return {
title: '索菲亚大学金融方向工商管理硕士项目', title: '索菲亚大学金融方向工商管理硕士项目',
navList: [ navList: [
{ title: '首页', path: '/index' }, { title: '首页', path: '/index' },
{ title: '项目介绍', path: '/project' }, { title: '工作动态', path: '/news', children: { path: ['/news/detail'] } },
{ title: '视频中心', path: '/videoCenter' }, { title: '教材中心', path: '/textBook', children: { path: ['/textBook/detail', '/textBook/chapter'] }},
{ title: '招生信息', path: '/recruit' }, { title: '师资培训', path: '/train', children: { path: ['/train/detail', 'train/form'] } },
{ title: '教学模块', path: '/teaching' }, { title: '考核站点', path: '/site' },
{ title: '师生风采', path: '/presence' }, { title: '证书成绩查询', path: '/query' }
// { title: '职业发展', path: '/careerDev' },
{ title: '校友工作', path: '/alumniWork' }
], ],
isLogin: false, isLogin: false,
user: null, user: null,
...@@ -74,17 +59,37 @@ export default { ...@@ -74,17 +59,37 @@ export default {
}, },
computed: { computed: {
passport() { passport() {
return this.$refs.passport return this.$refs.passport
},
isClassShow() {
return (item) => {
return this.$route.path === item.path
? 'active'
: item.children
? ((_this) => {
const isPath = item.children.path.find(item => {
return item === _this.$route.path
})
return isPath && 'active'
})(this)
: ''
}
} }
}, },
mounted() {
},
watch: { watch: {
$route(route) { // $route(route) {
if (route.query.needLogin) { // if (route.query.needLogin.path) {
this.handleLogin() // this.handleLogin()
} // }
} // }
}, },
methods: { methods: {
closeMask(blo) {
this.isLogin = blo
},
handleLogin() { handleLogin() {
this.passport.login() this.passport.login()
}, },
...@@ -121,115 +126,47 @@ export default { ...@@ -121,115 +126,47 @@ export default {
margin: 0 auto; margin: 0 auto;
} }
} }
.app-header-bar { .app-header-main {
height: 40px; position: relative;
background-color: #333; .poster{
.login { width: 100%;
float: right; height: 220px;
display: flex; background: url(https://zws-imgs-pub.ezijing.com/static/public/7f46acc2486aec78c8fd4bdf5afd9589.png) center;
line-height: 40px; background-size: cover;
color: #fff; }
div { .handle-btn{
font-size: 18px; position: absolute;
text-align: center; top: 16px;
right: 24px;
span{
font-size: 14px;
color: #FFFFFF;
line-height: 20px;
cursor: pointer; cursor: pointer;
} }
span {
padding: 0 20px;
}
} }
} }
.app-header-main { .app-header-menu{
max-width: 970px; width: 100%;
margin: 0 auto; height: 56px;
.hd { background: linear-gradient(47deg, #C01540 0%, #C01540 7%, #D43960 26%, #FF87A5 100%, #C01540 100%);
height: 110px; ul{
display: flex;
justify-content: space-between;
align-items: center;
}
.hd-left {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; li{
} width: 200px;
.logo { height: 56px;
width: 156px; text-align: center;
height: 50px; line-height: 56px;
} font-size: 20px;
.title { color: #FFFFFF;
margin-left: 20px; cursor: pointer;
padding: 0 10px; &.active{
color: #222; font-size: 20px;
font-size: 20px; color: #AF1B40;
line-height: 33px; background: #fff;
font-weight: 600;
border-left: 2px solid #333;
}
.bd {
margin-top: -20px;
padding: 10px 0;
display: flex;
align-items: center;
justify-content: space-between;
}
.nav {
display: flex;
li {
font-size: 15px;
font-weight: 600;
color: #222;
line-height: 20px;
padding: 0 14px;
a {
position: relative;
}
&:first-child {
padding-left: 0;
} }
} }
li + li {
border-left: 1px solid #d7d8d9;
}
}
.router-link-active:after {
content: '';
position: absolute;
left: 0;
right: 0;
bottom: -3px;
height: 2px;
background: #bf0927;
}
.search {
display: flex;
align-items: center;
}
.lang {
font-size: 15px;
color: #999;
}
.search-input {
outline: none;
width: 159px;
height: 34px;
border-radius: 4px;
border: 1px solid #ccc;
margin: 0 3px 0 8px;
padding-left: 13px;
font-size: 15px;
color: #999;
}
.search-button {
width: 54px;
height: 34px;
border-radius: 4px;
border: 1px solid #ccc;
font-size: 15px;
color: #999;
text-align: center;
line-height: 34px;
cursor: pointer;
} }
} }
</style> </style>
<template>
<div class="login-box">
<div class="login-card-mian">
<div class="title">账号登录</div>
<ul>
<li>
<el-select v-model="value" placeholder="请选择学校" class="forms">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
<i slot="prefix" class="el-input__icon el-icon-office-building"></i>
</el-select>
</li>
<li>
<el-input
class="forms"
placeholder="请输入账号"
prefix-icon="el-icon-user"
v-model="input2">
</el-input>
</li>
<li>
<el-input
class="forms"
placeholder="请输入密码"
prefix-icon="el-icon-lock"
show-password
v-model="input3">
</el-input>
</li>
</ul>
<div class="login-btn">登录</div>
<div class="register-btn">注册</div>
</div>
<div class="mask" @click="closeMask"></div>
</div>
</template>
<script>
export default {
data() {
return{
value: '',
input2: '',
input3: '',
options: []
}
},
methods: {
closeMask() {
this.$emit('closeMask', false)
}
}
}
</script>
<style lang="scss" scoped>
.login-box{
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba($color: #000000, $alpha: 0.5);
z-index: 999;
.mask{
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 9;
}
.login-card-mian{
z-index: 99;
box-sizing: border-box;
padding: 24px;
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%, -50%);
width: 328px;
background: #FFFFFF;
box-shadow: 0px 3px 10px 0px rgba(0, 0, 0, 0.3);
border-radius: 4px;
.title{
font-size: 18px;
color: #AF1B40;
line-height: 25px;
margin-bottom: 24px;
}
ul{
li{
margin-bottom: 24px;
.forms{
width: 100%;
}
}
}
.login-btn{
text-align: center;
line-height: 40px;
background: linear-gradient(315deg, rgba(225, 47, 116, 0.83) 0%, #C01540 100%);
border-radius: 4px;
font-size: 14px;
font-weight: bold;
color: #FFFFFF;
cursor: pointer;
}
.register-btn{
margin-top: 4px;
text-align: right;
font-size: 14px;
color: #999999;
line-height: 20px;
cursor: pointer;
}
}
}
::v-deep{
.forms{
i {
font-size: 20px;
}
input{
border-radius: 4px;
}
}
}
</style>
<template>
<div class="new-box">
<tap class="child-tabs" :menu="data" @changeChildTab="changeChildTab"></tap>
<div class="new-items" v-if="data[dataIndex]">
<template v-if="data[0].type != 'list'">
<div class="no-data" v-if="data[dataIndex].content == ''">暂无数据</div>
<div v-html="data[dataIndex].content"></div>
<div class="right-img">
<div class="img-box">
<img :src="data[dataIndex].image" alt="" class="photo">
<div class="line"></div>
</div>
<slot name="imgBtn"></slot>
</div>
</template>
<template v-else>
<slot name="list"></slot>
</template>
</div>
</div>
</template>
<script>
import tap from './tab/changeTab.vue'
export default {
props: {
data: {
type: Array,
default: {}
},
defaultPage: {
type: Number,
default: 0
}
},
components: {
tap,
},
data() {
return {
dataIndex: 0
}
},
mounted() {
this.$nextTick(() => {
this.dataIndex = this.defaultPage
})
},
methods: {
changeChildTab(index) {
this.$emit('changeIndex', index)
this.dataIndex = index
this.$forceUpdate()
}
}
}
</script>
<style lang="scss" scoped>
.no-data{
width: 100%;
text-align: center;
color: #999;
font-size: 26px;
}
.new-box{
width: 100%;
}
.child-tabs{
width: 670px;
margin-bottom: 40px;
}
.new-items{
// width: 670px;
display: flex;
::v-deep p{
img{
width: 100%;
display: block;
}
}
.img-box{
position: relative;
margin-left: 15px;
}
.right-img{
position: relative;
margin-left: auto;
.line{
position: absolute;
top: 35px;
left: -15px;
width: 213px;
height: 280px;
border: 1px solid #979797;
}
.photo{
position: relative;
z-index: 9;
width: 235px;
height: 300px;
display: flex;
position: relative;
}
}
}
</style>
<template>
<div>
<ul>
<template v-for="(item, index) in data">
<li :key="index" @click="goPage(item.source)">
<img :src="item.photo_uri" alt="">
<div class="right-txt">
<div class="title">{{ item.title }}</div>
<div class="cont-txt">{{ item.summary }}</div>
<div class="time">{{ item.updated_time }}</div>
</div>
</li>
</template>
</ul>
</div>
</template>
<script>
export default {
name: 'newsList',
props: {
data: {
type: Array,
default: {}
}
},
methods: {
goPage(url) {
window.open(url)
}
}
}
</script>
<style lang="scss" scoped>
ul{
width: 100%;
// width: 700px;
li{
cursor: pointer;
display: flex;
padding: 40px 0;
border-bottom: 1px solid #ccc;
&:nth-child(1){
padding-top: 0;
}
img{
width: 218px;
height: 145px;
}
.right-txt{
margin-left: 20px;
.title{
font-size: 16px;
font-weight: bold;
color: #303030;
line-height: 22px;
}
.cont-txt{
// width: 461px;
font-size: 14px;
font-weight: bold;
color: #ADADAD;
line-height: 24px;
margin-top: 20px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
}
.time{
margin-top: 14px;
font-size: 12px;
font-weight: bold;
color: #B6B6B6;
line-height: 17px;
}
}
}
}
</style>
\ No newline at end of file
<template>
<div>
<div class="top-nav">
<div class="min-height-img" :style="getImg(data.imgUrl)">
</div>
<div class="center97">
<ul class="menu">
<template v-for="(item, index) in data.menu">
<li
:key="index"
:class="activeIndex == index ? 'active' : ''"
@click="tab(index, item)"
>{{item}}</li>
</template>
</ul>
</div>
</div>
</div>
</template>
<script>
export default {
components: {
},
props: {
data: {
type: Object,
default: {}
}
},
data() {
return {
activeIndex: 0
}
},
computed: {
getImg() {
return (url) => {
return `background:url(${url});background-size: cover;`
}
}
},
methods: {
tab(index, title) {
// if(this.$route.path === '/presence' && title === '学生风采') {
// this.$router.push({ path: '/index' })
// }
this.activeIndex = index
this.$emit('changeTab', this.activeIndex)
}
}
}
</script>
<style lang="scss" scoped>
.center97{
width: 970px;
margin: 0 auto;
}
.min-height-img{
height: 190px;
background-size: cover;
}
.top-nav{
.center97{
position: relative;
}
img{
width: 100%;
display: block;
}
.menu{
position: absolute;
bottom: 0;
left: 0;
display: flex;
li{
width: 128px;
line-height: 36px;
text-align: center;
color: #fff;
font-size: 16px;
margin-right: 2px;
cursor: pointer;
background: #BF0927;
&.active{
background: #fff;
color: #C70025;
}
}
}
}
</style>
<template>
<div>
<ul class="child-tab">
<template v-for="(item, index) in menu">
<li
:key="index"
:class="activeIndex == index ? 'active' : ''"
@click="tab(index)"
>{{ item.title }}</li>
</template>
</ul>
</div>
</template>
<script>
export default {
props: {
menu: {
type: Array,
default: []
}
},
data() {
return {
activeIndex: 0
}
},
methods: {
tab(index) {
this.activeIndex = index
this.$emit('changeChildTab', this.activeIndex)
}
},
mounted() {
this.$route.query.type && (this.activeIndex = this.$route.query.type)
}
}
</script>
<style lang="scss" scoped>
.center97{
width: 970px;
margin: 0 auto;
}
.child-tab{
display: flex;
justify-content: flex-end;
// width: 670px;
border-bottom: 1px solid #979797;
li{
cursor: pointer;
position: relative;
line-height: 42px;
padding: 0 22px;
font-size: 14px;
color: #222;
&.active{
border: 1px solid #979797;
border-bottom: none;
border-top: 2px solid #BF0927;
&::after{
content: '';
width: 100%;
height: 3px;
background: #fff;
position: absolute;
bottom: -1px;
left: 0;
}
}
}
}
</style>
<template>
<div>
<ul>
<template v-if="data.length">
<template v-for="(item, index) in data">
<li :key="index">
<div>
<img v-if="type === 1" :src="item.photo_uri" alt="">
</div>
<div class="info">
<div class="name">{{ item.title }}</div>
<div class="p">{{ item.summary }}</div>
</div>
</li>
</template>
</template>
<template v-else>
<div class="no-data">暂无数据</div>
</template>
</ul>
</div>
</template>
<script>
export default {
data() {
return {}
},
props: {
data: {
type: Array,
default: {}
},
type: {
type: Number,
default: 0
}
}
}
</script>
<style lang="scss" scoped>
.no-data{
width: 100%;
text-align: center;
color: #999;
font-size: 26px;
}
ul{
li{
cursor: pointer;
display: flex;
border-bottom: 1px solid #F5F6F7;
padding: 30px 0;
img{
width: 120px;
// height: 140px;
}
.info{
margin-left: 20px;
}
.name{
font-size: 16px;
font-weight: bold;
color: #222222;
line-height: 22px;
margin-bottom: 10px;
}
.p{
font-size: 14px;
color: #222222;
line-height: 20px;
margin-bottom: 5px;
}
}
}
</style>
<template>
<div>
<div class="btn-tabs-boxs">
<template v-for="(item, index) in data.options">
<div :key="index" :class="tabsIndex == index && 'active'" @click="tabs(index)">{{ item }}</div>
</template>
</div>
</div>
</template>
<script>
export default {
props: {
data: {
type: Object,
default: {}
}
},
data() {
return {
tabsIndex: 0
}
},
mounted() {},
methods: {
tabs(n) {
this.tabsIndex = n
this.$emit('tabsChange', n)
}
}
}
</script>
<style lang="scss" scoped>
.btn-tabs-boxs{
// padding: 24px 0 30px;
display: flex;
justify-content: center;
div{
cursor: pointer;
text-align: center;
width: 200px;
height: 56px;
background: #F9F9F9;
font-size: 18px;
color: #666666;
line-height: 56px;
&.active{
color: #fff;
background: linear-gradient(315deg, rgba(225, 47, 116, 0.83) 0%, #C01540 100%);
}
}
}
</style>
<template>
<div class="no-data-box">
<div class="icon"></div>
<div class="txt">暂时没有任何内容</div>
</div>
</template>
<script>
export default {
}
</script>
<style lang="scss" scoped>
.no-data-box{
width: 200px;
margin: 0 auto;
.icon{
width: 200px;
height: 171px;
background: url(https://zws-imgs-pub.ezijing.com/static/public/61ec7327f046bab48226ac43c4fbd4d8.png);
background-size: 100% 100%;
}
.txt{
text-align: center;
font-size: 18px;
color: #666666;
line-height: 25px;
margin: 24px 0;
}
}
</style>
<template>
<div class="tabs-box">
<div class="name">{{ data.name }}</div>
<ul>
<template v-for="(item, index) in data.options">
<li
:key="index"
:class="tabsIndex == index && 'active'"
@click="tabs(index)"
>{{ item }}</li>
</template>
</ul>
</div>
</template>
<script>
export default {
props: {
data: {
type: Object,
default: {}
}
},
components: {
},
data() {
return {
tabsIndex: 0
}
},
methods: {
tabs(n) {
this.tabsIndex = n
}
}
}
</script>
<style lang="scss" scoped>
.tabs-box{
display: flex;
justify-content: center;
.name{
font-size: 14px;
color: #666666;
line-height: 20px;
margin-right: 24px;
}
ul{
display: flex;
li{
position: relative;
font-size: 14px;
color: #666666;
line-height: 20px;
margin-right: 24px;
cursor: pointer;
&.active{
&::after{
content: '';
position: absolute;
bottom: -4px;
left: 0;
width: 100%;
height: 2px;
background: #AF1B40;
border-radius: 1px;
}
}
}
}
}
</style>
...@@ -4,12 +4,7 @@ ...@@ -4,12 +4,7 @@
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta content="origin" name="referrer" /> <meta content="origin" name="referrer" />
<title>索菲亚大学金融方向工商管理硕士项目</title> <title></title>
<!-- <meta
name="viewport"
id="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, shrink-to-fit=no"
/> -->
<meta <meta
name="viewport" name="viewport"
id="viewport" id="viewport"
......
...@@ -8,6 +8,8 @@ import './style.scss' // 定义 element-ui主题色 + 公共样式 ...@@ -8,6 +8,8 @@ import './style.scss' // 定义 element-ui主题色 + 公共样式
import router from './router' // router定义 import router from './router' // router定义
import store from './store' import store from './store'
import App from './app.vue' import App from './app.vue'
import Calendar from 'vue-mobile-calendar'
Vue.use(Calendar)
// import cTool from '@tool' // import cTool from '@tool'
/* 引入 md5 */ /* 引入 md5 */
......
<template>
<div class="reg-form-box">
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm forms">
<el-form-item label="学校" prop="region">
<el-select v-model="ruleForm.region" placeholder="请选择" class="width100">
<el-option label="区域一" value="shanghai"></el-option>
<el-option label="区域二" value="beijing"></el-option>
</el-select>
</el-form-item>
<el-form-item label="姓名" prop="name">
<el-input v-model="ruleForm.name"></el-input>
</el-form-item>
<el-form-item label="手机号" prop="phone">
<el-input v-model="ruleForm.phone"></el-input>
</el-form-item>
<el-form-item label="身份证号" prop="codeId">
<el-input v-model="ruleForm.codeId"></el-input>
</el-form-item>
<el-form-item label="密码" prop="pws">
<el-input v-model="ruleForm.pws"></el-input>
</el-form-item>
<el-form-item label="确认密码" prop="qpws">
<el-input v-model="ruleForm.qpws"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')" class="sub-btn">立即创建</el-button>
<!-- <el-button @click="resetForm('ruleForm')">重置</el-button> -->
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
data() {
return {
ruleForm: {
name: '',
region: '',
phone: '',
codeId: '',
delivery: false,
type: [],
pws: '',
qpws: ''
},
rules: {
name: [
{ required: true, message: '请输入活动名称', trigger: 'blur' },
{ min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
],
region: [
{ required: true, message: '请选择活动区域', trigger: 'change' }
],
phone: [
{ required: true, message: '请输入手机号', trigger: 'blur' }
],
codeId: [
{ required: true, message: '请输入', trigger: 'blur' }
],
pws: [
{ required: true, message: '请输入', trigger: 'blur' }
],
qpws: [
{ required: true, message: '请输入', trigger: 'blur' }
]
}
};
},
methods: {
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
alert('submit!');
} else {
console.log('error submit!!');
return false;
}
});
},
resetForm(formName) {
this.$refs[formName].resetFields();
}
}
}
</script>
<style lang="scss" scoped>
.reg-form-box{
width: 380px;
margin: 0 auto;
padding: 24px 0;
.width100{
width: 100%;
}
}
::v-deep{
.forms{
i {
font-size: 20px;
}
input{
border-radius: 4px;
}
}
}
.sub-btn{
width: 270px;
height: 40px;
background: linear-gradient(315deg, rgba(225, 47, 116, 0.83) 0%, #C01540 100%);
border-radius: 4px;
}
</style>
<template>
<div>
<banner-tab :data="bannerTabData" @changeTab="changeTab"></banner-tab>
<div class="cont-mian center97">
<div class="module" v-if="activeIndex == 0">
<div class="left-txt" v-html="content"></div>
<img src="https://zws-imgs-pub.ezijing.com/static/public/3128bdbea80c04f1cbe1d3d5c600f2c5.png" alt="" class="exh" />
</div>
<div class="module" v-if="activeIndex == 1">
<div>
<div class="video-box">
<div class="text-cont">
为给紫荆的校友提供更好的服务,使校友之间的联络更加紧密、促进校友和紫荆的共同发展,紫荆教育特成立紫荆校友办,期望帮助校友建立广阔交流的人脉网络和校友平台。紫荆校友办是为校友提供服务的窗口和平台。校友办始终以服务校友为使命,通过组织形式多样的校友活动、搭建便捷高效的交流平台、传播校友的同学情谊以及向校友提供教育服务等渠道。
</div>
<div class="videos">
<video
width="420"
controls
src="https://zws-imgs-pub.ezijing.com/static/public/d54b17ec8d02432ed440285123acc1c0.mp4"
></video>
</div>
</div>
<div class="list-box">
<list :data="M1listData"></list>
</div>
</div>
</div>
<div class="module" v-if="activeIndex == 2">
<ul class="list-fc">
<template v-for="(item, index) in M2listData">
<li :key="index" @click="goPage(item.source)">{{ item.title }}</li>
</template>
</ul>
<img src="https://zws-imgs-pub.ezijing.com/static/public/3128bdbea80c04f1cbe1d3d5c600f2c5.png" alt="" class="exh" />
</div>
</div>
</div>
</template>
<script>
import cAction from '@action'
import bannerTab from '@/components/news/tab/bannerTab.vue'
import list from '@/components/news/newsList.vue'
export default {
components: {
bannerTab,
list
},
data() {
return {
bannerTabData: {
menu: ['校友会', '校友活动', '校友风采'],
imgUrl: 'https://zws-imgs-pub.ezijing.com/static/public/0390956f08b4f3f080171397f2238a12.png'
},
activeIndex: 0,
tabMenu: ['好书推荐', '校友手册', '校友卡申领', '终身邮箱'],
content: '',
requestParam: {
page: 1,
per_page: 100,
type: 59,
project_id: 1000
},
M1listData: [],
M2listData: []
}
},
mounted() {
this.getData()
this.getM1List()
this.getM2List()
},
methods: {
changeTab(index) {
this.activeIndex = index
},
changeChildTab(index) {
// this.tabShowItem = index
},
getData() {
cAction.reportAction
.getContent('校友会')
.then(json => {
if (json !== null) {
this.content = json[0].content
}
})
.catch(e => {
this.$message.error(e.message)
})
.finally(() => {})
},
getM1List() {
this.requestParam.type = 59
cAction.reportAction
.getNews(this.requestParam)
.then(json => {
this.M1listData = json
})
.catch(e => {
this.$message.error(e.message)
})
.finally(() => {})
},
getM2List() {
this.requestParam.type = 60
cAction.reportAction
.getNews(this.requestParam)
.then(json => {
this.M2listData = json
})
.catch(e => {
this.$message.error(e.message)
})
.finally(() => {})
},
goPage(url) {
window.open(url)
}
}
}
</script>
<style lang="scss" scoped>
.list-box {
// padding-top: 40px;
margin-top: 40px;
::v-deep {
ul {
&:nth-child(1) {
padding-top: 40px;
border-top: 1px solid #ccc !important;
}
}
}
}
.cont-mian {
.module {
padding-top: 30px;
padding-bottom: 60px;
display: flex;
.left-txt {
width: 670px;
}
.exh {
margin-left: auto;
// display: block;
width: 235px;
height: 300px;
}
}
}
.center97 {
width: 970px;
margin: 0 auto;
}
.top-nav {
.center97 {
position: relative;
}
img {
width: 100%;
display: block;
}
.menu {
position: absolute;
bottom: 0;
left: 0;
display: flex;
li {
cursor: pointer;
width: 128px;
line-height: 36px;
text-align: center;
color: #fff;
font-size: 16px;
margin-right: 2px;
cursor: pointer;
background: #bf0927;
&.active {
background: #fff;
color: #c70025;
}
}
}
}
.video-box {
width: 100%;
display: flex;
// padding-top: 30px;
.text-cont {
width: 478px;
font-size: 14px;
color: #000000;
line-height: 30px;
}
.videos {
margin-left: auto;
}
}
.list-fc {
li {
cursor: pointer;
width: 673px;
line-height: 82px;
border-bottom: 1px solid #ccc;
font-size: 16px;
font-weight: bold;
color: #222222;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.child-tab {
width: 100%;
}
</style>
差异被折叠。
<template>
<div class="letter">
<header class="header">
<div class="inner">
<div class="logo">
<router-link to="/"><img src="../../assets/img/head/ezijing-logo.png" /></router-link>
</div>
</div>
</header>
<nav class="nav"><h1 class="title">索菲亚大学金融方向工商管理硕士项目推荐信</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-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>
<el-form-item label="手机号" 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-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-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>
</div>
</section>
<el-dialog title="推荐信提交成功" :visible.sync="dialogVisible" :center="true" width="348px">
<div style="text-align: center"><img src="../../assets/images/icon_success.png" /></div>
<template #footer>
<el-button type="primary" @click="toHome">了解项目</el-button>
</template>
</el-dialog>
</div>
</template>
<script>
import * as api from '@/api/my'
export default {
name: 'LetterIndex',
data() {
return {
ruleForm: {
provider_name: '',
letter_content: '',
provider_phone_number: '',
provider_company_name: '',
provider_job_title: ''
},
rules: {
provider_name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
letter_content: [{ required: true, message: '请输入推荐信内容', trigger: 'blur' }],
provider_phone_number: [{ required: true, pattern: /^1[3-9]\d{9}$/, message: '请输入手机号', trigger: 'blur' }],
provider_company_name: [{ required: true, message: '请输入工作单位', trigger: 'blur' }],
provider_job_title: [{ required: true, message: '请输入职务', trigger: 'blur' }]
},
dialogVisible: false,
clientWidth: 0
}
},
computed: {
userId() {
return this.$route.params.userId
},
letterId() {
return this.$route.params.letterId
},
labelPosition() {
return this.clientWidth < 768 ? 'top' : 'left'
}
},
methods: {
// 提交
handleSubmit() {
this.$refs.form.validate().then(() => {
this.handleAddRequest()
})
},
// 提交推荐信
handleAddRequest() {
api.addLetter(this.userId, this.letterId, this.ruleForm).then(response => {
console.log(response)
const { error, message } = response
if (error.toString() === '0') {
this.dialogVisible = true
} else {
this.$message.error(message)
}
})
},
toHome() {
this.$router.push('/')
},
getClientWidth() {
this.clientWidth = document.body.clientWidth
},
onBlur(key) {
if (this.ruleForm[key]) {
this.ruleForm[key] = this.ruleForm[key].trim()
}
}
},
mounted() {
this.getClientWidth()
document.body.style = 'background-color:#eee;'
window.addEventListener('resize', this.getClientWidth)
},
destroyed() {
document.body.style = ''
window.removeEventListener('resize', this.getClientWidth)
}
}
</script>
<style lang="scss" scoped>
.letter {
.header {
background-color: #fff;
.inner {
max-width: 1000px;
margin: 0 auto;
}
.logo {
padding: 14px 0;
img {
height: 50px;
}
}
}
.nav {
background-color: var(--main-color);
.title {
font-size: 24px;
font-weight: 600;
color: #fff;
line-height: 60px;
text-align: center;
}
}
.content {
max-width: 1000px;
margin: 20px auto;
padding: 20px;
background-color: #fff;
box-sizing: border-box;
}
::v-deep .el-input {
max-width: 270px;
}
::v-deep .el-form--label-top {
.el-form-item__label {
line-height: 20px;
}
.el-input {
max-width: 100%;
}
}
::v-deep .el-input__inner,
::v-deep .el-textarea__inner {
border-radius: 0;
}
.buttons {
border-top: 1px solid #f1f1f1;
padding: 20px 100px;
}
@media (max-width: 767px) {
.logo {
text-align: center;
}
.buttons {
padding: 20px 0;
.el-button {
width: 100%;
display: block;
}
}
}
}
</style>
<template>
<div class="my">
<div class="card">
<div class="result">
<div class="result-left"><img src="../../../assets/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 @click="toApplication"><img src="../../../assets/images/my_01.png" /></li>
<li @click="toInterview"><img src="../../../assets/images/my_02.png" /></li>
<li @click="toAdmission"><img src="../../../assets/images/my_03.png" /></li>
</ul>
<div class="progress">
<el-steps :active="activeProgress" finish-status="success" align-center>
<el-step v-for="(item, index) in 3" :key="index">
<template #title>{{ getProgressStatusText(index) }}</template>
</el-step>
</el-steps>
</div>
</div>
</div>
</template>
<script>
import * as api from '@/api/my'
export default {
name: 'AppHome',
data() {
return {
material: {},
progress: {},
submissionStage: {
0: ['FILLING', 'PREPAYMENT'],
1: ['INTERVIEW_APPLICATION', 'AUDITION', 'INTERVIEW', 'PAYMENT'],
2: ['REGISTRATION'],
3: ['CLOSED']
},
result: {}
}
},
computed: {
activeProgress() {
for (const key in this.submissionStage) {
const list = this.submissionStage[key]
if (list.includes(this.material.submission_stage)) {
return parseInt(key)
}
}
return 0
}
},
methods: {
// 获取进度值
getProgressStatusText(index) {
if (this.activeProgress === index) {
return '进行中'
} else {
return this.activeProgress > index ? '已完成' : '待进行'
}
},
// 获取报名信息
getApplication() {
api.getApplication().then(response => {
const { data, error, message } = response
if (error.toString() === '0') {
const { material, progress } = data
this.material = material
this.progress = progress
} else {
this.$message.error(message)
}
})
},
// 获取报名审核状态
getApplicationStatus() {
api.getApplicationStatus().then(response => {
this.result = response.data
})
},
// 报名申请
toApplication() {
this.$router.push('/my/application?active=application_info')
},
// 申请面试
toInterview() {
if (this.activeProgress < 1) {
this.$message.warning('请完成报名申请并缴报名费')
return
}
this.$router.push('/my/interview')
},
// 办理入学
toAdmission() {
if (this.activeProgress < 2) {
this.$message.warning('请等待面试结果')
return
}
this.$router.push('/my/admission')
}
},
beforeMount() {
this.getApplication()
this.getApplicationStatus()
}
}
</script>
<style lang="scss" scoped>
.card {
background: #fff;
border-radius: 5px;
}
.card + .card {
margin-top: 10px;
}
.nav {
display: flex;
justify-content: space-between;
padding: 40px 70px 20px;
li {
position: relative;
width: 180px;
height: 120px;
}
a {
color: currentColor;
}
.cover {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
font-weight: 600;
color: #fff;
text-align: center;
background-color: rgba(0, 0, 0.5);
}
}
.result {
min-height: 40px;
padding: 0 20px;
display: flex;
align-items: center;
}
.result-left {
line-height: 14px;
color: var(--main-color);
img {
margin-right: 10px;
}
}
.result-right {
padding-left: 40px;
color: #666;
}
.progress {
margin: 0 40px;
}
</style>
<template>
<app-layout>
<vue-form
:menus="menus"
:default-active="currentActive"
@page-change="handlePageChange"
@success="handleSuccess"
@error="handleError"
@back="$router.push('/my/account')"
>
<template #aside-append>
<div class="aside-logout" @click="$store.dispatch('logout')"><span>退出登录</span></div>
</template>
<!-- 首页 -->
<app-home v-if="currentActive === 'account'" />
<template #content>
<!-- 基本信息 -->
<app-info v-if="currentActive === 'account_info'" />
<!-- 密码修改 -->
<app-password v-if="currentActive === 'account_password'" />
</template>
</vue-form>
</app-layout>
</template>
<script>
import AppLayout from '../layout.vue'
import AppHome from './home.vue'
import AppInfo from './info.vue'
import AppPassword from './password.vue'
export default {
components: { AppLayout, AppHome, AppInfo, AppPassword },
data() {
return {
menus: [
{
id: 'account',
title: '个人信息',
children: [
{ id: 'account_info', title: '基本信息' },
{ id: 'account_password', title: '密码修改' }
]
}
],
currentActive: 'account'
}
},
watch: {
$route: {
immediate: true,
handler(route) {
const { query = {} } = route
this.currentActive = query.active || 'account'
}
}
},
methods: {
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 })
}
}
}
</script>
<template>
<div>
<el-form
:model="ruleForm"
:rules="rules"
ref="form"
label-width="100px"
@submit.native.prevent
style="max-width: 680px"
>
<el-form-item label="姓名" prop="real_name">
<el-input v-model.trim="ruleForm.real_name"></el-input>
</el-form-item>
<el-form-item label="手机号" prop="mobile">
<el-input v-model.trim="ruleForm.mobile"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSubmit">确认修改</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import * as api from '@/api/my'
export default {
name: 'MyInfo',
data() {
return {
ruleForm: {
real_name: '',
mobile: ''
},
rules: {
real_name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
mobile: [{ required: true, message: '请输入手机号', trigger: 'blur' }]
}
}
},
methods: {
getUser() {
api.getUser().then(response => {
const data = response.data
this.ruleForm.real_name = data.realname
this.ruleForm.mobile = data.mobile
})
},
// 提交
handleSubmit() {
this.$refs.form.validate().then(this.handleRequest)
},
// 接口请求
handleRequest() {
this.loading = true
api.updateUser(this.ruleForm).then(response => {
response.code === 0 ? this.handleSuccess(response) : this.$message.error(response.msg)
this.loading = false
})
},
// 成功
handleSuccess(response) {
this.$alert('基本信息修改成功', {
type: 'success',
confirmButtonText: '返回报名系统',
callback: action => {
this.$router.push('/my')
}
})
}
},
beforeMount() {
this.getUser()
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-input {
max-width: 270px;
}
</style>
<template>
<div>
<el-form :model="ruleForm" :rules="rules" ref="form" label-width="100px" @submit.native.prevent>
<el-form-item label="手机号" prop="account">
<el-input v-model.trim="ruleForm.account"></el-input>
</el-form-item>
<el-form-item prop="code" label="验证码">
<el-input v-model.trim="ruleForm.code" placeholder="请输入验证码">
<countdown
slot="suffix"
size="mini"
:disabled="disabledSend"
@start="sendCodeRequest"
ref="countdown"
></countdown>
</el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input type="password" v-model.trim="ruleForm.password"></el-input>
</el-form-item>
<el-form-item label="确认密码" prop="passwordR">
<el-input type="password" v-model.trim="ruleForm.passwordR"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSubmit">确认修改</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import * as api from '@/api/my'
import countdown from '@/components/countdown.vue'
export default {
name: 'MyPassword',
components: { countdown },
data() {
const validatePass = (rule, value, callback) => {
if (value === '') {
callback(new Error('请再次输入密码'))
} else if (value !== this.ruleForm.password) {
callback(new Error('两次输入密码不一致!'))
} else {
callback()
}
}
return {
ruleForm: { account: '', code: '', password: '', passwordR: '' },
rules: {
account: [{ required: true, message: '请输入手机号', trigger: 'blur' }],
code: [{ required: true, message: '请输入验证码', trigger: 'blur' }],
password: [
{ required: true, message: '请输入新密码', trigger: 'blur' },
{ min: 6, max: 20, message: '长度为6-20个字符', trigger: 'blur' }
],
passwordR: [
{ required: true, message: '请输入新密码', trigger: 'blur' },
{ validator: validatePass, trigger: 'blur' }
]
}
}
},
computed: {
disabledSend() {
const value = this.ruleForm.account
return !(/^1[3-9]\d{9}$/.test(value) || /@/.test(value))
}
},
methods: {
// 提交
handleSubmit() {
this.$refs.form.validate().then(this.handleRequest)
},
// 接口请求
handleRequest() {
this.loading = true
api.updatePassword(this.ruleForm).then(response => {
response.code === 0 ? this.handleSuccess(response) : this.$message.error(response.msg)
this.loading = false
})
},
// 成功
handleSuccess(response) {
this.$alert('密码修改成功,快去登录吧', '提示', {
type: 'success',
confirmButtonText: '去登录',
callback: action => {
this.$router.push('/login')
}
})
},
// 验证码
sendCodeRequest() {
api
.sendCode({ account: this.ruleForm.account })
.then(response => {
console.log(response)
if (response.code === 0) {
this.$message({ type: 'success', message: '验证码已发送' })
} else {
// 停止计时
this.$refs.countdown.stop()
this.$message({ type: 'error', message: response.msg })
}
})
.catch(this.$refs.countdown.stop)
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-input {
max-width: 270px;
}
</style>
export default {
id: 'admission_byzs',
title: '毕业证书注册备案表',
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.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) > 6
const DIPLOMA_FILING_TABLE = attachments.filter(item => {
return item.file_type_id === 'DIPLOMA_FILING_TABLE'
})
return { DIPLOMA_FILING_TABLE }
}
},
form: {
prev: { to: { query: { active: 'admission_cjd' } } },
next: { to: { query: { active: 'admission_ywjl' } } },
hasButton: false,
options: {},
items: [
{
type: 'v-upload',
required: true,
model: 'DIPLOMA_FILING_TABLE',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'DIPLOMA_FILING_TABLE' }
},
prepend: `
<p>学信网《教育部学历证书电子注册备案表》[<a href="https://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/pc/sofia/%E6%AF%95%E4%B8%9A%E8%AF%81%E4%B9%A6%E6%B3%A8%E5%86%8C%E5%A4%87%E6%A1%88%E8%A1%A8.pdf" target="_blank" download="毕业证书注册备案表">下载流程表</a>]
<p>学历在学信网可查的同学,请下载学信网电子注册备案表提交到系统,具体获取流程请</p>
<p>下载附件 上传文件仅限“jpg,jpeg,pdf,png”格式,文件小于10Mb。</p>
`
}
]
}
}
export default function(_this) {
return {
id: 'admission_cjd',
title: '成绩单(中+英)',
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.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) > 6
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: {
next: { to: { query: { active: 'admission_byzs' } } },
hasButton: false,
options: { 'label-position': 'top' },
hint: `
<p>请将中英文成绩单原件扫描或者拍照后提交。</p>
<p>获取途径:联系大学时就读学校相关部门(档案馆/教务处)获取成绩单。</p>
`,
items: [
{
type: 'v-upload',
label: '中文成绩单',
model: 'REPORT_CARD_CN',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'REPORT_CARD_CN' }
}
},
{
type: 'v-upload',
label: '英文成绩单',
model: 'REPORT_CARD_EN',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'REPORT_CARD_EN' }
}
}
]
}
}
}
import cjd from './cjd'
import byzs from './byzs'
import ywjl from './ywjl'
import xy from './xy'
import xfjn from './xfjn'
export default function(_this) {
return {
id: 'admission',
title: '入学办理',
children: [cjd(_this), byzs, ywjl, xy(_this), xfjn(_this)]
}
}
export default function(_this) {
return {
id: 'admission_xfjn',
title: '缴费凭证',
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.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) > 6
const PAYMENT_VOUCHER = attachments.filter(item => {
return item.file_type_id === 'PAYMENT_VOUCHER'
})
return { PAYMENT_VOUCHER }
}
},
form: {
prev: { to: { query: { active: 'admission_xy' } } },
hasButton: false,
options: { 'label-position': 'top' },
hint: `
<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: [
{
type: 'v-upload',
model: 'PAYMENT_VOUCHER',
label: '上传缴费凭证',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'PAYMENT_VOUCHER' }
},
append: `申请者可将转账/支付缴费凭证截图或拍照后提交。<br>
上传多个文件,请打印出来检查无误后再上传。用A4纸打印后内容需显示完整、格式整齐、字迹清晰可辨。上传文件仅限“jpg,jpeg,pdf,png”格式,文件小于10Mb。`
}
]
}
}
}
export default function(_this) {
return {
id: 'admission_xy',
title: '入学协议',
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.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) > 6
const ADMISSION_AGREEMENT = attachments.filter(item => {
return item.file_type_id === 'ADMISSION_AGREEMENT'
})
return { ADMISSION_AGREEMENT }
}
},
form: {
prev: { to: { query: { active: 'admission_ywjl' } } },
next: { to: { query: { active: 'admission_xfjn' } } },
hasButton: false,
options: {},
items: [
{
type: 'v-upload',
required: true,
model: 'ADMISSION_AGREEMENT',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'ADMISSION_AGREEMENT' }
},
prepend: `
<p><a href="https://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/pc/sofia/%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>
`
}
]
}
}
}
export default {
id: 'admission_ywjl',
title: '英文简历',
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.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) > 6
const RESUME_EN = attachments.filter(item => {
return item.file_type_id === 'RESUME_EN'
})
return { RESUME_EN }
}
},
form: {
prev: { to: { query: { active: 'admission_byzs' } } },
next: { to: { query: { active: 'admission_xy' } } },
hasButton: false,
options: {},
items: [
{
type: 'v-upload',
required: true,
model: 'RESUME_EN',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'RESUME_EN' }
},
append: `
<p>请下载填写英文简历模板后上传 [<a href="https://zws-imgs-pub.oss-cn-beijing.aliyuncs.com/pc/sofia/%E8%8B%B1%E6%96%87%E7%AE%80%E5%8E%86.doc" target="_blank" download="英文简历模板">下载模板</a>]</p>
<p>请将英文简历填写完存为"pdf"格式上传,文件小于10MB。</p>`
}
]
}
}
<template>
<app-layout>
<vue-form
:menus="menus"
:default-active="currentActive"
@page-change="handlePageChange"
@success="handleSuccess"
@error="handleError"
@back="$router.push('/my/account')"
@prev="handlePrev"
@next="handleNext"
@uploaded="getApplication"
>
<template #aside-append>
<div class="aside-logout" @click="$store.dispatch('logout')"><span>退出登录</span></div>
</template>
</vue-form>
<el-dialog
title="办理入学资料提交成功"
:visible.sync="dialogVisible"
:center="true"
:close-on-click-modal="false"
width="348px"
>
<div class="dialog-tips">
<p>请确认是否已缴费,如未缴费点击下方缴费按钮 <br />(已缴费,请忽略)</p>
<div class="icon"><img src="../../../assets/images/icon_success.png" /></div>
</div>
<template #footer>
<el-button type="primary" @click="toPay">立即缴费</el-button>
<el-button type="primary" @click="dialogVisible = false">忽略</el-button>
</template>
</el-dialog>
</app-layout>
</template>
<script>
import AppLayout from '../layout.vue'
import getMenu from './form'
import * as api from '@/api/my'
export default {
components: { AppLayout },
data() {
const menus = getMenu(this)
return {
menus: [menus],
currentActive: 'admission_cjd',
dialogVisible: false,
detail: null
}
},
watch: {
$route: {
immediate: true,
handler(route) {
const { query = {} } = route
this.currentActive = query.active || 'admission_cjd'
}
},
showSubmitedDialog(value) {
this.dialogVisible = value
}
},
computed: {
isSubmited() {
if (this.detail) {
return !!this.detail.material.attachments.find(item => item.file_type_id === 'ADMISSION_AGREEMENT')
}
return false
},
showSubmitedDialog() {
return this.isSubmited && this.currentActive === 'admission_xy'
}
},
methods: {
// 获取报名信息
getApplication() {
api.getApplication().then(response => {
const { data, error, message } = response
if (error.toString() === '0') {
this.detail = data
} else {
this.$message.error(message)
}
})
},
handlePageChange(value) {
this.currentActive = value
this.$router.push({ path: this.$route.path, query: { active: value } }).catch(() => {})
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 })
},
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' } })
}
},
beforeMount() {
this.getApplication()
}
}
</script>
<style lang="scss" scoped>
.dialog-tips {
text-align: center;
p {
color: #262626;
line-height: 20px;
}
.icon {
margin-top: 20px;
text-align: center;
}
}
</style>
<template>
<el-dialog
title="您当前完成进度如下:"
width="348px"
:center="true"
:close-on-click-modal="false"
:visible.sync="dialogVisible"
@open="handleOpen"
@close="handleClose"
>
<div>
<ul v-if="detail">
<li
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].progress === 1 ? '已完成' : '未完成' }}</span>
<span class="view" @click="handleView(item.view.to)">立即查看</span>
</li>
</ul>
</div>
<template #footer>
<el-button type="primary" @click="dialogVisible = false">我知道啦</el-button>
</template>
</el-dialog>
</template>
<script>
import * as api from '@/api/my'
export default {
props: { value: { type: Boolean, default: false }, type: { type: Number, default: 0 } },
data() {
return {
dialogVisible: false,
detail: null,
progress: {},
options: [
[
{
title: '个人资料',
code: 'applicaitonInfo',
view: { to: { path: '/my/application', query: { active: 'application_info' } } }
}
// {
// title: '推荐信',
// 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: 'interviewByzs',
view: { to: { path: '/my/interview', query: { active: 'interview_byzs' } } }
},
// {
// title: '学位证书',
// code: 'interviewXwzs',
// view: { to: { path: '/my/interview', query: { active: 'interview_xwzs' } } }
// },
// {
// title: '学位证书英文证明',
// code: 'interviewXwzsEnglish',
// view: { to: { path: '/my/interview', query: { active: 'interview_xwzsywzm' } } }
// },
// {
// title: '英文简历',
// code: 'interviewYwjl',
// view: { to: { path: '/my/interview', query: { active: 'interview_ywjl' } } }
// },
// {
// title: '成绩单',
// code: 'interviewCjd',
// view: { to: { path: '/my/interview', query: { active: 'interview_cjd' } } }
// },
{
title: '2寸照片',
code: 'interviewZp',
view: { to: { path: '/my/interview', query: { active: 'interview_zp' } } }
}
// {
// title: '推荐信',
// code: 'interviewTjx',
// view: { to: { path: '/my/application', query: { active: 'application_tjx' } } }
// }
]
]
}
},
watch: {
value: {
immediate: true,
handler(value) {
this.dialogVisible = value
}
}
},
computed: {
currentOptions() {
return this.options[this.type]
}
},
methods: {
// 获取报名信息
getApplication() {
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
// 2寸照片
const interviewZp = { progress: 0 }
interviewZp.progress = missedRequiredList.PERSONAL_PHOTO_FOR_ID ? 0 : 1
// 毕业证书
const interviewByzs = { progress: 0 }
interviewByzs.progress = missedRequiredList.DIPLOMA_CN ? 0 : 1
// 学位证书
const interviewXwzs = { progress: 0 }
interviewXwzs.progress = missedRequiredList.DEGREE_CERT_CN ? 0 : 1
// 学位证书英文
const interviewXwzsEnglish = { progress: 0 }
interviewXwzsEnglish.progress = missedRequiredList.DEGREE_CERT_EN ? 0 : 1
// 英文简历
const interviewYwjl = { progress: 0 }
interviewYwjl.progress = missedRequiredList.RESUME_EN ? 0 : 1
// 成绩单
const interviewCjd = { progress: 0 }
interviewCjd.progress = missedRequiredList.REPORT_CARD_CN || missedRequiredList.REPORT_CARD_EN ? 0 : 1
// 推荐信
const interviewTjx = { progress: 0 }
interviewTjx.progress = progress.INTERVIEW_APPLICATION.reco_letters
? progress.INTERVIEW_APPLICATION.reco_letters.progress
: 0
this.progress = {
applicaitonInfo,
applicationTjx,
applicationWfzzm,
interviewZp,
interviewByzs,
interviewXwzs,
interviewXwzsEnglish,
interviewYwjl,
interviewCjd,
interviewTjx
}
} else {
this.$message.error(message)
}
})
},
handleView(to) {
this.dialogVisible = false
this.$router.push(to)
},
handleOpen() {
this.getApplication()
},
handleClose() {
this.$emit('input', this.dialogVisible)
}
}
}
</script>
<style lang="scss" scoped>
li {
padding: 10px 0;
display: flex;
align-items: center;
}
.name {
width: 80px;
text-align: right;
}
.line {
width: 40px;
height: 1px;
margin: 0 10px;
background-color: #ccc;
}
.is-success {
.status {
color: #33c011;
}
}
.is-error {
.status {
color: #af1b40;
}
}
.view {
margin-left: 40px;
color: #57acff;
text-decoration: underline;
cursor: pointer;
}
</style>
/**
* 申请声明
*/
export default function(_this) {
return {
id: 'application_declare',
title: '申请声明',
visible() {
return _this.visible
},
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.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: [] }
}
},
update: {
action: `/api/enrollment/v1.0/application-materials/submit/${webConf.others.projectId}`,
callback() {
_this.getApplication()
this.form.options.disabled = true
// _this.$router.push({ path: this.$route.path, query: { active: 'application_pay' } })
_this.$router.push({ path: '/my/interview' })
},
errorCallback() {
_this.completeVisible = true
}
},
form: {
prev: { to: { query: { active: 'application_info', tab: 'application_info_honor' } } },
submitText: '提交报名申请',
model: { isAgree: [] },
options: {},
items: [
{
type: 'v-checkbox',
values: [{ label: '同意', value: 1 }],
model: 'isAgree',
rules: [{ required: true, message: '请阅读协议', trigger: 'change' }],
prepend: `<p>1、本人知晓此申请表及所附文件将作为申请紫荆-索菲亚大学MBA面试和背景评估的参考依据,一旦成功录取,有关资料将作为学生信息存档。</p>
<p>2、本人声明所填资料正确无误,知晓任何不真实的信息或不诚信的行为,均会影响申请结果,已取得的成绩和资格会被取消。我理解并同意所有报名材料归紫荆教育所有,无论考生录取与否均不退回。我授权紫荆教育使用报名表中的信息查询本人学习和工作记录。</p>`
}
]
}
}
}
import info from './info'
// import tjx from './tjx'
// import wfzsm from './wfzzm'
import declare from './declare'
export default function(_this) {
return {
id: 'application',
title: '报名申请',
children: [
info(_this),
// tjx(_this),
// wfzsm(_this),
declare(_this)
// {
// id: 'application_pay',
// title: '缴报名费',
// show: false,
// visible() {
// return _this.visible
// }
// }
]
}
}
import first from './info/first'
import profile from './info/profile'
import education from './info/education'
import career from './info/career'
import honor from './info/honor'
import training from './info/training'
import answer from './info/answer'
export default function(_this) {
return {
id: 'application_info',
title: '个人资料',
tabs: [first(_this), profile(_this), education(_this), career(_this), answer(_this), training(_this), honor(_this)]
}
}
/**
* 学习目的
*/
export default function(_this) {
return {
id: 'application_info_answer',
title: '学习目的',
required: true,
visible() {
return _this.visible
},
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
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: '您为什么要申请索菲亚大学金融方向工商管理硕士项目?(60字以上,1000字以内)',
answer1: first.answer,
qid2: second.qid || '2',
question2: '您的短期和长期职业发展目标是什么?您打算如何达成此愿景?(60字以上,1000字以内)',
answer2: second.answer
}
}
},
update: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}/put`,
beforeRequest(data) {
return {
answers: [
{ qid: data.qid1, question: data.question1, answer: data.answer1 },
{ qid: data.qid2, question: data.question2, answer: data.answer2 }
]
}
}
},
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字以内)',
model: 'answer1',
attrs: { type: 'textarea', rows: '8', maxlength: '1000', style: 'width:100%' },
rules: [
{ required: true, message: '请输入', trigger: 'blur' },
{ min: 60, max: 1000, message: '长度在 60 到 1000 个字符', trigger: 'blur' }
]
},
{
type: 'v-input',
label: '您的短期和长期职业发展目标是什么?您打算如何达成此愿景?(60字以上,1000字以内)',
model: 'answer2',
attrs: { type: 'textarea', rows: '8', maxlength: '1000', style: 'width:100%' },
rules: [
{ required: true, message: '请输入', trigger: 'blur' },
{ min: 60, max: 1000, message: '长度在 60 到 1000 个字符', trigger: 'blur' }
]
}
]
}
}
}
/**
* 工作经验
*/
export default function(_this) {
return {
id: 'application_info_career',
title: '工作经验',
required: true,
visible() {
return _this.visible
},
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const { careers: list = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
return list.length ? list : [{}]
}
},
update: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.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) => {
result[key] = item[key]
return result
}, {})
})
return { careers }
}
},
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' },
items: [
{
type: 'v-datepicker',
label: '开始时间',
model: 'start_date',
attrs: {
type: 'month',
placeholder: '请选择工作开始时间',
valueFormat: 'yyyy-MM'
},
rules: [{ required: true, message: '请选择工作开始时间', trigger: 'blur' }]
},
{
type: 'v-datepicker',
label: '结束时间',
model: 'end_date',
attrs: {
type: 'month',
placeholder: '请选择工作结束时间',
valueFormat: 'yyyy-MM'
},
rules: [{ required: true, message: '请选择工作结束时间', trigger: 'blur' }]
},
{
type: 'v-input',
label: '工作单位',
model: 'company_name_cn',
attrs: { placeholder: '请输入工作单位' },
rules: [{ required: true, message: '请输入工作单位', trigger: 'blur' }]
},
{
type: 'v-select',
values: [
{ value: '互联网/电子商务' },
{ value: '基金/证券/期货/投资' },
{ value: '保险' },
{ value: '银行' },
{ value: '信托/担保/拍卖/典当' },
{ value: '计算机软件' },
{ value: 'IT服务(系统/数据/维护)' },
{ value: '电子技术/半导体/集成电路' },
{ value: '计算机硬件' },
{ value: '通信/电信/网络设备' },
{ value: '通信/电信运营、增值服务' },
{ value: '网络游戏' },
{ value: '房地产/建筑/建材/工程' },
{ value: '家居/室内设计/装饰装潢' },
{ value: '物业管理/商业中心' },
{ value: '专业服务/咨询(财会/法律/人力资源等)' },
{ value: '广告/会展/公关' },
{ value: '中介服务' },
{ value: '检验/检测/认证' },
{ value: '外包服务' },
{ value: '快速消费品(食品/饮料/烟酒/日化)' },
{ value: '耐用消费品(服饰/纺织/皮革/家具/家电)' },
{ value: '贸易/进出口' },
{ value: '零售/批发' },
{ value: '租赁服务' },
{ value: '教育/培训/院校' },
{ value: '礼品/玩具/工艺美术/收藏品/奢侈品' },
{ value: '汽车/摩托车' },
{ value: '大型设备/机电设备/重工业' },
{ value: '加工制造(原料加工/模具)' },
{ value: '仪器仪表及工业自动化' },
{ value: '印刷/包装/造纸' },
{ value: '办公用品及设备' },
{ value: '医药/生物工程' },
{ value: '医疗设备/器械' },
{ value: '航空/航天研究与制造' },
{ value: '交通/运输,物流/仓储' },
{ value: '医疗/护理/美容/保健/卫生服务' },
{ value: '酒店/餐饮,旅游/度假,媒体/出版/影视/文化传播' },
{ value: '娱乐/体育/休闲' },
{ value: '能源/矿产/采掘/冶炼' },
{ value: '石油/石化/化工,电气/电力/水利' },
{ value: '环保' },
{ value: '政府/公共事业/非盈利机构' },
{ value: '学术/科研,农/林/牧/渔跨领域经营' },
{ value: '其他' }
],
label: '行业类别',
model: 'industry',
rules: [{ required: true, message: '请选择行业类别', trigger: 'change' }]
},
{
type: 'v-input',
label: '工作部门',
model: 'dept_cn',
attrs: { placeholder: '请输入工作部门' },
rules: [{ required: true, message: '请输入工作部门', trigger: 'blur' }]
},
{
type: 'v-input',
label: '工作职位',
model: 'position_cn',
attrs: { placeholder: '请输入工作职位' },
rules: [{ required: true, message: '请输入工作职位', trigger: 'blur' }]
},
{
type: 'v-input',
label: '工作描述',
model: 'job_desc_cn',
attrs: {
type: 'textarea',
placeholder: '请输入工作描述',
rows: '8',
maxlength: '3000'
},
rules: [{ required: true, message: '请输入工作描述', trigger: 'blur' }]
}
]
}
}
}
/**
* 教育背景
*/
export default function(_this) {
return {
id: 'application_info_education',
title: '教育背景',
required: true,
visible() {
return _this.visible
},
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const { educations: list = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
return list.length ? list : [{}]
}
},
update: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}/put`,
beforeRequest(data) {
const educations = data.map(item => {
return ['start_date', 'end_date', 'school_name_cn', 'major_cn', 'degree'].reduce((result, key) => {
result[key] = item[key]
return result
}, {})
})
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' },
items: [
{
type: 'v-datepicker',
label: '开始时间',
model: 'start_date',
attrs: {
type: 'month',
placeholder: '请选择教育开始时间',
valueFormat: 'yyyy-MM'
},
rules: [{ required: true, message: '请选择教育开始时间', trigger: 'blur' }]
},
{
type: 'v-datepicker',
label: '结束时间',
model: 'end_date',
attrs: {
type: 'month',
placeholder: '请选择教育结束时间',
valueFormat: 'yyyy-MM'
},
rules: [{ required: true, message: '请选择教育结束时间', trigger: 'blur' }]
},
{
type: 'v-input',
label: '学校名称',
model: 'school_name_cn',
attrs: { placeholder: '请输入学校名称' },
rules: [{ required: true, message: '请输入学校名称', trigger: 'blur' }]
},
{
type: 'v-input',
label: '专业名称',
model: 'major_cn',
attrs: { placeholder: '请输入专业名称' },
rules: [{ required: true, message: '请输入专业名称', trigger: 'blur' }]
},
{
type: 'v-select',
values: [
{ value: '专科' },
{ value: '本科' },
{ value: '本科/学士' },
{ value: '硕士研究生' },
{ value: '研究生/硕士' },
{ value: '博士研究生' },
{ value: '研究生/博士' },
{ value: '其他' }
],
label: '学历/学位',
model: 'degree',
rules: [{ required: true, message: '请选择学历/学位', trigger: 'change' }]
}
]
}
}
}
/**
* 个人信息
*/
export default function(_this) {
return {
id: 'application_info_first',
title: '个人信息',
required: true,
visible() {
return this.tabActive === 'application_info_first'
},
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
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']
types.forEach(type => {
if (item.file_type_id === type) {
result[type].push(item)
}
})
return result
},
{ ID_CARD_FRONT: [], ID_CARD_BACK: [], HK_ID_CARD: [], PASSPORT: [], OTHER_ID_CARD_PHOTO: [] }
)
basicInfo.id_type = basicInfo.id_type === '护照' ? '中国护照' : basicInfo.id_type
return Object.assign({}, basicInfo, attachment)
}
},
update: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}/put`,
beforeRequest(data) {
const basicInfo = ['phone_number', 'email', 'id_type'].reduce((result, key) => {
result[key] = data[key]
return result
}, {})
return { basic_info: basicInfo }
}
},
form: {
hasButton: false,
next: { to: { query: { active: 'application_info', tab: 'application_info_profile' } }, isSubmit: true },
options: { labelWidth: '140px' },
items: [
{
type: 'v-input',
label: '手机号',
model: 'phone_number',
attrs: { placeholder: '请输入手机号', maxlength: 11 },
rules: [{ required: true, pattern: /^1[3-9]\d{9}$/, message: '请输入手机号', trigger: 'blur' }]
},
{
type: 'v-input',
label: '邮箱',
model: 'email',
attrs: { placeholder: '请输入邮箱' },
rules: [{ type: 'email', required: true, message: '请输入邮箱', trigger: 'blur' }]
},
{
type: 'v-select',
values: [{ value: '居民身份证' }, { value: '港澳台身份证' }, { value: '中国护照' }, { value: '其他' }],
label: '证件类型',
model: 'id_type',
attrs: { placeholder: '请选择证件类型' },
rules: [{ required: true, message: '请选择证件类型', trigger: 'change' }]
},
// 身份证照片(背面)
{
type: 'v-upload',
label: '身份证人像面',
model: 'ID_CARD_BACK',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'ID_CARD_BACK' },
limit: 1,
accept: 'image/*',
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) {
return data.id_type === '居民身份证'
}
},
// 身份证照片(正面)
{
type: 'v-upload',
label: '身份证国徽面',
model: 'ID_CARD_FRONT',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'ID_CARD_FRONT' },
limit: 1,
accept: 'image/*',
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) {
return data.id_type === '居民身份证'
}
},
// 港澳台身份证
{
type: 'v-upload',
label: '港澳台身份证',
model: 'HK_ID_CARD',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'HK_ID_CARD' },
limit: 1,
accept: 'image/*'
},
rules: [{ type: 'array', required: true, message: '请上传港澳台身份证', trigger: 'change' }],
isShow(data) {
return data.id_type === '港澳台身份证'
}
},
// 中国护照
{
type: 'v-upload',
label: '中国护照',
model: 'PASSPORT',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'PASSPORT' },
limit: 1,
accept: 'image/*'
},
rules: [{ type: 'array', required: true, message: '请上传中国护照', trigger: 'change' }],
isShow(data) {
return data.id_type === '中国护照'
}
},
// 其他证件
{
type: 'v-upload',
label: '其他证件',
model: 'OTHER_ID_CARD_PHOTO',
attrs: {
action: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/put`,
deleteAction: `/api/enrollment/v1.0/application-materials/attachments/${webConf.others.projectId}/delete`,
data: { file_type: 'OTHER_ID_CARD_PHOTO' },
limit: 1,
accept: 'image/*'
},
rules: [{ type: 'array', required: true, message: '请上传其他证件', trigger: 'change' }],
isShow(data) {
return data.id_type === '其他'
}
}
]
}
}
}
/**
* 荣誉奖励
*/
export default function(_this) {
return {
id: 'application_info_honor',
title: '荣誉奖励',
visible() {
return _this.visible
},
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const { honors: list = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
return list.length ? list : [{}]
}
},
update: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}/put`,
beforeRequest(data) {
const honors = data.map(item => {
return ['time', 'title', 'institution_cn'].reduce((result, key) => {
result[key] = item[key] || ''
return result
}, {})
})
return { honors }
}
},
form: {
prev: { to: { query: { active: 'application_info', tab: 'application_info_training' } }, isSubmit: true },
next: { to: { query: { active: 'application_declare' } }, isSubmit: true },
hasAdd: true,
options: { labelWidth: '140px' },
items: [
{
type: 'v-datepicker',
label: '获取时间',
model: 'time',
attrs: { type: 'date', valueFormat: 'yyyy-MM-dd', placeholder: '请选择获取时间' }
// rules: [{ required: true, message: '请选择获取时间', trigger: 'blur' }]
},
{
type: 'v-input',
label: '荣誉奖励',
model: 'title',
attrs: { placeholder: '请输入荣誉奖励' }
// rules: [{ required: true, message: '请输入荣誉奖励', trigger: 'blur' }]
},
{
type: 'v-input',
label: '证书颁发机构',
model: 'institution_cn',
attrs: { placeholder: '请输入证书颁发机构' }
// rules: [{ required: true, message: '请输入证书颁发机构', trigger: 'blur' }]
}
]
}
}
}
/**
* 所受培训
*/
export default function(_this) {
return {
id: 'application_info_training',
title: '所受培训',
visible() {
return _this.visible
},
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
const { trainings: list = [], submission_stage: submissionStage = 'FILLING' } = data.data.material
this.form.options.disabled = submissionStage !== 'FILLING'
return list.length ? list : [{}]
}
},
update: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}/put`,
beforeRequest(data) {
const trainings = data.map(item => {
return ['start_date', 'end_date', 'institution_cn', 'course_cn'].reduce((result, key) => {
result[key] = item[key] || ''
return result
}, {})
})
return { trainings }
}
},
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: [
{
type: 'v-datepicker',
label: '开始时间',
model: 'start_date',
attrs: {
type: 'month',
placeholder: '请选择培训开始时间',
valueFormat: 'yyyy-MM'
}
// rules: [{ required: true, message: '请选择培训开始时间', trigger: 'blur' }]
},
{
type: 'v-datepicker',
label: '结束时间',
model: 'end_date',
attrs: {
type: 'month',
placeholder: '请选择培训结束时间',
valueFormat: 'yyyy-MM'
}
// rules: [{ required: true, message: '请选择培训结束时间', trigger: 'blur' }]
},
{
type: 'v-input',
label: '培训机构',
model: 'institution_cn',
attrs: { placeholder: '请输入培训机构' }
// rules: [{ required: true, message: '请输入培训机构', trigger: 'blur' }]
},
{
type: 'v-input',
label: '课程名称',
model: 'course_cn',
attrs: { placeholder: '请输入课程名称' }
// rules: [{ required: true, message: '请输入课程名称', trigger: 'blur' }]
}
]
}
}
}
/**
* 推荐信
*/
export default function(_this) {
return {
id: 'application_tjx',
title: '推荐信',
visible() {
return _this.visible
},
get: {
action: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}`,
callback(data) {
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: `/api/enrollment/v1.0/application-materials/${webConf.others.projectId}/put`,
beforeRequest(data) {
return { reco_letters: data }
}
},
form: {
minlength: 2,
prev: { to: { query: { active: 'application_info', tab: 'application_info_honor' } }, isSubmit: true },
next: { to: { query: { active: 'application_wfzzm' } }, isSubmit: true },
hasAdd: true,
disabled(data) {
return !!data.letter_content
},
aside: {
prepend: {
html: '<p style="color:#33C011;">推荐人已完成</p>',
visible(data) {
return !!data.letter_content
}
},
buttons: [
{
text: '再次邀请',
visible(data) {
const editable = ['PREPAYMENT', 'INTERVIEW_APPLICATION', 'AUDITION'].includes(
_this.detail.material.submission_stage
)
return data.id && !data.letter_content && editable
},
onClick(data) {
_this.sendToProvider(data)
}
},
{
text: '更换推荐人',
visible(data) {
const editable = ['PREPAYMENT', 'INTERVIEW_APPLICATION', 'AUDITION'].includes(
_this.detail.material.submission_stage
)
return data.id && !data.letter_content && editable
},
onClick(data, $form) {
$form.validate().then(() => {
_this.changeProvider(data)
})
}
}
]
},
options: { labelWidth: '140px' },
items: [
{
type: 'v-input',
label: '推荐人姓名',
model: 'provider_name',
attrs: { placeholder: '请输入推荐人姓名' },
rules: [{ required: true, message: '请输入推荐人姓名', trigger: 'blur' }]
},
{
type: 'v-input',
label: '推荐人电话',
model: 'provider_phone_number',
attrs: { placeholder: '请输入推荐人电话', maxlength: 11 },
rules: [{ required: true, pattern: /^1[3-9]\d{9}$/, message: '请输入推荐人电话', trigger: 'blur' }]
},
{
type: 'v-input',
label: '推荐人邮箱',
model: 'provider_email',
attrs: { placeholder: '请输入推荐人邮箱' },
rules: [{ type: 'email', required: true, message: '请输入推荐人邮箱', trigger: 'blur' }]
},
{
type: 'v-select',
values: [
{ value: '老师/导师' },
{ value: '领导' },
{ value: '同学' },
{ value: '同事' },
{ value: '亲属' },
{ value: '朋友' },
{ value: '其他' }
],
label: '与推荐人关系',
model: 'provider_relationship',
rules: [{ required: true, message: '请选择与推荐人关系', trigger: 'change' }]
}
]
}
}
}
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
差异被折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论