dev_202412
yujialong 9 months ago
parent 359e02bd47
commit d792fcf846
  1. 8
      public/index.html
  2. 1
      src/api/index.js
  3. 13
      src/pages/record/show/index.vue
  4. 122
      src/pages/screen/index.vue
  5. 3
      src/pages/station/preview/index.vue
  6. 231
      src/plugins/requests/index.js
  7. 1
      src/setting.js
  8. 7
      src/styles/page/screen.scss

@ -3,21 +3,21 @@
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="keywords" content="智信云,教学,教育,在线编程" /> <meta name="keywords" content="职站,教学,教育,在线编程" />
<meta <meta
name="description" name="description"
content="智信云是一家为高等院校提供实验课程数字化服务的国家级高新技术企业。以区块链、大数据、人工智能等前沿技术在行业领域的运用为支撑,将新技术与经济与管理人才培养深度融合,面向全国高等院校的经济、金融、大数据应用等相关专业提供科研创新、金课建设、实验实训教学软件、实践教学以及学生就业培训为一体的专业建设咨询与技术支持服务。" content="职站是一款辅助院校教师开展虚拟仿真实验教学的智能云实践平台。平台采用了大数据,云计算等技术,为学校搭建信息化平台提供了基础,可助力院校实现教学智能化升级。职站平台设计遵循着极简、高效的理念,可帮助老师轻松开展实验教学,并支持自定义发布考核和练习,智能统计和检验学生的日常实训练习效果;老师还可以通过可视化图表报告直观查看学生实训成绩,评估教学成果。"
/> />
<meta name="baidu-site-verification" content="code-TRfXe8xIkJ" /> <meta name="baidu-site-verification" content="code-TRfXe8xIkJ" />
<!-- <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> --> <!-- <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> -->
<meta name="viewport" content="width=device-width, user-scalable=yes, shrink-to-fit=no" /> <meta name="viewport" content="width=device-width, user-scalable=yes, shrink-to-fit=no" />
<link rel="stylesheet" href="//at.alicdn.com/t/font_830376_qzecyukz0s.css" /> <link rel="stylesheet" href="//at.alicdn.com/t/font_830376_qzecyukz0s.css" />
<title></title> <title>职站——为院校打造一站式虚拟仿真实训教学数智云平台</title>
<script> <script>
var _hmt = _hmt || []; var _hmt = _hmt || [];
(function () { (function () {
var hm = document.createElement('script'); var hm = document.createElement('script');
hm.src = 'https://hm.baidu.com/hm.js?e4d7deeca2d6ea71d2bd5fa2365bc654'; hm.src = 'https://hm.baidu.com/hm.js?72fbad6ebf1d6c705117fe8fe0686a0e';
var s = document.getElementsByTagName('script')[0]; var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(hm, s); s.parentNode.insertBefore(hm, s);
})(); })();

@ -229,4 +229,5 @@ export default {
activityRanking: `occupationlab/occupationlab/data/kanban/activityRanking`, activityRanking: `occupationlab/occupationlab/data/kanban/activityRanking`,
listByEntity: `product/productLogo/listByEntity`, listByEntity: `product/productLogo/listByEntity`,
productsWithExperimentalResults: `occupationlab/occupationlab/data/kanban/productsWithExperimentalResults`,
}; };

@ -274,9 +274,14 @@ export default {
index++ index++
} }
}) })
e.lcStudentAnswer.map((n, i) => { // lcStudentAnswerlcRuleRecords
e.answer += `${i + 1}.${n.userAnswer || '未填写'};` if (e.lcStudentAnswer) {
}) e.lcStudentAnswer.map((n, i) => {
e.answer += `${i + 1}.${n.userAnswer || '未填写'};`
})
} else {
e.lcStudentAnswer = e.lcRuleRecords
}
}) })
} else { // pythonuserScores } else { // pythonuserScores
list.forEach(e => { list.forEach(e => {
@ -520,6 +525,7 @@ samp {
padding: 10px 16px; padding: 10px 16px;
font-size: 14px; font-size: 14px;
color: #333; color: #333;
white-space: pre-wrap;
&.edit { &.edit {
color: #abb3c6; color: #abb3c6;
@ -540,6 +546,7 @@ samp {
} }
.result-pic { .result-pic {
max-width: 100%;
margin: 10px 0; margin: 10px 0;
} }

@ -1,10 +1,7 @@
<template> <template>
<div class="wrap"> <div class="wrap">
<!-- 全屏 --> <!-- 全屏 -->
<img class="full" <img class="full" src="@/assets/img/screen/full.png" alt="" @click="fullScreen">
src="@/assets/img/screen/full.png"
alt=""
@click="fullScreen">
<!--header--> <!--header-->
<div class="header"> <div class="header">
<div class="bg_header"> <div class="bg_header">
@ -37,18 +34,15 @@
<i class="b_r_line"></i> <i class="b_r_line"></i>
</div> </div>
<div class="main_title"> <div class="main_title">
<img src="@/assets/img/screen/t_1.png" <img src="@/assets/img/screen/t_1.png" alt="">
alt="">
平台考试数据统计 平台考试数据统计
</div> </div>
<ul class="time-switch"> <ul class="time-switch">
<li v-for="(item, i) in times" <li v-for="(item, i) in times" :key="i" :class="{ active: item.id === time }" @click="switchTime(item.id)">
:key="i" {{
:class="{active: item.id === time}" item.name }}</li>
@click="switchTime(item.id)">{{ item.name }}</li>
</ul> </ul>
<div id="chart1" <div id="chart1" class="chart"></div>
class="chart"></div>
</div> </div>
<div class="item"> <div class="item">
<div class="t_line_box"> <div class="t_line_box">
@ -68,12 +62,10 @@
<i class="b_r_line"></i> <i class="b_r_line"></i>
</div> </div>
<div class="main_title"> <div class="main_title">
<img src="@/assets/img/screen/t_2.png" <img src="@/assets/img/screen/t_2.png" alt="">
alt="">
学生成绩分布分析 学生成绩分布分析
</div> </div>
<div id="chart2" <div id="chart2" class="chart t_btn9"></div>
class="chart t_btn9"></div>
</div> </div>
<div class="item"> <div class="item">
<div class="t_line_box"> <div class="t_line_box">
@ -93,12 +85,10 @@
<i class="b_r_line"></i> <i class="b_r_line"></i>
</div> </div>
<div class="main_title"> <div class="main_title">
<img src="@/assets/img/screen/t_7.png" <img src="@/assets/img/screen/t_7.png" alt="">
alt="">
月人均在线学习时长情况 月人均在线学习时长情况
</div> </div>
<div id="chart3" <div id="chart3" class="chart t_btn9"></div>
class="chart t_btn9"></div>
</div> </div>
<div class="item"> <div class="item">
<div class="t_line_box"> <div class="t_line_box">
@ -118,17 +108,14 @@
<i class="b_r_line"></i> <i class="b_r_line"></i>
</div> </div>
<div class="main_title"> <div class="main_title">
<img src="@/assets/img/screen/t_7.png" <img src="@/assets/img/screen/t_7.png" alt="">
alt="">
平台登录人数 平台登录人数
</div> </div>
<div id="chart4" <div id="chart4" class="chart t_btn9"></div>
class="chart t_btn9"></div>
</div> </div>
</div> </div>
<div class="middle"> <div class="middle">
<div class="item" <div class="item" style="height: 620px">
style="height: 620px">
<!--左上边框--> <!--左上边框-->
<div class="t_line_box"> <div class="t_line_box">
<i class="t_l_line"></i> <i class="t_l_line"></i>
@ -149,15 +136,8 @@
<i class="r_b_line"></i> <i class="r_b_line"></i>
<i class="b_r_line"></i> <i class="b_r_line"></i>
</div> </div>
<video class="video" <video class="video" ref="video" width="100%" height="100%" autoplay muted loop>
ref="video" <source src="@/assets/videos/screen.mp4" type="video/mp4">
width="100%"
height="100%"
autoplay
muted
loop>
<source src="@/assets/videos/screen.mp4"
type="video/mp4">
您的浏览器不支持 video 标签 您的浏览器不支持 video 标签
</video> </video>
<div class="stat-mask"></div> <div class="stat-mask"></div>
@ -173,8 +153,7 @@
<p class="name">当前活跃人数</p> <p class="name">当前活跃人数</p>
</div> </div>
</div> </div>
<div class="item" <div class="item" style="height: 440px;">
style="height: 440px;">
<!--左上边框--> <!--左上边框-->
<div class="t_line_box"> <div class="t_line_box">
<i class="t_l_line"></i> <i class="t_l_line"></i>
@ -196,18 +175,14 @@
<i class="b_r_line"></i> <i class="b_r_line"></i>
</div> </div>
<div class="main_title"> <div class="main_title">
<img src="@/assets/img/screen/t_3.png" <img src="@/assets/img/screen/t_3.png" alt="">
alt="">
学生实验课程考核成绩趋势图 学生实验课程考核成绩趋势图
</div> </div>
<div class="chart" <div class="chart" id="chart5" style="height: 420px"></div>
id="chart5"
style="height: 420px"></div>
</div> </div>
</div> </div>
<div class="right"> <div class="right">
<div class="item" <div class="item" style="height: 160px">
style="height: 160px">
<!--左上边框--> <!--左上边框-->
<div class="t_line_box"> <div class="t_line_box">
<i class="t_l_line"></i> <i class="t_l_line"></i>
@ -229,23 +204,18 @@
<i class="b_r_line"></i> <i class="b_r_line"></i>
</div> </div>
<div class="main_title"> <div class="main_title">
<img src="@/assets/img/screen/t_4.png" <img src="@/assets/img/screen/t_4.png" alt="">
alt="">
本月综合学习积极性最高的实验课程 本月综合学习积极性最高的实验课程
</div> </div>
<ul class="list"> <ul class="list">
<li v-for="(item, i) in courses" <li v-for="(item, i) in courses" :key="i">
:key="i">
<span class="index">{{ i + 1 }}</span> <span class="index">{{ i + 1 }}</span>
<p class="text">{{ item.goodsName }}</p> <p class="text">{{ item.goodsName }}</p>
<img class="icon" <img class="icon" src="@/assets/img/screen/medal.png" alt="">
src="@/assets/img/screen/medal.png"
alt="">
</li> </li>
</ul> </ul>
</div> </div>
<div class="item" <div class="item" style="height: 240px">
style="height: 240px">
<!--左上边框--> <!--左上边框-->
<div class="t_line_box"> <div class="t_line_box">
<i class="t_l_line"></i> <i class="t_l_line"></i>
@ -267,23 +237,20 @@
<i class="b_r_line"></i> <i class="b_r_line"></i>
</div> </div>
<div class="main_title"> <div class="main_title">
<img src="@/assets/img/screen/t_5.png" <img src="@/assets/img/screen/t_5.png" alt="">
alt="">
热门理论课程排行榜 热门理论课程排行榜
</div> </div>
<div class="popular-wrap" <div class="popular-wrap" ref="popularCourses">
ref="popularCourses">
<ul class="list popular"> <ul class="list popular">
<li v-for="(item, i) in popularCourses" <li v-for="(item, i) in popularCourses" :key="i">
:key="i">
<span class="index">{{ i + 1 }}</span> <span class="index">{{ i + 1 }}</span>
<p class="text">{{ item }}</p> <p class="text">{{ item.courseName }}</p>
<span class="num">{{ item.viewCount }}</span>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
<div class="item" <div class="item" style="height: 300px">
style="height: 300px">
<div class="t_line_box"> <div class="t_line_box">
<i class="t_l_line"></i> <i class="t_l_line"></i>
<i class="l_t_line"></i> <i class="l_t_line"></i>
@ -301,8 +268,7 @@
<i class="b_r_line"></i> <i class="b_r_line"></i>
</div> </div>
<div class="main_title"> <div class="main_title">
<img src="@/assets/img/screen/t_7.png" <img src="@/assets/img/screen/t_7.png" alt="">
alt="">
学霸排行榜 学霸排行榜
</div> </div>
<div class="main_table"> <div class="main_table">
@ -318,13 +284,10 @@
</thead> </thead>
</table> </table>
</div> </div>
<div class="main_table" <div class="main_table" ref="ach" style="max-height: 222px;margin-top: 0;overflow: hidden">
ref="ach"
style="max-height: 222px;margin-top: 0;overflow: hidden">
<table> <table>
<tbody> <tbody>
<tr v-for="(item, i) in achs" <tr v-for="(item, i) in achs" :key="i">
:key="i">
<td width="20%">{{ i + 1 }}</td> <td width="20%">{{ i + 1 }}</td>
<td width="20%">{{ item.userName }}</td> <td width="20%">{{ item.userName }}</td>
<td width="20%">{{ token ? item.className : item.schoolName }}</td> <td width="20%">{{ token ? item.className : item.schoolName }}</td>
@ -335,8 +298,7 @@
</table> </table>
</div> </div>
</div> </div>
<div class="item" <div class="item" style="height: 300px">
style="height: 300px">
<div class="t_line_box"> <div class="t_line_box">
<i class="t_l_line"></i> <i class="t_l_line"></i>
<i class="l_t_line"></i> <i class="l_t_line"></i>
@ -354,8 +316,7 @@
<i class="b_r_line"></i> <i class="b_r_line"></i>
</div> </div>
<div class="main_title"> <div class="main_title">
<img src="@/assets/img/screen/t_7.png" <img src="@/assets/img/screen/t_7.png" alt="">
alt="">
活跃度排行榜 活跃度排行榜
</div> </div>
<div class="main_table"> <div class="main_table">
@ -369,13 +330,10 @@
</thead> </thead>
</table> </table>
</div> </div>
<div class="main_table" <div class="main_table" ref="active" style="max-height: 230px;margin-top: 0;overflow: hidden">
ref="active"
style="max-height: 230px;margin-top: 0;overflow: hidden">
<table> <table>
<tbody> <tbody>
<tr v-for="(item, i) in actives" <tr v-for="(item, i) in actives" :key="i">
:key="i">
<td width="20%">{{ i + 1 }}</td> <td width="20%">{{ i + 1 }}</td>
<td width="20%">{{ token ? item.className : item.schoolName }}</td> <td width="20%">{{ token ? item.className : item.schoolName }}</td>
<td width="20%">{{ item.activityIndex }}</td> <td width="20%">{{ item.activityIndex }}</td>
@ -462,8 +420,8 @@ export default {
}).catch(res => { }) }).catch(res => { })
// //
this.$post(this.api.courseRankings).then(({ data }) => { this.$post(this.api.courseRankings).then(({ list }) => {
this.popularCourses = data this.popularCourses = list
}).catch(res => { }) }).catch(res => { })
// //
@ -771,7 +729,7 @@ export default {
] ]
const cousrseRes = await this.$post(this.api.websiteProductList, { const cousrseRes = await this.$post(this.api.productsWithExperimentalResults, {
pageNum: 1, pageNum: 1,
pageSize: 1000, pageSize: 1000,
sort: 0, sort: 0,
@ -780,7 +738,7 @@ export default {
purchaseStatus: this.token ? 1 : '' purchaseStatus: this.token ? 1 : ''
}) })
if (cousrseRes) { if (cousrseRes) {
const courseList = cousrseRes.page.records const courseList = cousrseRes.list
const ids = courseList.map(e => e.mallId) const ids = courseList.map(e => e.mallId)
times.map(e => { times.map(e => {
e.mallId = ids e.mallId = ids

@ -412,7 +412,7 @@ export default {
}, },
destroyed () { destroyed () {
// //
this.$post(this.api.playRecordSave, { util.local.get(Setting.tokenKey) && this.$post(this.api.playRecordSave, {
courseId: this.courseId, courseId: this.courseId,
courseType: 0, courseType: 0,
playTime: Math.ceil((Date.now() - this.startTime) / 1000 / 60) playTime: Math.ceil((Date.now() - this.startTime) / 1000 / 60)
@ -850,6 +850,7 @@ export default {
util.cookies.set('competitionId', '', -1) util.cookies.set('competitionId', '', -1)
util.cookies.set('language', '', -1) util.cookies.set('language', '', -1)
util.cookies.set('className', '', -1) util.cookies.set('className', '', -1)
util.cookies.set('loaded', '', -1)
// 8pythoncookiesystemId // 8pythoncookiesystemId
location.href = process.env.NODE_ENV === 'development' ? location.href = process.env.NODE_ENV === 'development' ?
`http://${location.hostname}:8085/#/` : `http://${location.hostname}:8085/#/` :

@ -1,148 +1,145 @@
import axios from "axios"; import axios from 'axios'
import util from "@/libs/util"; import Util from '@/libs/util'
import router from "@/router"; import router from '@/router'
import Setting from "@/setting"; import Setting from '@/setting'
import { Message } from "element-ui"; import { Message } from 'element-ui'
const service = axios.create({ const service = axios.create({
baseURL: Setting.apiBaseURL, baseURL: Setting.apiBaseURL,
timeout: 10000000 timeout: 10000000
}); });
// post请求头 // post请求头
service.defaults.headers.post["Content-Type"] = "application/json;charset=UTF-8"; service.defaults.headers.post["Content-Type"] = "application/json;charset=UTF-8"
// 请求拦截器 // 请求拦截器
service.interceptors.request.use(config => { service.interceptors.request.use(config => {
util.getToken(); Util.getToken();
let token = util.local.get(Setting.tokenKey); let token = Util.local.get(Setting.tokenKey)
if (token) config.headers.token = token; if (token) config.headers.token = token
return config; return config
}, err => { }, err => {
util.errorMsg({ Util.errorMsg({
message: "退出登陆", message: "退出登陆",
onClose: function() { onClose: function () {
router.push({ name: "/login" }); router.push({ name: "/login" })
} }
}); })
return Promise.reject(err); return Promise.reject(err)
}); });
let logouted = 0; let logouted = 0;
// 响应拦截器 // 响应拦截器
service.interceptors.response.use( service.interceptors.response.use(
response => { response => {
const res = response.data; const res = response.data;
if (res.status == 200 || res.status == 10000 || res.status == 30001) { if (res.status == 200 || res.status == 10000 || res.status == 30001) {
return Promise.resolve(res).catch(e => {}); return Promise.resolve(res).catch(e => { });
} else if (!res.status) { } else if (res.code === 401) {
return Promise.resolve(res).catch(e => {}); // 账号互踢
} else if (res.status === 10008) { if (!logouted) {
Message.error({ Util.local.remove(Setting.storeKey)
message: res.message, Util.local.remove(Setting.tokenKey)
showClose: true, Util.errorMsg(res.msg.includes('顶') ? '您的账号已在其他设备登录,您已被迫下线!' : '登录过期,请重新登录!')
duration: 1500 setTimeout(() => {
router.replace({
path: '/login'
}) })
return Promise.reject(res) logouted = 0
} else { }, 1500)
util.errorMsg(res.message); logouted = 1
return Promise.reject(res) }
} } else if (!res.status) {
}, return Promise.resolve(res).catch(e => { });
// 服务器状态码不是200的情况 } else if (res.status === 10008) {
error => { Message.error({
if (error.response.status) { message: res.message,
switch (error.response.status) { showClose: true,
// 401: 未登录 duration: 1500
// 未登录则跳转登录页面,并携带当前页面的路径 })
// 在登录成功后返回当前页面,这一步需要在登录页操作。 return Promise.reject(res)
case 401: } else {
if (!logouted) { Util.errorMsg(res.message);
util.local.remove(Setting.storeKey); return Promise.reject(res)
util.local.remove(Setting.tokenKey); }
util.errorMsg("登录过期,请重新登录"); },
setTimeout(() => { // 服务器状态码不是200的情况
router.replace({ error => {
path: "/login" if (error.response.status) {
}); switch (error.response.status) {
}, 1000); // 401: 未登录
logouted = 1 // 未登录则跳转登录页面,并携带当前页面的路径
} // 在登录成功后返回当前页面,这一步需要在登录页操作。
break; case 401:
case 500: if (!logouted) {
util.errorMsg("网络错误"); Util.local.remove(Setting.storeKey)
break; Util.local.remove(Setting.tokenKey)
// 403 token过期 Util.errorMsg("登录过期,请重新登录")
// 登录过期对用户进行提示 setTimeout(() => {
// 清除本地token和清空vuex中token对象 router.replace({
// 跳转登录页面 path: "/login"
case 403: });
util.local.remove(Setting.storeKey); }, 1000)
util.local.remove(Setting.tokenKey); logouted = 1
util.errorMsg("登录过期,请重新登录"); }
// 清除token break
// store.commit('loginSuccess', null); case 500:
// 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面 Util.errorMsg("网络错误")
setTimeout(() => { break;
router.replace({ // 404请求不存在
path: "/login" case 404:
}); Util.errorMsg("网络请求不存在!")
}, 1000); break;
break; // 其他错误,直接抛出错误提示
// 404请求不存在 default:
case 404: Util.errorMsg(error.response.data.message)
util.errorMsg("网络请求不存在!"); Promise.reject(res);
break; }
// 其他错误,直接抛出错误提示 return Promise.reject(error.response)
default:
util.errorMsg(error.response.data.message);
Promise.reject(res);
}
return Promise.reject(error.response);
}
} }
}
); );
function get(url, params) { function get (url, params) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
service.get(url, { params: params }).then(res => { service.get(url, { params: params }).then(res => {
resolve(res); resolve(res);
}).catch(err => { }).catch(err => {
reject(err); reject(err);
});
}); });
});
} }
function post(url, params) { function post (url, params) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
service.post(url, params).then(res => { service.post(url, params).then(res => {
resolve(res); resolve(res);
}).catch(err => { }).catch(err => {
reject(err.data); reject(err.data);
});
}); });
});
} }
function del(url, params) { function del (url, params) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
service.delete(url, { service.delete(url, {
params params
}).then(res => { }).then(res => {
resolve(res); resolve(res);
}).catch(err => { }).catch(err => {
reject(err.data); reject(err.data);
});
}); });
});
} }
function put(url, params) { function put (url, params) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
service.put(url, params).then(res => { service.put(url, params).then(res => {
resolve(res); resolve(res);
}).catch(err => { }).catch(err => {
reject(err.data); reject(err.data);
});
}); });
});
} }
export { get, post, del, put }; export { get, post, del, put };

@ -32,6 +32,7 @@ if (isDev) {
const ip = localStorage.getItem('localIp') const ip = localStorage.getItem('localIp')
const ips = ['http://192.168.31.217:9000/', 'http://192.168.31.51:9000/', 'http://121.37.12.51/'] const ips = ['http://192.168.31.217:9000/', 'http://192.168.31.51:9000/', 'http://121.37.12.51/']
host = ips[+ip] host = ips[+ip]
// host = 'http://192.168.31.51:9000/'
} else if (isSq) { } else if (isSq) {
zcPath = `10.20.100.204:8883` zcPath = `10.20.100.204:8883`
} }

@ -381,6 +381,13 @@ $height: 250px;
background-color: #072951; background-color: #072951;
box-shadow:-10px 0px 15px #2C58A6 inset, 10px 0px 15px #2C58A6 inset; box-shadow:-10px 0px 15px #2C58A6 inset, 10px 0px 15px #2C58A6 inset;
} }
.num {
position: absolute;
top: 10px;
right: 10%;
font-size: 12px;
color: #fff;
}
} }
.index { .index {
position: absolute; position: absolute;

Loading…
Cancel
Save