Merge branch 'dev-yjl' into 'shenzhen-dev'

项目版-安全教育 扫一扫考试页面开发

See merge request !122
This commit is contained in:
袁晶琳 2023-03-17 10:47:05 +08:00
commit f08f9c3919
8 changed files with 342 additions and 249 deletions

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 KiB

View File

@ -1,67 +1,71 @@
import Vue from 'vue'
import App from './index.vue'
import router from '@/router/index'
import VueMatomo from 'vue-matomo'
import store from '@/store'
import '@/plugins/element.js'
import vuescroll from 'vuescroll'
import uploader from 'vue-simple-uploader'
import i18n from '@/assets/i18n/i18n'
import preview from 'vue-photo-preview'
import 'vue-photo-preview/dist/skin.css'
import * as filters from '@/filters/index.js'
import '@/assets/iconfont/iconfont.css'
import '@/assets/style/layout.less'
import '@/assets/style/button.less'
import '@/assets/style/table.less'
import '@/assets/style/dialog.less'
import '@/assets/style/pagination.less'
import axios from 'axios'
import { Message } from 'element-ui'
import Pagination from '@/components/Pagination'
import { resetForm } from '@/util'
import { autoLogin } from '@/assets/js/api/autoLogin-xingXuan'
import { decode, encode } from 'js-base64'
import { loginApi, companyLoginApi, projectLoginApi } from '@/assets/js/api/loginSign'
import SlideVerify from 'vue-monoplasty-slide-verify'; //滑动验证
import VueAwesomeSwiper from 'vue-awesome-swiper';
import scroll from 'vue-seamless-scroll'
Vue.use(scroll)
import VueQuillEditor from 'vue-quill-editor'
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
import Vue from "vue";
import App from "./index.vue";
import router from "@/router/index";
import VueMatomo from "vue-matomo";
import store from "@/store";
import "@/plugins/element.js";
import vuescroll from "vuescroll";
import uploader from "vue-simple-uploader";
import i18n from "@/assets/i18n/i18n";
import preview from "vue-photo-preview";
import "vue-photo-preview/dist/skin.css";
import * as filters from "@/filters/index.js";
import "@/assets/iconfont/iconfont.css";
import "@/assets/style/layout.less";
import "@/assets/style/button.less";
import "@/assets/style/table.less";
import "@/assets/style/dialog.less";
import "@/assets/style/pagination.less";
import axios from "axios";
import { Message } from "element-ui";
import Pagination from "@/components/Pagination";
import { resetForm } from "@/util";
import { autoLogin } from "@/assets/js/api/autoLogin-xingXuan";
import { decode, encode } from "js-base64";
import {
loginApi,
companyLoginApi,
projectLoginApi,
} from "@/assets/js/api/loginSign";
import SlideVerify from "vue-monoplasty-slide-verify"; //滑动验证
import VueAwesomeSwiper from "vue-awesome-swiper";
import scroll from "vue-seamless-scroll";
Vue.use(scroll);
import VueQuillEditor from "vue-quill-editor";
Vue.use(VueQuillEditor) // 注册富文本编辑器
import "quill/dist/quill.core.css";
import "quill/dist/quill.snow.css";
import "quill/dist/quill.bubble.css";
Vue.use(VueQuillEditor); // 注册富文本编辑器
Vue.use(SlideVerify);
Vue.use(VueAwesomeSwiper);
// 全局组件挂载
Vue.component('Pagination', Pagination)
Vue.component("Pagination", Pagination);
// 全局方法挂载
Vue.prototype.resetForm = resetForm
Vue.prototype.resetForm = resetForm;
if (COMPANY == 'xingxuan') {
if(window.location.href.indexOf('?project_id=') != -1) {
const projectId = window.location.href.split('?project_id=')[1].split('&')[0];
login(projectId)
if (COMPANY == "xingxuan") {
if (window.location.href.indexOf("?project_id=") != -1) {
const projectId = window.location.href
.split("?project_id=")[1]
.split("&")[0];
login(projectId);
}
function login(projectNumber) {
autoLogin({ projectNumber }).then(res => {
if (res.code != 200) return
autoLogin({ projectNumber }).then((res) => {
if (res.code != 200) return;
parseLoginData(res.result);
})
});
}
function parseLoginData(data) {
window._paq.push(['trackEvent', '点击', '登录', '登录账号'])
window._paq.push(["trackEvent", "点击", "登录", "登录账号"]);
axios.defaults.headers.common["Authorization"] =
"Bearer" + " " + data.token;
@ -105,7 +109,7 @@ if (COMPANY == 'xingxuan') {
switch (data.accountType) {
case 1:
store.commit("setMenuList", menu2);
store.commit("setProjectManageMenuList", menu2)
store.commit("setProjectManageMenuList", menu2);
store.commit("setIsShowBackIndex", false);
router.push("/registerAudit");
break;
@ -114,11 +118,11 @@ if (COMPANY == 'xingxuan') {
case 4:
case 7:
store.commit("setMenuList", companyModule);
store.commit("setProjectManageMenuList", companyModule)
store.commit("setProjectManageMenuList", companyModule);
store.commit("setIsShowBackIndex", false);
console.log('跳转路由',companyModule[0].modulePath);
console.log("跳转路由", companyModule[0].modulePath);
router.push(companyModule[0].modulePath);
break;
case 5:
store.commit("setProjectSn", data.sn);
@ -130,94 +134,93 @@ if (COMPANY == 'xingxuan') {
}
}
function handler(data, sn) {
console.log(data + sn, 'dllmhjc');
console.log(sn, 'dllmhjc -- sn');
console.log(data + sn, "dllmhjc");
console.log(sn, "dllmhjc -- sn");
window._paq.push(['trackEvent', '点击', '登录', '登录账号'])
axios.defaults.headers.common['Authorization'] = 'Bearer' + ' ' + data.token
axios.defaults.headers.common['operateId'] = data.userId
window._paq.push(["trackEvent", "点击", "登录", "登录账号"]);
axios.defaults.headers.common["Authorization"] = "Bearer" + " " + data.token;
axios.defaults.headers.common["operateId"] = data.userId;
store.commit("setProjectSn", sn);
store.commit('setUserInfo', data)
var moduleList = data.menuAuthority.moduleList ? data.menuAuthority.moduleList : []
var companyModule = []
store.commit("setUserInfo", data);
var moduleList = data.menuAuthority.moduleList
? data.menuAuthority.moduleList
: [];
var companyModule = [];
if (moduleList.length == 0 && data.accountType != 1) {
return false
return false;
}
moduleList.forEach(element => {
moduleList.forEach((element) => {
if (element.moduleType == 1) {
companyModule.push(element)
companyModule.push(element);
}
})
});
var 菜单 = [
{ menuName: '企业管理', id: 9199, path: '/registerAudit' },
{ menuName: '模块菜单管理', id: 9299, path: '/moduleMenuManage' },
{ menuName: 'app版本管理', id: 9297, path: '/operateManage' },
{ menuName: '塔吊模型管理', id: 9298, path: '/brand' }
]
{ menuName: "企业管理", id: 9199, path: "/registerAudit" },
{ menuName: "模块菜单管理", id: 9299, path: "/moduleMenuManage" },
{ menuName: "app版本管理", id: 9297, path: "/operateManage" },
{ menuName: "塔吊模型管理", id: 9298, path: "/brand" },
];
switch (data.accountType) {
case 1:
store.commit('setMenuList', 菜单)
store.commit('setProjectManageMenuList', 菜单)
store.commit('setIsShowBackIndex', false)
router.push('/registerAudit')
break
store.commit("setMenuList", 菜单);
store.commit("setProjectManageMenuList", 菜单);
store.commit("setIsShowBackIndex", false);
router.push("/registerAudit");
break;
case 2:
case 3:
case 4:
case 7:
store.commit('setMenuList', companyModule)
store.commit('setProjectManageMenuList', companyModule)
store.commit('setIsShowBackIndex', false)
router.push(companyModule[0].modulePath)
store.commit('setProjectSn', sn)
break
store.commit("setMenuList", companyModule);
store.commit("setProjectManageMenuList", companyModule);
store.commit("setIsShowBackIndex", false);
router.push(companyModule[0].modulePath);
store.commit("setProjectSn", sn);
break;
case 5:
case 6:
if(PROJECT_TYPE != "zjsj"){
//看看项目看板内有没有菜单
let arr = data.menuAuthority.moduleList
let arr2=[]
arr.forEach(element => {
if(element.moduleType==4){
arr2.push(element)
return
}
});
console.log('arr2',arr2)
// 如果数组为空表示该用户没有权限访问
if (!arr2.length) {
router.push("/projectIndex");
}else{
router.push(arr2[0].modulePath);
}
}else{
if (data.styleType == 1 || !data.styleType) {
router.push('/projectIndex')
} else if (data.styleType == 2) {
router.push('/projectV2/taskList')
if (PROJECT_TYPE != "zjsj") {
//看看项目看板内有没有菜单
let arr = data.menuAuthority.moduleList;
let arr2 = [];
arr.forEach((element) => {
if (element.moduleType == 4) {
arr2.push(element);
return;
}
});
console.log("arr2", arr2);
// 如果数组为空表示该用户没有权限访问
if (!arr2.length) {
router.push("/projectIndex");
} else {
router.push('/projectV3/taskList')
router.push(arr2[0].modulePath);
}
store.commit('setProjectSn', data.sn)
break
} else {
if (data.styleType == 1 || !data.styleType) {
router.push("/projectIndex");
} else if (data.styleType == 2) {
router.push("/projectV2/taskList");
} else {
router.push("/projectV3/taskList");
}
store.commit("setProjectSn", data.sn);
break;
}
}
// this.selectMp3FileList()
}
let url = ''
console.log(COMPANY)
if (COMPANY == 'longguang') {
url = 'http://matomo.logan.com.cn';
let url = "";
console.log(COMPANY);
if (COMPANY == "longguang") {
url = "http://matomo.logan.com.cn";
}
Vue.use(VueMatomo, {
// url http://matomo-sit.logan.com.cn/index.php测试地址
host: 'http://matomo.logan.com.cn', //生产
host: "http://matomo.logan.com.cn", //生产
// host:'http://matomo-sit.logan.com.cn', //测试
// host:url,
siteId: 47,
@ -229,82 +232,96 @@ Vue.use(VueMatomo, {
requireCookieConsent: false,
enableHeartBeatTimer: true,
heartBeatTimerInterval: 15,
userId: '',
trackerFileName: 'matomo',
userId: "",
trackerFileName: "matomo",
trackerUrl: undefined,
trackerScriptUrl: undefined,
debug: true,
})
Vue.use(preview)
});
Vue.use(preview);
Vue.use(uploader);
Vue.prototype.$EventBus = new Vue()
Object.keys(filters).forEach(key => {
Vue.filter(key, filters[key])
})
Vue.prototype.$EventBus = new Vue();
Object.keys(filters).forEach((key) => {
Vue.filter(key, filters[key]);
});
Vue.config.productionTip = false
Vue.config.productionTip = false;
Vue.use(vuescroll, {
ops: {
bar: {
background: "rgba(166, 166, 167, 0.6)",
onlyShowBarOnScroll: false,
size: "5px",
minSize: 0.2
}
}
minSize: 0.2,
},
},
});
// 加载缩略图
Vue.prototype.downloadImgMin = function (row) {
let fileUrl = store.state.FILEURL + row.fileUrl
return fileUrl
Vue.prototype.downloadImgMin = function(row) {
let fileUrl = store.state.FILEURL + row.fileUrl;
return fileUrl;
};
//获取文件下载路径
Vue.prototype.getDownloadFilePath = function (row) {
let fileUrl = store.state.FILEURL + row.fileUrl
return fileUrl
Vue.prototype.getDownloadFilePath = function(row) {
let fileUrl = store.state.FILEURL + row.fileUrl;
return fileUrl;
};
//文件查看大图
Vue.prototype.getViewFilePath = function (row) {
let fileUrl = store.state.FILEURL + row.fileUrl
return fileUrl
Vue.prototype.getViewFilePath = function(row) {
let fileUrl = store.state.FILEURL + row.fileUrl;
return fileUrl;
};
//路由监听
router.beforeEach((to, form, next) => {
const direction = to.query.direction
console.log('跳转',direction);
if (direction) {
const info = JSON.parse(decode(direction))
const account = { account: info.acount, password: info.pwd }
const whitepage = ["/authentication", "/test", "/videoLearning",'/pages/projectEnd/safetyEducation/authentication'];
const tentative = res => {
console.log('res-----',res);
handler(res.result, info.projectSn)
return next({ path: to.path })
}
console.log('白名单跳转生效了嘛==============11111111111 :',to);
if (whitepage.includes(to.path)) {
console.log('白名单跳转生效了嘛==============');
return next();
}
const direction = to.query.direction;
console.log("跳转", direction);
if (direction) {
const info = JSON.parse(decode(direction));
const account = { account: info.acount, password: info.pwd };
const tentative = (res) => {
console.log("res-----", res);
handler(res.result, info.projectSn);
return next({ path: to.path });
};
if (LOGINTYPE == 1) {
loginApi(account).then(tentative)
loginApi(account).then(tentative);
} else if (LOGINTYPE == 2) {
companyLoginApi(account).then(tentative)
companyLoginApi(account).then(tentative);
} else if (LOGINTYPE == 3) {
projectLoginApi(account).then(tentative)
projectLoginApi(account).then(tentative);
}
}else {
if (COMPANY == 'xingxuan') return next()
} else {
if (COMPANY == "xingxuan") return next();
if (store.state.userInfo) {
next();
} else if (!store.state.userInfo && to.path != '/login' && to.path != '/' && to.path != '/sign' && !isDockingToWoer && to.path != '/authorization') {
next({ path: '/' });
} else if (
!store.state.userInfo &&
to.path != "/login" &&
to.path != "/" &&
to.path != "/sign" &&
!isDockingToWoer &&
to.path != "/authorization"
) {
next({ path: "/" });
} else {
next();
}
}
})
});
// Vue.prototype.$EventBus = new Vue()
@ -312,6 +329,5 @@ new Vue({
router,
store,
i18n,
render: h => h(App)
}).$mount('#app')
render: (h) => h(App),
}).$mount("#app");

View File

@ -1,18 +1,18 @@
<template>
<div>
<div class="fullHeight">
<!-- <image src="/static/onlineTest_bg.png" class="onlineTest_bg"></image> -->
<div class="centerBox">
<img src="@/assets/images/aqjy.png" class="aqjyImg" />
<div class="inputContent">
<input
class="inputBox"
type="text"
v-model="idCard"
placeholder="请输入身份证号码"
/>
<div class="confirmBtn" @click="verifyFn">开始培训</div>
</div>
<div class="fullHeight">
<img src="@/assets/images/onlineTest_bg.png" class="onlineTest_bg" />
<div class="centerBox">
<!-- <img src="@/assets/images/aqjy.png" class="aqjyImg" /> -->
<div class="inputContent">
<input
class="inputBox"
type="text"
v-model="idCard"
placeholder="请输入身份证号码"
/>
</div>
<div type="primary" class="btn submitBtn big" @click="verifyFn">
<span>开始培训</span>
</div>
</div>
</div>
@ -28,9 +28,10 @@ export default {
eduId: ''
}
},
created(options) {
this.projectSn = this.$store.state.projectSn
this.eduId = '1636008037212958721'
created() {
console.log('收到的参数 :', this.$route.query)
this.projectSn = this.$route.query.projectSn
this.eduId = this.$route.query.eduId
},
methods: {
verifyFn() {
@ -43,7 +44,11 @@ export default {
projectSn: this.projectSn
}).then((result) => {
if (result.result) {
this.$message.success('验证成功!')
// this.$message({
// message: '',
// type: 'success'
// })
// this.$message.success('')
setTimeout(() => {
this.$router.push({
path: '/videoLearning',
@ -60,22 +65,27 @@ export default {
}
</script>
<style scoped>
<style lang='less' scoped>
.onlineTest_bg {
width: 100%;
height: 180rem;
margin-top: -83rem;
}
.fullHeight {
width: 100%;
height: 100%;
}
.centerBox {
position: absolute;
left: 50%;
top: 50%;
top: 90%;
transform: translate(-50%, -50%);
text-align: center;
}
.aqjyImg {
width: 120px;
height: 100px;
margin-bottom: 30px;
width: 50rem;
height: 40rem;
margin-bottom: 15rem;
}
.inputContent {
/* position: fixed;
@ -87,21 +97,29 @@ export default {
justify-content: center;
}
.inputBox {
margin-top: 30rem;
background-color: white;
border-radius: 4px;
padding: 10px 10px;
width: 200px;
font-size: 15px;
border-radius: 2rem;
padding: 3rem 0rem;
width: 80rem;
font-size: 6.5rem;
display: inline-block;
margin-right: 10px;
border: 1px solid rgba(63, 83, 110, 0.5);
margin-right: 2rem;
border: 0.5rem solid rgba(63, 83, 110, 0.5);
/* margin-left: 2rem; */
}
.confirmBtn {
background-color: #4181fe;
color: white;
font-size: 15px;
padding: 10px 20px;
border-radius: 4px;
width: 60px;
.submitBtn {
margin: -55rem -13rem;
position: fixed;
bottom: 10rem;
/* left: 20px; */
width: calc(130% - 0rem);
background: #4181fe;
height: 15rem;
border: none;
color: #fff;
font-size: 7.5rem;
border-radius: 10rem;
line-height: 15rem;
}
</style>

View File

@ -102,13 +102,15 @@
</template>
</dialogs>
<div class="testResultBox" v-if="showResult">
<image
<img
v-if="isQualified == 1"
src="/static/Pass.png"
src="@/assets/images/Pass.png"
class="resultImg"
></image>
<image v-else src="/static/noPass.png" class="resultImg"></image>
<div class="score">{{ score }}</div>
/>
<img v-else src="@/assets/images/noPass.png" class="resultImg" />
<div class="score">
<span>{{ score }}</span>
</div>
</div>
</div>
</template>
@ -267,45 +269,44 @@ export default {
}
</script>
<style scoped>
<style lang="less" scoped>
.tips {
font-size: 14px;
font-size: 7rem;
color: red;
margin: 10px 0;
margin: 5rem 5rem;
text-align: center;
}
.blockBox {
box-shadow: 0 4px 24px 0px rgba(212, 220, 236, 0.69);
border-radius: 8px;
margin: 15px;
padding: 15px;
box-shadow: 0 2rem 12rem 0px rgba(212, 220, 236, 0.69);
border-radius: 4rem;
margin: 7.5rem;
padding: 5rem;
position: relative;
}
.optionItem {
/* padding-left: 20px; */
margin-top: 10px;
font-size: 14px;
margin-top: 5rem;
font-size: 7rem;
display: block;
}
.desc {
margin-left: 5px;
margin-left: 2.5rem;
}
.checkbox {
transform: scale(0.8);
}
.submitBtn {
/* margin: 15px 20px; */
/* position: fixed;
bottom: 20px;
left: 20px; */
width: calc(100% - 40px);
margin: 20px;
height: 44px;
border-radius: 20px;
margin: -70rem 5rem;
position: fixed;
bottom: 10rem;
/* left: 20px; */
width: calc(100% - 10rem);
background: #4181fe;
color: #fff;
height: 15rem;
border: none;
font-size: 20px;
color: #fff;
font-size: 7.5rem;
border-radius: 10rem;
}
.testResultBox {
position: fixed;
@ -316,29 +317,68 @@ export default {
z-index: 99999;
}
.resultImg {
width: 100%;
height: 100%;
width: 90%;
height: 180%;
margin: -30rem 6rem;
}
.score {
position: fixed;
position: relative;
left: 50%;
top: 55%;
font-size: 70px;
width: 200px;
height: 200px;
top: -32%;
width: 55rem;
height: 55rem;
border-radius: 50%;
border: 8px solid #fdcb05;
color: #fdcb05;
border: 4rem solid #fdcb05;
text-align: center;
line-height: 200px;
line-height: 100rem;
transform: translate(-50%, -50%);
span {
width: 55rem;
position: absolute;
// display: inline-block;
color: #fdcb05;
font-size: 20rem;
margin-top: -22rem;
margin-left: -28rem;
}
}
.headers {
border-bottom: 1px solid #f3f3f3;
height: 50px;
/* border-bottom: 0.5rem solid #f3f3f3; */
height: 8rem;
color: #3d4490;
font-size: 18px;
font-size: 7.5rem;
text-align: center;
line-height: 50px;
line-height: 6rem;
margin-top: -55%;
/* background-color: pink; */
}
.testTilte {
font-size: 6rem;
}
::v-deep .el-checkbox__label {
font-size: 4rem;
line-height: 10rem;
}
::v-deep .el-checkbox__inner {
margin-top: -2rem;
width: 4rem;
height: 4rem;
line-height: 10rem;
/* border: 0.5rem solid #fff; */
}
::v-deep .el-radio__inner {
margin-top: -2rem;
width: 4rem;
height: 4rem;
line-height: 10rem;
}
::v-deep .el-radio__label {
font-size: 4rem;
line-height: 10rem;
}
</style>

View File

@ -95,36 +95,54 @@ export default {
</script>
<style scoped>
.fullHeight {
width: 100%;
height: 120%;
}
.videoBox {
width: 100%;
height: 300px;
margin: 10px 0;
height: 100rem;
margin: 0rem 0;
}
.courseTitle {
padding: 0 15px;
font-size: 7.5rem;
padding: 2rem 7.5rem;
}
.desc {
font-size: 12px;
font-size: 6rem;
opacity: 0.6;
padding: 5px 0 0 15px;
padding: 2.5rem 0 0 7.5rem;
}
.submitBtn {
/* margin: 15px 20px; */
margin: -70rem 5rem;
position: fixed;
bottom: 20px;
bottom: 10rem;
/* left: 20px; */
width: calc(100% - 0px);
width: calc(100% - 10rem);
background: #4181fe;
height: 44px;
height: 15rem;
border: none;
color: #fff;
font-size: 7.5rem;
border-radius: 10rem;
}
.headers {
border-bottom: 1px solid #f3f3f3;
height: 50px;
/* border-bottom: 0.5rem solid #f3f3f3; */
height: 8rem;
color: #3d4490;
font-size: 18px;
font-size: 7.5rem;
text-align: center;
line-height: 50px;
line-height: 6rem;
margin-top: -55%;
/* background-color: pink; */
}
/* 播放器按钮 */
::v-deep video::-webkit-media-controls-play-button {
/* background-image: url(play-button.png); */
/* display: none; */
width: 200rem;
height: 200rem;
}
</style>

View File

@ -663,9 +663,10 @@ export default {
new QRCode('workerQRcode' + index, {
width: width,
height: height, //
text:
url +
'/authentication?eduId=' +
'#/authentication?eduId=' +
this.eduId +
'&projectSn=' +
this.$store.state.projectSn, //