Merge remote-tracking branch 'boe/zcwy-master' into zcwy-master

This commit is contained in:
zhangsir
2024-06-03 19:07:17 +08:00
51 changed files with 4352 additions and 647 deletions

27
package-lock.json generated
View File

@@ -2711,6 +2711,11 @@
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
"integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
},
"bignumber.js": {
"version": "9.1.2",
"resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.1.2.tgz",
"integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug=="
},
"binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
@@ -7252,6 +7257,14 @@
"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true
},
"json-bigint": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/json-bigint/-/json-bigint-1.0.0.tgz",
"integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
"requires": {
"bignumber.js": "^9.0.0"
}
},
"json-parse-better-errors": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
@@ -12567,7 +12580,7 @@
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.8.3",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
"resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
"integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
"dev": true,
"optional": true,
@@ -12579,7 +12592,7 @@
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
@@ -12589,7 +12602,7 @@
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"optional": true,
@@ -12600,7 +12613,7 @@
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
@@ -12610,21 +12623,21 @@
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,

View File

@@ -25,6 +25,7 @@
"fuse.js": "^6.4.6",
"image-conversion": "^2.1.1",
"jsencrypt": "^3.2.1",
"json-bigint": "^1.0.0",
"mockjs": "^1.1.0",
"moment": "^2.29.1",
"nprogress": "^0.2.0",

View File

@@ -0,0 +1,56 @@
import ajax from '../unionAjax.js';
const baseURL = '';
export const pageList = function(query) {
return ajax.postJson(baseURL,'/activityApi/certification/list',query);
}
export const getTeacherInfo = function(query) {
return ajax.postJson(baseURL,'/activityApi/teacher/getTeacherInfo',query);
}
export const getProgress = function(query) {
return ajax.postJson(baseURL,'/activityApi/certification/getProgress',query);
}
export const addTeacher = function(query) {
return ajax.postJson(baseURL,'/activityApi/teacher/addTeacher',query);
}
export const getCertificationProcess = function(query) {
return ajax.postJson(baseURL,'/activityApi/teacher/getCertificationProcess',query);
}
export const setOfflineTutoring = function(query) {
return ajax.postJson(baseURL,'/activityApi/certification/setOfflineTutoring',query);
}
export const treeList = function() {
return ajax.get(baseURL,'/systemapi/xboe/type/tree-list?sysResType=1&status=1');
}
export const getReviewResult = function(query) {
return ajax.postJson(baseURL,'/activityApi/certification/getReviewResult',query);
}
export const secondExamine = function(query) {
return ajax.postJson(baseURL,'/activityApi/certification/secondExamine',query);
}
export const download = function(data) {
return ajax.get(baseURL,'/activityApi/teacher/download?coursewareId='+data.coursewareId);
}
const exportPdf=function (data){
return ajax.getJsonToFile(baseURL,`/activityApi/teacher/download?coursewareId=${data.coursewareId}`);
}
export default {
pageList,
getTeacherInfo,
treeList,
getCertificationProcess,
setOfflineTutoring,
getReviewResult,
secondExamine,
exportPdf
}

View File

@@ -1,9 +1,10 @@
import axios from 'axios'
import qs from 'qs'
import { Notification, MessageBox, Message } from 'element-ui'
import {Notification, MessageBox, Message} from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/token'
import {getToken} from '@/utils/token'
import errorCode from '@/utils/errorCode'
/**
*request请求 axios.request(config)
*requestJson请求 axios.request(config)
@@ -19,50 +20,50 @@ import errorCode from '@/utils/errorCode'
// const ReLoginUrl=process.env.VUE_APP_LOGIN_URL;
const TokenName='token';
const TokenName = 'token';
/**axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded'**/
//只是用于发送json对象数据时使用post,put,patch
/**axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded'**/
//只是用于发送json对象数据时使用post,put,patch
//用于普通的发送请求
const formRequest=axios.create({
const formRequest = axios.create({
//headers:{'Content-Type':'application/x-www-form-urlencoded'},
// axios中请求配置有baseURL选项表示请求URL公共部分
// baseURL: process.env.VUE_APP_CESOURCE_BASE_API,
//超时
timeout: 10000,
})
//发送json对象的拦截器
formRequest.interceptors.request.use(config => {
})
//发送json对象的拦截器
formRequest.interceptors.request.use(config => {
//是否需要设置 token
const isToken = (config.headers || {}).isToken === false
let curToken=getToken();
let curToken = getToken();
//curToken='eyJ0eXBlIjoidG9rZW4iLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC91LmJvZS5jb20iLCJpYXQiOjE2NzIzMTE2MTIsImV4cCI6MTY3MjMxODgxMiwiR2l2ZW5OYW1lIjoiYm9ldSIsInVzZXJJZCI6IjZCMDQ5RkFGLUMzMTQtN0NDRi0wRDI4LTBEMjNGNEM0MjUzMSIsInVJZCI6Ijk2NTM0MjAyNzQ5NzYwNzE2OCIsInBlcm1pc3Npb24iOiIifQ==.a4f41376e994c5fcd3ab537ce17572ef4c633863f87785cf7b6ffa353e2ed51c';
if (curToken && !isToken) {
config.headers[TokenName] = curToken // 让每个请求携带自定义token 请根据实际情况自行修改
}
return config
}, error => {
}, error => {
console.log(error)
Promise.reject(error)
});
formRequest.interceptors.response.use(res => {
});
formRequest.interceptors.response.use(res => {
//console.log(res);
const code = res.data.status || 200;
if(code===200){
if (code === 200) {
return res.data
}else{
if(code === 401){
} else {
if (code === 401) {
// store.dispatch('LogOut').then(() => {
// location.href = this.webBaseUrl + ReLoginUrl;
// })
console.error('',res.data);
console.error('', res.data);
return Promise.reject(new Error('接口返回未登录'))
}else if(code===403){
var msg='当前操作没有权限';
} else if (code === 403) {
var msg = '当前操作没有权限';
Message({message: msg, type: 'error'});
return Promise.reject(new Error(msg))
}else{
} else {
//Message({message: res.data.message, type: 'error'});
//console.log('err' + res.data.error);
return res.data
@@ -70,15 +71,13 @@ const formRequest=axios.create({
}
},
error => {
console.log('err',error)
let { message } = error;
console.log('err', error)
let {message} = error;
if (message == "Network Error") {
message = "网络异常,请稍后重试";
}
else if (message.includes("timeout")) {
} else if (message.includes("timeout")) {
message = "网络异常或接口错误,请求超时";
}
else if (message.includes("Request failed with status code")) {
} else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常";
}
Message({
@@ -88,22 +87,22 @@ const formRequest=axios.create({
})
return Promise.reject(error)
}
)
)
/**
* request请求,可以自定义参数
*/
const request=formRequest.request;
const request = formRequest.request;
/**
* get请求 ,只有url
*/
const get = function(baseURL,url){
const get = function (baseURL, url) {
return request({
baseURL,
url: url,
method: 'get',
headers:{'Content-Type':'application/x-www-form-urlencoded'}
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})
}
@@ -112,83 +111,92 @@ const get = function(baseURL,url){
* @param {Object} url
* @param {Object} postData
*/
const post=function(baseURL,url,postData){
if(postData){
postData=qs.stringify(postData);
const post = function (baseURL, url, postData) {
if (postData) {
postData = qs.stringify(postData);
}
return request({
baseURL,
url: url,
method: 'post',
data:postData,
headers:{'Content-Type':'application/x-www-form-urlencoded'}
data: postData,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})
}
//post请求
const postForm=function(baseURL,url,data){
const postForm = function (baseURL, url, data) {
return request({
baseURL,
url,
data,
method: 'post',
headers:{'Content-Type':'application/x-www-form-urlencoded'}
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
});
}
}
// const postJson=jsonRequest.post;
const postJson=function(baseURL,url,postData){
const postJson = function (baseURL, url, postData) {
return request({
baseURL,
url: url,
method: 'post',
data:postData,
headers:{'Content-Type':'application/json;charset=utf-8'},
data: postData,
headers: {'Content-Type': 'application/json;charset=utf-8'},
})
}
// 导出文件请求定义
const postJsonToFile=function(baseURL,url,postData){
const postJsonToFile = function (baseURL, url, postData) {
return request({
baseURL,
url: url,
method: 'post',
data:postData,
headers:{'Content-Type':'application/json;charset=utf-8'},
data: postData,
headers: {'Content-Type': 'application/json;charset=utf-8'},
responseType: 'blob'
})
}
const getJsonToFile = function (baseURL, url, postData) {
return request({
baseURL,
url: url,
method: 'get',
data: postData,
headers: {'Content-Type': 'application/json;charset=utf-8'},
responseType: 'blob'
})
}
/**
* put请求
*/
const put=function(baseURL,url,data){
if(data){
data=qs.stringify(data);
const put = function (baseURL, url, data) {
if (data) {
data = qs.stringify(data);
}
return request({
baseURL,
url: url,
method: 'put',
data:data,
headers:{'Content-Type':'application/x-www-form-urlencoded'}
data: data,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})
}
const putJson=function(baseURL,url,data){
const putJson = function (baseURL, url, data) {
return request({
baseURL,
url: url,
method: 'put',
data:data,
headers:{'Content-Type':'application/json;charset=utf-8'},
data: data,
headers: {'Content-Type': 'application/json;charset=utf-8'},
})
}
export default {
tokenName:TokenName,
tokenName: TokenName,
request,
get,
post,
@@ -196,4 +204,5 @@ export default {
postJsonToFile,
put,
putJson,
getJsonToFile
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
src/assets/images/learn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 890 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -14,7 +14,7 @@
:default-active="activeMenu"
router
active-text-color="#3379FB"
:default-openeds="['manageTodo','manageFinish','teacherTodo','teacherFinish','myqa','notice','mystudy', 'course', 'exam', 'u001', 'u002', 'u003', 'u004','mylecnotes','mycaseRecord']"
:default-openeds="['manageTodo','manageFinish','teacherTodo','teacherFinish','lecturer','myqa','notice','mystudy', 'course', 'exam', 'u001', 'u002', 'u003', 'u004','mylecnotes','mycaseRecord']"
class="el-menu-vertical"
@open="handleOpen"
@close="handleClose"
@@ -166,7 +166,6 @@
<span slot="title" class="textl">已审核的课程</span>
</el-menu-item>
<el-menu-item index="/need/qafinish">
<!-- <i class="el-icon-menu"></i> -->
<span slot="title" class="textl">已回答问题</span>
</el-menu-item>
</el-submenu>
@@ -195,10 +194,14 @@
</el-menu-item>
-->
</el-submenu>
<!-- <el-menu-item index="/user/tools" v-show="curIdentity == 2">
<i class="el-icon-menu"></i>
<span slot="title">功能百宝箱</span>
</el-menu-item> -->
<el-menu-item index="/need/lecturer" v-show="curIdentity == 2">
<template slot="title">
<svg-icon icon-class="lecturer" style="font-size:16px"></svg-icon>
<span>讲师认证</span>
<div v-if="instructor!=0" style="position: absolute;right: 60px;top: 0;background-color: red;width: 20px;height: 20px;color: #fff;border-radius: 50%;display: flex;justify-content: center;align-items: center">
{{ instructor }}</div>
</template>
</el-menu-item>
<el-submenu index="u004" v-show="curIdentity == 2">
<template slot="title">
<i class="el-icon-s-grid" style="color:#0165FF"></i>
@@ -379,8 +382,8 @@
<script>
import { mapGetters } from 'vuex';
import apiCourse from '../../api/modules/course.js';
import apicourseStudy from "../../api/modules/courseStudy.js"
import {pageList} from "@/api/modules/lecturer"
import courseImage from "@/components/Course/courseImage.vue"
import testUser from '@/utils/testUsers.js'
export default {
@@ -409,13 +412,16 @@ export default {
badge: 0,
isCollapse: false,
lastStudy:{},
overlayShow: false
overlayShow: false,
instructor:0
};
},
created() {
this.$store.dispatch('refrashReviewed');
this.$store.dispatch('refrashStudyTaskCount');
this.getLastStudy();
//获取讲师认证中条数
this.instructorCertification()
},
mounted() {
//console.log(this.userInfo.loginName,'this.userInfo.loginName');
@@ -428,6 +434,12 @@ export default {
// }
},
methods: {
//讲师认证条数
instructorCertification(){
pageList({ teacherNo:this.userInfo.userNo,courseName:'', pageNo: 1, pageSize: 10}).then(res=>{
this.instructor=res.data.count
})
},
toCourseDetail(item){
if(isNaN(item.courseType)){
return `${this.webBaseUrl}/course/boeframe?id=${item.courseId}&type=${item.courseId}`;

View File

@@ -0,0 +1,273 @@
<script setup>
import {getCertificationProcess} from "@/api/modules/lecturer";
export default {
props: {
teacherId:String,
pid:String
},
data(){
return{
status:{
secondResult:1,
draftStatus:1,
onlineLearning:1,
offlineTutoring:1,
endStatus:1,
reviewResult:3,
offlineTutoring1:1,
endStatus1:1,
reviewResult1:3,
}
}
},
created() {
if (this.pid==null || this.pid==''){
this.getCertificationProcess()
}else {
this.getCertificationProcess()
this.getCertificationProcess1()
}
},
watch: {
teacherId: {
handler(newVal) {
if (newVal) {
console.log(newVal)
this.getCertificationProcess()
}
}
},
},
methods:{
getCertificationProcess(){
getCertificationProcess({teacherId:this.teacherId}).then(res=>{
let data=res.data
if(data.draftStatus==0){
this.status.draftStatus=0
if (data.onlineLearning==0){
this.status.onlineLearning=0
if (data.offlineTutoring==0){
this.status.offlineTutoring=0
if (data.endStatus==0){
this.status.endStatus=0
this.status.reviewResult=data.reviewResult
}else if (data.endStatus==2){
this.status.endStatus=2
this.status.reviewResult=data.reviewResult
}
}
}else if(data.onlineLearning==2 && data.offlineTutoring==1){
this.status.onlineLearning=2
}else if (data.onlineLearning==2 && data.offlineTutoring==0){
this.status.onlineLearning=0
if (data.offlineTutoring==0){
this.status.offlineTutoring=0
if (data.endStatus==0){
this.status.endStatus=0
this.status.reviewResult=data.reviewResult
}else if (data.endStatus==2){
this.status.endStatus=2
this.status.reviewResult=data.reviewResult
}
}
}
}else if (data.draftStatus==2){
this.status.draftStatus=2
if (data.onlineLearning==0){
this.status.onlineLearning=0
if (data.offlineTutoring==0){
this.status.offlineTutoring=0
if (data.endStatus==0){
this.status.endStatus=0
this.status.reviewResult=data.reviewResult
}else if (data.endStatus==2){
this.status.endStatus=2
this.status.reviewResult=data.reviewResult
}
}
}else if(data.onlineLearning==2 && data.offlineTutoring==1){
this.status.onlineLearning=2
}else if (data.onlineLearning==2 && data.offlineTutoring==0){
this.status.onlineLearning=0
if (data.offlineTutoring==0){
this.status.offlineTutoring=0
if (data.endStatus==0){
this.status.endStatus=0
this.status.reviewResult=data.reviewResult
}else if (data.endStatus==2){
this.status.endStatus=2
this.status.reviewResult=data.reviewResult
}
}
}
}
})
},
getCertificationProcess1(){
getCertificationProcess({teacherId:this.pid}).then(res=>{
console.log(res)
let data=res.data
if(data.secondResult==0){
this.status.secondResult=0
if (data.offlineTutoring==0){
this.status.offlineTutoring1=0
if (data.endStatus==0){
this.status.endStatus1=0
this.status.reviewResult1=data.reviewResult
}else if (data.endStatus==2){
this.status.endStatus1=2
this.status.reviewResult1=data.reviewResult
}
}
}
})
}
}
};
</script>
<template>
<div class="main">
<div class="process">
<img src="../assets/images/first_draft.png" alt="" v-if="status.draftStatus==1">
<img src="../assets/images/first_draft2.png" alt="" v-if="status.draftStatus==2">
<img src="../assets/images/first_draft1.png" alt="" v-if="status.draftStatus==0">
<div :class="status.draftStatus==1?'tim1':status.draftStatus==2?'tim2':'tim'">{{status.draftStatus==1?'初稿未上传':status.draftStatus==2?'初稿已退回':'初稿已上传'}}</div>
</div>
<div :class="status.draftStatus==1?'line1':status.draftStatus==2?'line':'line'"></div>
<div class="process">
<img src="../assets/images/E-learning1.png" alt="" v-if="status.onlineLearning==0">
<img src="../assets/images/E-learning.png" alt="" v-if="status.onlineLearning==1">
<img src="../assets/images/E-learning2.png" alt="" v-if="status.onlineLearning==2">
<div :class="status.onlineLearning==1?'tim1':status.onlineLearning==2?'tim3':'tim'">{{status.onlineLearning==1?'线上学习未完成':status.onlineLearning==2?'线上学习进行中':'线上学习已完成'}}</div>
</div>
<div :class="status.onlineLearning==1?'line1':status.onlineLearning==2?'line1':'line'"></div>
<div class="process">
<img src="../assets/images/tutoring1.png" alt="" v-if="status.offlineTutoring==0">
<img src="../assets/images/tutoring.png" alt="" v-if="status.offlineTutoring==1">
<div :class="status.offlineTutoring==1?'tim1':'tim'">{{status.offlineTutoring==1?'线下辅导未完成':'线下辅导已完成'}}</div>
</div>
<div :class="status.offlineTutoring==1?'line1':'line'"></div>
<div class="process">
<img src="../assets/images/final_draft1.png" alt="" v-if="status.endStatus==0">
<img src="../assets/images/final_draft.png" alt="" v-if="status.endStatus==1">
<img src="../assets/images/final_draft2.png" alt="" v-if="status.endStatus==2">
<div :class="status.endStatus==1?'tim1':status.endStatus==2?'tim2':'tim'">{{status.endStatus==1?'终稿未上传':status.endStatus==2?'终稿已退回':'终稿已上传'}}</div>
</div>
<div :class="status.endStatus==1?'line1':status.endStatus==2?'line1':'line'"></div>
<div class="process">
<img src="../assets/images/certification.png" alt="" v-if="status.reviewResult==3">
<img src="../assets/images/certification.png" alt="" v-if="status.reviewResult==2">
<img src="../assets/images/certification3.png" alt="" v-if="status.reviewResult==1">
<img src="../assets/images/certification4.png" alt="" v-if="status.reviewResult==0">
<div :class="status.reviewResult==3?'tim1':status.reviewResult==2?'tim1':status.reviewResult==1?'tim2':'tim4'">
{{status.reviewResult==3?'认证':status.reviewResult==2?'认证':status.reviewResult==1?'认证未通过':'认证已通过'}}</div>
</div>
<div :class="status.reviewResult==3?'line1':status.reviewResult==2?'line1':status.reviewResult==1?'line':'line'" v-if="status.secondResult==0"></div>
<div class="process" v-if="status.secondResult==0">
<img src="../assets/images/tutoring1.png" alt="" v-if="status.offlineTutoring1==0">
<img src="../assets/images/tutoring.png" alt="" v-if="status.offlineTutoring1==1">
<div :class="status.offlineTutoring1==1?'tim1':'tim'">{{status.offlineTutoring1==1?'线下辅导未完成':'线下辅导已完成'}}</div>
</div>
<div :class="status.offlineTutoring1==1?'line1':'line'"v-if="status.secondResult==0"></div>
<div class="process" v-if="status.secondResult==0">
<img src="../assets/images/final_draft1.png" alt="" v-if="status.endStatus1==0">
<img src="../assets/images/final_draft2.png" alt="" v-if="status.endStatus1==2">
<img src="../assets/images/final_draft.png" alt="" v-if="status.endStatus1==1">
<div :class="status.endStatus1==1?'tim1':status.endStatus1==2?'tim2':'tim'">{{status.endStatus1==1?'终稿未上传':status.endStatus1==2?'终稿已退回':'终稿已上传'}}</div>
</div>
<div :class="status.endStatus1==1?'line1':status.endStatus1==2?'line1':'line'" v-if="status.secondResult==0"></div>
<div class="process" v-if="status.secondResult==0">
<img src="../assets/images/certification.png" alt="" v-if="status.reviewResult1==3">
<img src="../assets/images/certification.png" alt="" v-if="status.reviewResult1==2">
<img src="../assets/images/certification3.png" alt="" v-if="status.reviewResult1==1">
<img src="../assets/images/certification4.png" alt="" v-if="status.reviewResult1==0">
<div :class="status.reviewResult1==3?'tim1':status.reviewResult1==2?'tim1':status.reviewResult1==1?'tim2':'tim4'">
{{status.reviewResult1==3?'认证':status.reviewResult1==2?'认证':status.reviewResult1==1?'认证未通过':'认证已通过'}}</div>
</div>
</div>
</template>
<style scoped lang="scss">
.main {
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 20px;
}
.process {
display: flex;
flex-direction: column;
align-items: center;
img {
width: 46px;
height: 46px;
}
.tim {
font-weight: 400;
font-size: 14px;
color: #409EFF;
line-height: 20px;
margin-top: 12px;
}
.tim1 {
font-weight: 400;
font-size: 14px;
color: #979797;
line-height: 20px;
margin-top: 12px;
}
.tim2 {
font-weight: 400;
font-size: 14px;
color: #FF4040;
line-height: 20px;
margin-top: 12px;
}
.tim3 {
font-weight: 400;
font-size: 14px;
color: #ffa050;
line-height: 20px;
margin-top: 12px;
}
.tim4 {
font-weight: 400;
font-size: 14px;
color: #31AF0D ;
line-height: 20px;
margin-top: 12px;
}
}
.line {
width: 81px;
height: 1px;
border: 1px solid #409EFF;
margin: 0 8px 30px 8px;
}
.line1 {
width: 81px;
height: 1px;
border: 1px solid #DEDEDE;
margin: 0 8px 30px 8px;
}
.line2 {
width: 81px;
height: 1px;
border: 1px solid #FF4040;
margin: 0 8px 30px 8px;
}
.line3 {
width: 81px;
height: 1px;
border: 1px solid #ffa050;
margin: 0 8px 30px 8px;
}
</style>

View File

@@ -50,7 +50,6 @@ export const pages=[
{title:'考试管理',path:'list',component:'exam/ExamList',hidden:false},
{title:'我的考试待办',path:'mytask',component:'exam/MyExamTask',hidden:false},
{title:'我的考试已办',path:'myfinish',component:'exam/MyExamFinish',hidden:false},
]},
{title:'待办',path:'/need',hidden:false,children:[
{title:'待回答问题',path:'qareply',component:'qa/NeedReplys',hidden:false},
@@ -60,6 +59,18 @@ export const pages=[
// {title:'我的案例记录',path:'mycaseRecord',component:'course/MycaseRecord',hidden:false},
{title:'待审核的课程',path:'waitaudit',component:'course/WaitAudit',hidden:true},
{title:'已审核的课程',path:'waitaudited',component:'course/WaitAudited',hidden:true},
{title:'讲师认证',path:'lecturer',component:'lecturer/Index',hidden:true},
{title:'上传初稿',path:'draft',component:'lecturer/FirstDraft',hidden:true},
{title:'线上学习',path:'onlinelearning',component:'lecturer/OnlineLearning',hidden:true},
{title:'线下辅导',path:'coaching',component:'lecturer/CoachingPage',hidden:true},
{title:'线下辅导完成',path:'coachingsuccess',component:'lecturer/CoachingSuccess',hidden:true},
{title:'上传终稿',path:'final',component:'lecturer/FinalDraft',hidden:true},
{title:'终稿成功',path:'finalsuccess',component:'lecturer/FinalSuccess',hidden:true},
{title:'二次认证',path:'twoathentication',component:'lecturer/TwoAthentication',hidden:true},
{title:'二次辅导',path:'twocoaching',component:'lecturer/TwoCoaching',hidden:true},
{title:'二次辅导成功',path:'twocoachingsuccess',component:'lecturer/TwoCos',hidden:true},
{title:'二次终稿',path:'twofinal',component:'lecturer/TwoFinal',hidden:true},
{title:'二次终稿成功',path:'twofinals',component:'lecturer/TwoFinals',hidden:true},
]},
{title:'教师教学',path:'/teaching',hidden:false,children:[
{title:'授课记录',path:'course',component:'teacher/TeachingCourse',hidden:false},

View File

@@ -0,0 +1 @@
<svg t="1715160530343" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="15057" width="256" height="256"><path d="M1009.336 639.683c-17.473-14.8-43.641-12.653-58.44 4.829L733.248 901.416l-93.729-86.876c-16.795-15.58-43.034-14.558-58.593 2.227-15.569 16.794-14.567 43.023 2.227 58.593L708.68 991.704a41.435 41.435 0 0 0 28.183 11.055c0.83 0 1.66-0.021 2.5-0.071a41.465 41.465 0 0 0 29.135-14.587l245.668-289.977c14.799-17.473 12.643-43.641-4.83-58.441z" fill="#1378f6" p-id="15058"></path><path d="M574.355 911.854H83.151c0.253-16.177 0.668-33.487 1.053-49.685 0.395-16.339 0.75-31.442 0.881-43.114 6.813-11.358 23.05-18.07 52.721-28.355 10.437-3.613 21.228-7.349 32.05-11.925 18.495-7.795 37.77-16.085 57.216-24.447 29.023-12.472 59.007-25.358 86.795-36.787l37.911-10.356a41.397 41.397 0 0 0 12.573-5.841c21.967-15.113 36.96-44.876 51.628-76.642l1.853-4.009c7.046-15.155 4.302-33.063-6.955-45.423-49.623-54.432-79.254-131.833-79.254-207.048 0-236.678 101.829-264.051 178.431-264.051 76.592 0 178.42 27.373 178.42 264.051 0 75.215-29.62 152.617-79.244 207.058a41.456 41.456 0 0 0-6.934 45.463l1.983 4.263c14.648 31.635 29.61 61.274 51.497 76.338a41.38 41.38 0 0 0 12.572 5.841l37.901 10.356c27.839 11.439 57.874 24.356 86.938 36.858 4.899 2.105 36.251-46.688 61.619-63.796-9.526-4.08-19.173-8.23-28.861-12.391-30.207-12.988-61.437-26.422-90.581-38.367a43.68 43.68 0 0 0-4.859-1.649l-29.944-8.18c-3.594-4.95-7.886-12.826-11.773-20.54 52.772-67.704 82.615-154.104 82.615-241.254 0-286.778-142.118-346.98-261.349-346.98s-261.358 60.202-261.358 346.98c0 87.15 29.843 173.561 82.624 241.254-3.877 7.693-8.179 15.6-11.763 20.55l-29.944 8.17a43.062 43.062 0 0 0-4.859 1.649c-29.083 11.925-60.272 25.339-90.429 38.296-19.274 8.281-38.377 16.49-56.72 24.234-8.311 3.514-17.371 6.651-26.947 9.972-38.984 13.504-87.504 30.319-106.171 84.406a41.526 41.526 0 0 0-2.268 13.524c0 11.794-0.436 29.895-0.921 49.907-0.77 32.202-1.64 68.686-1.144 93.953 0.446 22.574 18.87 40.645 41.455 40.645H657.54c-45.03-11.743-78.487-43.944-83.185-82.928z" fill="#1378f6" p-id="15059"></path></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@@ -25,6 +25,7 @@ import 'swiper/dist/css/swiper.css';
Vue.use(VueAwesomeSwiper)
import watermark from './utils/warterMark.js'
import Bus from './utils/bus.js'
Vue.prototype.$bus = Bus
Vue.prototype.$watermark = watermark

View File

@@ -19,27 +19,27 @@ export const constantRoutes = [{
path: '',
redirect: '/study'
},
{
{
path: '/loading',
hidden: true,
component: (resolve) => require(['@/views/Loading'], resolve),
name: 'loading',
meta: { title: '正在进入学习中心', icon: 'dashboard', noCache: true, affix: false },
},
{
meta: {title: '正在进入学习中心', icon: 'dashboard', noCache: true, affix: false},
},
{
path: '/login',
hidden: true,
component: (resolve) => require(['@/views/Login'], resolve),
name: 'login',
meta: { title: '京东方大学堂登录', icon: 'dashboard', noCache: true, affix: false },
},
{
meta: {title: '京东方大学堂登录', icon: 'dashboard', noCache: true, affix: false},
},
{
path: '/index',
hidden: true,
component: (resolve) => require(['@/views/Index'], resolve),
name: 'index',
meta: { title: '首页', icon: 'dashboard', noCache: true, affix: false },
},
meta: {title: '首页', icon: 'dashboard', noCache: true, affix: false},
},
// {
// path: '/grateful/index',
// hidden: true,
@@ -47,7 +47,7 @@ export const constantRoutes = [{
// name: 'gratefulIndex',
// meta: { title: '感恩教师首页', icon: 'dashboard', noCache: true, affix: false },
// },
{
{
path: '/grateful',
component: Grateful,
redirect: '/grateful/index',
@@ -57,221 +57,222 @@ export const constantRoutes = [{
hidden: true,
component: (resolve) => require(['@/views/grateful/GratefulHomePage'], resolve),
name: 'GratefulHomePage',
meta: { title: '感恩教师首页', icon: 'dashboard', noCache: true, affix: true, hidden:false }
meta: {title: '感恩教师首页', icon: 'dashboard', noCache: true, affix: true, hidden: false}
},
{
path: 'teacherEmpowerment',
hidden: true,
component: (resolve) => require(['@/views/grateful/TeacherEmpowerment'], resolve),
name: 'TeacherEmpowerment',
meta: { title: '教师赋能', icon: 'dashboard', noCache: true, affix: true, hidden:true }
meta: {title: '教师赋能', icon: 'dashboard', noCache: true, affix: true, hidden: true}
},
{
path: 'toolDown',
hidden: true,
component: (resolve) => require(['@/views/grateful/ToolDown'], resolve),
name: 'ToolDown',
meta: { title: '工具下载', icon: 'dashboard', noCache: true, affix: true, hidden:true }
meta: {title: '工具下载', icon: 'dashboard', noCache: true, affix: true, hidden: true}
},
{
path: 'gratefulNotice',
hidden: true,
component: (resolve) => require(['@/views/grateful/GratefulNotice'], resolve),
name: 'GratefulNotice',
meta: { title: '通知列表', icon: 'dashboard', noCache: true, affix: true, hidden:true }
meta: {title: '通知列表', icon: 'dashboard', noCache: true, affix: true, hidden: true}
},
{
path: 'noticeDetail',
hidden: true,
component: (resolve) => require(['@/views/grateful/NoticeDetail'], resolve),
name: 'NoticeDetail',
meta: { title: '通知详情', icon: 'dashboard', noCache: true, affix: true, hidden:true }
meta: {title: '通知详情', icon: 'dashboard', noCache: true, affix: true, hidden: true}
},
{
path: 'teacherOpinion',
hidden: true,
component: (resolve) => require(['@/views/grateful/TeacherOpinion'], resolve),
name: 'TeacherOpinion',
meta: { title: '师资大全', icon: 'dashboard', noCache: true, affix: true, hidden:true }
meta: {title: '师资大全', icon: 'dashboard', noCache: true, affix: true, hidden: true}
},
]
},
{
},
{
path: '/forward',
hidden: true,
component: (resolve) => require(['@/views/Forward'], resolve),
name: 'forward',
meta: { title: '详细信息', icon: 'dashboard', noCache: true, affix: false },
},
{
meta: {title: '详细信息', icon: 'dashboard', noCache: true, affix: false},
},
{
path: '/course',
hidden: true,
component: (resolve) => require(['@/views/portal/course/Index'], resolve),
name: 'course',
meta: { title: '课程', keepAlive: true, icon: 'dashboard', noCache: true, affix: false },
},
{
meta: {title: '课程', keepAlive: true, icon: 'dashboard', noCache: true, affix: false},
},
{
path: '/courseRecommended',
hidden: true,
component: (resolve) => require(['@/views/portal/course/CourseRecommended'], resolve),
name: 'courseRecommended',
meta: { title: '推荐课程', keepAlive: true, icon: 'dashboard', noCache: true, affix: false },
},
{
meta: {title: '推荐课程', keepAlive: true, icon: 'dashboard', noCache: true, affix: false},
},
{
path: '/courseSeries',
hidden: true,
component: (resolve) => require(['@/views/portal/course/CourseSeries'], resolve),
name: 'courseSeries',
meta: { title: '系列课程', keepAlive: true, icon: 'dashboard', noCache: true, affix: false },
},
{
meta: {title: '系列课程', keepAlive: true, icon: 'dashboard', noCache: true, affix: false},
},
{
path: '/course/micro',
hidden: true,
component: (resolve) => require(['@/views/portal/course/Micro'], resolve),
name: 'courseDetailMicro',
meta: { title: '课程详情', icon: 'dashboard', noCache: true, affix: false },
},
{
meta: {title: '课程详情', icon: 'dashboard', noCache: true, affix: false},
},
{
path: '/course/detail',
hidden: true,
component: (resolve) => require(['@/views/portal/course/Detail'], resolve),
name: 'courseDetail',
meta: { title: '课程详情', keepAlive: true, icon: 'dashboard', noCache: true, affix: false },
},
meta: {title: '课程详情', keepAlive: true, icon: 'dashboard', noCache: true, affix: false},
},
// 课程预览
{
{
path: '/course/microPreview',
hidden: true,
component: (resolve) => require(['@/views/portal/course/microPreview'], resolve),
name: 'microPreview',
meta: { title: '课程预览', icon: 'dashboard', noCache: true, affix: false },
},
{
meta: {title: '课程预览', icon: 'dashboard', noCache: true, affix: false},
},
{
path: '/course/rePreview',
hidden: true,
component: (resolve) => require(['@/views/portal/course/rePreview'], resolve),
name: 'courseRePreview',
meta: { title: '课程预览', icon: 'dashboard', noCache: true, affix: false },
},
meta: {title: '课程预览', icon: 'dashboard', noCache: true, affix: false},
},
//
// 外来链接
{
{
path: '/course/boeframe',
hidden: true,
component: (resolve) => require(['@/views/portal/boeframe'], resolve),
name: 'courseBoeframe',
meta: { title: '课程预览', icon: 'dashboard', noCache: true, affix: false },
},
meta: {title: '课程预览', icon: 'dashboard', noCache: true, affix: false},
},
//外来链接
{
{
path: '/course/recorded',
hidden: true,
component: (resolve) => require(['@/views/portal/course/Recorded'], resolve),
name: 'courseDetailRecorded',
meta: { title: '课程详情', icon: 'dashboard', noCache: true, affix: false },
},
{
meta: {title: '课程详情', icon: 'dashboard', noCache: true, affix: false},
},
{
//此页面需要指定课程的参数
path: '/course/studyindex',
hidden: true,
component: (resolve) => require(['@/views/study/coursenew'], resolve),
name: 'courseStudyIndex',
meta: { title: '课程学习', keepAlive: true, icon: 'dashboard', noCache: true, affix: false },
},
{
meta: {title: '课程学习', keepAlive: true, icon: 'dashboard', noCache: true, affix: false},
},
//讲师认证
{
path: '/case',
hidden: true,
component: (resolve) => require(['@/views/portal/case/Index'], resolve),
name: 'case',
meta: { title: '案例', keepAlive: true, icon: 'dashboard', noCache: false, affix: true },
},
{
meta: {title: '案例', keepAlive: true, icon: 'dashboard', noCache: false, affix: true},
},
{
path: '/case/detail',
hidden: true,
component: (resolve) => require(['@/views/portal/case/Detail'], resolve),
name: 'caseDetail',
meta: { title: '案例详情', keepAlive: true, icon: 'dashboard', noCache: false, affix: true },
},
{
meta: {title: '案例详情', keepAlive: true, icon: 'dashboard', noCache: false, affix: true},
},
{
path: '/article',
hidden: true,
component: (resolve) => require(['@/views/portal/article/Index'], resolve),
name: 'article',
meta: { title: '文章', icon: 'dashboard', noCache: true, affix: false },
},
{
meta: {title: '文章', icon: 'dashboard', noCache: true, affix: false},
},
{
path: '/article/detail',
hidden: true,
component: (resolve) => require(['@/views/portal/article/Detail'], resolve),
name: 'articleDetail',
meta: { title: '文章详情', icon: 'dashboard', noCache: true, affix: false },
},
{
meta: {title: '文章详情', icon: 'dashboard', noCache: true, affix: false},
},
{
path: '/article/add',
hidden: true,
component: (resolve) => require(['@/views/portal/article/Add'], resolve),
name: 'articleAdd',
meta: { title: '发布文章', icon: 'dashboard', noCache: true, affix: false },
},
{
meta: {title: '发布文章', icon: 'dashboard', noCache: true, affix: false},
},
{
path: '/qa',
hidden: true,
component: (resolve) => require(['@/views/portal/qa/Index'], resolve),
name: 'qa',
meta: { title: '问答', icon: 'dashboard', noCache: true, affix: false },
},
{
meta: {title: '问答', icon: 'dashboard', noCache: true, affix: false},
},
{
path: '/message',
hidden: true,
component: (resolve) => require(['@/views/portal/user/Message'], resolve),
name: 'userMsg',
meta: { title: '我的消息', icon: 'dashboard', noCache: true, affix: false },
},
{
meta: {title: '我的消息', icon: 'dashboard', noCache: true, affix: false},
},
{
path: '/home',
hidden: true,
component: (resolve) => require(['@/views/homepage/Index'], resolve),
name: 'homePage',
redirect: '/home/:id',
meta: { title: '个人主页', icon: 'dashboard', noCache: true, affix: false },
meta: {title: '个人主页', icon: 'dashboard', noCache: true, affix: false},
children: [{
path: ':id',
hidden: true,
component: (resolve) => require(['@/views/homepage/page'], resolve),
name: 'page',
meta: { title: '个人主页', icon: 'dashboard', noCache: true, affix: true }
meta: {title: '个人主页', icon: 'dashboard', noCache: true, affix: true}
},
{
path: ':id/leaving',
hidden: true,
component: (resolve) => require(['@/views/homepage/leavingMessage'], resolve),
name: 'leavingMessage',
meta: { title: '留言', icon: 'dashboard', noCache: true, affix: true }
meta: {title: '留言', icon: 'dashboard', noCache: true, affix: true}
}
]
},
{
},
{
path: '/comments',
hidden: true,
component: (resolve) => require(['@/views/portal/Comments'], resolve),
name: 'commentReply',
meta: { title: '评论回复', icon: 'dashboard', noCache: true, affix: false },
},
{
meta: {title: '评论回复', icon: 'dashboard', noCache: true, affix: false},
},
{
path: '/qa/answer',
hidden: true,
component: (resolve) => require(['@/views/portal/qa/Answer'], resolve),
name: 'qaAnswer',
meta: { title: '写回答', icon: 'dashboard', noCache: true, affix: false },
},
{
meta: {title: '写回答', icon: 'dashboard', noCache: true, affix: false},
},
{
path: '/follow',
hidden: true,
component: (resolve) => require(['@/views/portal/follow'], resolve),
name: 'follow',
meta: { title: '我的关注', icon: 'dashboard', noCache: true, affix: false },
},
{
meta: {title: '我的关注', icon: 'dashboard', noCache: true, affix: false},
},
{
path: '/study',
component: Layout,
redirect: '/study/index',
@@ -280,10 +281,10 @@ export const constantRoutes = [{
hidden: true,
component: (resolve) => require(['@/views/StudyIndex'], resolve),
name: 'studyIndex',
meta: { title: '首页', icon: 'dashboard', noCache: true, affix: true }
meta: {title: '首页', icon: 'dashboard', noCache: true, affix: true}
}]
},
{
},
{
path: '/teacher',
component: Layout,
children: [{
@@ -291,10 +292,10 @@ export const constantRoutes = [{
hidden: true,
component: (resolve) => require(['@/views/TeacherIndex'], resolve),
name: 'teacherIndex',
meta: { title: '教师个人中心', icon: 'dashboard', noCache: true, affix: true }
meta: {title: '教师个人中心', icon: 'dashboard', noCache: true, affix: true}
}]
},
{
},
{
path: '/manager',
component: Layout,
children: [{
@@ -302,38 +303,38 @@ export const constantRoutes = [{
hidden: true,
component: (resolve) => require(['@/views/ManageIndex'], resolve),
name: 'managerIndex',
meta: { title: '管理员个人中心', icon: 'dashboard', noCache: true, affix: true }
meta: {title: '管理员个人中心', icon: 'dashboard', noCache: true, affix: true}
}]
},
{
},
{
path: '/exam/test',
hidden: true,
component: (resolve) => require(['@/views/exam/Test'], resolve),
name: 'test',
meta: { title: '京东方大学堂考试', icon: 'dashboard', noCache: true, affix: true },
},
{
meta: {title: '京东方大学堂考试', icon: 'dashboard', noCache: true, affix: true},
},
{
path: '/video/test',
hidden: true,
component: (resolve) => require(['@/views/portal/course/video'], resolve),
name: 'videotest',
meta: { title: '课程视频测试', icon: 'dashboard', noCache: true, affix: true },
},
{
meta: {title: '课程视频测试', icon: 'dashboard', noCache: true, affix: true},
},
{
path: '/404',
component: (resolve) => require(['@/views/error/404'], resolve),
hidden: true
},
{
},
{
path: '/401',
component: (resolve) => require(['@/views/error/401'], resolve),
hidden: true
},
{
},
{
path: '/500',
component: (resolve) => require(['@/views/error/500'], resolve),
hidden: true
}
}
]
const router = new VueRouter({
@@ -344,7 +345,7 @@ const router = new VueRouter({
if (saveTop) {
return saveTop;
} else {
return { x: 0, y: 0 }
return {x: 0, y: 0}
}
},
})

View File

@@ -0,0 +1,113 @@
<script>
import {addTeacher, getCertificationProcess, setOfflineTutoring} from "@/api/modules/lecturer";
import processStatus from "@/components/processStatus.vue";
export default {
name: "CoachingPage",
components: {processStatus},
data(){
return{
options: [],
value: '',
value2:'',
teacherId:''
}
},
created() {
//读取路由参数
this.teacherId=this.$route.query.teacherId
//获取老师列表
this.getTeacherList()
},
methods:{
getTeacherList() {
addTeacher({pageNo:1,pageSize:100,keyword:''}).then(res=>{
this.options = res.data.map(item => {
return { value: item.realName, label: item.realName };
});
})
},
getCoachingTeacher(){
console.log(this.value)
},
getJump(){
let tutor=this.value.join(',')
let tutorTime=this.value2
if (tutor==''||tutorTime==''){
this.$message({
message: '请填写必填信息',
type: 'error'
});
}else {
setOfflineTutoring({teacherId:this.teacherId,tutor,tutorTime}).then(res=>{
this.$router.push({
path:'/need/coachingsuccess',
query:{
teacherId:this.teacherId
}
})
})
}
}
}
}
</script>
<template>
<div>
<process-status :teacherId="teacherId"></process-status>
<div class="title">线下辅导</div>
<el-container>
<div class="form-table">
<div class="tip" style="margin-bottom: 20px;color: #d7d7d7;">您还未完成线下辅导快去约辅导老师辅导课件吧</div>
<el-form >
<el-form-item required label="辅导老师:">
<el-select
v-model="value"
multiple
filterable
remote
reserve-keyword
placeholder="请输入辅导老师姓名"
@change="getCoachingTeacher"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item required label="辅导时间:">
<el-date-picker
v-model="value2"
type="datetime"
placeholder="请选择辅导完成时间"
format="yyyy-MM-dd HH:mm"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
<el-button type="primary" size="medium" style="margin-top: 20px;margin-left: 70px" @click="getJump()">已完成</el-button>
</el-form>
<div class="tip" style="margin-bottom: 20px;color: #797979;margin-top: 24px">提示如若未完成线下辅导请勿点击已完成</div>
</div>
</el-container>
</div>
</template>
<style scoped lang="scss">
.title{
font-size: 16px;
font-weight: 800;
border-bottom: 1px solid rgba(153, 153, 153, 0.2);
padding: 2px 2px 20px 2px;
}
.form-table{
width: 100%;
margin-top: 20px;
}
</style>

View File

@@ -0,0 +1,273 @@
<script>
import lecturer, {addTeacher, getCertificationProcess, getProgress, getTeacherInfo} from "@/api/modules/lecturer";
import processStatus from "@/components/processStatus.vue";
export default {
name: "CoachingSuccess",
components: {processStatus},
data() {
return {
teacherId: '',
form: {
teacherName: '',
teacherNo: '',
orgName: ''
},
progressData: {},
fileBaseUrl: process.env.VUE_APP_BOE_MOBILE_URL,
uploadUrl:process.env.VUE_APP_FILE_BASE_URL,
disabled: false,
statusInfo: '',
teacherInfo:''
}
},
created() {
//读取路由参数
this.teacherId = this.$route.query.teacherId
//获取教师基本信息
this.baseInfo()
this.getStatus()
},
methods: {
//获取教师认证状态
getStatus() {
getCertificationProcess({teacherId: this.teacherId}).then(res => {
this.statusInfo = res.data
})
},
baseInfo() {
getTeacherInfo({teacherId: this.teacherId}).then(res => {
this.teacherInfo=res.data[0]
var orgNameList=res.data[0].orgName.split('/')
if (orgNameList.length<=3){
this.form.orgName=res.data[0].orgName
}else {
this.form.orgName=orgNameList[orgNameList.length-3]+'/'+orgNameList[orgNameList.length-2]+'/'+orgNameList[orgNameList.length-1]
}
/*
* teacherName:教师姓名 teacherNo:教师工号 orgName:组织 positionName:岗位 bandCode:职级 courseName:认证课程名称 courseContent课程内容分类
* courseIntroduction:课程简介
* */
this.form.teacherName = res.data[0].teacherName
this.form.teacherNo = res.data[0].teacherNo
this.form.positionName = res.data[0].positionName
this.form.bandCode = res.data[0].bandCode
this.form.courseName = res.data[0].courseName
this.form.courseContent = res.data[0].courseContent
this.form.courseIntroduction = res.data[0].courseIntroduction
this.form.coursewareName = res.data[0].examineCourseware.coursewareName
this.form.tutor = res.data[0].tutor.split(',')
this.form.tutorTime = res.data[0].tutorTime
//获取学习进度
this.addTeacher()
})
},
addTeacher() {
addTeacher({pageNo: 1, pageSize: 10, keyword: this.form.teacherNo}).then(res => {
this.getProgress(res.data[0].id)
})
},
getProgress(id) {
getProgress({teacherId: id}).then(res => {
this.progressData = res.data
res.data.forEach((item, index) => {
if (item.progress != 100) {
this.disabled = true
return
}
})
})
},
getJump() {
this.$router.push({
path: '/need/final',
query: {teacherId: this.teacherId}
})
},
toCaseData(courseId){
this.$router.push("/course/studyindex?id=" + courseId);
},
downloadFile(){
lecturer.exportPdf({coursewareId:this.teacherInfo.examineCourseware.id}).then(res=>{
if(res.status) {
this.$message.error('导出失败');
} else {
const link = document.createElement('a');// 创建a标签
let blob = new Blob([res],{type: 'application/vnd.;charset=UTF-8'}); // 设置文件类型
link.style.display = "none";
link.href = URL.createObjectURL(blob); // 创建URL
link.setAttribute("download", this.teacherInfo.examineCourseware.coursewareName);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
this.dialogVisible = false;
}
})
}
}
}
</script>
<template>
<div>
<process-status :teacherId="teacherId"></process-status>
<div class="title">基本信息</div>
<el-container>
<div class="form-table">
<el-form>
<div>
<el-col :span="11">
<el-form-item label="姓名:">
{{ form.teacherName }}
</el-form-item>
</el-col>
<el-col :span="11" :offset="2">
<el-form-item label="工号:">
{{ form.teacherNo }}
</el-form-item>
</el-col>
</div>
<div>
<el-col :span="11">
<el-form-item label="组织:">
{{ form.orgName }}
</el-form-item>
</el-col>
<el-col :span="11" :offset="2">
<el-form-item label="岗位:">
{{ form.positionName }}
</el-form-item>
</el-col>
</div>
<div>
<el-col :span="11">
<el-form-item label="认证课程名称:" prop="courseName">
<div style="overflow: hidden;text-overflow: ellipsis;white-space: nowrap;cursor: pointer;" :title="form.courseName">
{{ form.courseName }}
</div>
</el-form-item>
</el-col>
<el-col :span="11" :offset="2">
<el-form-item label="课程内容分类:" prop="courseContent">
{{ form.courseContent }}
</el-form-item>
</el-col>
</div>
<el-form-item label="课程简介:" prop="courseIntroduction">
{{ form.courseIntroduction }}
</el-form-item>
<el-form-item label="初稿课件:" prop="courseIntroduction">
{{ form.coursewareName }} <span style="color: #1378f6;display: inline-block;margin-left: 16px;cursor: pointer;" @click="downloadFile">查看</span>
</el-form-item>
</el-form>
</div>
</el-container>
<div class="title" style="margin-top: 20px">线上课程</div>
<div class="progress" >
<div v-for="(item,index) in progressData" :key="index" @click="toCaseData(item.courseId)">
<div class="uc-course-img" style="width: 212px;height:119px">
<img style="width: 100%;" v-if="item.courseImage!=''&&item.courseImage.includes('https://')" :src="item.courseImage">
<img style="width: 100%;" v-else-if="item.courseImage!=''" :src="uploadUrl+item.courseImage">
<img style="width: 100%;" v-else :src="fileBaseUrl+'/pc/images/bgimg/course.png'">
</div>
<div class="courseName" :title="item.courseName">{{ item.courseName }}</div>
<div class="smallTitle">当前进度</div>
<el-progress :percentage="parseInt(item.progress)" :color="parseInt(item.progress)=='100'?'#31AF0D':'#FFA050'"></el-progress>
</div>
</div>
<div>
<div class="title" style="margin-top: 20px">线下辅导</div>
<el-container>
<div class="form-table">
<el-form>
<el-form-item label="辅导老师:">
<span v-for="(item,index) in form.tutor" :key="item"
style="display: inline-block;margin-right: 20px">{{ item }}</span>
</el-form-item>
<el-form-item label="辅导时间:">
{{ form.tutorTime }}
</el-form-item>
</el-form>
</div>
</el-container>
</div>
<div class="tip">
提示您已完成线下辅导快去进行下一步吧
</div>
<el-button type="primary" style="margin-top: 20px;" @click="getJump()">下一步</el-button>
</div>
</template>
<style scoped lang="scss">
.title {
font-size: 16px;
font-weight: 800;
border-bottom: 1px solid rgba(153, 153, 153, 0.2);
padding: 2px 2px 20px 2px;
}
.form-table {
width: 100%;
margin-top: 20px;
}
.progress{
display: flex;
align-items: center;
margin-top: 20px;
flex-wrap: wrap;
}
.progress>div{
width: 300px;
margin-right: 30px;
margin-bottom: 12px;
}
.courseName {
font-weight: 650;
color: #333333;
font-size: 14px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
width: 100%;
}
.smallTitle {
color: #134054;
font-size: 12px;
margin-top: 7px;
}
::v-deep .el-form-item__content {
font-weight: 500;
}
::v-deep .el-form-item {
margin-bottom: 0px;
}
.tip {
color: #333333;
font-size: 14px;
margin-top: 20px;
}
::v-deep .el-progress-bar__outer{
background-color: rgba(255, 160, 80, 0.2);
}
::v-deep .el-form-item__label{
font-weight: 400;
font-size: 14px;
color: #333333;
line-height: 40px;
}
::v-deep .el-form-item__content{
font-weight: 400;
font-size: 14px;
color: #333333;
line-height: 40px;
}
</style>

View File

@@ -0,0 +1,280 @@
<script>
import {mapActions, mapGetters} from "vuex";
import {getCertificationProcess, getTeacherInfo, setOfflineTutoring, treeList} from "@/api/modules/lecturer"
import processStatus from "@/components/processStatus.vue";
import axios from "axios";
export default {
name: "FinalDraft",
components: {processStatus},
computed: {
...mapGetters(['userInfo'])
},
data(){
return{
disabled:false,
//状态信息
statusInfo:{},
sysType: [],
sysProps: {
value: "name",
label: "name"
},
sysTypeListMap:[],
//教师id
teacherId:'',
labelPosition:'right',
form: {
teacherName: '',
teacherNo: '',
orgName: '',
positionName: '',
bandCode: '',
courseName:'',
courseContent:'',
courseIntroduction:'',
coursewareUrl:'',
courseContent_1:''
},
rules: {
courseName: [
{required: true, message: '请输入认证课程名称', trigger: 'change'},
{ min: 1, max: 50, message: '最多五十字', trigger: 'blur' }
],
courseContent_1: [
{required: true, message: '请选择课程分类', trigger: 'change'}
],
courseIntroduction: [
{required: true, message: '请输入课程简介', trigger: 'change'},
{ min: 1, max: 500, message: '最多五百字', trigger: 'blur' }
],
}
}
},
methods:{
...mapActions({
getResOwnerTree:'resOwner/getResOwnerTree',
loadResOwners:'resOwner/loadResOwners',
getSysTypeTree:'sysType/getSysTypeTree',
loadSysTypes:'sysType/loadSysTypes'
}),
//获取教师认证状态
getStatus(){
getCertificationProcess({teacherId:this.teacherId}).then(res=>{
this.statusInfo=res.data
if (this.statusInfo.draftStatus==0){
this.disabled=true
}
})
},
baseInfo(){
getTeacherInfo({teacherId:this.teacherId}).then(res=>{
var orgNameList=res.data[0].orgName.split('/')
if (orgNameList.length<=3){
this.form.orgName=res.data[0].orgName
}else {
this.form.orgName=orgNameList[orgNameList.length-3]+'/'+orgNameList[orgNameList.length-2]+'/'+orgNameList[orgNameList.length-1]
}
this.form.teacherName=res.data[0].teacherName
this.form.teacherNo=res.data[0].teacherNo
this.form.courseContent_1=res.data[0].courseContent.split('/')
this.form.courseIntroduction=res.data[0].courseIntroduction
this.form.courseName=res.data[0].courseName
this.form.positionName=res.data[0].positionName
this.form.bandCode=res.data[0].bandCode
//获取初始值
this.form.courseNameOne=res.data[0].courseName
this.form.courseIntroductionOne=res.data[0].courseIntroduction
this.form.courseContent_2=res.data[0].courseContent
})
},
onSubmit(formName){
this.$refs[formName].validate((valid) => {
if (valid) {
if (this.form.coursewareUrl==''){
this.$message({
message: '未上传文件',
type: 'error'
});
return
}else {
this.form.courseContent = this.form.courseContent_1.join('/');
setOfflineTutoring(
{teacherId:this.teacherId,
courseName:this.form.courseNameOne==this.form.courseName?null:this.form.courseName,
courseContent:this.form.courseContent_2==this.form.courseContent?null:this.form.courseContent,
courseIntroduction:this.form.courseIntroductionOne==this.form.courseIntroduction?null:this.form.courseIntroduction,
coursewareUrl:this.form.coursewareUrl,
coursewareName:this.form.coursewareName,
version:1
}).then(res=>{
if (res.code==200){
this.$message({
message: '设置成功',
type: 'success'
});
this.$router.push({
path:'/need/finalsuccess',
query:{teacherId:this.teacherId}
})
}else {
this.$message({
message: res.msg,
type: 'error'
});
}
})
}
} else {
return false;
}
});
},
handRemove(file){
this.form.coursewareUrl=''
this.form.coursewareName=''
},
handlSuccess(response, file, fileList){
if (response.code==200){
this.form.coursewareUrl=response.data.coursewareUrl
this.form.coursewareName=response.data.coursewareName
this.$message({
message: '上传成功',
type: 'success'
});
}
},
handlError(response, file, fileList){
this.$message({
message: '上传失败',
type: 'error'
});
},
beforeUpload(file) {
axios.defaults.timeout = 30000;
const isLt2M = file.size / 1024 / 1024 <= 500;
if (!isLt2M) {
this.$message.error('文件大小超出500M请重新上传');
}
return isLt2M;
}
},
created() {
//获取基本信息
this.teacherId=this.$route.query.teacherId
this.baseInfo()
this.getStatus()
this.getSysTypeTree().then(rs=>{
this.sysTypeListMap=rs;
})
}
}
</script>
<template>
<div>
<process-status :teacherId="teacherId"></process-status>
<div class="title">上传终稿</div>
<el-container>
<div class="form-table">
<el-form ref="form" :model="form" :rules="rules" :label-position="labelPosition" label-width="140px">
<div>
<el-col :span="10">
<el-form-item label="姓名:">
<el-input type="text" :disabled="true" v-model="form.teacherName"></el-input>
</el-form-item>
</el-col>
<el-col :span="10" :offset="4">
<el-form-item label="工号:">
<el-input type="text" :disabled="true" v-model="form.teacherNo"></el-input>
</el-form-item>
</el-col>
</div>
<el-form-item label="组织:">
<el-input v-model="form.orgName" :disabled="true"></el-input>
</el-form-item>
<div>
<el-col :span="10">
<el-form-item label="岗位:">
<el-input type="text" :disabled="true" v-model="form.positionName"></el-input>
</el-form-item>
</el-col>
<el-col :span="10" :offset="4">
<el-form-item label="职级:">
<el-input type="text" :disabled="true" v-model="form.bandCode"></el-input>
</el-form-item>
</el-col>
</div>
<el-form-item label="认证课程名称:" prop="courseName">
<el-input v-model="form.courseName" maxlength="30"
show-word-limit placeholder="请输入认证课程名称"></el-input>
</el-form-item>
<el-form-item label="课程内容分类:" prop="courseContent_1">
<el-cascader placeholder="选择内容分类" style="width:100%" clearable v-model="form.courseContent_1" :props="sysProps" :options="sysTypeListMap"></el-cascader>
</el-form-item>
<el-form-item label="课程简介:" prop="courseIntroduction">
<el-input type="textarea" maxlength="150"
show-word-limit rows="5" v-model="form.courseIntroduction"></el-input>
</el-form-item>
<el-form-item label="上传终稿:" required>
<el-upload
class="upload-demo"
drag
action="/activityApi/certification/uploadCourseware"
accept=".ppt,.pptx,.pdf"
:on-success="handlSuccess"
:on-error="handlError"
:limit="1"
:before-upload="beforeUpload"
:on-remove="handRemove"
multiple>
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<div class="el-upload__tip" slot="tip">请上传解密后的文件仅支持上传pptpptxpdf格式文件</div>
</el-upload>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit('form')">提交</el-button>
</el-form-item>
</el-form>
</div>
</el-container>
</div>
</template>
<style scoped lang="scss">
.title{
font-size: 16px;
font-weight: 800;
border-bottom: 1px solid rgba(153, 153, 153, 0.2);
padding: 2px 2px 20px 2px;
}
.form-table{
width: 100%;
margin-top: 20px;
}
.iconImg{
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
color: #333333;
font-size: 14px;
}
.iconImg>img{
width: 30px;
height: 30px;
margin-bottom: 10px;
}
.line{
width: 2px;
height: 100px;
background-color: #d7d7d7;
margin-top: 3px;
margin-bottom: 3px;
}
::v-deep .el-upload__tip{
font-size: 18px;
}
</style>

View File

@@ -0,0 +1,406 @@
<script>
import lecturer, {
addTeacher,
getCertificationProcess,
getProgress,
getReviewResult,
getTeacherInfo, secondExamine
} from "@/api/modules/lecturer";
import processStatus from "@/components/processStatus.vue";
export default {
name: "FinalSuccess",
components: {processStatus},
data() {
return {
teacherId: '',
form: {
teacherName: '',
teacherNo: '',
orgName: ''
},
progressData: {},
fileBaseUrl: process.env.VUE_APP_BOE_MOBILE_URL,
uploadUrl:process.env.VUE_APP_FILE_BASE_URL,
disabled: false,
statusInfo: '',
result: '',
newTeacherId: '',
isFalse: true,
teacherInfo: ''
}
},
created() {
//读取路由参数
this.teacherId = this.$route.query.teacherId
//获取教师基本信息
this.baseInfo()
this.getStatus()
this.getReviewResult()
},
methods: {
//前往二次认证
getoFactor(second) {
secondExamine({teacherId: this.teacherId, second,}).then(res => {
this.newTeacherId = res.data.replace(/[^0-9]/ig, '')
if (res.code == 200) {
if (second == 1) {
this.$router.push({
path: '/need/twoathentication',
query: {teacherId: this.newTeacherId}
})
} else {
this.$router.push('/need/lecturer')
}
} else {
this.$message({
message: res.msg,
type: 'error'
});
}
})
},
//获取认证结果
getReviewResult() {
getReviewResult({teacherId: this.teacherId}).then(res => {
this.result = res.data
})
},
//获取教师认证状态
getStatus() {
getCertificationProcess({teacherId: this.teacherId}).then(res => {
this.statusInfo = res.data
})
},
baseInfo() {
getTeacherInfo({teacherId: this.teacherId}).then(res => {
this.teacherInfo = res.data[0]
var orgNameList=res.data[0].orgName.split('/')
if (orgNameList.length<=3){
this.form.orgName=res.data[0].orgName
}else {
this.form.orgName=orgNameList[orgNameList.length-3]+'/'+orgNameList[orgNameList.length-2]+'/'+orgNameList[orgNameList.length-1]
}
/*
* teacherName:教师姓名 teacherNo:教师工号 orgName:组织 positionName:岗位 bandCode:职级 courseName:认证课程名称 courseContent课程内容分类
* courseIntroduction:课程简介
* */
this.form.teacherName = res.data[0].teacherName
this.form.teacherNo = res.data[0].teacherNo
this.form.positionName = res.data[0].positionName
this.form.bandCode = res.data[0].bandCode
this.form.courseName = res.data[0].courseName
this.form.courseContent = res.data[0].courseContent
this.form.courseIntroduction = res.data[0].courseIntroduction
this.form.coursewareName = res.data[0].examineCourseware.coursewareName
this.form.tutor = res.data[0].tutor.split(',')
this.form.tutorTime = res.data[0].tutorTime
//获取学习进度
this.addTeacher()
})
},
addTeacher() {
addTeacher({pageNo: 1, pageSize: 10, keyword: this.form.teacherNo}).then(res => {
this.getProgress(res.data[0].id)
})
},
getProgress(id) {
getProgress({teacherId: id}).then(res => {
this.progressData = res.data
res.data.forEach((item, index) => {
if (item.progress != 100) {
this.disabled = true
return
}
})
})
},
getJump() {
this.$router.push({
path: '/need/final',
query: {teacherId: this.teacherId}
})
},
toCaseData(courseId) {
this.$router.push("/course/studyindex?id=" + courseId);
},
downloadFile() {
lecturer.exportPdf({coursewareId: this.teacherInfo.examineCourseware.id}).then(res => {
if (res.status) {
this.$message.error('导出失败');
} else {
const link = document.createElement('a');// 创建a标签
let blob = new Blob([res], {type: 'application/vnd.;charset=UTF-8'}); // 设置文件类型
link.style.display = "none";
link.href = URL.createObjectURL(blob); // 创建URL
link.setAttribute("download", this.teacherInfo.examineCourseware.coursewareName);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
this.dialogVisible = false;
}
})
},
getJumplist() {
this.$router.push('/need/lecturer')
}
}
}
</script>
<template>
<div>
<process-status :teacherId="teacherId"></process-status>
<div class="title">基本信息</div>
<el-container>
<div class="form-table">
<el-form>
<div>
<el-col :span="11">
<el-form-item label="姓名:">
{{ form.teacherName }}
</el-form-item>
</el-col>
<el-col :span="11" :offset="2">
<el-form-item label="工号:">
{{ form.teacherNo }}
</el-form-item>
</el-col>
</div>
<div>
<el-col :span="11">
<el-form-item label="组织:">
{{ form.orgName }}
</el-form-item>
</el-col>
<el-col :span="11" :offset="2">
<el-form-item label="岗位:">
{{ form.positionName }}
</el-form-item>
</el-col>
</div>
<div>
<el-col :span="11">
<el-form-item label="认证课程名称:" prop="courseName">
<div style="overflow: hidden;text-overflow: ellipsis;white-space: nowrap;cursor: pointer;" :title="form.courseName">
{{ form.courseName }}
</div>
</el-form-item>
</el-col>
<el-col :span="11" :offset="2">
<el-form-item label="课程内容分类:" prop="courseContent">
{{ form.courseContent }}
</el-form-item>
</el-col>
</div>
<el-form-item label="课程简介:" prop="courseIntroduction">
{{ form.courseIntroduction }}
</el-form-item>
<el-form-item label="终稿课件:" prop="courseIntroduction">
{{ form.coursewareName }} <span
style="color: #1378f6;display: inline-block;margin-left: 16px;cursor: pointer;"
@click="downloadFile">查看</span>
</el-form-item>
</el-form>
</div>
</el-container>
<div class="title" style="margin-top: 20px">线上课程</div>
<div class="progress">
<div v-for="(item,index) in progressData" :key="index" @click="toCaseData(item.courseId)">
<div class="uc-course-img" style="width: 212px;height:119px">
<img style="width: 100%;" v-if="item.courseImage!=''&&item.courseImage.includes('https://')" :src="item.courseImage">
<img style="width: 100%;" v-else-if="item.courseImage!=''" :src="uploadUrl+item.courseImage">
<img style="width: 100%;" v-else :src="fileBaseUrl+'/pc/images/bgimg/course.png'">
</div>
<div class="courseName" :title="item.courseName">{{ item.courseName }}</div>
<div class="smallTitle">当前进度</div>
<el-progress :percentage="parseInt(item.progress)"
:color="parseInt(item.progress)=='100'?'#31AF0D':'#FFA050'"></el-progress>
</div>
</div>
<div>
<div class="title" style="margin-top: 20px">线下辅导</div>
<el-container>
<div class="form-table">
<el-form>
<el-form-item label="辅导老师:">
<span v-for="(item,index) in form.tutor" :key="item"
style="display: inline-block;margin-right: 20px">{{ item }}</span>
</el-form-item>
<el-form-item label="辅导时间:">
{{ form.tutorTime }}
</el-form-item>
</el-form>
</div>
</el-container>
</div>
<div>
<div class="title" style="margin-top: 20px">认证结果</div>
<div v-if="statusInfo.reviewResult==2" class="score">请您耐心等待线下认证安排</div>
<div v-if="statusInfo.reviewResult==0" class="score" style="color: #31AF0D;">
恭喜您您的认证分数为{{ result.avgScore }}已经通过认证
</div>
<div v-if="statusInfo.reviewResult==1" class="score" style="color: #ff0000">
很遗憾您的认证分数为{{ result.avgScore }}没有通过认证
</div>
</div>
<div class="twoFactorAuthentication" v-if="statusInfo.reviewResult==1&&statusInfo.second==0">
<img src="../../assets/images/rightImg.png" alt="">
<div class="titleAuthentication">是否进行二次认证</div>
<div class="yes" @click="getoFactor(1)"></div>
<div class="no" @click="getoFactor(2)"></div>
</div>
</div>
</template>
<style scoped lang="scss">
.title {
font-size: 16px;
font-weight: 800;
border-bottom: 1px solid rgba(153, 153, 153, 0.2);
padding: 2px 2px 20px 2px;
}
.form-table {
width: 100%;
margin-top: 20px;
}
.progress {
display: flex;
align-items: center;
margin-top: 20px;
flex-wrap: wrap;
}
.progress > div {
width: 300px;
margin-right: 30px;
margin-bottom: 12px;
}
.courseName {
font-weight: 650;
color: #333333;
font-size: 14px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
width: 100%;
}
.smallTitle {
color: #134054;
font-size: 12px;
margin-top: 7px;
}
::v-deep .el-form-item__content {
font-weight: 500;
}
::v-deep .el-form-item {
margin-bottom: 0px;
}
.tip {
color: #7d7c7c;
font-size: 14px;
margin-top: 20px;
}
.score {
margin-top: 28px;
font-size: 18px;
color: #333333;
font-weight: 400;
}
.twoFactorAuthentication {
width: 100%;
height: 56px;
background: #F0F6FC;
margin-top: 20px;
border-radius: 6px;
display: flex;
align-items: center;
img {
width: 20px;
height: 20px;
margin-left: 23px;
}
.titleAuthentication {
font-weight: 500;
font-size: 16px;
color: #333333;
margin-left: 16px;
}
.yes {
width: 64px;
height: 24px;
background: #409EFF;
border: 1px solid #409EFF;
font-weight: 400;
font-size: 14px;
color: #FFFFFF;
display: flex;
justify-content: center;
align-items: center;
border-radius: 3px;
margin-left: 20px;
cursor: pointer;
}
.no {
width: 64px;
height: 24px;
background: rgba(64, 158, 255, 0.1);
border: 1px solid #409EFF;
font-weight: 400;
font-size: 14px;
color: #409EFF;
display: flex;
justify-content: center;
align-items: center;
border-radius: 3px;
margin-left: 16px;
cursor: pointer;
}
}
.remind {
margin-bottom: 20px;
box-sizing: border-box;
color: #797979;
}
::v-deep .el-progress-bar__outer {
background-color: rgba(255, 160, 80, 0.2);
}
::v-deep .el-form-item__label {
font-weight: 400;
font-size: 14px;
color: #333333;
line-height: 40px;
}
::v-deep .el-form-item__content {
font-weight: 400;
font-size: 14px;
color: #333333;
line-height: 40px;
}
.over {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
width: 580px;
}
</style>

View File

@@ -0,0 +1,286 @@
<script>
import {mapActions, mapGetters} from "vuex";
import {getCertificationProcess, getTeacherInfo, setOfflineTutoring, treeList} from "@/api/modules/lecturer"
import processStatus from '@/components/processStatus.vue';
import axios from "axios";
export default {
name: "FirstDraft",
computed: {
...mapGetters(['userInfo'])
},
components:{
processStatus
},
data(){
return{
disabled:false,
//状态信息
statusInfo:{},
sysType: [],
sysProps: {
value: "name",
label: "name"
},
sysTypeListMap:[],
//教师id
teacherId:'',
labelPosition:'right',
form: {
teacherName: '',
teacherNo: '',
orgName: '',
positionName: '',
bandCode: '',
courseName:'',
courseContent:'',
courseIntroduction:'',
coursewareUrl:'',
courseContent_1:''
},
rules: {
courseName: [
{required: true, message: '请输入认证课程名称', trigger: 'change'},
{ min: 1, max: 30, message: '最多30字', trigger: 'blur' }
],
courseContent_1: [
{required: true, message: '请选择课程分类', trigger: 'change'}
],
courseIntroduction: [
{required: true, message: '请输入课程简介', trigger: 'change'},
{ min: 1, max: 150, message: '最多150字', trigger: 'blur' }
],
}
}
},
created() {
//获取基本信息
this.teacherId=this.$route.query.teacherId
this.baseInfo()
this.getSysTypeTree().then(rs=>{
this.sysTypeListMap=rs;
})
},
methods:{
...mapActions({
getResOwnerTree:'resOwner/getResOwnerTree',
loadResOwners:'resOwner/loadResOwners',
getSysTypeTree:'sysType/getSysTypeTree',
loadSysTypes:'sysType/loadSysTypes'
}),
//获取教师认证状态
getStatus(){
getCertificationProcess({teacherId:this.teacherId}).then(res=>{
this.statusInfo=res.data
if (this.statusInfo.offlineTutoring==0){
this.$router.push({
path:'/need/coachingsuccess',
query:{teacherId:this.teacherId}
})
}else {
this.$router.push({
path:'/need/onlinelearning',
query:{teacherId:this.teacherId}
})
}
})
},
baseInfo(){
getTeacherInfo({teacherId:this.teacherId}).then(res=>{
var orgNameList=res.data[0].orgName.split('/')
if (orgNameList.length<=3){
this.form.orgName=res.data[0].orgName
}else {
this.form.orgName=orgNameList[orgNameList.length-3]+'/'+orgNameList[orgNameList.length-2]+'/'+orgNameList[orgNameList.length-1]
}
this.form.teacherName=res.data[0].teacherName
this.form.teacherNo=res.data[0].teacherNo
this.form.positionName=res.data[0].positionName
this.form.bandCode=res.data[0].bandCode
this.form.courseContent_1=res.data[0].courseContent.split('/')
this.form.courseIntroduction=res.data[0].courseIntroduction
this.form.courseName=res.data[0].courseName
//获取初始值
this.form.courseNameOne=res.data[0].courseName
this.form.courseIntroductionOne=res.data[0].courseIntroduction
this.form.courseContent_2=res.data[0].courseContent
})
},
onSubmit(formName){
this.$refs[formName].validate((valid) => {
if (valid) {
if (this.form.coursewareUrl==''){
this.$message({
message: '未上传文件',
type: 'error'
});
return
}else {
this.form.courseContent = this.form.courseContent_1.join('/');
setOfflineTutoring(
{teacherId:this.teacherId,
courseName:this.form.courseNameOne==this.form.courseName?null:this.form.courseName,
courseContent:this.form.courseContent_2==this.form.courseContent?null:this.form.courseContent,
courseIntroduction:this.form.courseIntroductionOne==this.form.courseIntroduction?null:this.form.courseIntroduction,
coursewareUrl:this.form.coursewareUrl,
coursewareName:this.form.coursewareName,
version:0
}).then(res=>{
if (res.code==200){
this.$message({
message: '设置成功',
type: 'success'
});
this.getStatus()
}else {
this.$message({
message:res.msg,
type: 'error'
});
}
})
}
} else {
return false;
}
});
},
handRemove(file){
this.form.coursewareUrl=''
this.form.coursewareName=''
},
handlSuccess(response, file, fileList){
if (response.code==200){
this.form.coursewareUrl=response.data.coursewareUrl
this.form.coursewareName=response.data.coursewareName
this.$message({
message: '上传成功',
type: 'success'
});
}
},
handlError(response, file, fileList){
this.$message({
message: '上传失败',
type: 'error'
});
},
beforeUpload(file) {
axios.defaults.timeout = 30000;
const isLt2M = file.size / 1024 / 1024 <= 500;
if (!isLt2M) {
this.$message.error('文件大小超出500M请重新上传');
}
return isLt2M;
}
},
}
</script>
<template>
<div class="main">
<process-status :teacherId="teacherId"></process-status>
<div class="title">上传初稿</div>
<el-container>
<div class="form-table">
<el-form ref="form" :model="form" :rules="rules" :label-position="labelPosition" label-width="140px">
<div>
<el-col :span="10">
<el-form-item label="姓名:">
<el-input type="text" :disabled="true" v-model="form.teacherName"></el-input>
</el-form-item>
</el-col>
<el-col :span="10" :offset="4">
<el-form-item label="工号:">
<el-input type="text" :disabled="true" v-model="form.teacherNo"></el-input>
</el-form-item>
</el-col>
</div>
<el-form-item label="组织:">
<el-input v-model="form.orgName" :disabled="true"></el-input>
</el-form-item>
<div>
<el-col :span="10">
<el-form-item label="岗位:">
<el-input type="text" :disabled="true" v-model="form.positionName"></el-input>
</el-form-item>
</el-col>
<el-col :span="10" :offset="4">
<el-form-item label="职级:">
<el-input type="text" :disabled="true" v-model="form.bandCode"></el-input>
</el-form-item>
</el-col>
</div>
<el-form-item label="认证课程名称:" prop="courseName">
<el-input v-model="form.courseName" maxlength="30"
show-word-limit placeholder="请输入认证课程名称"></el-input>
</el-form-item>
<el-form-item label="课程内容分类:" prop="courseContent_1">
<el-cascader placeholder="选择内容分类" style="width: 100%" clearable v-model="form.courseContent_1" :props="sysProps" :options="sysTypeListMap"></el-cascader>
</el-form-item>
<el-form-item label="课程简介:" prop="courseIntroduction">
<el-input type="textarea" maxlength="150"
show-word-limit style="width: 100%" rows="5" v-model="form.courseIntroduction"></el-input>
</el-form-item>
<el-form-item label="上传初稿:" required>
<el-upload
class="upload-demo"
drag
action="/activityApi/certification/uploadCourseware"
accept=".ppt,.pptx,.pdf"
:on-success="handlSuccess"
:before-upload="beforeUpload"
:on-error="handlError"
:limit="1"
:on-remove="handRemove"
multiple>
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<div class="el-upload__tip" slot="tip">请上传解密后的文件仅支持上传pptpptxpdf格式文件</div>
</el-upload>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit('form')">提交</el-button>
</el-form-item>
</el-form>
</div>
</el-container>
</div>
</template>
<style scoped lang="scss">
.title{
font-size: 16px;
font-weight: 800;
border-bottom: 1px solid rgba(153, 153, 153, 0.2);
padding: 2px 2px 20px 2px;
}
.form-table{
width: 100%;
margin-top: 20px;
}
.iconImg{
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
color: #333333;
font-size: 14px;
}
.iconImg>img{
width: 30px;
height: 30px;
margin-bottom: 10px;
}
.line{
width: 2px;
height: 100px;
background-color: #d7d7d7;
margin-top: 3px;
margin-bottom: 3px;
}
::v-deep .el-upload__tip{
font-size: 18px;
}
</style>

View File

@@ -0,0 +1,293 @@
<script>
import {mapGetters} from "vuex";
import courseImage from "@/components/Course/courseImage.vue";
import {getCertificationProcess, getReviewResult, pageList} from "@/api/modules/lecturer"
export default {
name: "index",
components: {courseImage},
data(){
return{
fileBaseUrl:process.env.VUE_APP_FILE_BASE_URL,
params: { teacherNo:'',courseName:'', pageNo: 1, pageSize: 10, },
total:'',
// reviewResult 0-通过1-未通过2-进行中 3-已报名
couresList:[]
}
},
computed: {
...mapGetters(['userInfo'])
},
mounted() {
this.getList();
},
methods:{
jumpRouter(teacherId){
this.$router.push({
path:'/need/draft',
query:{teacherId:teacherId}
})
},
// 列表
getList(){
this.params.teacherNo=this.userInfo.userNo
pageList(this.params).then(res=>{
this.couresList=res.data.page.records
this.total=res.data.page.total
})
},
// 搜索
searchList(){
this.params.pageNo = 1;
this.getList();
},
// 重置
closePageFind(){
this.params.courseName = '';
this.params.pageNo = 1;
this.getList();
},
handleSizeChange(val) {
this.params.pageSize = val;
this.getList();
},
handleCurrentChange(val) {
this.params.pageNo = val;
this.getList();
},
// 根据认证状态跳转页面
getView(item){
getCertificationProcess({teacherId:item.teacherId}).then(res=>{
var data = res.data
if (data.draftStatus==2){
this.$router.push({
path:'/need/draft',
query:{teacherId:item.teacherId}
})
}else if ((data.onlineLearning==1 || data.offlineTutoring==1) && data.secondResult==1){
this.$router.push({
path:'/need/onlinelearning',
query:{teacherId:item.teacherId}
})
}else if (data.endStatus==1 && data.secondResult==1){
this.$router.push({
path:'/need/coachingsuccess',
query:{teacherId:item.teacherId}
})
}else if (data.endStatus==2 && data.secondResult==1){
this.$router.push({
path:'/need/final',
query:{teacherId:item.teacherId}
})
}else if (data.secondResult==1 && (data.reviewResult==2 || data.reviewResult==1)){
this.$router.push({
path:'/need/finalsuccess',
query:{teacherId:item.teacherId}
})
}else if (data.secondResult==0 && data.offlineTutoring==1){
this.$router.push({
path:'/need/twoathentication',
query:{teacherId:item.teacherId}
})
}else if (data.secondResult==0 && data.endStatus==1){
this.$router.push({
path:'/need/twocoachingsuccess',
query:{teacherId:item.teacherId}
})
}else if (data.secondResult==0 && data.endStatus==2){
this.$router.push({
path:'/need/twofinal',
query:{teacherId:item.teacherId}
})
}else {
this.$router.push({
path:'/need/twofinals',
query:{teacherId:item.teacherId}
})
}
})
},
//查看认证记录
getRecording(item){
getCertificationProcess({teacherId:item.teacherId}).then(res=>{
var data = res.data
if (data.secondResult==0){
this.$router.push({
path:'/need/twofinals',
query:{teacherId:item.teacherId}
})
}else {
this.$router.push({
path:'/need/finalsuccess',
query:{teacherId:item.teacherId}
})
}
})
},
//控制跳转
getJump(item){
if (item.reviewResult==1 || item.reviewResult==0){
this.getRecording(item)
}else if (item.reviewResult==2){
this.getView(item)
}else if (item.reviewResult==3){
this.jumpRouter(item.teacherId)
}
}
}
}
</script>
<template>
<div>
<div style="display: flex;justify-content:space-between;position: relative;">
<div style="display: flex;justify-content: flex-start; padding: 12px 32px 10px 12px;">
<div style="margin-left:10px"><el-input v-model="params.courseName" placeholder="请输入认证课程名称" clearable ></el-input></div>
<div style="padding-left: 10px;"><el-button type="primary" icon="el-icon-search" @click="searchList">搜索</el-button></div>
<div style="padding: 0px 5px;"><el-button icon="el-icon-refresh-right" type="primary" @click="closePageFind">重置</el-button></div>
</div>
</div>
<div v-if="this.couresList.length!=0">
<div class="uc-course" v-for="(item, idx) in couresList" :key="idx" @click="getJump(item)">
<div class="uc-course-img" style="width: 212px;height:119px">
<img :src="item.cover">
</div>
<div class="uc-course-info">
<div class="uc-course-name">
<span class="ytg" v-if="item.reviewResult == 0">已通过</span>
<span class="wtg" v-if="item.reviewResult == 1">未通过</span>
<span class="jxz" v-if="item.reviewResult == 2">认证中</span>
<span class="ybm" v-if="item.reviewResult == 3">已报名</span>
<span style="font-size:18px;color:#333">{{ item.draftStatus==1?item.examineName:item.courseName }}</span>
</div>
<div class="summary-item">
<div>{{ item.reviewResult==3?item.description:item.courseIntroduction }}</div>
</div>
<div class="uc-course-text">
{{ item.reviewResult==3||item.reviewResult==2?'报名时间':'认证时间' }}{{ item.reviewResult==3||item.reviewResult==2?item.createTime:item.reviewTime }}
<span type="text" style="margin-left:10px;font-size:14px;cursor: pointer;color:#b6b6b6" v-if="item.reviewResult==1||item.reviewResult==0">查看认证记录</span>
<span type="text" style="margin-left:10px;font-size:14px;cursor: pointer;color:#3da8f0" v-if="item.reviewResult==3">填写信息</span>
<span type="text" style="margin-left:10px;font-size:14px;cursor: pointer;color:#3da8f0" v-if="item.reviewResult==2">查看</span>
</div>
</div>
</div>
</div>
<div v-if="this.couresList.length==0">
<div>
<div class="zan-wu">暂无数据</div>
</div>
</div>
<div v-if="couresList.length > 0" style="text-align: center; margin-top:57px;">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="params.pageNo"
:page-sizes="[10, 20, 30, 40]"
:page-size="params.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
></el-pagination>
</div>
</div>
</template>
<style scoped lang="scss">
.list-wu{
text-align: center;
margin: 40px;
color: #333;
}
.ytg {
color: #2ab28b;
font-size: 18px;
}
.wtg {
color: #fd0000;
font-size: 18px;
}
.jxz {
font-size: 18px;
color: #1378f6;
}
.ybm {
font-size: 18px;
color: #1378f6;
}
.Create-coures {
position: absolute;
right: 32px;
}
.uc-badge {
margin-top: 10px;
margin-right: 40px;
}
.uc-course {
cursor: pointer;
display: flex;
justify-content: space-around;
border-bottom: 1px solid #e8e8e8;
padding: 20px 0px 15px 0px;
margin: 0 32px 0 22px;
::v-deep .uc-course-img {
width: 212px;
img {
width: 212px;height:119px;
border: 1px solid #f4f4f5;
}
}
.uc-course-info {
flex: 1;
line-height: 28px;
padding: 0px 10px;
.summary-item {
padding-top: 10px;
height: 40px;
line-height: 15px;
color: #7d7d7d;
font-size: 14px;
overflow: hidden;
width: 90%;
word-break:break-all;
display: -webkit-box;
// overflow: hidden;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.uc-course-name {
font-size: 16px;
display: -webkit-box;
white-space:pre-wrap;
// word-wrap: break-word;
overflow: hidden;
text-overflow:ellipsis;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
word-break:break-all;
// font-weight: 700;
}
.uc-course-text {
color: #666;
margin-top: 28px;
}
}
.uc-course-btns {
text-align: right;
.btn1 {
height: 44px;
padding: 10px 15px;
}
.btn2 {
height: 44px;
padding: 10px 15px;
}
.btn {
height: 44px;
padding: 10px 15px;
}
}
}
</style>

View File

@@ -0,0 +1,250 @@
<script>
import {addTeacher, getProgress, getTeacherInfo} from "@/api/modules/lecturer";
import lecturer from "@/api/modules/lecturer";
import processStatus from "@/components/processStatus.vue";
export default {
name: "OnlineLearning",
components: {processStatus},
data(){
return{
teacherId:'',
form:{
teacherName:'',
teacherNo:'',
orgName:''
},
progressData:{},
fileBaseUrl:process.env.VUE_APP_BOE_MOBILE_URL,
uploadUrl:process.env.VUE_APP_FILE_BASE_URL,
disabled:true,
statusInfo:'',
teacherInfo:'',
pid:''
}
},
created() {
//读取路由参数
this.teacherId=this.$route.query.teacherId
//获取教师基本信息
this.baseInfo()
},
methods:{
baseInfo(){
getTeacherInfo({teacherId:this.teacherId}).then(res=>{
this.teacherInfo=res.data[0]
var orgNameList=res.data[0].orgName.split('/')
if (orgNameList.length<=3){
this.form.orgName=res.data[0].orgName
}else {
this.form.orgName=orgNameList[orgNameList.length-3]+'/'+orgNameList[orgNameList.length-2]+'/'+orgNameList[orgNameList.length-1]
}
/*
* teacherName:教师姓名 teacherNo:教师工号 orgName:组织 positionName:岗位 bandCode:职级 courseName:认证课程名称 courseContent课程内容分类
* courseIntroduction:课程简介
* */
this.form.teacherName=res.data[0].teacherName
this.form.teacherNo=res.data[0].teacherNo
this.form.positionName=res.data[0].positionName
this.form.bandCode=res.data[0].bandCode
this.form.courseName=res.data[0].courseName
this.form.courseContent=res.data[0].courseContent
this.form.courseIntroduction=res.data[0].courseIntroduction
this.form.coursewareName=res.data[0].examineCourseware.coursewareName
//获取学习进度
this.addTeacher()
})
},
addTeacher(){
addTeacher({pageNo:1,pageSize:10,keyword:this.form.teacherNo}).then(res=>{
this.getProgress(res.data[0].id)
})
},
getProgress(id){
getProgress({teacherId:id}).then(res=>{
this.progressData=res.data
if ( res.data.length>=1 ){
res.data.forEach((item,index)=>{
if (item.progress==100 && index==res.data.length-1){
this.disabled=false
}else if (item.progress==100) {
}else {
this.disabled=true
return
}
})
}
})
},
getJump(){
this.$router.push({
path:'/need/coaching',
query:{teacherId:this.teacherId}
})
},
toCaseData(courseId){
this.$router.push("/course/studyindex?id=" + courseId);
},
downloadFile(){
lecturer.exportPdf({coursewareId:this.teacherInfo.examineCourseware.id}).then(res=>{
if(res.status) {
this.$message.error('导出失败');
} else {
const link = document.createElement('a');// 创建a标签
let blob = new Blob([res],{type: 'application/vnd.;charset=UTF-8'}); // 设置文件类型
link.style.display = "none";
link.href = URL.createObjectURL(blob); // 创建URL
link.setAttribute("download", this.teacherInfo.examineCourseware.coursewareName);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
this.dialogVisible = false;
}
})
}
}
}
</script>
<template>
<div>
<process-status :teacherId="teacherId.toString()" :pid="pid.toString()"></process-status>
<div class="title">基本信息</div>
<el-container>
<div class="form-table">
<el-form>
<div>
<el-col :span="11">
<el-form-item label="姓名:">
{{form.teacherName}}
</el-form-item>
</el-col>
<el-col :span="11" :offset="2">
<el-form-item label="工号:">
{{form.teacherNo}}
</el-form-item>
</el-col>
</div>
<div>
<el-col :span="11">
<el-form-item label="组织:">
{{form.orgName}}
</el-form-item>
</el-col>
<el-col :span="11" :offset="2">
<el-form-item label="岗位:">
{{form.positionName}}
</el-form-item>
</el-col>
</div>
<div>
<el-col :span="11">
<el-form-item label="认证课程名称:" prop="courseName">
<div style="overflow: hidden;text-overflow: ellipsis;white-space: nowrap;cursor: pointer;" :title="form.courseName">
{{ form.courseName }}
</div>
</el-form-item>
</el-col>
<el-col :span="11" :offset="2">
<el-form-item label="课程内容分类:" prop="courseContent">
{{form.courseContent}}
</el-form-item>
</el-col>
</div>
<el-form-item label="课程简介:" prop="courseIntroduction">
{{form.courseIntroduction}}
</el-form-item>
<el-form-item label="初稿课件:" prop="courseIntroduction">
{{form.coursewareName}} <span style="color: #1378f6;display: inline-block;margin-left: 16px; cursor: pointer;" @click="downloadFile">查看</span>
</el-form-item>
</el-form>
</div>
</el-container>
<div class="title" style="margin-top: 20px">线上课程</div>
<div class="progress" >
<div v-for="(item,index) in progressData" :key="index" @click="toCaseData(item.courseId)">
<div class="uc-course-img" style="width: 212px;height:119px">
<img style="width: 100%;" v-if="item.courseImage!=''&&item.courseImage.includes('https://')" :src="item.courseImage">
<img style="width: 100%;" v-else-if="item.courseImage!=''" :src="uploadUrl+item.courseImage">
<img style="width: 100%;" v-else :src="fileBaseUrl+'/pc/images/bgimg/course.png'">
</div>
<div class="courseName" :title="item.courseName">{{ item.courseName }}</div>
<div class="smallTitle">当前进度</div>
<el-progress :percentage="parseInt(item.progress)" :color="parseInt(item.progress)=='100'?'#31AF0D':'#FFA050'"></el-progress>
</div>
</div>
<div class="tip">
{{ disabled==false?'提示:您的线上课程已经学习完毕,快去进行下一步吧':'提示:您的课程还未学习完毕,不能进行下一步!'}}
</div>
<el-button type="primary" :disabled="disabled" style="margin-top: 20px;" @click="getJump()">下一步</el-button>
</div>
</template>
<style scoped lang="scss">
.title{
font-size: 16px;
font-weight: 800;
border-bottom: 1px solid rgba(153, 153, 153, 0.2);
padding: 2px 2px 20px 2px;
}
.form-table{
width: 100%;
margin-top: 20px;
}
.progress{
display: flex;
align-items: center;
margin-top: 20px;
flex-wrap: wrap;
}
.progress>div{
width: 300px;
margin-right: 30px;
margin-bottom: 12px;
}
.courseName {
font-weight: 650;
color: #333333;
font-size: 14px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
width: 100%;
}
.smallTitle{
color:#134054;
font-size:12px;
margin-top: 7px;
}
::v-deep .el-form-item__content{
font-weight: 500;
}
::v-deep .el-form-item{
margin-bottom: 0px;
}
.tip{
color: #333333;
font-weight: 400;
font-size: 14px;
margin-top: 20px;
}
::v-deep .el-progress-bar__outer{
background-color: rgba(255, 160, 80, 0.2);
}
::v-deep .el-form-item__label{
font-weight: 400;
font-size: 14px;
color: #333333;
line-height: 40px;
}
::v-deep .el-form-item__content{
font-weight: 400;
font-size: 14px;
color: #333333;
line-height: 40px;
}
</style>

View File

@@ -0,0 +1,327 @@
<script>
import lecturer, {
addTeacher,
getCertificationProcess,
getProgress,
getReviewResult,
getTeacherInfo, secondExamine
} from "@/api/modules/lecturer";
import processStatus from "@/components/processStatus.vue";
export default {
name: "TwoAthentication",
components: {processStatus},
data(){
return{
teacherId:'',
form:{
teacherName:'',
teacherNo:'',
orgName:''
},
progressData:{},
fileBaseUrl:process.env.VUE_APP_BOE_MOBILE_URL,
uploadUrl:process.env.VUE_APP_FILE_BASE_URL,
disabled:false,
statusInfo:'',
result:'',
newTeacherId:'',
pid:'',
statusInfo1:'',
teacherInfo:''
}
},
created() {
//读取路由参数
this.teacherId=this.$route.query.teacherId
//获取教师基本信息
this.baseInfo()
// this.getReviewResult()
},
methods:{
//获取认证结果
getReviewResult(){
getReviewResult({teacherId:this.pid}).then(res=>{
this.result=res.data
})
},
//获取教师认证状态
getStatus(){
getCertificationProcess({teacherId:this.teacherId}).then(res=>{
this.statusInfo=res.data
})
getCertificationProcess({teacherId:this.pid}).then(res=>{
this.statusInfo1=res.data
})
},
baseInfo(){
getTeacherInfo({teacherId:this.teacherId}).then(res=>{
var orgNameList=res.data[0].orgName.split('/')
if (orgNameList.length<=3){
this.form.orgName=res.data[0].orgName
}else {
this.form.orgName=orgNameList[orgNameList.length-3]+'/'+orgNameList[orgNameList.length-2]+'/'+orgNameList[orgNameList.length-1]
}
this.pid=res.data[0].pid
getTeacherInfo({teacherId:res.data[0].pid}).then(resquest=>{
this.teacherInfo = resquest.data[0]
this.form.teacherName=resquest.data[0].teacherName
this.form.teacherNo=resquest.data[0].teacherNo
this.form.positionName=resquest.data[0].positionName
this.form.bandCode=resquest.data[0].bandCode
this.form.courseName=resquest.data[0].courseName
this.form.courseContent=resquest.data[0].courseContent
this.form.courseIntroduction=resquest.data[0].courseIntroduction
this.form.coursewareName=resquest.data[0].examineCourseware.coursewareName
this.form.tutor = resquest.data[0].tutor.split(',')
this.form.tutorTime = resquest.data[0].tutorTime
//获取学习进度
this.getReviewResult()
this.addTeacher()
this.getStatus()
})
/*
* teacherName:教师姓名 teacherNo:教师工号 orgName:组织 positionName:岗位 bandCode:职级 courseName:认证课程名称 courseContent课程内容分类
* courseIntroduction:课程简介
* */
})
},
addTeacher(){
addTeacher({pageNo:1,pageSize:10,keyword:this.form.teacherNo}).then(res=>{
this.getProgress(res.data[0].id)
})
},
getProgress(id){
getProgress({teacherId:id}).then(res=>{
this.progressData=res.data
res.data.forEach((item,index)=>{
if (item.progress!=100){
this.disabled=true
return
}
})
})
},
format(percentage) {
return percentage === 100 ? '满' : `${percentage}%`;
},
getJump(){
this.$router.push({
path:'/need/twocoaching',
query:{teacherId:this.teacherId}
})
},
toCaseData(courseId){
this.$router.push("/course/studyindex?id=" + courseId);
},
downloadFile() {
lecturer.exportPdf({coursewareId: this.teacherInfo.examineCourseware.id}).then(res => {
if (res.status) {
this.$message.error('导出失败');
} else {
const link = document.createElement('a');// 创建a标签
let blob = new Blob([res], {type: 'application/vnd.;charset=UTF-8'}); // 设置文件类型
link.style.display = "none";
link.href = URL.createObjectURL(blob); // 创建URL
link.setAttribute("download", this.teacherInfo.examineCourseware.coursewareName);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
this.dialogVisible = false;
}
})
}
}
}
</script>
<template>
<div>
<process-status :teacherId="pid.toString()" :pid="teacherId.toString()"></process-status>
<div class="title">基本信息</div>
<el-container>
<div class="form-table">
<el-form>
<div>
<el-col :span="11">
<el-form-item label="姓名:">
{{ form.teacherName }}
</el-form-item>
</el-col>
<el-col :span="11" :offset="2">
<el-form-item label="工号:">
{{ form.teacherNo }}
</el-form-item>
</el-col>
</div>
<div>
<el-col :span="11">
<el-form-item label="组织:">
{{ form.orgName }}
</el-form-item>
</el-col>
<el-col :span="11" :offset="2">
<el-form-item label="岗位:">
{{ form.positionName }}
</el-form-item>
</el-col>
</div>
<div>
<el-col :span="11">
<el-form-item label="认证课程名称:" prop="courseName">
<div style="overflow: hidden;text-overflow: ellipsis;white-space: nowrap;cursor: pointer;" :title="form.courseName">
{{ form.courseName }}
</div>
</el-form-item>
</el-col>
<el-col :span="11" :offset="2">
<el-form-item label="课程内容分类:" prop="courseContent">
{{ form.courseContent }}
</el-form-item>
</el-col>
</div>
<el-form-item label="课程简介:" prop="courseIntroduction">
{{ form.courseIntroduction }}
</el-form-item>
<el-form-item label="终稿课件:" prop="courseIntroduction">
{{ form.coursewareName }} <span
style="color: #1378f6;display: inline-block;margin-left: 16px;cursor: pointer;"
@click="downloadFile">查看</span>
</el-form-item>
</el-form>
</div>
</el-container>
<div class="title" style="margin-top: 20px">线上课程</div>
<div class="progress">
<div v-for="(item,index) in progressData" :key="index" @click="toCaseData(item.courseId)">
<div class="uc-course-img" style="width: 212px;height:119px">
<img style="width: 100%;" v-if="item.courseImage!=''&&item.courseImage.includes('https://')" :src="item.courseImage">
<img style="width: 100%;" v-else-if="item.courseImage!=''" :src="uploadUrl+item.courseImage">
<img style="width: 100%;" v-else :src="fileBaseUrl+'/pc/images/bgimg/course.png'">
</div>
<div class="courseName" :title="item.courseName">{{ item.courseName }}</div>
<div class="smallTitle">当前进度</div>
<el-progress :percentage="parseInt(item.progress)"
:color="parseInt(item.progress)=='100'?'#31AF0D':'#FFA050'"></el-progress>
</div>
</div>
<div>
<div class="title" style="margin-top: 20px">线下辅导</div>
<el-container>
<div class="form-table">
<el-form>
<el-form-item label="辅导老师:">
<span v-for="(item,index) in form.tutor" :key="item"
style="display: inline-block;margin-right: 20px">{{ item }}</span>
</el-form-item>
<el-form-item label="辅导时间:">
{{ form.tutorTime }}
</el-form-item>
</el-form>
</div>
</el-container>
</div>
<div>
<div class="title" style="margin-top: 20px">认证结果</div>
<div v-if="statusInfo1.reviewResult==2" class="score">请您耐心等待线下认证安排</div>
<div v-if="statusInfo1.reviewResult==0" class="score" style="color: #4b7900;">恭喜您您的认证分数为{{ result.avgScore }}已经通过认证</div>
<div v-if="statusInfo1.reviewResult==1" class="score" style="color: #ff0000">很遗憾您的认证分数为{{ result.avgScore }}没有通过认证</div>
</div>
<div>
<div class="title" style="margin-top: 20px">二次线下辅导</div>
<div class="tip">提示您的线上课程已经学习完毕快去进行下一步吧</div>
</div>
<el-button type="primary" style="margin-top: 20px;margin-left: 80px" @click="getJump()">下一步</el-button>
</div>
</template>
<style scoped lang="scss">
.title{
font-size: 16px;
font-weight: 800;
border-bottom: 1px solid rgba(153, 153, 153, 0.2);
padding: 2px 2px 20px 2px;
}
.form-table{
width: 100%;
margin-top: 20px;
}
.progress {
display: flex;
align-items: center;
margin-top: 20px;
flex-wrap: wrap;
}
.progress > div {
width: 300px;
margin-right: 30px;
margin-bottom: 12px;
}
.courseName {
font-weight: 650;
color: #333333;
font-size: 14px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
width: 100%;
}
.smallTitle{
color:#134054;
font-size:12px;
margin-top: 7px;
}
::v-deep .el-form-item__content{
font-weight: 500;
}
::v-deep .el-form-item{
margin-bottom: 0px;
}
.tip{
color: #333333;
font-size: 14px;
margin-top: 20px;
}
.score {
margin-top: 28px;
font-size: 18px;
color: #333333;
font-weight: 400;
}
.twoFactorAuthentication{
width: 344px;
height: 135px;
padding: 2px 2px 2px 2px;
border: 1px solid #d7d7d7;
background-color: #ffffff;
box-sizing: border-box;
margin-top: 20px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.remind {
margin-bottom: 20px;
box-sizing: border-box;
color: #797979;
}
::v-deep .el-progress-bar__outer {
background-color: rgba(255, 160, 80, 0.2);
}
::v-deep .el-form-item__label {
font-weight: 400;
font-size: 14px;
color: #333333;
line-height: 40px;
}
::v-deep .el-form-item__content {
font-weight: 400;
font-size: 14px;
color: #333333;
line-height: 40px;
}
</style>

View File

@@ -0,0 +1,116 @@
<script>
import {addTeacher, getCertificationProcess, getTeacherInfo, setOfflineTutoring} from "@/api/modules/lecturer";
import processStatus from "@/components/processStatus.vue";
export default {
name: "TwoCoaching",
components: {processStatus},
data(){
return{
options: [],
value: '',
value2:'',
teacherId:'',
pid:''
}
},
created() {
//读取路由参数
this.teacherId=this.$route.query.teacherId
//获取老师列表
this.getTeacherList()
getTeacherInfo({teacherId:this.teacherId}).then(res=> {
this.pid = res.data[0].pid
})
},
methods:{
getTeacherList() {
addTeacher({pageNo:1,pageSize:100,keyword:''}).then(res=>{
this.options = res.data.map(item => {
return { value: item.realName, label: item.realName };
});
})
},
getCoachingTeacher(){
console.log(this.value)
},
getJump(){
let tutor=this.value.join(',')
let tutorTime=this.value2
if (tutor==''||tutorTime==''){
this.$message({
message: '请填写必填信息',
type: 'error'
});
}else {
setOfflineTutoring({teacherId:this.teacherId,tutor,tutorTime}).then(res=>{
this.$router.push({
path:'/need/twocoachingsuccess',
query:{
teacherId:this.teacherId
}
})
})
}
}
}
}
</script>
<template>
<div>
<process-status :teacherId="pid.toString()" :pid="teacherId.toString()"></process-status>
<div class="title">二次线下辅导</div>
<el-container>
<div class="form-table">
<div class="tip" style="margin-bottom: 20px;color: #d7d7d7;">您还未完成线下辅导快去约辅导老师辅导课件吧</div>
<el-form>
<el-form-item required label="辅导老师:">
<el-select
v-model="value"
multiple
filterable
remote
reserve-keyword
placeholder="请输入辅导老师姓名"
@change="getCoachingTeacher"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item required label="辅导时间:">
<el-date-picker
v-model="value2"
type="datetime"
placeholder="请选择辅导完成时间"
format="yyyy-MM-dd HH:mm"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
<el-button type="primary" size="medium" style="margin-top: 20px;margin-left: 70px" @click="getJump()">已完成</el-button>
</el-form>
<div class="tip" style="margin-bottom: 20px;margin-top: 24px;font-size: 14px;color: #333333">提示如若未完成线下辅导请勿点击已完成</div>
</div>
</el-container>
</div>
</template>
<style scoped lang="scss">
.title{
font-size: 16px;
width: 850px;
border-bottom: 1px solid rgba(153, 153, 153, 0.2);
padding: 2px 2px 20px 2px;
}
.form-table{
width: 100%;
margin-top: 20px;
}
</style>

View File

@@ -0,0 +1,342 @@
<script>
import lecturer, {
addTeacher,
getCertificationProcess,
getProgress,
getReviewResult,
getTeacherInfo, secondExamine
} from "@/api/modules/lecturer";
import processStatus from "@/components/processStatus.vue";
export default {
name: "TwoCos",
components: {processStatus},
data(){
return{
teacherId:'',
form:{
teacherName:'',
teacherNo:'',
orgName:''
},
progressData:{},
fileBaseUrl:process.env.VUE_APP_BOE_MOBILE_URL,
uploadUrl:process.env.VUE_APP_FILE_BASE_URL,
disabled:false,
statusInfo:'',
result:'',
newTeacherId:'',
pid:'',
statusInfo1:'',
teacherInfo:'',
form1:{}
}
},
created() {
//读取路由参数
this.teacherId=this.$route.query.teacherId
//获取教师基本信息
this.baseInfo()
// this.getReviewResult()
},
methods:{
//获取认证结果
getReviewResult(){
getReviewResult({teacherId:this.pid}).then(res=>{
this.result=res.data
})
},
//获取教师认证状态
getStatus(){
getCertificationProcess({teacherId:this.teacherId}).then(res=>{
this.statusInfo=res.data
})
getCertificationProcess({teacherId:this.pid}).then(res=>{
this.statusInfo1=res.data
})
},
baseInfo(){
getTeacherInfo({teacherId:this.teacherId}).then(res=>{
this.pid=res.data[0].pid
var orgNameList=res.data[0].orgName.split('/')
if (orgNameList.length<=3){
this.form.orgName=res.data[0].orgName
}else {
this.form.orgName=orgNameList[orgNameList.length-3]+'/'+orgNameList[orgNameList.length-2]+'/'+orgNameList[orgNameList.length-1]
}
this.form1.tutor = res.data[0].tutor.split(',')
this.form1.tutorTime = res.data[0].tutorTime
getTeacherInfo({teacherId:res.data[0].pid}).then(resquest=>{
this.teacherInfo = resquest.data[0]
this.form.teacherName=resquest.data[0].teacherName
this.form.teacherNo=resquest.data[0].teacherNo
this.form.positionName=resquest.data[0].positionName
this.form.bandCode=resquest.data[0].bandCode
this.form.courseName=resquest.data[0].courseName
this.form.courseContent=resquest.data[0].courseContent
this.form.courseIntroduction=resquest.data[0].courseIntroduction
this.form.coursewareName=resquest.data[0].examineCourseware.coursewareName
this.form.tutor = resquest.data[0].tutor.split(',')
this.form.tutorTime = resquest.data[0].tutorTime
//获取学习进度
this.getReviewResult()
this.addTeacher()
this.getStatus()
})
/*
* teacherName:教师姓名 teacherNo:教师工号 orgName:组织 positionName:岗位 bandCode:职级 courseName:认证课程名称 courseContent课程内容分类
* courseIntroduction:课程简介
* */
})
},
addTeacher(){
addTeacher({pageNo:1,pageSize:10,keyword:this.form.teacherNo}).then(res=>{
this.getProgress(res.data[0].id)
})
},
getProgress(id){
getProgress({teacherId:id}).then(res=>{
this.progressData=res.data
res.data.forEach((item,index)=>{
if (item.progress!=100){
this.disabled=true
return
}
})
})
},
format(percentage) {
return percentage === 100 ? '满' : `${percentage}%`;
},
getJump(){
this.$router.push({
path:'/need/twofinal',
query:{teacherId:this.teacherId}
})
},
toCaseData(courseId){
this.$router.push("/course/studyindex?id=" + courseId);
},
downloadFile() {
lecturer.exportPdf({coursewareId: this.teacherInfo.examineCourseware.id}).then(res => {
if (res.status) {
this.$message.error('导出失败');
} else {
const link = document.createElement('a');// 创建a标签
let blob = new Blob([res], {type: 'application/vnd.;charset=UTF-8'}); // 设置文件类型
link.style.display = "none";
link.href = URL.createObjectURL(blob); // 创建URL
link.setAttribute("download", this.teacherInfo.examineCourseware.coursewareName);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
this.dialogVisible = false;
}
})
}
}
}
</script>
<template>
<div>
<process-status :teacherId="pid.toString()" :pid="teacherId.toString()"></process-status>
<div class="title">基本信息</div>
<el-container>
<div class="form-table">
<el-form>
<div>
<el-col :span="11">
<el-form-item label="姓名:">
{{ form.teacherName }}
</el-form-item>
</el-col>
<el-col :span="11" :offset="2">
<el-form-item label="工号:">
{{ form.teacherNo }}
</el-form-item>
</el-col>
</div>
<div>
<el-col :span="11">
<el-form-item label="组织:">
{{ form.orgName }}
</el-form-item>
</el-col>
<el-col :span="11" :offset="2">
<el-form-item label="岗位:">
{{ form.positionName }}
</el-form-item>
</el-col>
</div>
<div>
<el-col :span="11">
<el-form-item label="认证课程名称:" prop="courseName">
<div style="overflow: hidden;text-overflow: ellipsis;white-space: nowrap;cursor: pointer;" :title="form.courseName">
{{ form.courseName }}
</div>
</el-form-item>
</el-col>
<el-col :span="11" :offset="2">
<el-form-item label="课程内容分类:" prop="courseContent">
{{ form.courseContent }}
</el-form-item>
</el-col>
</div>
<el-form-item label="课程简介:" prop="courseIntroduction">
{{ form.courseIntroduction }}
</el-form-item>
<el-form-item label="终稿课件:" prop="courseIntroduction">
{{ form.coursewareName }} <span
style="color: #1378f6;display: inline-block;margin-left: 16px;cursor: pointer;"
@click="downloadFile">查看</span>
</el-form-item>
</el-form>
</div>
</el-container>
<div class="title" style="margin-top: 20px">线上课程</div>
<div class="progress">
<div v-for="(item,index) in progressData" :key="index" @click="toCaseData(item.courseId)">
<div class="uc-course-img" style="width: 212px;height:119px">
<img style="width: 100%;" v-if="item.courseImage!=''&&item.courseImage.includes('https://')" :src="item.courseImage">
<img style="width: 100%;" v-else-if="item.courseImage!=''" :src="uploadUrl+item.courseImage">
<img style="width: 100%;" v-else :src="fileBaseUrl+'/pc/images/bgimg/course.png'">
</div>
<div class="courseName" :title="item.courseName">{{ item.courseName }}</div>
<div class="smallTitle">当前进度</div>
<el-progress :percentage="parseInt(item.progress)"
:color="parseInt(item.progress)=='100'?'#31AF0D':'#FFA050'"></el-progress>
</div>
</div>
<div>
<div class="title" style="margin-top: 20px">线下辅导</div>
<el-container>
<div class="form-table">
<el-form>
<el-form-item label="辅导老师:">
<span v-for="(item,index) in form.tutor" :key="item"
style="display: inline-block;margin-right: 20px">{{ item }}</span>
</el-form-item>
<el-form-item label="辅导时间:">
{{ form.tutorTime }}
</el-form-item>
</el-form>
</div>
</el-container>
</div>
<div>
<div class="title" style="margin-top: 20px">认证结果</div>
<div v-if="statusInfo1.reviewResult==2" class="score">请您耐心等待线下认证安排</div>
<div v-if="statusInfo1.reviewResult==0" class="score" style="color: #4b7900;">恭喜您您的认证分数为{{ result.avgScore }}已经通过认证</div>
<div v-if="statusInfo1.reviewResult==1" class="score" style="color: #ff0000">很遗憾您的认证分数为{{ result.avgScore }}没有通过认证</div>
</div>
<div>
<div class="title" style="margin-top: 20px">二次线下辅导</div>
<el-container>
<div class="form-table">
<el-form>
<el-form-item label="辅导老师:">
<span v-for="(item,index) in form1.tutor" :key="item"
style="display: inline-block;margin-right: 20px">{{ item }}</span>
</el-form-item>
<el-form-item label="辅导时间:">
{{ form1.tutorTime }}
</el-form-item>
</el-form>
</div>
</el-container>
</div>
<el-button type="primary" style="margin-top: 20px;margin-left: 80px" @click="getJump()">下一步</el-button>
</div>
</template>
<style scoped lang="scss">
.title{
font-size: 16px;
font-weight: 800;
border-bottom: 1px solid rgba(153, 153, 153, 0.2);
padding: 2px 2px 20px 2px;
}
.form-table{
width: 100%;
margin-top: 20px;
}
.progress {
display: flex;
align-items: center;
margin-top: 20px;
flex-wrap: wrap;
}
.progress > div {
width: 300px;
margin-right: 30px;
margin-bottom: 12px;
}
.courseName {
font-weight: 650;
color: #333333;
font-size: 14px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
width: 100%;
}
.smallTitle{
color:#134054;
font-size:12px;
margin-top: 7px;
}
::v-deep .el-form-item__content{
font-weight: 500;
}
::v-deep .el-form-item{
margin-bottom: 0px;
}
.tip{
color: #333333;
font-size: 14px;
margin-top: 20px;
}
.score {
margin-top: 28px;
font-size: 18px;
color: #333333;
font-weight: 400;
}
.twoFactorAuthentication{
width: 344px;
height: 135px;
padding: 2px 2px 2px 2px;
border: 1px solid #d7d7d7;
background-color: #ffffff;
box-sizing: border-box;
margin-top: 20px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.remind {
margin-bottom: 20px;
box-sizing: border-box;
color: #797979;
}
::v-deep .el-progress-bar__outer {
background-color: rgba(255, 160, 80, 0.2);
}
::v-deep .el-form-item__label {
font-weight: 400;
font-size: 14px;
color: #333333;
line-height: 40px;
}
::v-deep .el-form-item__content {
font-weight: 400;
font-size: 14px;
color: #333333;
line-height: 40px;
}
</style>

View File

@@ -0,0 +1,282 @@
<script>
import {mapActions, mapGetters} from "vuex";
import {getCertificationProcess, getTeacherInfo, setOfflineTutoring, treeList} from "@/api/modules/lecturer"
import processStatus from "@/components/processStatus.vue";
import axios from "axios";
export default {
name: "TwoFinal",
components: {processStatus},
computed: {
...mapGetters(['userInfo'])
},
data(){
return{
disabled:false,
//状态信息
statusInfo:{},
sysType: [],
sysProps: {
value: "name",
label: "name"
},
sysTypeListMap:[],
//教师id
teacherId:'',
labelPosition:'right',
form: {
teacherName: '',
teacherNo: '',
orgName: '',
positionName: '',
bandCode: '',
courseName:'',
courseContent:'',
courseIntroduction:'',
coursewareUrl:'',
courseContent_1:''
},
pid:'',
rules: {
courseName: [
{required: true, message: '请输入认证课程名称', trigger: 'change'},
{ min: 1, max: 30, message: '最多30字', trigger: 'blur' }
],
courseContent_1: [
{required: true, message: '请选择课程分类', trigger: 'change'}
],
courseIntroduction: [
{required: true, message: '请输入课程简介', trigger: 'change'},
{ min: 1, max: 150, message: '最多150字', trigger: 'blur' }
],
}
}
},
methods:{
...mapActions({
getResOwnerTree:'resOwner/getResOwnerTree',
loadResOwners:'resOwner/loadResOwners',
getSysTypeTree:'sysType/getSysTypeTree',
loadSysTypes:'sysType/loadSysTypes'
}),
//获取教师认证状态
getStatus(){
getCertificationProcess({teacherId:this.teacherId}).then(res=>{
this.statusInfo=res.data
if (this.statusInfo.draftStatus==0){
this.disabled=true
}
})
},
baseInfo(){
getTeacherInfo({teacherId:this.teacherId}).then(res=>{
this.pid=res.data[0].pid
var orgNameList=res.data[0].orgName.split('/')
if (orgNameList.length<=3){
this.form.orgName=res.data[0].orgName
}else {
this.form.orgName=orgNameList[orgNameList.length-3]+'/'+orgNameList[orgNameList.length-2]+'/'+orgNameList[orgNameList.length-1]
}
this.form.teacherName=res.data[0].teacherName
this.form.teacherNo=res.data[0].teacherNo
this.form.positionName=res.data[0].positionName
this.form.bandCode=res.data[0].bandCode
this.form.courseIntroduction=res.data[0].courseIntroduction
this.form.courseContent_1=res.data[0].courseContent.split('/')
this.form.courseName=res.data[0].courseName
//获取初始值
this.form.courseNameOne=res.data[0].courseName
this.form.courseIntroductionOne=res.data[0].courseIntroduction
this.form.courseContent_2=res.data[0].courseContent
})
},
onSubmit(formName){
this.$refs[formName].validate((valid) => {
if (valid) {
if (this.form.coursewareUrl==''){
this.$message({
message: '未上传文件',
type: 'error'
});
return
}else {
this.form.courseContent = this.form.courseContent_1.join('/');
setOfflineTutoring(
{teacherId:this.teacherId,
courseName:this.form.courseNameOne==this.form.courseName?null:this.form.courseName,
courseContent:this.form.courseContent_2==this.form.courseContent?null:this.form.courseContent,
courseIntroduction:this.form.courseIntroductionOne==this.form.courseIntroduction?null:this.form.courseIntroduction,
coursewareUrl:this.form.coursewareUrl,
coursewareName:this.form.coursewareName,
version:1
}).then(res=>{
if (res.code==200){
this.$message({
message: '设置成功',
type: 'success'
});
this.$router.push({
path:'/need/twofinals',
query:{teacherId:this.teacherId}
})
}else {
this.$message({
message: res.msg,
type: 'error'
});
}
})
}
} else {
return false;
}
});
},
handRemove(file){
this.form.coursewareUrl=''
this.form.coursewareName=''
},
handlSuccess(response, file, fileList){
if (response.code==200){
this.form.coursewareUrl=response.data.coursewareUrl
this.form.coursewareName=response.data.coursewareName
this.$message({
message: '上传成功',
type: 'success'
});
}
},
handlError(response, file, fileList){
this.$message({
message: '上传失败',
type: 'error'
});
},
beforeUpload(file) {
axios.defaults.timeout = 30000;
const isLt2M = file.size / 1024 / 1024 <= 500;
if (!isLt2M) {
this.$message.error('文件大小超出500M请重新上传');
}
return isLt2M;
}
},
created() {
//获取基本信息
this.teacherId=this.$route.query.teacherId
this.baseInfo()
this.getStatus()
this.getSysTypeTree().then(rs=>{
this.sysTypeListMap=rs;
})
}
}
</script>
<template>
<div>
<process-status :teacherId="pid.toString()" :pid="teacherId.toString()"></process-status>
<div class="title">二次认证-上传终稿</div>
<el-container>
<div class="form-table">
<el-form ref="form" :model="form" :rules="rules" :label-position="labelPosition" label-width="140px">
<div>
<el-col :span="10">
<el-form-item label="姓名:">
<el-input type="text" :disabled="true" v-model="form.teacherName"></el-input>
</el-form-item>
</el-col>
<el-col :span="10" :offset="4">
<el-form-item label="工号:">
<el-input type="text" :disabled="true" v-model="form.teacherNo"></el-input>
</el-form-item>
</el-col>
</div>
<el-form-item label="组织:">
<el-input v-model="form.orgName" :disabled="true"></el-input>
</el-form-item>
<div>
<el-col :span="10">
<el-form-item label="岗位:">
<el-input type="text" :disabled="true" v-model="form.positionName"></el-input>
</el-form-item>
</el-col>
<el-col :span="10" :offset="4">
<el-form-item label="职级:">
<el-input type="text" :disabled="true" v-model="form.bandCode"></el-input>
</el-form-item>
</el-col>
</div>
<el-form-item label="认证课程名称:" prop="courseName">
<el-input v-model="form.courseName" maxlength="30"
show-word-limit placeholder="请输入认证课程名称"></el-input>
</el-form-item>
<el-form-item label="课程内容分类:" prop="courseContent_1">
<el-cascader placeholder="选择内容分类" style="width: 100%;" clearable v-model="form.courseContent_1" :props="sysProps" :options="sysTypeListMap"></el-cascader>
</el-form-item>
<el-form-item label="课程简介:" prop="courseIntroduction">
<el-input type="textarea" maxlength="150"
show-word-limit rows="5" v-model="form.courseIntroduction"></el-input>
</el-form-item>
<el-form-item label="上传终稿:" required>
<el-upload
class="upload-demo"
drag
action="/activityApi/certification/uploadCourseware"
accept=".ppt,.pptx,.pdf"
:on-success="handlSuccess"
:on-error="handlError"
:limit="1"
:on-remove="handRemove"
:before-upload="beforeUpload"
multiple>
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<div class="el-upload__tip" slot="tip">请上传解密后的文件仅支持上传pptpptxpdf格式文件</div>
</el-upload>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit('form')">提交</el-button>
</el-form-item>
</el-form>
</div>
</el-container>
</div>
</template>
<style scoped lang="scss">
.title{
font-size: 16px;
font-weight: 800;
border-bottom: 1px solid rgba(153, 153, 153, 0.2);
padding: 2px 2px 20px 2px;
}
.form-table{
width: 100%;
margin-top: 20px;
}
.iconImg{
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
color: #333333;
font-size: 14px;
}
.iconImg>img{
width: 30px;
height: 30px;
margin-bottom: 10px;
}
.line{
width: 2px;
height: 100px;
background-color: #d7d7d7;
margin-top: 3px;
margin-bottom: 3px;
}
::v-deep .el-upload__tip{
font-size: 18px;
}
</style>

View File

@@ -0,0 +1,352 @@
<script>
import lecturer, {
addTeacher,
getCertificationProcess,
getProgress,
getReviewResult,
getTeacherInfo, secondExamine
} from "@/api/modules/lecturer";
import processStatus from "@/components/processStatus.vue";
export default {
name: "TwoFinals",
components: {processStatus},
data(){
return{
teacherId:'',
form:{
teacherName:'',
teacherNo:'',
orgName:''
},
progressData:{},
fileBaseUrl:process.env.VUE_APP_BOE_MOBILE_URL,
uploadUrl:process.env.VUE_APP_FILE_BASE_URL,
disabled:false,
statusInfo:'',
statusInfo1:'',
result:'',
result1:'',
newTeacherId:'',
pid:'',
teacherInfo:'',
form1:{
}
}
},
created() {
//读取路由参数
this.teacherId=this.$route.query.teacherId
//获取教师基本信息
this.baseInfo()
},
methods:{
//获取认证结果
getReviewResult(){
getReviewResult({teacherId:this.teacherId}).then(res=>{
this.result=res.data
})
getReviewResult({teacherId:this.pid}).then(res=>{
this.result1=res.data
})
},
//获取教师认证状态
getStatus(){
getCertificationProcess({teacherId:this.teacherId}).then(res=>{
this.statusInfo=res.data
})
getCertificationProcess({teacherId:this.pid}).then(res=>{
this.statusInfo1=res.data
})
},
baseInfo(){
getTeacherInfo({teacherId:this.teacherId}).then(res=>{
this.pid=res.data[0].pid
var orgNameList=res.data[0].orgName.split('/')
if (orgNameList.length<=3){
this.form.orgName=res.data[0].orgName
}else {
this.form.orgName=orgNameList[orgNameList.length-3]+'/'+orgNameList[orgNameList.length-2]+'/'+orgNameList[orgNameList.length-1]
}
this.form1.tutor = res.data[0].tutor.split(',')
this.form1.tutorTime = res.data[0].tutorTime
this.form.courseName=res.data[0].courseName
this.form.courseContent=res.data[0].courseContent
this.form.courseIntroduction=res.data[0].courseIntroduction
getTeacherInfo({teacherId:res.data[0].pid}).then(resquest=>{
this.teacherInfo = resquest.data[0]
this.form.teacherName=resquest.data[0].teacherName
this.form.teacherNo=resquest.data[0].teacherNo
this.form.positionName=resquest.data[0].positionName
this.form.bandCode=resquest.data[0].bandCode
this.form.coursewareName=resquest.data[0].examineCourseware.coursewareName
this.form.tutor = resquest.data[0].tutor.split(',')
this.form.tutorTime = resquest.data[0].tutorTime
//获取学习进度
this.getReviewResult()
this.addTeacher()
this.getStatus()
})
/*
* teacherName:教师姓名 teacherNo:教师工号 orgName:组织 positionName:岗位 bandCode:职级 courseName:认证课程名称 courseContent课程内容分类
* courseIntroduction:课程简介
* */
})
},
addTeacher(){
addTeacher({pageNo:1,pageSize:10,keyword:this.form.teacherNo}).then(res=>{
this.getProgress(res.data[0].id)
})
},
getProgress(id){
getProgress({teacherId:id}).then(res=>{
this.progressData=res.data
res.data.forEach((item,index)=>{
if (item.progress!=100){
this.disabled=true
return
}
})
})
},
format(percentage) {
return percentage === 100 ? '满' : `${percentage}%`;
},
getJump(){
this.$router.push({
path:'/need/twofinal',
query:{teacherId:this.teacherId}
})
},
toCaseData(courseId){
this.$router.push("/course/studyindex?id=" + courseId);
},
downloadFile() {
lecturer.exportPdf({coursewareId: this.teacherInfo.examineCourseware.id}).then(res => {
if (res.status) {
this.$message.error('导出失败');
} else {
const link = document.createElement('a');// 创建a标签
let blob = new Blob([res], {type: 'application/vnd.;charset=UTF-8'}); // 设置文件类型
link.style.display = "none";
link.href = URL.createObjectURL(blob); // 创建URL
link.setAttribute("download", this.teacherInfo.examineCourseware.coursewareName);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
this.dialogVisible = false;
}
})
}
}
}
</script>
<template>
<div>
<process-status :teacherId="pid.toString()" :pid="teacherId.toString()"></process-status>
<div class="title">基本信息</div>
<el-container>
<div class="form-table">
<el-form>
<div>
<el-col :span="11">
<el-form-item label="姓名:">
{{ form.teacherName }}
</el-form-item>
</el-col>
<el-col :span="11" :offset="2">
<el-form-item label="工号:">
{{ form.teacherNo }}
</el-form-item>
</el-col>
</div>
<div>
<el-col :span="11">
<el-form-item label="组织:">
{{ form.orgName }}
</el-form-item>
</el-col>
<el-col :span="11" :offset="2">
<el-form-item label="岗位:">
{{ form.positionName }}
</el-form-item>
</el-col>
</div>
<div>
<el-col :span="11">
<el-form-item label="认证课程名称:" prop="courseName">
<div style="overflow: hidden;text-overflow: ellipsis;white-space: nowrap;cursor: pointer;" :title="form.courseName">
{{ form.courseName }}
</div>
</el-form-item>
</el-col>
<el-col :span="11" :offset="2">
<el-form-item label="课程内容分类:" prop="courseContent">
{{ form.courseContent }}
</el-form-item>
</el-col>
</div>
<el-form-item label="课程简介:" prop="courseIntroduction">
{{ form.courseIntroduction }}
</el-form-item>
<el-form-item label="终稿课件:" prop="courseIntroduction">
{{ form.coursewareName }} <span
style="color: #1378f6;display: inline-block;margin-left: 16px;cursor: pointer;"
@click="downloadFile">查看</span>
</el-form-item>
</el-form>
</div>
</el-container>
<div class="title" style="margin-top: 20px">线上课程</div>
<div class="progress">
<div v-for="(item,index) in progressData" :key="index" @click="toCaseData(item.courseId)">
<div class="uc-course-img" style="width: 212px;height:119px">
<img style="width: 100%;" v-if="item.courseImage!=''&&item.courseImage.includes('https://')" :src="item.courseImage">
<img style="width: 100%;" v-else-if="item.courseImage!=''" :src="uploadUrl+item.courseImage">
<img style="width: 100%;" v-else :src="fileBaseUrl+'/pc/images/bgimg/course.png'">
</div>
<div class="courseName" :title="item.courseName ">{{ item.courseName }}</div>
<div class="smallTitle">当前进度</div>
<el-progress :percentage="parseInt(item.progress)"
:color="parseInt(item.progress)=='100'?'#31AF0D':'#FFA050'"></el-progress>
</div>
</div>
<div>
<div class="title" style="margin-top: 20px">线下辅导</div>
<el-container>
<div class="form-table">
<el-form>
<el-form-item label="辅导老师:">
<span v-for="(item,index) in form.tutor" :key="item"
style="display: inline-block;margin-right: 20px">{{ item }}</span>
</el-form-item>
<el-form-item label="辅导时间:">
{{ form.tutorTime }}
</el-form-item>
</el-form>
</div>
</el-container>
</div>
<div>
<div class="title" style="margin-top: 20px">认证结果</div>
<div v-if="result1.reviewResult==2" class="score">请您耐心等待线下认证安排</div>
<div v-if="result1.reviewResult==0" class="score" style="color: #31AF0D;">恭喜您您的认证分数为{{ result1.avgScore }}已经通过认证</div>
<div v-if="result1.reviewResult==1" class="score" style="color: #ff0000">很遗憾您的认证分数为{{ result1.avgScore }}没有通过认证</div>
</div>
<div>
<div class="title" style="margin-top: 20px">二次线下辅导</div>
<el-container>
<div class="form-table">
<el-form>
<el-form-item label="辅导老师:">
<span v-for="(item,index) in form1.tutor" :key="item" style="display: inline-block;margin-right: 20px">{{item}}</span>
</el-form-item>
<el-form-item label="辅导时间:">
{{form1.tutorTime}}
</el-form-item>
</el-form>
</div>
</el-container>
</div>
<div>
<div class="title" style="margin-top: 20px">二次认证结果</div>
<div v-if="result.reviewResult==2" class="score">请您耐心等待线下认证安排</div>
<div v-if="result.reviewResult==0" class="score" style="color: #4b7900;">恭喜您您的认证分数为{{ result.avgScore }}已经通过认证</div>
<div v-if="result.reviewResult==1" class="score" style="color: #ff0000">很遗憾您的认证分数为{{ result.avgScore }}没有通过认证</div>
</div>
</div>
</template>
<style scoped lang="scss">
.title{
font-size: 16px;
font-weight: 800;
border-bottom: 1px solid rgba(153, 153, 153, 0.2);
padding: 2px 2px 20px 2px;
}
.form-table{
width: 100%;
margin-top: 20px;
}
.progress {
display: flex;
align-items: center;
margin-top: 20px;
flex-wrap: wrap;
}
.progress > div {
width: 300px;
margin-right: 30px;
margin-bottom: 12px;
}
.courseName {
font-weight: 650;
color: #333333;
font-size: 14px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
width: 100%;
}
.smallTitle{
color:#134054;
font-size:12px;
margin-top: 7px;
}
::v-deep .el-form-item__content{
font-weight: 500;
}
::v-deep .el-form-item{
margin-bottom: 0px;
}
.tip{
color: #333333;
font-size: 14px;
margin-top: 20px;
}
.score {
margin-top: 28px;
font-size: 18px;
color: #333333;
font-weight: 400;
}
.twoFactorAuthentication{
width: 344px;
height: 135px;
padding: 2px 2px 2px 2px;
border: 1px solid #d7d7d7;
background-color: #ffffff;
box-sizing: border-box;
margin-top: 20px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.remind {
margin-bottom: 20px;
box-sizing: border-box;
color: #797979;
}
::v-deep .el-progress-bar__outer {
background-color: rgba(255, 160, 80, 0.2);
}
::v-deep .el-form-item__label {
font-weight: 400;
font-size: 14px;
color: #333333;
line-height: 40px;
}
::v-deep .el-form-item__content {
font-weight: 400;
font-size: 14px;
color: #333333;
line-height: 40px;
}
</style>

View File

@@ -97,8 +97,13 @@
<!-- <a :href="returnRouter(item)"> -->
<div v-if="item.refType !== '99'">
<div style="cursor: pointer;" @click="returnRouter(item)" class="msg-body-content" v-if="item.content">
{{ item.tip }}-{{ item.content }}</div>
{{ item.tip }}-{{ item.content }}
</div>
<div style="cursor: pointer;" @click="returnRouter(item)" class="msg-body-content" v-else>{{ item.tip }}
<span style="color:#0078FC;" v-if="item.refType == '100'||item.refType == '101'">点击查看</span>
</div>
<div style="cursor: pointer;" @click="returnRouter(item)" class="msg-body-content" v-else-if="item.refType == '102'">
{{ item.tip }}
</div>
</div>
<div v-else :class="!item.isRead ? 'infoActive' : ''" style="cursor: pointer;" @click="goRouter(item)"
@@ -424,6 +429,10 @@ export default {
this.$router.push('/qa/answer?id=' + item.refId);
} else if (item.refType == 1) {
this.$router.push('/course/studyindex?id=' + item.refId);
} else if (item.refType == 100) {
this.$router.push('/need/draft?teacherId=' + item.pageParams);
} else if (item.refType == 101) {
this.$router.push('/need/finalsuccess?teacherId=' + item.pageParams);
}
}

View File

@@ -10,14 +10,12 @@ function resolve(dir) {
const name = defaultSettings.title || '京东方大学堂' // 标题
const port = process.env.port || process.env.npm_config_port || 80 // 端口
// vue.config.js 配置说明
//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
// 这里只列一部分,具体配置参考文档
const timeStamp = new Date().getTime()
// vue.config.js 配置说明
//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
// 这里只列一部分,具体配置参考文档
const timeStamp = new Date().getTime()
module.exports = {
filenameHashing:false,
filenameHashing: false,
// 部署生产环境和开发环境下的URL。
// 默认情况下Vue CLI 会假设你的应用是被部署在一个域名的根路径上
// 例如 https://www.sss.com/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.aaa.com/admin/,则设置 baseUrl 为 /admin/。
@@ -33,15 +31,15 @@ module.exports = {
css: {
extract: {
ignoreOrder: true,
filename:`css/[name].css?v=${timeStamp}`,
chunkFilename:`css/chunk.[id].css?v=${timeStamp}`
filename: `css/[name].css?v=${timeStamp}`,
chunkFilename: `css/chunk.[id].css?v=${timeStamp}`
}
},
configureWebpack: {
name: name,
output:{
filename:`js/[name].js?v=${timeStamp}`,
chunkFilename:`js/chunk.[id].js?v=${timeStamp}`
output: {
filename: `js/[name].js?v=${timeStamp}`,
chunkFilename: `js/chunk.[id].js?v=${timeStamp}`
},
resolve: {
alias: {
@@ -140,7 +138,7 @@ module.exports = {
// target: 'http://127.0.0.1:9090',
target: 'https://u-pre.boe.com',
changeOrigin: true,
logLevel:'debug',
logLevel: 'debug',
secure: false,
pathRewrite: {
// '^/systemapi': ''
@@ -169,7 +167,7 @@ module.exports = {
// target: 'http://127.0.0.1:9080',
target: 'https://u-pre.boe.com',
changeOrigin: true,
logLevel:'debug',
logLevel: 'debug',
secure: false,
pathRewrite: {
// '^/statApi': ''
@@ -180,7 +178,7 @@ module.exports = {
// target: 'http://127.0.0.1:9081',
target: 'https://u-pre.boe.com',
changeOrigin: true,
logLevel:'debug',
logLevel: 'debug',
secure: false,
pathRewrite: {
// '^/socialApi': ''