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

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

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

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

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

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

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

@ -381,6 +381,13 @@ $height: 250px;
background-color: #072951;
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 {
position: absolute;

Loading…
Cancel
Save