提交 8d8bae6e authored 作者: 王鹏飞's avatar 王鹏飞

chore: 持续优化

上级 63425f38
const fs = require('fs')
const path = require('path')
const chalk = require('chalk')
const OSS = require('ali-oss')
const log = console.log
const client = new OSS({
region: 'oss-cn-beijing',
accessKeyId: 'LTAIOTuuLTaWoGJj',
accessKeySecret: 'dE5tTGm2lh35eItct2krW2DeH2lf2I',
bucket: 'webapp-pub'
})
async function uploadTarget(src, dist) {
try {
const result = await client.put(dist, path.join(__dirname, src))
log(chalk.green('上传成功', result.url))
} catch (e) {
log(chalk.red('上传失败', src))
log(e)
}
}
function generateUploadTarget(src, dist) {
fs.readdir(path.join(__dirname, src), function (err, files) {
if (err) {
log(err)
return
}
files.forEach(function (file) {
const _src = src + '/' + file
const _dist = dist + '/' + file
const stats = fs.statSync(path.join(__dirname, _src))
// 判断是否为文件
stats.isFile() && uploadTarget(_src, _dist)
// 判断是否为文件夹
stats.isDirectory() && generateUploadTarget(_src, _dist)
})
})
}
generateUploadTarget('./client-dist', '/website/prod/eec')
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -5,7 +5,6 @@
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"deploy": "node ./deploy.js",
"lint": "eslint --ext .js --ext .jsx --ext .vue src/",
"lint:fix": "eslint --fix --ext .js --ext .jsx --ext .vue src/"
},
......@@ -14,25 +13,21 @@
"axios": "^1.5.0",
"element-ui": "^2.15.14",
"file-saver": "^2.0.5",
"js-cookie": "^2.2.1",
"js-md5": "^0.7.3",
"lodash": "^4.17.20",
"print-js": "^1.6.0",
"qrcode.vue": "^1.7.0",
"swiper": "^6.3.5",
"viewerjs": "^1.9.0",
"vue": "^2.7.16",
"vue-awesome-swiper": "3.1.3",
"vue-meta-info": "^0.1.7",
"vue-mobile-calendar": "^3.3.0",
"vue-router": "^3.6.5",
"vuex": "^3.6.2"
},
"devDependencies": {
"@vitejs/plugin-vue2": "^2.3.3",
"ali-oss": "^6.11.2",
"eslint": "^8.48.0",
"eslint-plugin-vue": "^9.17.0",
"qs": "^6.14.0",
"sass": "1.66.1",
"vite": "^4.5.9",
"vite-plugin-mkcert": "^1.16.0"
......
import { articleApi } from '@api'
export default class ArticleAction {
getAllClassify (obj) { return articleApi.getAllClassify(obj).then(res => res) }
getArticle (obj) { return articleApi.getArticle(obj).then(res => res) }
getArticleDetail (id) { return articleApi.getArticleDetail(id).then(res => res) }
formCommit (data) { return articleApi.formCommit(data).then(res => res) }
getBanner (obj) { return articleApi.getBanner(obj).then(res => res) }
sendCheckedCode (obj) { return articleApi.sendCheckedCode(obj).then(res => res) }
register (obj) { return articleApi.register(obj).then(res => res) }
register2 (obj) { return articleApi.register2(obj).then(res => res) }
getUserInfo (obj) { return articleApi.getUserInfo(obj).then(res => res) }
getFormDetail (obj) { return articleApi.getFormDetail(obj).then(res => res) }
getOrder (obj) { return articleApi.getOrder(obj).then(res => res) }
checkPay (id) { return articleApi.checkPay(id).then(res => res) }
payEnd (obj) { return articleApi.payEnd(obj).then(res => res) }
updateUserInfo (obj) { return articleApi.updateUserInfo(obj).then(res => res) }
getCard (obj) { return articleApi.getCard(obj).then(res => res) }
}
import ArticleAction from './ArticleAction'
let articleAction = new ArticleAction()
const cAction = {
articleAction
}
/**
* 统一处理接口返回请求
* 由于使用 axios ,返回 then + finally 可能存在 部分浏览器不支持情况
* 需要 添加兼容
* @param {[object]} obj 整个对象
* @param {[object]} obj.component 当前调用组件对象 传过来,必传
* @param {[string]} obj.actionName action名字,必传
* @param {[string]} obj.functionName action类中的方法名,必传
* @param {[object]} obj.data 传输数据,必传
* @param {[function]} obj.thenCallback 异步成功返回回调值,必传
* @param {[function]} obj.catchCallback 异常抛出时,返回错误抓取回调值,必传
* @param {[function]} obj.finallyCallback 最终finally回调,必传
*/
export const request = obj => {
cAction[obj.actionName]
[obj.functionName](obj.data)
.then(res => {
obj.thenCallback(res)
})
.catch(e => {
obj.component.$message.error(e.message)
obj.catchCallback(e)
})
.finally(e => {
obj.finallyCallback(e)
})
}
export default cAction
import httpRequest from '@/utils/httpRequest'
// 获取文章分类
export function getAllClassify(params) {
return httpRequest.get('/api/microservices/api/category/articles', { params })
}
// 获取文章
export function getArticle(params) {
return httpRequest.get('/api/microservices/api/article/list', { params })
}
// 获取文章详情
export function getArticleDetail(id) {
return httpRequest.get(`/api/microservices/api/article/${id}/info`)
}
export function formCommit(data) {
return httpRequest.post('/api/microservices/api/v3/apply/teacher-form', data)
}
// 获取轮播
export function getBanner(params) {
return httpRequest.get('/api/microservices/api/carousel/list', { params })
}
// 发送验证码
export function sendCheckedCode(data) {
return httpRequest.post('/api/usercenter/user/send-code', data)
}
// 注册
export function register(data) {
return httpRequest.post('/api/usercenter/user/register', data)
}
// 注册
export function register2(data) {
return httpRequest.post('/api/usercenter/user/register-and-login-by-mobile', data)
}
// 获取用户信息
export function getUserInfo() {
return httpRequest.get('/api/passport/account/get-user-info')
}
// 表单回显
export const getFormDetail = (params) => {
return httpRequest.get('/api/microservices/api/v3/apply/teacher-form-detail', { params })
}
// 下单
export function getOrder(data) {
return httpRequest.post('/api/microservices/api/v3/apply/unified-order', data)
}
// 查看订单状态
export function checkPay(id) {
return httpRequest.post('/api/pay/order/query', { order_id: id }, { headers: { 'Content-Type': 'application/json' } })
}
// 支付完成通知
export function payEnd(data) {
return httpRequest.post('/api/microservices/api/v3/apply/pay-end', data)
}
// 更新用户信息
export function updateUserInfo(data) {
return httpRequest.post('/api/usercenter/user/update-user', data)
}
// 获取证书
export function getCard(params) {
return httpRequest.get('/api/cert/api/v1/cert/detail', { params })
}
/**
* 提交留咨信息
*/
export function postNes(data) {
return httpRequest.post('/api/enrollment/v1.0/applications', data)
}
import BaseAPI from './base_api'
export default class ScoreAPI extends BaseAPI {
// 获取文章分类
getAllClassify = (obj = {}) => this.get('/api/microservices/api/category/articles', obj, {})
// 获取文章
getArticle = (obj = {}) => this.get('/api/microservices/api/article/list', obj, {})
// 获取文章详情
getArticleDetail = id => this.get(`/api/microservices/api/article/${id}/info`)
// formCommit = (data) => this.post('/api/microservices/api/form/commit', data)
formCommit = data => this.post('/api/microservices/api/v3/apply/teacher-form', data)
// 获取轮播
getBanner = (obj = {}) => this.get('/api/microservices/api/carousel/list', obj, {})
// 发送验证码
sendCheckedCode = (obj = {}) => this.post('/api/usercenter/user/send-code', obj)
// 注册
register = (obj = {}) => this.post('/api/usercenter/user/register', obj)
// 注册
register2 = (obj = {}) => this.post('/api/usercenter/user/register-and-login-by-mobile', obj)
// 获取用户信息
getUserInfo = () => this.get('/api/passport/account/get-user-info')
// 表单回显
getFormDetail = (params = {}) => {
return this.get('/api/microservices/api/v3/apply/teacher-form-detail', params, {})
}
// 下单
getOrder = (obj = {}) => this.post('/api/microservices/api/v3/apply/unified-order', obj)
// 查看订单状态
checkPay = id =>
this.post('/api/pay/order/query', { order_id: id }, { headers: { 'Content-Type': 'application/json' } })
// 支付完成通知
payEnd = (obj = {}) => this.post('/api/microservices/api/v3/apply/pay-end', obj)
// 更新用户信息
updateUserInfo = (obj = {}) => this.post('/api/usercenter/user/update-user', obj)
// 获取证书
getCard = (obj = {}) => this.get('/api/cert/api/v1/cert/detail', obj, {})
}
import axios from 'axios'
import _ from 'lodash'
import qs from 'qs'
export default class API {
constructor() {
/* 创建一个 自定义配置axios实例 */
// 让ajax携带cookie
axios.defaults.withCredentials = true
this._axios = axios.create({
timeout: 5 * 1000,
baseURL: import.meta.env.VITE_API_BASE_URL,
/* 即将被发送的自定义请求头 */
headers: {
Accept: '*/*',
'Accept-Language': '',
'Content-Type': 'application/x-www-form-urlencoded'
}
})
}
/* 获取当前Vue创建实例 */
getVueInstance() {
return window.G.$instance_vue
}
/* 重新封装 请求时的执行函数 */
_request(_config = {}) {
/* 具体执行请求成功后业务逻辑前,先执行该方法 */
const beforeSuccess = _config.beforeSuccess ? _config.beforeSuccess : this._reqSuccess
/* 具体执行请求失败后业务逻辑前,先执行该方法 */
const beforeFail = _config.beforeFail ? _config.beforeFail : this._reqFail
const headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
_config.headers = _.assignIn(headers, _config.headers)
/* 判别 传输方式 */
if (_config.headers['Content-Type'] === 'application/x-www-form-urlencoded') {
_config.data = qs.stringify(_config.data)
}
if (_config.headers['Content-Type'] === 'multipart/form-data') {
let fr = new FormData() // eslint-disable-line
const _obj = _config.data || _config.params
for (const key in _obj) {
fr.append(key, _obj[key])
}
_config.data = fr
}
/* 创建并根据参数发起请求 */
return this._axios(_config).then(beforeSuccess.bind(this), beforeFail.bind(this))
}
/**
* 统一处理request success操作,在实现业务逻辑前进行统一处理。
* 注意:如果不能满足需求,可在接口定义处重新实现
* @param {[object]} res 返回数据
*/
_reqSuccess(res) {
const { status, data } = res
let err = null
if (status === 200) {
return data
} else {
err = new Error(JSON.stringify(res.data))
throw err
}
}
/**
* 统一处理request fail操作,在实现业务逻辑前进行统一处理。
* 注意:如果不能满足需求,可在接口定义处重新实现
* @param {[object]} res 如果未到达 response 阶段,则无res.response
*/
_reqFail(res) {
let err = null
if (res.code === 'ECONNABORTED') {
err = new Error('网络超时,请稍后重试')
} else if (res.response) {
err = new Error(JSON.stringify(res.response))
} else {
err = new Error('msg:' + res.message + 'stack:' + res.stack)
err.code = 500
}
/* 如果出错,创建错误对象,并抛出一个错误。 */
throw err
}
/* 重新实现 get请求 */
get(url, data, config) {
return this._request(_.assignIn({ url, method: 'GET', params: data }, config))
}
/* 重新实现 post请求 */
post(url, data, config) {
return this._request(_.assignIn({ url, method: 'POST', data: data }, config))
}
/* 重新实现 put请求 */
put(url, data, config) {
return this._request(_.assignIn({ url, method: 'PUT', data: data }, config))
}
/* 重新实现 delete请求 */
delete(url, data, config) {
return this._request(_.assignIn({ url, method: 'DELETE', params: data }, config))
}
}
// import LoginAPI from './login_api'
import ArticleAPI from './article_api'
import httpRequest from '@/utils/httpRequest'
// let loginApi = new LoginAPI(webConf)
const articleApi = new ArticleAPI({})
/**
* 提交留咨信息
*/
export function postNes(data) {
return httpRequest.post('/api/enrollment/v1.0/applications', data)
}
export { articleApi }
<template>
<div class="school-box">
<div class="module1 content-max-width">
<div class="title" id="points5">申报试点</div>
<div class="p">试点申报请前往职业技能等级证书信息管理服务平台(网址: https://vslc.ncb.edu.cn/csr-declaraPlatform)进行申请。</div>
<img src="https://zws-imgs-pub.ezijing.com/static/public/fef814a1209bab02367cfdf8ab4f51dc.png" alt="" class="img">
<div class="p1">
<span>试点申报说明:</span>
<div class="all-btn" @click="goPage('/news')">看通知</div>
</div>
<div class="p1">
<span>试点申报入口:</span>
<div class="all-btn" @click="goPage('https://vslc.ncb.edu.cn/csr-declaraPlatform', 1)">去申请</div>
</div>
<div class="p1" style="align-items: baseline;">
<span style="white-space:nowrap;">申报审核结果:</span>
<div class="color-c">我司会联系您,请关注校方注册网站时联系人注册手机的通知。</div>
</div>
<div class="content-max-width" id="points1">
<div class="title">考点申报</div>
<div class="p">在职业技能等级证书信息管理服务平台-试点院校业务平台-考试管理菜单中,打开申报考点栏目申报考核站点。<br/>
学校如果要组织证书的考试,需要向紫荆教育申报考点,审批通过后方可组织学生考试。<br/>
若学校不符合紫荆教育公布的考核站点建设标准要求,可以向紫荆教育申请去其他考核站点借考,借考分配由紫荆教育操作处理。</div>
</div>
<div class="p1">
<span>考点申报说明:</span>
<div class="all-btn" @click="goPage('/news')">看通知</div>
</div>
<div class="p1">
<span>考点申报入口:</span>
<div class="all-btn" @click="goPage('https://vslc.ncb.edu.cn/csr-declaraPlatform', 1)">去申请</div>
</div>
</div>
<div class="module2">
<div class="content-max-width" id="points2">
<!-- <div class="p">
<div class="title tnew">集中报名师训</div>
<div class="p">有关单位意向申报成为1+X职业技能等级证书考核站点,请按要求登录政府网站申请试点院校业务平台(网址: https://vslc.ncb.edu.cn )输入试点学校管理员的账号密码,在考试管理菜单中,打开申报考点栏目,即可自主申报考核站点</div>
<div class="all-btn" @click="goPage('/school/form')">去申请</div>
</div> -->
<!-- <div class="title">组织老师培训</div>
<div class="p">根据紫荆教育发布的师资培训方案,学校组织符合条件的专业老师参加师资培训。</div>
<div class="p1">
<span>通知关注:</span>
<div class="all-btn con-btn" @click="goPage('/news')">看通知</div>
</div>
<div class="p1">
<span>报名入口:</span>
<div class="all-btn con-btn" @click="goPage('/train')">去报名</div>
</div> -->
<!-- <div class="all-btn con-btn" @click="goPage('/train')">去报名</div>
<div class="all-btn con-btn" @click="goPage('/news')">看通知</div> -->
<div class="title mar-t36" id="points3">统一实施教学</div>
<div class="item">
<div class="content" style="margin-left:0px;">
<div class="text">
学校可统一组织开班授课。线上课程可使用我司学习系统的辅助教学功能。<br/>
支持视频课程教学播放、PPT课程讲义播放。<br/>
管理班级学员和开班课,了解各班学习进度
</div>
<div class="all-btn" @click="goPage('https://x-learning.ezijing.com/', 1)">进入系统</div>
</div>
</div>
<img style="margin: 0 auto;display:block;" src="https://zws-imgs-pub.ezijing.com/static/public/5bc16cb6a3a5cda51df669315991a69a.png" alt="">
</div>
</div>
<div class="module3 content-max-width">
<div class="title" id="points4">批量报名考试</div>
<div class="text-box" style="display:block">
<div class="text">成绩查询请前往职业技能等级证书信息管理服务平台(网址: https://vslc.ncb.edu.cn/csr-scoreCertificate)进行查询。</div>
<!-- <div class="text">1、设置考场信息:考核站点申请后,需要在职业技能等级证书信息管理服务平台-试点院校业务平台-考场管理栏目中为考核站点设置考场信息,考场信息每次考试均需设置一次。</div> -->
<!-- <div class="text">2、为学生报考:请在职业技能等级证书信息管理服务平台-试点院校业务平台-报考管理功能中为学生进行报考。</div> -->
<!-- <div class="text">成绩查询请前往职业技能等级证书信息管理服务平台(网址: https://vslc.ncb.edu.cn/csr-scoreCertificate)进行查询。</div> -->
<div class="all-btn" style="margin-left:0px;" @click="goPage('https://vslc.ncb.edu.cn/csr-scoreCertificate', 1)">进入系统</div>
</div>
<div class="img-box">
<img src="https://zws-imgs-pub.ezijing.com/static/public/182e9ee4459c70648ddd626075d666a8.png" alt="">
<!-- <img style="height:188px;" src="https://zws-imgs-pub.ezijing.com/static/public/94d7bf72697b2b6e452e93b555b50038.png" alt=""> -->
</div>
</div>
</div>
</template>
<script>
import action from '@action'
export default {
mounted() {
// this.newsList()
if (this.$route.query.point) {
setTimeout(() => {
this.pointScroll()
}, 500)
}
},
methods: {
pointScroll(){
if (this.$route.query.point !== undefined) {
const element = document.getElementById(`point${this.$route.query.point}`);
if (element) {
const offsetTop = element.getBoundingClientRect().top + window.scrollY;
window.scrollTo({
top: offsetTop,
behavior: 'smooth'
});
}
}
},
goPage(path, n) {
if (n) {
window.open(path)
} else {
this.$router.push({
path: path
})
}
},
newsList() {
if (!Object.keys(this.$store.state.classify).length) {
setTimeout(() => {
this.articleClassify = this.$store.state.classify
this.newsList()
}, 2000)
} else {
const findId = this.articleClassify[0].children.find(item => {
return item.display_name === '我是学校'
})
action.articleAction.getArticle({ category_id: findId.id }).then(res => {
this.data = res.data.list[0].content
})
}
}
},
watch: {
'$route': {
handler: function(val, oldVal){
this.pointScroll()
},
deep: true
}
}
}
</script>
<style lang="scss" scoped>
.content-max-width{
width: 1200px;
margin: 0 auto;
}
.title{
font-size: 24px;
font-weight: bold;
color: #333333;
line-height: 33px;
}
.all-btn{
width: 104px;
height: 40px;
background: linear-gradient(315deg, rgba(225, 47, 116, 0.83) 0%, #C01540 100%);
border-radius: 4px;
text-align: center;
line-height: 40px;
color: #fff;
font-size: 14px;
cursor: pointer;
&.autos{
margin: 0 auto;
}
}
.school-box{
background: #F8F8F9;
.module1{
padding: 36px 0;
.dosc{
// padding-bottom: 32px;
}
.p{
font-size: 18px;
color: #666666;
line-height: 36px;
margin: 16px 0;
}
.img{
width: 600px;
margin: 0 auto;
display: block;
}
.p1{
margin: 16px 0;
display: flex;
align-items: center;
.color-c{
line-height: 30px;
color: #666666;
font-size: 18px;
}
span{
font-size: 18px;
font-weight: bold;
color: #222222;
line-height: 30px;
&.text-index-2em{
text-indent: 2em;
}
}
}
}
.module2{
padding: 36px 0;
background: #fff;
.mar-t36{
margin-top: 36px;
}
.p1{
margin: 16px 0;
display: flex;
align-items: center;
.color-c{
line-height: 30px;
color: #666666;
font-size: 18px;
}
span{
font-size: 18px;
font-weight: bold;
color: #222222;
line-height: 30px;
&.text-index-2em{
text-indent: 2em;
}
}
}
.p{
font-size: 18px;
color: #666666;
line-height: 36px;
margin: 16px 0;
}
.con-btn{
// margin: 0 auto;
// margin-bottom: 16px;
}
.item{
display: flex;
margin-top: 16px;
img{
width: 326px;
height: 180px;
margin-left: 47px;
}
.content{
margin-left: 40px;
.text{
font-size: 18px;
color: #666666;
line-height: 36px;
}
.all-btn{
margin-top: 16px;
}
}
}
}
.module3{
padding: 46px 0 36px;
.text-box{
display: flex;
// align-items: center;
margin: 24px 0 16px;
.text{
font-size: 18px;
color: #666666;
line-height: 36px;
}
.all-btn{
margin-left: 25px;
}
}
.img-box{
display: flex;
justify-content: center;
img{
&:nth-child(1){
margin-right: 74px;
}
&:nth-child(2){
margin-top: 16px;
}
}
}
}
}
</style>
<template>
<div class="candida-box">
<div class="module1 content-max-width">
<div class="title" id="point5">考生报名</div>
<div class="dosc">
<img src="https://zws-imgs-pub.ezijing.com/static/public/0718c8ea2386caafca53c4a74abc5c69.png" alt="" />
<div class="cursor" @click="goPage('https://vslc.ncb.edu.cn/child-orgInfo?orgCode=330220946', 1)"></div>
<div class="cursor2" @click="goPage('https://vslc.ncb.edu.cn/child-orgInfo?orgCode=330220946', 1)"></div>
<div
class="btn1"
@click="goPage('https://zws-imgs-pub.ezijing.com/static/public/c1c74b9c5bf6b2f51d7b5545a9a963ef.docx', 1)"
></div>
<div
class="btn2"
@click="goPage('https://zws-imgs-pub.ezijing.com/static/public/3a959d34c5af16299d64841bf5ca542c.docx', 1)"
></div>
<div
class="btn3"
@click="goPage('https://zws-imgs-pub.ezijing.com/static/public/7585d6fd4f13ce6551820ae272c12ca1.docx', 1)"
></div>
</div>
<!-- <div class="p">
<span>考试报名对象:</span>
已申报1+X证书试点并通过考核站点验收的学校
</div>
<div class="p2">
<span>考试计划:</span>
<img src="https://zws-imgs-pub.ezijing.com/static/public/6e74b2e552bc3a2bf00062e3af03fe7b.png" alt="">
</div>
<div class="p2">
<span>考试计划:</span>
<div>请各试点院校根据学生学习情况,灵活选择考试时间,组织考试。<br/>
2021年1月份的1+X考试需在12月20日完成报名,报名后不能做任何变更,请各试点院校提前做好相关计划。<br/>
请在每场考试报名截止日期之前完成报名,并于考试当天准时参加考试。因个人原因导致的缺考,不予重新免费安排考试。<br/>
请在每场考试缴费截止日期之前完成缴费,并确保缴费人数与报名人数一致,否则不予安排考试。</div>
</div>
<div class="bm-btn">去报名</div>
<div class="p2 padd-b-36">
<span>缴费流程:</span>
<div class="process">
<span class="order"></span>
<div class="text">学生</div>
<div class="border"></div>
<span class="order"></span>
<div class="text">试点学校</div>
<div class="border"></div>
<span class="order"></span>
<div class="text">培训评价组织</div>
</div>
</div> -->
</div>
<div class="module2">
<div class="content-max-width" id="point1">
<div class="dosc">
<div id="point2" class="cursor" @click="goPage('https://login.ezijing.com/xlearn/register', 1)"></div>
<div class="cursor2" @click="goPage('https://vslc.ncb.edu.cn/childIndex?orgCode=330220946', 1)"></div>
<div class="cursor3" @click="goPage('https://x.ezijing.com/news?type=0', 1)"></div>
<div class="cursor4" @click="goPage('https://vslc.ncb.edu.cn/ncb_admin/#/login?systemType=3', 1)"></div>
<img src="https://zws-imgs-pub.ezijing.com/static/public/94b18249a87c56e05b620eafbcdb41c7.png" alt="" />
<div class="all-btn mar-at16-ab36" @click="goPage('https://x-exam.ezijing.com/login/6753212536302075904', 1)">
参加考试
</div>
</div>
<!-- <div class="title" id="point1">学习课程</div>
<div class="item flex">
<img class="img" src="https://zws-imgs-pub.ezijing.com/static/public/dc31668fb1d44405ad8b52c94d9c5e3b.png" alt="">
<div class="content-text">
<div class="text">
学习系统以学习课程和做题练题为主要功能。学习课程以视频展示,清晰、流畅且稳定。视频播放支持倍速、全屏切换、课程讲义和视频双频同步播放;视频章节中插入试卷随学随考;支持视频课程及PDF、PPT等文本课程学习(学生)。做题练题区分模拟测试和错题、收藏功能。模拟测试模拟真考流程,熟悉考试做题方式并评估成绩给定参考答案;错题练习系统自动记录错题,针对薄弱环节使学员多次加强练习。收藏试题主动添加试题。学习系统以帮助所有学员取得最好的成绩为目标,可随时联系客服反馈意见。
</div>
<div class="run-btn" @click="goPage('https://x-learning.ezijing.com/', 1)">进入系统</div>
</div>
</div>
<div class="title">参加考试</div>
<div class="process">
<div class="item">
<div class="icon-box">
<img src="https://zws-imgs-pub.ezijing.com/static/public/417180cc1fdf4078b26478923f1552de.png" alt="" class="icon">
</div>
<div class="name">关注考点通知</div>
</div>
<div class="border"></div>
<div class="item">
<div class="icon-box">
<img src="https://zws-imgs-pub.ezijing.com/static/public/df4fd1064d73a099666f3ba38fe106cd.png" alt="" class="icon">
</div>
<div class="name">考试报名</div>
</div>
<div class="border"></div>
<div class="item">
<div class="icon-box">
<img src="https://zws-imgs-pub.ezijing.com/static/public/a3ac60aa76afa4306d9d52e0693ad86f.png" alt="" class="icon">
</div>
<div class="name">打印准考证</div>
</div>
<div class="border"></div>
<div class="item">
<div class="icon-box">
<img src="https://zws-imgs-pub.ezijing.com/static/public/3319cf892c2535c1963ec8daef711264.png" alt="" class="icon">
</div>
<div class="name">参加考试</div>
</div>
</div> -->
</div>
</div>
<div class="module3 content-max-width" id="point3">
<div class="docs">
<img src="https://zws-imgs-pub.ezijing.com/static/public/dfaae45f0a5ed31c281f42e6de54f706.png" alt="" />
<div class="cursor" @click="goPage('https://vslc.ncb.edu.cn/csr-scoreCertificate', 1)"></div>
<div id="point4" class="all-btn mar-at16" @click="goPage('https://vslc.ncb.edu.cn/csr-verification', 1)">
证书查询
</div>
</div>
<!-- <div class="title mar-t36">成绩查询</div>
<div class="p">成绩查询请前往职业技能等级证书信息管理服务平台(网址: https://vslc.ncb.edu.cn/csr-scoreCertificate)进行查询。</div>
<img src="https://zws-imgs-pub.ezijing.com/static/public/e2c0c840ca551e344ffff6c03775030c.png" class="img1" alt="">
<div class="btn" @click="goPage('https://vslc.ncb.edu.cn/csr-scoreCertificate', 1)">去查询</div>
<div class="title">证书查询</div>
<div class="p">证书查询请前往职业技能等级证书信息管理服务平台(网址: https://vslc.ncb.edu.cn/csr-verification)进行查询。</div>
<img src="https://zws-imgs-pub.ezijing.com/static/public/8176a5a1080aeb1e67240d85d12ef468.png" alt="" class="img2">
<div class="btn" @click="goPage('https://vslc.ncb.edu.cn/csr-verification', 1)">去查询</div> -->
</div>
</div>
</template>
<script>
import action from '@action'
export default {
mounted() {
// this.newsList()
console.log(this.$route.query.point, 'this.$route.query.point')
if (this.$route.query.point) {
this.pointScroll()
}
},
data() {
return {
articleClassify: this.$store.state.classify,
data: ''
}
},
methods: {
pointScroll() {
if (this.$route.query.point !== undefined) {
const element = document.getElementById(`point${this.$route.query.point}`);
if (element) {
const offsetTop = element.getBoundingClientRect().top + window.scrollY;
window.scrollTo({
top: offsetTop,
behavior: 'smooth'
});
}
}
},
goPage(path, n) {
if (n) {
window.open(path)
} else {
this.$router.push({
path: path
})
}
},
newsList() {
if (!Object.keys(this.$store.state.classify).length) {
setTimeout(() => {
this.articleClassify = this.$store.state.classify
this.newsList()
}, 2000)
} else {
const findId = this.articleClassify[0].children.find(item => {
return item.display_name === '我是考生'
})
action.articleAction.getArticle({ category_id: findId.id }).then(res => {
this.data = res.data.list[0].content
})
}
}
},
watch: {
$route: {
handler: function(val, oldVal) {
this.pointScroll()
},
deep: true
}
}
}
</script>
<style lang="scss" scoped>
.content-max-width {
width: 1200px;
margin: 0 auto;
}
.candida-box {
.module1 {
padding-top: 37px;
position: relative;
.title {
font-size: 24px;
font-weight: bold;
color: #333333;
line-height: 33px;
}
.dosc {
padding-bottom: 32px;
padding-top: 25px;
position: relative;
font-size: 18px;
color: #666666;
line-height: 36px;
margin-top: 16px;
.cursor {
position: absolute;
bottom: 200px;
right: 300px;
width: 500px;
height: 30px;
// background: rgba(0,0,0,0.3);
cursor: pointer;
}
.cursor2 {
position: absolute;
bottom: 140px;
right: 300px;
width: 500px;
height: 30px;
// background: rgba(0,0,0,0.3);
cursor: pointer;
}
.btn1 {
position: absolute;
top: 250px;
left: 170px;
width: 70px;
height: 30px;
// background: rgba(0,0,0,0.3);
cursor: pointer;
}
.btn2 {
position: absolute;
top: 285px;
left: 170px;
width: 70px;
height: 30px;
// background: rgba(0,0,0,0.3);
cursor: pointer;
}
.btn3 {
position: absolute;
top: 325px;
left: 170px;
width: 70px;
height: 30px;
// background: rgba(0,0,0,0.3);
cursor: pointer;
}
}
.p {
font-size: 18px;
font-weight: bold;
color: #666666;
line-height: 30px;
margin-top: 16px;
span {
font-size: 18px;
font-weight: bold;
color: #222222;
line-height: 30px;
}
}
.p2 {
font-size: 18px;
font-weight: bold;
color: #666666;
line-height: 30px;
margin-top: 16px;
span {
font-size: 18px;
font-weight: bold;
color: #222222;
line-height: 30px;
}
display: flex;
margin-top: 16px;
}
.bm-btn {
cursor: pointer;
width: 104px;
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;
line-height: 40px;
text-align: center;
margin-left: 90px;
margin-top: 16px;
}
.process {
display: flex;
align-items: center;
.order {
color: #cccccc;
margin-right: 10px;
}
.text {
font-size: 18px;
color: #222222;
margin-right: 10px;
}
.border {
width: 100px;
height: 1px;
background: #ccc;
margin-right: 10px;
}
}
.padd-b-36 {
padding-bottom: 36px;
}
}
.module2 {
background: #fff;
padding: 24px 0 29px;
.dosc {
// padding-bottom: 32px;
// padding-top: 25px;
position: relative;
// font-size: 18px;
// color: #666666;
// line-height: 36px;
// margin-top: 16px;
.cursor {
position: absolute;
top: 660px;
left: 555px;
width: 104px;
height: 40px;
// background: rgba(0,0,0,0.1);
cursor: pointer;
}
.cursor2 {
position: absolute;
top: 1050px;
left: 25px;
width: 250px;
height: 40px;
// background: rgba(0,0,0,0.1);
cursor: pointer;
}
.cursor3 {
position: absolute;
top: 1125px;
left: 25px;
width: 200px;
height: 40px;
// background: rgba(0,0,0,0.1);
cursor: pointer;
}
.cursor4 {
position: absolute;
top: 1000px;
left: 330px;
width: 230px;
height: 40px;
// background: rgba(0,0,0,0.1);
cursor: pointer;
}
}
.title {
font-size: 24px;
font-weight: bold;
color: #333333;
line-height: 33px;
margin-bottom: 25px;
}
.process {
display: flex;
}
.item {
&.flex {
display: flex;
}
.img {
width: 326px;
height: 180px;
}
.content-text {
margin-left: auto;
width: 793px;
.text {
color: #666666;
font-size: 18px;
line-height: 36px;
}
.run-btn {
width: 104px;
height: 40px;
background: linear-gradient(315deg, rgba(225, 47, 116, 0.83) 0%, #c01540 100%);
border-radius: 4px;
line-height: 40px;
text-align: center;
color: #fff;
font-size: 14px;
font-weight: bold;
margin-top: 16px;
cursor: pointer;
margin-bottom: 36px;
}
}
}
.process {
display: flex;
justify-content: center;
.item {
.icon-box {
display: flex;
align-items: center;
justify-content: center;
width: 74px;
height: 74px;
background: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(153, 153, 153, 0.3);
border-radius: 50%;
margin: 0 auto;
img {
width: 40px;
display: block;
}
}
.name {
font-size: 18px;
font-weight: bold;
color: #222222;
line-height: 25px;
margin-top: 20px;
&.mar-10 {
margin-top: 10px;
}
}
}
.border {
width: 120px;
height: 2px;
background: #cccccc;
border-radius: 1px;
margin: 36px 30px 0;
}
}
}
.module3 {
padding-bottom: 36px;
.docs {
// padding-bottom: 32px;
padding-top: 36px;
position: relative;
// font-size: 18px;
// color: #666666;
// line-height: 36px;
// margin-top: 16px;
.cursor {
position: absolute;
top: 405px;
left: 550px;
width: 104px;
height: 40px;
// background: rgba(0,0,0,0.1);
cursor: pointer;
}
}
.title {
font-size: 24px;
font-weight: bold;
color: #333333;
line-height: 33px;
margin-bottom: 16px;
}
.p {
font-size: 18px;
color: #666666;
line-height: 36px;
}
.img1 {
width: 600px;
display: block;
margin: 16px auto;
}
.img2 {
width: 609px;
display: block;
margin: 16px auto;
}
.btn {
cursor: pointer;
margin: 0 auto;
width: 104px;
height: 40px;
background: linear-gradient(315deg, rgba(225, 47, 116, 0.83) 0%, #c01540 100%);
border-radius: 4px;
font-size: 14px;
text-align: center;
font-weight: bold;
color: #ffffff;
line-height: 40px;
}
}
}
.mar-t36 {
margin-top: 36px;
}
.all-btn {
width: 104px;
// padding: 0 24px;
height: 40px;
background: linear-gradient(315deg, rgba(225, 47, 116, 0.83) 0%, #c01540 100%);
border-radius: 4px;
line-height: 40px;
text-align: center;
color: #fff;
font-size: 14px;
// font-weight: bold;
margin-top: 16px;
cursor: pointer;
margin-bottom: 36px;
margin: 0 auto;
&.mar-at16-ab36 {
margin: 16px 0 36px 528px;
}
&.mar-at16 {
margin: 16px 0 36px 528px;
}
}
</style>
<template>
<div class="teacher-box">
<div class="module1 content-max-width" id="pointt0">
<img src="https://zws-imgs-pub.ezijing.com/static/public/895216245db6e0fa6551d61a3a5de958.png" alt="" />
<img
class="mar-t16"
src="https://zws-imgs-pub.ezijing.com/static/public/1b9f08b595bc674a2f26f58a14b7c974.png"
alt=""
/>
<!-- <div class="title">师资培训报名</div>
<div class="p">紫荆教育计划2021年共开展9期针对“金融产品数字化营销职业技能等级证书”的师资培训,具体安排如下:</div>
<img style="width:30%;display:block;margin:0 auto;" src="https://zws-imgs-pub.ezijing.com/static/public/50ce208136ab7e9c023450940d94fb14.png" alt="">
<p class="p">注:以上安排供参考,具体计划以紫荆教育官方通告为准。</p> -->
<!-- <div class="p1">
<span>培训报名对象:</span>
<div class="color-c">
相关对口金融专业的老师
</div>
</div> -->
<div class="new-liu">
<div class="title">五、培训费用</div>
<div class="new-p">详见每期师资培训通知。</div>
<!-- <div class="new-p"> 1.金融产品数字化营销职业技能等级证书信息管理服务平台<span @click="goPage('https://vslc.ncb.edu.cn/childIndex?orgCode=330220946', 1)">(https://vslc.ncb.edu.cn/childIndex?orgCode=330220946)</span></div> -->
<!-- <div class="new-p">2.紫荆教育官网<span>(https://x.ezijing.com/news?type=0)</span></div> -->
</div>
<div class="p1">
<span>通知关注:</span>
<div class="all-btn" @click="goPage('/news')">通知</div>
</div>
<div class="p1">
<span>报名入口:</span>
<div class="all-btn" @click="goPage('/train')">报名</div>
</div>
<!-- <div class="p1">
<span>金融产品数字化营销师资培训(第一期)</span>
</div>
<div style="margin-left:36px">
<div class="p1">
<span>培训类型:</span>
<div class="color-c">
初级
</div>
</div>
<div class="p1">
<span>培训地点:</span>
<div class="color-c">
深圳
</div>
</div>
<div class="p1">
<span>培训起始时间:</span>
<div class="color-c">
2021年3月22日-26日(3月21日报到)
</div>
</div>
<div class="p1">
<span>联系人:</span>
<div class="color-c">
王老师
</div>
</div>
</div> -->
<div class="title mar-t36-b26" id="pointt1">师资学习平台</div>
<div class="item">
<img src="https://zws-imgs-pub.ezijing.com/static/public/0e01f2de1b44db0e612e1638cc087517.png" alt="" />
<div class="content">
<div class="text">
紫荆教育为师生精心打造综合一体化学习平台,可实现考核体系的标准化,数据资源的统一化,师资学习的多元化,以及学习管理的系统化,最终形成学、练、训、考、评、管一体的数字化营销学习平台。
</div>
<div class="all-btn" @click="goPage('https://x-learning.ezijing.com/', 1)">进入系统</div>
</div>
</div>
</div>
<div class="module2">
<div class="content-max-width">
<!-- <div class="title" id="pointt1">师训结业测评</div>
<div class="p">老师参加完师资培训之后,需要从培训内容、教学设计、教授方法等方面进行全面测评,测评形式不限于小组讨论、个人答辩、试卷考试等,具体测评形式以当期师资培训方案为准。</div> -->
<!-- <div class="p1">
<span>通知关注:</span>
<div class="all-btn" @click="goPage('/news')">看通知</div>
</div> -->
<div class="title mar-t36-b16" id="pointt2">授权师资名单</div>
<div class="cert-box">
<img
style="margin: 0 16px"
src="https://zws-imgs-pub.ezijing.com/static/public/0b0412a8f5673b0bde98a2c57949f641.png"
alt=""
/>
<div class="content">
<div class="text">
紫荆教育1+X金融产品数字化营销职业技能等级证书师资培训为期3天,培训结束后一周内,公布授权师资名单。随后将结业证书邮寄到老师所在院校。
</div>
<div class="all-btn" style="margin-left: 80px;margin-top: 20px;">查询名单</div>
</div>
<div class="text"></div>
</div>
</div>
<div class="module3">
<div class="content-max-width">
<div class="title">开班授课</div>
<div class="item">
<div class="item">
<img src="https://zws-imgs-pub.ezijing.com/static/public/4da0818309b5b8f6ff494ae428dd24e0.png" alt="" />
<div class="content">
<div class="text">
获得培训资质后,老师可使用紫荆教育学习系统的辅助教学功能,完成对学生的授课教学。学习系统支持视频课程教学播放、PPT课程讲义播放、管理班级学员和开班课、了解进度等功能。
</div>
<div id="pointt3" class="all-btn" @click="goPage('https://x-learning.ezijing.com/', 1)">进入系统</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import action from '@action'
export default {
data() {
return {
articleClassify: this.$store.state.classify,
datas: ''
}
},
mounted() {
if (this.$route.query.point) {
setTimeout(() => {
this.pointScroll()
}, 500)
}
},
methods: {
pointScroll() {
if (this.$route.query.point !== undefined) {
const element = document.getElementById(`point${this.$route.query.point}`);
if (element) {
const offsetTop = element.getBoundingClientRect().top + window.scrollY;
window.scrollTo({
top: offsetTop,
behavior: 'smooth'
});
}
}
},
goPage(path, n) {
if (n) {
window.open(path)
} else {
this.$router.push({
path: path
})
}
},
newsList() {
debugger
if (!Object.keys(this.$store.state.classify).length) {
setTimeout(() => {
this.articleClassify = this.$store.state.classify
this.newsList()
}, 2000)
} else {
const findId = this.articleClassify[0].children.find(item => {
return item.display_name === '我是老师'
})
action.articleAction.getArticle({ category_id: findId.id }).then(res => {
this.datas = res.data.list[0].content
})
}
}
},
watch: {
$route: {
handler: function(val, oldVal) {
this.pointScroll()
},
deep: true
}
}
}
</script>
<style lang="scss" scoped>
.content-max-width {
width: 1200px;
margin: 0 auto;
}
.all-btn {
width: 104px;
height: 40px;
background: linear-gradient(315deg, rgba(225, 47, 116, 0.83) 0%, #c01540 100%);
border-radius: 4px;
text-align: center;
line-height: 40px;
color: #fff;
font-size: 14px;
cursor: pointer;
}
.mar-t16 {
margin-top: 16px;
}
.teacher-box {
.module1 {
padding: 36px 0;
.new-liu {
padding-top: 16px;
.title {
font-size: 18px;
color: rgba(63, 63, 63, 1);
}
.new-p {
line-height: 36px;
color: rgba(157, 157, 157, 1);
font-size: 18px;
span {
color: rgba(0, 133, 232, 1);
cursor: pointer;
}
}
}
.title {
font-weight: bold;
color: #333333;
line-height: 33px;
font-size: 24px;
&.mar-t36-b26 {
margin: 36px 0 26px;
}
}
.p {
font-size: 18px;
color: #666666;
line-height: 36px;
margin: 16px 0;
}
.p1 {
margin: 16px 0;
display: flex;
align-items: center;
.color-c {
line-height: 30px;
color: #666666;
font-size: 18px;
}
span {
font-size: 18px;
font-weight: bold;
color: #222222;
line-height: 30px;
}
}
.item {
display: flex;
img {
width: 326px;
height: 180px;
}
.content {
margin-left: auto;
width: 790px;
.text {
font-size: 18px;
color: #666666;
line-height: 36px;
}
.all-btn {
margin-top: 16px;
}
}
}
}
.module2 {
background: #fff;
padding: 36px 0;
.title {
font-size: 24px;
font-weight: bold;
color: #333333;
line-height: 33px;
&.mar-t36-b16 {
margin: 0px 0 16px;
}
}
.p {
font-size: 18px;
color: #666666;
line-height: 36px;
margin: 16px 0;
}
.p1 {
margin: 16px 0;
display: flex;
align-items: center;
.color-c {
line-height: 30px;
color: #666666;
font-size: 18px;
}
span {
font-size: 18px;
font-weight: bold;
color: #222222;
line-height: 30px;
}
}
.cert-box {
display: flex;
align-items: center;
img {
// width: 230px;
// height: 145px;
}
.text {
font-size: 18px;
color: #666666;
margin-left: 80px;
}
}
}
.module3 {
padding: 72px 0;
.title {
font-size: 24px;
font-weight: bold;
color: #333333;
line-height: 33px;
}
.item {
margin-top: 20px;
display: flex;
img {
width: 326px;
height: 180px;
}
.content {
margin-left: 76px;
.text {
font-size: 18px;
color: #666666;
line-height: 36px;
}
.all-btn {
margin-top: 16px;
}
}
}
}
}
</style>
<template>
<div class="hall-box">
<headBanner />
<div class="home-office-hall content-max-width">
<div class="title">办事大厅</div>
<div class="office-mian">
<ul class="tab-btn-box">
<li
v-for="(item, index) in offsetBtn"
:class="offsetTabIndex == index && 'active'"
:key="index"
@click="offsetTab(index)">
{{ item }}
</li>
</ul>
<ul class="item-box">
<template v-if="offsetTabIndex == 0">
<template v-for="(item, index) in examineeNav">
<template v-if="item.pathType === 3">
<li :key="index" @click="register">
<img :src="item.icon" alt="" class="img" />
<img :src="item.iconActive" alt="" class="img-active" />
<div class="text">
<span class="span1">{{ item.text }}</span>
<span class="span2">{{ item.textActive }}</span>
</div>
</li>
</template>
<template v-else>
<li :key="index" @click="goPage(item.path, item.pathType)">
<img :src="item.icon" alt="" class="img" />
<img :src="item.iconActive" alt="" class="img-active" />
<div class="text">
<span class="span1">{{ item.text }}</span>
<span class="span2">{{ item.textActive }}</span>
</div>
</li>
</template>
</template>
</template>
<template v-if="offsetTabIndex == 1">
<template v-for="(item, index) in teacherNav">
<template v-if="item.pathType === 3">
<li :key="index" @click="register">
<img :src="item.icon" alt="" class="img" />
<img :src="item.iconActive" alt="" class="img-active" />
<div class="text">
<span class="span1">{{ item.text }}</span>
<span class="span2">{{ item.textActive }}</span>
</div>
</li>
</template>
<template v-else-if="item.pathType === 4">
<li :key="index" @click="queryCard">
<img :src="item.icon" alt="" class="img" />
<img :src="item.iconActive" alt="" class="img-active" />
<div class="text">
<span class="span1">{{ item.text }}</span>
<span class="span2">{{ item.textActive }}</span>
</div>
</li>
</template>
<template v-else>
<li :key="index" @click="goPage(item.path, item.pathType)">
<img :src="item.icon" alt="" class="img" />
<img :src="item.iconActive" alt="" class="img-active" />
<div class="text">
<span class="span1">{{ item.text }}</span>
<span class="span2">{{ item.textActive }}</span>
</div>
</li>
</template>
</template>
</template>
<template v-if="offsetTabIndex == 2">
<template v-for="(item, index) in schoolNav">
<template v-if="item.pathType === 3">
<li :key="index" @click="register">
<img :src="item.icon" alt="" class="img" />
<img :src="item.iconActive" alt="" class="img-active" />
<div class="text">
<span class="span1">{{ item.text }}</span>
<span class="span2">{{ item.textActive }}</span>
</div>
</li>
</template>
<template v-else>
<li :key="index" @click="goPage(item.path, item.pathType)">
<img :src="item.icon" alt="" class="img" />
<img :src="item.iconActive" alt="" class="img-active" />
<div class="text">
<span class="span1">{{ item.text }}</span>
<span class="span2">{{ item.textActive }}</span>
</div>
</li>
</template>
</template>
</template>
</ul>
</div>
</div>
<student-help ref="help" v-show="offsetTabIndex == 0"></student-help>
<teacher-help ref="help" v-show="offsetTabIndex == 1"></teacher-help>
<school-help ref="help" v-show="offsetTabIndex == 2"></school-help>
<vue-passport ref="passport" @ready="onReady" :options="options"></vue-passport>
</div>
</template>
<script>
import action from '@action'
import headBanner from '@/components/headBanner.vue'
import studentHelp from './components/studentHelp.vue'
import teacherHelp from './components/teacherHelp.vue'
import schoolHelp from './components/schoolHelp.vue'
export default {
components: {
headBanner,
studentHelp,
teacherHelp,
schoolHelp,
},
data() {
return {
offsetTabIndex: 0,
offsetBtn: ['我是考生', '我是老师', '我是学校'],
examineeNav: [
{
icon: 'https://zws-imgs-pub.ezijing.com/static/public/8617726397bcc6fa81020934c57d92bd.png',
iconActive: 'https://zws-imgs-pub.ezijing.com/static/public/ef0878be9e9fa6deab5b9dcfac9af12b.png',
text: '注册账号',
path: '/register',
textActive: '注册后方可报名',
pathType: 3,
},
{
icon: 'https://zws-imgs-pub.ezijing.com/static/public/5c7db419e6af3214fa53b1d4920cf7b5.png',
iconActive: 'https://zws-imgs-pub.ezijing.com/static/public/76256d877bd6787af42d2f6010108a8b.png',
text: '考生报名',
path: '/hall?role=0&point=5',
textActive: '可选择学校统一报名或在对应的考点报名',
},
{
icon: 'https://zws-imgs-pub.ezijing.com/static/public/b5a6b0bf40f24545fd10cbf315e5839c.png',
iconActive: 'https://zws-imgs-pub.ezijing.com/static/public/556e2554d2545d3d3a726dbcbaf20494.png',
text: '学习课程',
path: '/hall?role=0&point=1',
textActive: '进入学习系统学习',
},
{
icon: 'https://zws-imgs-pub.ezijing.com/static/public/9c4d618281f12680a367d212545cf041.png',
iconActive: 'https://zws-imgs-pub.ezijing.com/static/public/53dd24cbf9c4c1a6ed078ab3b6049e95.png',
text: '参加考试',
path: '/hall?role=0&point=2',
textActive: '关注考点和考场安排,准备考试材料',
},
{
icon: 'https://zws-imgs-pub.ezijing.com/static/public/6bf9fedcbff1d13de413667b33787db3.png',
iconActive: 'https://zws-imgs-pub.ezijing.com/static/public/3639914b6dbe79d4b2e745159fd49230.png',
text: '成绩查询',
path: '/hall?role=0&point=3',
textActive: '进入成绩查询系统',
},
{
icon: 'https://zws-imgs-pub.ezijing.com/static/public/1e6d8f785a106b17eb698d1d563ff479.png',
iconActive: 'https://zws-imgs-pub.ezijing.com/static/public/e3088887b1e2fc9711c7ad692e2e53cd.png',
text: '证书查询',
path: '/hall?role=0&point=4',
textActive: '进入证书查询系统',
},
],
teacherNav: [
{
icon: 'https://zws-imgs-pub.ezijing.com/static/public/2da6e70cac93900bdb1867458c9b7449.png',
iconActive: 'https://zws-imgs-pub.ezijing.com/static/public/c92aa5f2800a9a5bbedce54bfa0d499b.png',
text: '注册账号',
path: '/register',
pathType: 3,
textActive: '注册后方可报名',
},
{
icon: 'https://zws-imgs-pub.ezijing.com/static/public/284f07548eb240cc384a102f1b7efdda.png',
iconActive: 'https://zws-imgs-pub.ezijing.com/static/public/0c9823481d85f209b4a498945f31ea83.png',
text: '师资培训报名',
path: '/hall?role=1&point=t0',
textActive: '提交报名资料,等待审核通知和培训通知',
},
{
icon: 'https://zws-imgs-pub.ezijing.com/static/public/b278993ee5c29349ff83d1d9b4b596c9.png',
iconActive: 'https://zws-imgs-pub.ezijing.com/static/public/8d24a5c20a8ab87d26db73ccfacd2fba.png',
text: '师资学习平台',
path: '/hall?role=1&point=t1',
textActive: '提供师资培训资料,辅助老师学习',
},
// {
// icon: 'https://zws-imgs-pub.ezijing.com/static/public/6f9583c270a3302a352ae9bbba64099d.png',
// iconActive: 'https://zws-imgs-pub.ezijing.com/static/public/8a16c6cd1dc986075a002fe314f21d0d.png',
// text: '参加考试',
// path: '/hall?role=1&point=t1&home=1',
// textActive: '培训后参加统一考试'
// },
{
icon: 'https://zws-imgs-pub.ezijing.com/static/public/06f7b0220ab6d8d9d34f6d68258f2669.png',
iconActive: 'https://zws-imgs-pub.ezijing.com/static/public/130affba0b6cefd278c31ddfab74acfc.png',
text: '授权师资名单',
path: '/hall?role=1&point=t2',
textActive: '授予培训资格证书老师名单',
},
{
icon: 'https://zws-imgs-pub.ezijing.com/static/public/70c3defef24fd1438ada43b3e1ccff87.png',
iconActive: 'https://zws-imgs-pub.ezijing.com/static/public/fe6b2d4c31d7f6369468c675d5876671.png',
text: '开班授课',
path: '/hall?role=1&point=t3',
textActive: '进入学习平台',
},
{
icon: 'https://zws-imgs-pub.ezijing.com/static/public/1e6d8f785a106b17eb698d1d563ff479.png',
iconActive: 'https://zws-imgs-pub.ezijing.com/static/public/e3088887b1e2fc9711c7ad692e2e53cd.png',
text: '证书查询',
path: this.isLogin ? this.queryCard() : '/hall?role=1&point=t4',
pathType: 4,
textActive: '进入证书查询系统',
},
],
schoolNav: [
{
icon: 'https://zws-imgs-pub.ezijing.com/static/public/00e366f3cc15ab30c1fd285d10989bed.png',
iconActive: 'https://zws-imgs-pub.ezijing.com/static/public/66dd597f670a07584897d03a4c6bd9ab.png',
text: '注册账号',
path: '/register',
pathType: 3,
textActive: '注册后方可申报',
},
{
icon: 'https://zws-imgs-pub.ezijing.com/static/public/1dc324792168ee1e6a07b5975e6e3d8b.png',
iconActive: 'https://zws-imgs-pub.ezijing.com/static/public/02e1e75b3aed4a92f3038589091be1f2.png',
text: '试点申报',
path: '/hall?role=2&point=s5',
textActive: '提交报名资料,等待审核通知',
},
{
icon: 'https://zws-imgs-pub.ezijing.com/static/public/17e3d75022ee88d4661bff4ca61f0966.png',
iconActive: 'https://zws-imgs-pub.ezijing.com/static/public/073a7d9317d0ff8d8876c4ce53d15bc2.png',
text: '考点申报',
path: '/hall?role=2&point=s1',
textActive: '提交资料,等待审核通知',
},
// {
// icon: 'https://zws-imgs-pub.ezijing.com/static/public/ea6a2917391444208d9084c3205227b2.png',
// iconActive: 'https://zws-imgs-pub.ezijing.com/static/public/55065b21e5ba9bc735a3d3527f07af79.png',
// text: '集中报名师训',
// path: '/hall?role=2&point=s2',
// textActive: '给老师分配帐号进入学习系统学习和线下统一培训'
// },
{
icon: 'https://zws-imgs-pub.ezijing.com/static/public/cc4885f2f4b6f566954cdb15381916f8.png',
iconActive: 'https://zws-imgs-pub.ezijing.com/static/public/901044f1465a5497fef8135f9e2ce4ff.png',
text: '统一实施教学',
path: '/hall?role=2&point=s3',
textActive: '发通知组织统一上课',
},
{
icon: 'https://zws-imgs-pub.ezijing.com/static/public/1505fd4535d858b4939e46f2534bfcaf.png',
iconActive: 'https://zws-imgs-pub.ezijing.com/static/public/3c3d204e15a400a7f74b4a9dad44cd55.png',
text: '批量报名考试',
path: '/hall?role=2&point=s4',
textActive: '统计学员后统一报名',
},
],
isLogin: false,
options: {
baseUrl: import.meta.env.VITE_API_BASE_URL,
register: {
data: {
username: `ezijing-${new Date().getTime()}`,
},
fields: ['account', 'code', 'password'],
},
login: {
account: {
onSuccess: this.loginSuccess,
},
phone: {
onSuccess: this.loginSuccess,
},
},
},
}
},
computed: {
passport() {
return this.$refs.passport
},
},
created() {
action.articleAction.getUserInfo().then((res) => {
if (res && res.code === 0) {
window.sessionStorage.userInfo = JSON.stringify(res.data)
this.isLogin = true
}
})
},
mounted() {
this.offsetTabIndex = parseInt(this.$route.query.role) || 0
},
methods: {
loginSuccess(data) {
this.passport.checkLoginStatus((isLogin, user = {}) => {
window.sessionStorage.userInfo = JSON.stringify(user)
this.isLogin = isLogin
this.user = user
this.$router.push('/my')
})
window.location.reload()
},
onReady(isLogin, user = {}) {
this.user = user
window.sessionStorage.userInfo = JSON.stringify(user)
},
queryCard() {
if (this.isLogin) {
this.$router.push('/queryCard')
} else {
this.passport.login()
}
},
register() {
this.$router.push({
query: Object.assign(this.$route.query, {
register: this.$route.query.register ? this.$route.query.register++ : 1,
}),
})
},
offsetTab(n) {
this.offsetTabIndex = n
this.$router.push({
query: Object.assign({}, { role: n }),
})
},
goPage(path, n) {
if (n) {
window.open(path)
} else {
this.$router.push({
path: path,
})
this.$refs.help.pointScroll()
}
},
},
watch: {
$route: {
handler: function (val, oldVal) {
this.offsetTabIndex = this.$route.query.role || 0
},
deep: true,
},
},
}
</script>
<style lang="scss" scoped>
.hall-box {
background: #f8f8f9;
}
.content-max-width {
width: 1200px;
margin: 0 auto;
}
.home-office-hall {
.title {
font-size: 24px;
font-weight: bold;
color: #444444;
line-height: 33px;
padding: 36px 0 16px;
}
.office-mian {
display: flex;
}
.tab-btn-box {
padding-top: 24px;
li {
width: 96px;
height: 40px;
background: none;
border-radius: 23px;
text-align: center;
line-height: 40px;
font-size: 16px;
color: #444444;
cursor: pointer;
&.active {
color: #fff;
background: #a81a42;
border-radius: 23px;
}
}
}
.item-box {
display: flex;
margin-left: 7px;
li {
width: 168px;
height: 168px;
background: #ffffff;
box-shadow: 0px 2px 6px 0px rgba(0, 0, 0, 0.09);
border-radius: 4px;
margin-left: 16px;
transition: all 0.5s;
&:hover {
background: #a81a42;
transform: translateY(-10px);
.img {
display: none;
margin: 43px auto 15px auto;
}
.img-active {
display: block;
}
.text {
color: #fff;
.span1 {
display: none;
}
.span2 {
display: block;
}
}
}
img {
height: 50px;
display: block;
margin: 43px auto 20px auto;
}
.img-active {
display: none;
}
.text {
text-align: center;
font-size: 16px;
color: #444444;
line-height: 18px;
.span2 {
display: none;
}
.span1 {
display: block;
}
}
}
}
}
</style>
......@@ -82,7 +82,7 @@
</template>
<script>
import action from '@action'
import * as api from '@/api/article'
import headBanner from '@/components/headBanner.vue'
export default {
components: { headBanner },
......@@ -117,7 +117,7 @@ export default {
},
},
created() {
action.articleAction.getUserInfo().then((res) => {
api.getUserInfo().then((res) => {
if (res && res.code === 0) {
this.isLogin = true
}
......@@ -188,7 +188,7 @@ export default {
const findId = this.articleClassify[0].children.find((item) => {
return item.display_name === (this.newsTabIndex ? '工作动态' : '新闻动态')
})
action.articleAction.getArticle({ category_id: findId ? findId.id : 23 }).then((res) => {
api.getArticle({ category_id: findId ? findId.id : 23 }).then((res) => {
this.list = res.data.list
})
}
......
......@@ -25,7 +25,7 @@
<script>
import printJS from 'print-js'
import action from '@action'
import * as api from '@/api/article'
import { saveAs } from 'file-saver'
export default {
......@@ -44,7 +44,7 @@ export default {
// 获取证书列表
handleGetCard() {
const params = { project_prefix: 'x1' }
action.articleAction.getCard(params).then((res) => {
api.getCard(params).then((res) => {
this.cardList = res.data?.list
})
},
......
......@@ -9,11 +9,11 @@
</div>
</template>
<script>
import action from '@action'
import * as api from '@/api/article'
import breadcrumb from '@/components/breadcrumb.vue'
export default {
components: {
breadcrumb
breadcrumb,
},
data() {
return {
......@@ -21,12 +21,12 @@ export default {
crumbData: [
{
path: '/',
name: '首页'
name: '首页',
},
{
name: parseInt(this.$route.query.tabs) === 1 ? '工作动态' : '通知公告'
}
]
name: parseInt(this.$route.query.tabs) === 1 ? '工作动态' : '通知公告',
},
],
}
},
mounted() {
......@@ -35,21 +35,21 @@ export default {
this.crumbData = [
{
path: '/',
name: '首页'
name: '首页',
},
{
name: parseInt(this.$route.query.tabs) === 1 ? '工作动态' : '通知公告'
}
name: parseInt(this.$route.query.tabs) === 1 ? '工作动态' : '通知公告',
},
]
}
},
methods: {
getData() {
action.articleAction.getArticleDetail(this.$route.query.id).then(res => {
api.getArticleDetail(this.$route.query.id).then((res) => {
this.data = res.data
})
}
}
},
},
}
</script>
<style lang="scss" scoped>
......
......@@ -20,20 +20,20 @@ import headBanner from '@/components/headBanner.vue'
import item from './components/listItem.vue'
import btnTabs from '@/components/tabs/btnTabs.vue'
import breadcrumb from '@/components/breadcrumb.vue'
import action from '@action'
import * as api from '@/api/article'
export default {
components: {
item,
btnTabs,
breadcrumb,
headBanner
headBanner,
},
data() {
return {
articleClassify: this.$store.state.classify,
tabsData: {
options: ['通知公告', '工作动态'],
index: 0
index: 0,
},
tabsDataIndex: 0,
list: [],
......@@ -41,12 +41,12 @@ export default {
crumbData: [
{
path: '/',
name: '首页'
name: '首页',
},
{
name: '工作动态'
}
]
name: '工作动态',
},
],
}
},
created() {
......@@ -67,7 +67,7 @@ export default {
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
background: 'rgba(0, 0, 0, 0.7)',
})
if (!Object.keys(this.$store.state.classify).length) {
setTimeout(() => {
......@@ -77,11 +77,11 @@ export default {
} else {
console.log(this.tabsDataIndex)
console.log(this.articleClassify[0].children)
const findId = this.articleClassify[0].children.find(item => {
const findId = this.articleClassify[0].children.find((item) => {
return item.display_name === (this.tabsDataIndex ? '工作动态' : '新闻动态')
})
console.log(findId.id)
action.articleAction.getArticle({ category_id: findId.id }).then(res => {
api.getArticle({ category_id: findId.id }).then((res) => {
this.list = res.data.list
this.pages = res.data.pages
this.$nextTick(() => {
......@@ -90,20 +90,20 @@ export default {
loading.close()
})
}
}
},
},
watch: {
$route: {
handler: function(val, oldVal) {
handler: function (val, oldVal) {
if (this.$route.query.type !== undefined || this.$route.query.type !== 'undefined') {
this.tabsData.index = parseInt(this.$route.query.type)
this.tabsDataIndex = parseInt(this.$route.query.type)
this.newsList()
}
},
deep: true
}
}
deep: true,
},
},
}
</script>
<style lang="scss" scoped>
......
......@@ -33,7 +33,7 @@
</template>
<script>
import { postNes } from '@/api'
import { postNes } from '@/api/article'
export default {
components: {},
data() {
......
......@@ -20,7 +20,7 @@
</div>
</template>
<script>
import action from '@action'
import * as api from '@/api/article'
export default {
data() {
return {
......@@ -50,7 +50,7 @@ export default {
const findId = this.articleClassify[0].children.find((item) => {
return item.display_name === (this.newsTabIndex ? '工作动态' : '新闻动态')
})
action.articleAction.getArticle({ category_id: findId ? findId.id : 23 }).then((res) => {
api.getArticle({ category_id: findId ? findId.id : 23 }).then((res) => {
this.list = res.data.list
})
}
......
<template>
<div class="chapter-box">
<breadcrumb class="content-max-width crumb" :data="crumbData" />
<div class="intr">
<div class="title">
<div class="content-max-width">资源介绍</div>
</div>
<div class="content content-max-width">
<div class="con-left">
<div class="text-box">
<div class="name">所属课程:</div>
<div class="nr">金融数字化营销</div>
</div>
<div class="text-box">
<div class="name">上传时间:</div>
<div class="nr">2020/09/03</div>
</div>
<div class="text-box">
<div class="name">浏览数:</div>
<div class="nr">35</div>
</div>
</div>
<div class="v-code-box">
<div class="code"></div>
<div class="text">手机扫码浏览</div>
</div>
</div>
</div>
<div class="screenshot">
<div class="title">
<div class="content-max-width">屏幕截图</div>
</div>
<div class="content-max-width">
<div class="block"></div>
</div>
</div>
</div>
</template>
<script>
import breadcrumb from '@/components/breadcrumb.vue'
export default {
components: {
breadcrumb
},
data() {
return {
crumbData: [
{
path: '/',
name: '首页'
},
{
path: '/textBook',
name: '教材中心'
},
{
path: '/textBook/detail',
name: '金融数字化营销'
},
{
name: '目录'
}
]
}
}
}
</script>
<style lang="scss" scoped>
.crumb {
padding-bottom: 24px;
}
.content-max-width {
width: 1109px;
margin: 0 auto;
}
.chapter-box {
padding-top: 24px;
.intr {
.title {
width: 100%;
height: 40px;
background: #f9f9f9;
.content-max-width {
line-height: 40px;
font-size: 14px;
font-weight: bold;
color: #c0004f;
}
}
.content {
display: flex;
.con-left {
width: 427px;
margin-left: 56px;
.text-box {
margin-top: 12px;
display: flex;
.name {
font-size: 14px;
font-weight: bold;
color: #222222;
line-height: 20px;
}
.nr {
font-size: 14px;
font-family: PingFangSC-Regular, PingFang SC;
color: #717171;
line-height: 20px;
}
}
}
.v-code-box {
width: 136px;
margin-top: 12px;
.code {
width: 136px;
height: 136px;
background: #d8d8d8;
}
.text {
font-size: 14px;
color: #222222;
line-height: 20px;
text-align: center;
margin-top: 8px;
}
}
}
}
.screenshot {
margin-top: 24px;
.title {
width: 100%;
height: 40px;
background: #f9f9f9;
.content-max-width {
line-height: 40px;
font-size: 14px;
font-weight: bold;
color: #c0004f;
}
}
.block {
width: 444px;
height: 250px;
background: #d8d8d8;
margin: 12px auto;
}
}
}
</style>
<template>
<div class="item-box">
<img src="https://zws-imgs-pub.ezijing.com/static/public/7c63bd40600a040f867fe4db9014fb7c.png" alt="">
<div class="right-content">
<div class="title">《金融产品数字化营销职业技能等级认证教材》(初级)</div>
<div class="des-box">
<p class="ind">作者:基础数据维护及档案管理</p>
<p>出版时间:基础数据维护及档案管理</p>
<p class="ind">ISBN:基础数据维护及档案管理</p>
<p>书籍简介:基础数据维护及档案管理</p>
</div>
<router-link to="/textBook/detail">
<div class="detail-btn">查看详情</div>
</router-link>
</div>
</div>
</template>
<script>
export default {
data() {
return {
input: ''
}
}
}
</script>
<style lang="scss" scoped>
.item-box{
padding: 24px 0;
border-bottom: 1px solid #eee;
display: flex;
img{
width: 383px;
height: 213px;
display: block;
}
.right-content{
margin-left: 24px;
.title{
font-size: 18px;
font-weight: bold;
color: #C01540;
line-height: 25px;
}
.des-box{
margin-top: 24px;
p{
font-size: 14px;
color: #666666;
line-height: 20px;
margin-bottom: 8px;
&.ind{
text-indent: 2em;
}
}
}
.detail-btn{
color: #fff;
text-align: center;
line-height: 36px;
width: 96px;
height: 36px;
background: linear-gradient(315deg, rgba(225, 47, 116, 0.83) 0%, #C01540 100%);
border-radius: 4px;
margin-top: 16px;
}
}
}
</style>
<template>
<div class="search-box">
<div class="name">教材搜索</div>
<el-input
class="input"
placeholder="请输入内容"
v-model="input">
<i slot="prefix" class="el-input__icon el-icon-search"></i>
</el-input>
<div class="search-btn">查询</div>
</div>
</template>
<script>
export default {
data() {
return {
input: ''
}
}
}
</script>
<style lang="scss" scoped>
.search-box{
display: flex;
justify-content: center;
align-items: center;
.input{
width: 360px;
border-radius: 4px;
margin: 0 12px;
}
.search-btn{
text-align: center;
line-height: 32px;
width: 60px;
height: 32px;
background: linear-gradient(312deg, rgba(192, 21, 64, 0.67) 0%, #C01540 100%);
border-radius: 4px;
font-size: 14px;
color: #FFFFFF;
cursor: pointer;
}
}
</style>
<template>
<div class="book-detail-box content-max-width">
<breadcrumb class="content-max-width crumb" :data="crumbData" />
<div class="bool-det-top">
<div class="item-box">
<img src="https://zws-imgs-pub.ezijing.com/static/public/7c63bd40600a040f867fe4db9014fb7c.png" alt="" />
<div class="right-content">
<div class="title">《金融产品数字化营销职业技能等级认证教材》(初级)</div>
<div class="des-box">
<p>
<span>教材简介:</span
><i
>往价计子断选社界他界四收半很导条回于问个地给资政色金美关做除当打目商马层消酸龙信样世手除制二美信很按划从专我。时先革自好利治条每部教最运则府完接上立什线为象律然对就率则适第变一需党事连识接月报专各口细信要指有飞应组必飞队知从好作用直矿里。已量少查市平料通题界期下干</i
>
</p>
<p><span>定价:</span><i>199¥</i></p>
<p><span>作者:</span><i>基础数据维护及档案管理</i></p>
<p><span>出版时间:</span><i>基础数据维护及档案管理</i></p>
<p><span>ISBN:</span><i>基础数据维护及档案管理</i></p>
</div>
</div>
</div>
<div class="v-code-box">
<div class="block"></div>
<div class="text">手机扫码浏览</div>
</div>
</div>
<div class="book-det-bottom">
<div class="catalog">
<div class="title">目录</div>
<ul>
<li>
<div class="chapter">第一章</div>
<div class="node" @click="goChapter">第一节</div>
</li>
<li>
<div class="chapter">第一章</div>
<div class="node" @click="goChapter">第一节</div>
</li>
<li>
<div class="chapter">第一章</div>
<div class="node" @click="goChapter">第一节</div>
</li>
</ul>
</div>
<div class="author">
<div class="title">作者</div>
<div class="item">
<div class="info-box">
<img src="https://zws-imgs-pub.ezijing.com/static/public/f064b2cb83039e1d4754993167d73864.png" alt="" />
<div class="info">
<div class="name">赵瑾龙</div>
<div class="xx">研究院</div>
</div>
</div>
<div class="intr">
<div class="name">简介:</div>
<div class="text">
往价计子断选社界他界四收半很导条回于问个地给资政色金美关做除当打目商马层消酸龙信样世手除制二美信很按划从专我。
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import breadcrumb from '@/components/breadcrumb.vue'
export default {
components: {
breadcrumb
},
data() {
return {
crumbData: [
{
path: '/',
name: '首页'
},
{
path: '/textBook',
name: '教材中心'
},
{
name: '金融数字化营销'
}
]
}
},
methods: {
goChapter() {
this.$router.push({
path: '/textBook/chapter'
})
}
}
}
</script>
<style lang="scss" scoped>
.content-max-width {
width: 1109px;
margin: 0 auto;
}
.book-det-bottom {
display: flex;
.catalog {
.title {
font-size: 18px;
font-weight: bold;
color: #c80046;
line-height: 25px;
margin-bottom: 24px;
}
ul {
li {
width: 729px;
padding: 16px 0;
border-top: 1px solid #eee;
.chapter {
font-size: 18px;
font-weight: bofld;
color: #262626;
line-height: 25px;
}
.node {
font-size: 14px;
color: #7d7d7d;
line-height: 20px;
margin-top: 12px;
cursor: pointer;
}
}
}
}
.author {
margin-left: auto;
.title {
font-size: 18px;
font-weight: bold;
color: #c80046;
line-height: 25px;
margin-bottom: 24px;
}
.item {
width: 280px;
border-top: 1px solid #eee;
margin-top: 24px;
.info-box {
padding-top: 16px;
display: flex;
align-items: center;
img {
width: 80px;
height: 80px;
}
.info {
margin-left: 16px;
.name {
font-size: 18px;
font-weight: bold;
color: #2b2b2b;
line-height: 25px;
}
.xx {
font-size: 14px;
color: #888888;
line-height: 20px;
margin-top: 12px;
}
}
}
.intr {
margin-top: 16px;
display: flex;
.name {
font-size: 14px;
font-weight: bold;
color: #262626;
line-height: 20px;
white-space: nowrap;
}
.text {
font-size: 14px;
color: #7d7d7d;
line-height: 20px;
}
}
}
}
}
.bool-det-top {
display: flex;
padding-top: 24px;
}
.book-detail-box {
.v-code-box {
width: 136px;
margin-left: auto;
// margin-top: 24px;
.block {
width: 136px;
height: 136px;
background: #d8d8d8;
border: 1px solid #979797;
}
.text {
font-size: 14px;
color: #222222;
line-height: 20px;
margin-top: 8px;
text-align: center;
}
}
.item-box {
// padding: 24px 0;
// border-bottom: 1px solid #eee;
display: flex;
img {
width: 258px;
height: 143px;
display: block;
}
.right-content {
margin-left: 24px;
.title {
font-size: 18px;
font-weight: bold;
color: #c01540;
line-height: 25px;
}
.des-box {
margin-top: 24px;
p {
font-size: 14px;
color: #666666;
line-height: 20px;
margin-bottom: 8px;
display: flex;
span {
width: 70px;
font-size: 14px;
font-weight: bold;
color: #222222;
line-height: 20px;
white-space: nowrap;
}
i {
max-width: 400px;
font-style: normal;
font-size: 14px;
color: #717171;
line-height: 20px;
}
}
}
.detail-btn {
color: #fff;
text-align: center;
line-height: 36px;
width: 96px;
height: 36px;
background: linear-gradient(315deg, rgba(225, 47, 116, 0.83) 0%, #c01540 100%);
border-radius: 4px;
margin-top: 16px;
}
}
}
}
.crumb {
padding-top: 24px;
}
</style>
<template>
<div class="book-box">
<breadcrumb class="content-max-width crumb" :data="crumbData" />
<search />
<screen-tabs class="tabs-box" :data="tabsData"></screen-tabs>
<ul class="list-box content-max-width">
<li>
<item />
</li>
<li>
<item />
</li>
</ul>
<div class="pagination">
<el-pagination :page-size="100" layout="prev, pager, next, jumper" :total="1000"> </el-pagination>
</div>
</div>
</template>
<script>
import search from './components/search.vue'
import item from './components/item.vue'
import screenTabs from '@/components/tabs/screenTabs.vue'
import breadcrumb from '@/components/breadcrumb.vue'
export default {
components: {
search,
item,
screenTabs,
breadcrumb
},
data() {
return {
tabsIndex: 0,
tabsData: {
name: '出版时间',
options: ['全部', '2020年', '2019年', '2018年']
},
crumbData: [
{
path: '/',
name: '首页'
},
{
name: '教材中心'
}
]
}
},
methods: {
tabs(n) {
this.tabsIndex = n
}
}
}
</script>
<style lang="scss" scoped>
.content-max-width {
width: 1109px;
margin: 0 auto;
}
.book-box {
padding-top: 24px;
.tabs-box {
margin-top: 24px;
// margin-bottom: 30px;
}
// .tabs-box{
// margin-top: 24px;
// margin-bottom: 30px;
// 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;
// }
// }
// }
// }
// }
}
.pagination {
padding: 24px 0;
display: flex;
justify-content: center;
}
</style>
......@@ -41,20 +41,20 @@
</div>
</template>
<script>
import action from '@action'
import * as api from '@/api/article'
import QrcodeVue from 'qrcode.vue'
export default {
components: {
QrcodeVue
QrcodeVue,
},
props: {
formData: {
type: Object
type: Object,
},
periods: {
type: Number,
default: '1'
}
default: '1',
},
},
data() {
return {
......@@ -62,7 +62,7 @@ export default {
isCodeShow: false,
product_id: '6787934443077107712',
payInfo: {},
time: null
time: null,
}
},
methods: {
......@@ -73,15 +73,15 @@ export default {
const param = {
pay_type: this.payMethod,
product_id: this.product_id,
form_id: this.formData.id && this.formData.id.toString()
form_id: this.formData.id && this.formData.id.toString(),
}
const loading = this.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
background: 'rgba(0, 0, 0, 0.7)',
})
action.articleAction.getOrder(param).then(res => {
api.getOrder(param).then((res) => {
if (res.code === 200) {
this.payInfo = res.data
this.isCodeShow = true
......@@ -98,13 +98,13 @@ export default {
})
},
checkPay(id, order_no) {
action.articleAction.checkPay(id).then(res => {
api.checkPay(id).then((res) => {
if (res.code === 0) {
const [order = {}] = res.data
if (order.status === 1) {
this.$message({
message: '支付成功',
type: 'success'
type: 'success',
})
this.payEnd(order_no)
this.$emit('payStatus')
......@@ -124,14 +124,14 @@ export default {
payEnd(orderOn) {
const param = {
order_no: orderOn,
form_id: this.formData.id.toString()
form_id: this.formData.id.toString(),
}
action.articleAction.payEnd(param).then(res => {})
}
api.payEnd(param).then((res) => {})
},
},
beforeDestroy() {
// clearInterval(this.time)
}
},
}
</script>
<style lang="scss" scoped>
......
......@@ -73,36 +73,36 @@
</template>
<script>
import item from './components/item.vue'
import action from '@action'
import * as api from '@/api/article'
import breadcrumb from '@/components/breadcrumb.vue'
import datalist from './data.js'
export default {
components: {
item,
breadcrumb
breadcrumb,
},
data() {
return {
datalist,
crumbData: [{ path: '/', name: '首页' }, { name: '师资培训' }]
crumbData: [{ path: '/', name: '首页' }, { name: '师资培训' }],
}
},
computed: {
detail() {
const id = this.$route.query.id
return this.datalist.find(item => item.id === id) || {}
}
return this.datalist.find((item) => item.id === id) || {}
},
},
mounted() {
// this.getData()
},
methods: {
getData() {
action.articleAction.getArticleDetail(this.$route.query.id).then(res => {
api.getArticleDetail(this.$route.query.id).then((res) => {
this.data = res.data
})
}
}
},
},
}
</script>
<style lang="scss" scoped>
......
......@@ -37,7 +37,7 @@
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item style="height:10px;">
<el-form-item style="height: 10px">
<div class="line">发票信息填写</div>
</el-form-item>
<el-form-item label="发票类型" id="fplx" prop="invoice_type">
......@@ -51,24 +51,21 @@
label="发票抬头"
v-if="form.invoice_type && form.invoice_type !== '无'"
prop="invoice_title"
:rules="{ required: true, message: '请输入发票抬头', trigger: 'blur' }"
>
:rules="{ required: true, message: '请输入发票抬头', trigger: 'blur' }">
<el-input v-model="form.invoice_title"></el-input>
</el-form-item>
<el-form-item
label="纳税人识别号"
v-if="form.invoice_type && form.invoice_type !== '无'"
prop="taxpayer_registration_num"
:rules="{ required: true, message: '请输入纳税人识别号', trigger: 'blur' }"
>
:rules="{ required: true, message: '请输入纳税人识别号', trigger: 'blur' }">
<el-input v-model="form.taxpayer_registration_num"></el-input>
</el-form-item>
<el-form-item
label="注册地址"
v-if="form.invoice_type === '增值税专用发票'"
prop="invoice_address_mobile"
:rules="{ required: true, message: '请输入注册地址', trigger: 'blur' }"
>
:rules="{ required: true, message: '请输入注册地址', trigger: 'blur' }">
<el-input v-model="form.invoice_address_mobile"></el-input>
</el-form-item>
<el-form-item
......@@ -76,8 +73,7 @@
id="account"
v-if="form.invoice_type === '增值税专用发票'"
prop="opening_bank_account"
:rules="{ required: true, message: '请输入开户行及账号', trigger: 'blur' }"
>
:rules="{ required: true, message: '请输入开户行及账号', trigger: 'blur' }">
<el-input v-model="form.opening_bank_account"></el-input>
</el-form-item>
<el-form-item label="发票内容" id="sh" v-if="form.invoice_type && form.invoice_type !== '无'">
......@@ -163,23 +159,23 @@
:periods="id"
@payStatus="payStatus"
@closePayPop="closePayPop"
class="payPop"
/>
class="payPop" />
</div>
</template>
<script>
import action from '@action'
import * as api from '@/api/article'
// import { updateUserInfo } from '@/api/common'
import breadcrumb from '@/components/breadcrumb.vue'
import payPop from './components/payPop.vue'
import nations from '@/utils/nations'
const IDCARD_REG = /(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}[0-9Xx]$)/
const IDCARD_REG =
/(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}[0-9Xx]$)/
const MOBILE_REG = /^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/
const EMAIL_REG = /^[A-Za-z0-9]+([_\.\\-][A-Za-z0-9]+)*@([A-Za-z0-9\-]+\.)+[A-Za-z]{2,6}$/
export default {
components: {
breadcrumb,
payPop
payPop,
},
data() {
const IDChecked = (rule, value, callback) => {
......@@ -206,11 +202,11 @@ export default {
crumbData: [
{
path: '/',
name: '首页'
name: '首页',
},
{
name: '师资培训'
}
name: '师资培训',
},
],
nations: nations,
form: {
......@@ -230,7 +226,7 @@ export default {
opening_bank_account: '',
invoice_detail: '非学历教育*培训费',
mobile: '',
checked_code: ''
checked_code: '',
},
rules: {
school_name: { required: true, message: '请输入院校名称', trigger: 'blur' },
......@@ -239,18 +235,18 @@ export default {
nation: { required: true, message: '请输入民族', trigger: 'blur' },
id_num: [
{ required: true, message: '请输入身份证号', trigger: 'blur' },
{ validator: IDChecked, trigger: 'blur' }
{ validator: IDChecked, trigger: 'blur' },
],
live_status: { required: true, message: '请选择居住方式', trigger: 'change' },
invoice_type: { required: true, message: '请选择发票类型', trigger: 'change' },
mobile: [
{ required: true, message: '请输入手机号', trigger: 'blur' },
{ validator: mobileChecked, trigger: 'blur' }
]
{ validator: mobileChecked, trigger: 'blur' },
],
},
isBtnDisabled: false,
isPayPopShow: false,
isLogin: false
isLogin: false,
}
},
computed: {
......@@ -261,13 +257,13 @@ export default {
},
hidePayBtn() {
return [6, 202201, 202202, 2022001, 2022002].includes(this.id)
}
},
},
created() {
if (!this.id) {
this.$router.push('/train')
}
action.articleAction.getUserInfo().then(res => {
api.getUserInfo().then((res) => {
if (res && res.code === 0) {
window.sessionStorage.userInfo = JSON.stringify(res.data)
this.isLogin = true
......@@ -288,9 +284,9 @@ export default {
getDetail(call) {
// 登录状态不需要手机号验证码
const params = {
periods: this.id
periods: this.id,
}
action.articleAction.getFormDetail(params).then(res => {
api.getFormDetail(params).then((res) => {
if (res.code === 200) {
if (!Object.keys(res.data.detail).length) {
this.isInfoNull = true
......@@ -307,7 +303,7 @@ export default {
},
// 支付
checkPay(id, call) {
action.articleAction.checkPay(id).then(res => {
api.checkPay(id).then((res) => {
if (res.code === 0) {
const [order = {}] = res.data
if (order.status === 1) {
......@@ -348,7 +344,7 @@ export default {
formData[this.formName[name]] = this.form[name]
})
param.table_content = JSON.stringify(formData)
action.articleAction.formCommit(param).then(res => {
api.formCommit(param).then(res => {
this.$message({
message: '提交成功',
type: 'success'
......@@ -364,7 +360,7 @@ export default {
this.form.order_no = '1'
}
}
this.$refs.form.validate(valid => {
this.$refs.form.validate((valid) => {
if (valid) {
call()
} else {
......@@ -427,7 +423,7 @@ export default {
// 登录了直接走报名表单 没有登录走注册登录后再走报名表单
if (this.isLogin) {
this.sendEnrollInfo()
.then(res => {
.then((res) => {
this.isInfoNull = false
this.getDetail()
this.message('提交成功!', 'success', 6000)
......@@ -436,7 +432,7 @@ export default {
// this.message('手机号注册成功!','success', 6000)
// }, 300)
})
.catch(error => {
.catch((error) => {
if (error && error.type === 'register') {
// this.message('报名信息提交成功!','success', 6000)
// setTimeout(() => {
......@@ -448,10 +444,10 @@ export default {
}
})
} else {
this.defaultRegister().then(res => {
this.defaultRegister().then((res) => {
this.getDetail(
this.sendEnrollInfo()
.then(res => {
.then((res) => {
this.message('报名信息提交成功!', 'success', 6000)
// this.message('报名信息修改成功!','success', 6000)
// setTimeout(() => {
......@@ -461,7 +457,7 @@ export default {
this.$router.go(0)
}, 1000)
})
.catch(error => {
.catch((error) => {
if (error && error.type === 'register') {
// this.message('报名信息提交成功!','success', 6000)
// setTimeout(() => {
......@@ -489,18 +485,18 @@ export default {
form.invoice_detail = ''
}
}
action.articleAction.formCommit(form).then(res => {
api.formCommit(form).then((res) => {
if (res && res.code === 200) {
resolve({
type: 'enroll',
state: 'success',
msg: '报名信息提交成功'
msg: '报名信息提交成功',
})
} else {
reject({
type: 'enroll',
state: 'fail',
msg: res.msg || '报名信息提交失败'
msg: res.msg || '报名信息提交失败',
})
}
})
......@@ -515,18 +511,18 @@ export default {
} else {
let param = {
account: this.form.mobile,
service: 'sofia.ezijing.com'
service: 'sofia.ezijing.com',
}
action.articleAction.sendCheckedCode(param).then(res => {
api.sendCheckedCode(param).then((res) => {
if (res && res.code === 0) {
this.$message({
message: '验证码发送成功',
type: 'success'
type: 'success',
})
} else {
this.$message({
message: res.msg || '发送验证码失败',
type: 'error'
type: 'error',
})
}
})
......@@ -557,7 +553,7 @@ export default {
// service: 'sofia.ezijing.com'
// }
// let promise = new Promise((resolve, reject) => {
// action.articleAction.register(param).then(res => {
// api.register(param).then(res => {
// if (res && res.code === 0) {
// //code: 0注册成功 5已注册
// resolve({
......@@ -584,32 +580,32 @@ export default {
mobile: this.form.mobile,
code: this.form.checked_code,
nickname: this.form.username || this.randomNickname(),
project_id: 5002
project_id: 5002,
// password: '123456',
// secret: true,
// service: 'sofia.ezijing.com'
}
let promise = new Promise((resolve, reject) => {
action.articleAction.register2(param).then(res => {
api.register2(param).then((res) => {
if (res && res.code === 0) {
//code: 0注册成功 5已注册
resolve({
type: 'register',
state: 'success',
msg: 'success'
msg: 'success',
})
} else if (res && res.code === 5) {
reject({
type: 'register',
state: 'fail',
msg: res.msg || '此手机号已经被注册'
msg: res.msg || '此手机号已经被注册',
})
} else {
this.$message.error(res.msg)
reject({
type: 'register',
state: 'fail',
msg: res.msg || '注册失败'
msg: res.msg || '注册失败',
})
}
})
......@@ -636,19 +632,19 @@ export default {
this.$message({
message: errMsg,
type: type || 'info',
duration: dur || 3000
duration: dur || 3000,
})
},
fetchUpdateUserInfo() {
console.log(1111)
const params = {
real_name: this.form.username || ''
real_name: this.form.username || '',
}
action.articleAction.updateUserInfo(params).then(res => {
api.updateUserInfo(params).then((res) => {
console.log(res)
})
}
}
},
},
}
</script>
<style lang="scss" scoped>
......
......@@ -72,13 +72,12 @@
</el-upload>
</el-form-item> -->
<el-form-item label="填写模板" label-width="100px">
<span style="color:#0053C6;cursor: pointer;">下载Excel模板</span>
<span style="color: #0053c6; cursor: pointer">下载Excel模板</span>
<el-upload
style="margin-left:auto;"
style="margin-left: auto"
class="upload-demo"
action="/api/microservices/admin_api/file/upload"
:on-success="handleChange"
>
:on-success="handleChange">
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">请下载模板后,按照模板格式填写完整资料后,上传报名表。</div>
</el-upload>
......@@ -92,11 +91,11 @@
</div>
</template>
<script>
import action from '@action'
import * as api from '@/api/article'
import breadcrumb from '@/components/breadcrumb.vue'
export default {
components: {
breadcrumb
breadcrumb,
},
data() {
return {
......@@ -105,11 +104,11 @@ export default {
crumbData: [
{
path: '/',
name: '首页'
name: '首页',
},
{
name: '师资培训'
}
name: '师资培训',
},
],
form: {
i1: '',
......@@ -123,7 +122,7 @@ export default {
i9: '',
i10: '',
i11: '',
i12: ''
i12: '',
},
formName: {
i1: '姓名',
......@@ -137,14 +136,14 @@ export default {
i9: '抬头',
i10: '税号',
i11: '地址',
i12: '开户行、账号'
}
i12: '开户行、账号',
},
}
},
methods: {
onSubmit() {
let flag = true
Object.keys(this.form).map(item => {
Object.keys(this.form).map((item) => {
if (item === 'i11' || item === 'i12') {
} else {
if (this.form[item] === '') {
......@@ -153,20 +152,20 @@ export default {
}
})
if (!flag) {
this.$message('请完善信息');
this.$message('请完善信息')
} else {
const param = {}
param.tag = 2
param.url = this.file
const formData = {}
Object.keys(this.form).map(name => {
Object.keys(this.form).map((name) => {
formData[this.formName[name]] = this.form[name]
})
param.table_content = JSON.stringify(formData)
action.articleAction.formCommit(param).then(res => {
api.formCommit(param).then((res) => {
this.$message({
message: '提交成功',
type: 'success'
type: 'success',
})
})
}
......@@ -176,8 +175,8 @@ export default {
},
back() {
this.$router.go(-1)
}
}
},
},
}
</script>
<style lang="scss" scoped>
......
......@@ -7,8 +7,7 @@
class="screen-tabs-box"
:activeIndex.sync="tabsIndex"
:data="screenTabsData"
@tabChange="HandleTabChange"
></screen-tabs>
@tabChange="HandleTabChange"></screen-tabs>
<div class="train-mian">
<ul>
<template v-for="(item, index) in tabsContentList">
......@@ -36,7 +35,7 @@
</div>
</template>
<script>
import action from '@action'
import * as api from '@/api/article'
import btnTabs from '@/components/tabs/btnTabs.vue'
import screenTabs from '@/components/tabs/screenTabs.vue'
import noData from '@/components/tabs/noData.vue'
......@@ -51,7 +50,7 @@ export default {
item,
noData,
search,
breadcrumb
breadcrumb,
},
data() {
return {
......@@ -61,14 +60,14 @@ export default {
tabsContentList: datalist,
value3: '',
btnTabsData: {
options: ['会议报名', '核心专家']
options: ['会议报名', '核心专家'],
},
screenTabsData: {
name: '筛选:',
options: ['全部', '正在进行', '未开始', '已结束']
options: ['全部', '正在进行', '未开始', '已结束'],
},
pages: {},
crumbData: [{ path: '/', name: '首页' }, { name: '师资培训' }]
crumbData: [{ path: '/', name: '首页' }, { name: '师资培训' }],
}
},
mounted() {
......@@ -84,7 +83,7 @@ export default {
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)' //
background: 'rgba(0, 0, 0, 0.7)', //
})
if (!Object.keys(this.$store.state.classify).length) {
setTimeout(() => {
......@@ -92,17 +91,17 @@ export default {
this.newsList()
}, 2000)
} else {
const findId = this.articleClassify[0].children.find(item => {
const findId = this.articleClassify[0].children.find((item) => {
return item.display_name === '会议报名'
})
action.articleAction.getArticle({ category_id: findId.id }).then(res => {
api.getArticle({ category_id: findId.id }).then((res) => {
this.list = res.data.list
this.pages = res.data.pages
loading.close()
})
}
}
}
},
},
}
</script>
<style lang="scss" scoped>
......
......@@ -32,14 +32,6 @@ const routes = [
{ path: '/register', component: () => import('@/pages/account/register.vue') },
// 证书成绩查询
{ path: '/queryCard', component: () => import('@/pages/home/queryCard.vue') },
// // 教材中心
// { path: '/textBook', component: () => import('@/pages/textBook/index.vue') },
// // 教材中心详情
// { path: '/textBook/detail', component: () => import('@/pages/textBook/detail.vue') },
// // 教材中心详情->章节
// { path: '/textBook/chapter', component: () => import('@/pages/textBook/chapter.vue') },
// // 办事大厅
// { path: '/hall', component: () => import('@/pages/hall/index.vue') },
],
},
]
......
import Vue from 'vue'
import Vuex from 'vuex'
import action from '@action'
import * as api from '@/api/article'
Vue.use(Vuex)
......@@ -16,7 +16,7 @@ const store = new Vuex.Store({
},
actions: {
getClassify({ commit }) {
action.articleAction.getAllClassify().then((response) => {
api.getAllClassify().then((response) => {
commit('setClassify', response.data)
})
},
......
......@@ -59,10 +59,7 @@ httpRequest.interceptors.request.use(
httpRequest.interceptors.response.use(
function (response) {
const { data } = response
// zws
if (parseInt(data.code)) {
return Promise.reject(data)
}
if (parseInt(data.error) && data.message === '需要登录才能调用接口') {
location.href = `${process.env.loginURL}/login/index?redirect_uri=${encodeURIComponent(location.href)}`
return Promise.reject(data)
......
......@@ -13,11 +13,7 @@ export default defineConfig({
outDir: 'client-dist',
},
resolve: {
alias: [
{ find: '@', replacement: path.resolve(__dirname, 'src') },
{ find: '@action', replacement: path.resolve(__dirname, 'src/action') },
{ find: '@api', replacement: path.resolve(__dirname, 'src/api') },
],
alias: [{ find: '@', replacement: path.resolve(__dirname, 'src') }],
},
css: {
// 禁用SASS警告提醒
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论