首页案例面板

20240205
yujialong 3 years ago
parent d534e1194a
commit d31225ccc0
  1. BIN
      src/assets/img/case/bg.png
  2. BIN
      src/assets/img/case/btn.png
  3. BIN
      src/assets/img/case/header.png
  4. BIN
      src/assets/img/case/left.png
  5. BIN
      src/assets/img/case/right.png
  6. 727
      src/components/case/index.vue
  7. 122
      src/pages/bank/list/index.vue
  8. 2
      src/router/routes.js
  9. 6
      src/setting.js

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

@ -0,0 +1,727 @@
<template>
<div>
<el-container class="scrollbar" v-if="caseVisible">
<el-header>
<div class="flex a-center j-between">
<div class="flex a-center" style="width: 28%">
<p>实训项目</p>
<el-select v-model="projectId" placeholder="请选择" class="select" :disabled="projectPermissions != 0" @change="selectProject">
<el-option
v-for="item in value"
:key="item.projectId"
:label="item.projectName"
:value="item.projectId"
></el-option>
</el-select>
</div>
<div class="countDownBox">
<div style="margin-left: -40px;">
<div :sendSync="sendSync" :autoStart="autoStart" :defaultVal="defaultVal">
实训{{text}}时间
<span class="timeSpan">{{day}}</span>
<span class="timeSpan">{{hour}}</span>小时
<span class="timeSpan">{{minutes}}</span>
<span class="timeSpan">{{seconds}}</span>
</div>
</div>
</div>
<div class="countDownBox">
<div>
总得分
<span class="gradeSpan">{{grade}}</span>
</div>
</div>
<div>
<el-button
style="backgroundColor: #202020;color: #d0d0d0;font-size:14px;"
v-show="projectPermissions == 0"
@click="reload"
>重新开始</el-button>
<el-button class="submit-btn" style="margin-right:7px" @click="Submit()" :disabled="isSubmit">提交</el-button>
</div>
</div>
</el-header>
<el-container>
<el-aside width="30%">
<div class="aside-header">
<div class="header_h flex a-center">
<i class="el-icon-s-order"></i>
<p>实验目标</p>
</div>
<div class="font_css">
<div class="experimentalGoal">
<div class="break-all" v-html="experimentalGoal"></div>
</div>
</div>
</div>
<div class="aside-footer">
<div class="header_h flex a-center">
<i class="el-icon-s-management"></i>
<p>实验任务</p>
</div>
<div>
<el-row>
<el-col :span="24">
<el-card shadow="hover">
<el-table :data="tableData" :stripe="true" height="405">
<el-table-column type="index"></el-table-column>
<el-table-column prop="judgmentPointsName" label="判分标准" align="center"></el-table-column>
<el-table-column prop="right" label="完成结果" align="center">
<template slot-scope="scope">
<i
v-if="scope.row.right=='0'"
class="el-icon-check"
style="color:green;font-size:20px"
></i>
<i
v-else-if="scope.row.right=='-1'"
class="el-icon-close"
style="color:red;font-size:20px"
></i>
</template>
</el-table-column>
<el-table-column prop="score" label="得分" align="center"></el-table-column>
</el-table>
</el-card>
</el-col>
</el-row>
</div>
</div>
</el-aside>
<el-main>
<el-tabs v-model="activeName" type="card">
<el-tab-pane label="案例" name="first">
<div class="break-all" v-html="caseDescription"></div>
</el-tab-pane>
<el-tab-pane label="实验要求" name="second">
<el-collapse v-model="activeNames">
<el-collapse-item v-for="(loop, index) in points" :key="index">
<template slot="title">
<i class="el-icon-s-ticket"></i>
<span style="font-size:16px">{{loop.judgmentPointsName}}</span>
</template>
<div class="break-all" v-html="loop.experimentalRequirements"></div>
</el-collapse-item>
</el-collapse>
</el-tab-pane>
<el-tab-pane label="实验提示" name="fifth" v-if="isstartexperimentSuggests">
<div class="break-all" v-html="experimentSuggests"></div>
</el-tab-pane>
</el-tabs>
</el-main>
</el-container>
</el-container>
<!-- </div> -->
<div class="panel" :class="{active: caseVisible}">
<div @click="toggleCase">
<img src="../../assets/img/case/left.png" alt v-if="caseVisible" />
<img src="../../assets/img/case/right.png" alt v-else />
</div>
</div>
</div>
</template>
<script>
import util from '@/libs/util'
import Setting from '@/setting'
export default {
data() {
return {
systemId: Setting.systemId,
workbench: [],
test: [],
caseVisible: true,
grade: "00",
exampleData: "",
codeid: "",
codeIds: [],
judgmentPointsIds: [],
text: "",
isStart: false,
globalTimer: null, //setInterval
millisecond: 0,
countVal: this.defaultVal, //
pauseTime: 0,
day: 0,
seconds: 0,
minutes: 0,
hour: 0,
createTime: "", //
actEndTime: "", //
projectId: "", //
value: [],
experimentalGoal: "", //
caseDescription: "", //
experimentSuggests: "", //
judgmentPointsName: "", //
points: [],
activeNames: [],
tableData: [],
activeName: "first",
schoolId: '',
studentId: "",
courseId: "",
projectId: "",
assessmentId: "",
projectPermissions: 0, //(0 1 2)
isSubmit: false,
entryTime: util.formatDate('yyyy-MM-dd hh:mm:ss'),
startTime: '',
stopTime: '',
isSelected: false,
userId: '',
isstartexperimentSuggests: 1
};
},
watch: {
countVal: {
deep: true,
handler: function(val, oldVal) {
let vm = this;
if (vm.needSendSunc) {
vm.passToParent(val);
}
}
},
needSendSunc: {
deep: true,
handler: function(val) {
let vm = this;
if (val) {
vm.passToParent(vm.countString);
}
}
}
},
props: {
sendSync: {
type: Boolean,
default: false
},
autoStart: {
type: Boolean,
default: false
},
defaultVal: {
type: Number,
default: null
},
codeId: {
type: Number,
default: 0
},
},
computed: {
needSendSunc: function() {
return this.sendSync;
},
//
second: function() {
return this.num(this.seconds);
},
minute: function() {
return this.num(this.minutes);
}
},
mounted() {
this.projectPermissions = this.projectId ? 1 : 0
if(this.projectId){
this.getQueryProject();
}else{
this.getProjects();
}
this.assessmentId && this.projectId && this.checkVer()
this.codeId && this.codeIds.push(this.codeId)
},
methods: {
checkVer() {
let data = {
userId: this.userId,
id: this.assessmentId
}
this.$get(this.api.qualifications,data).then(res => {
if(res.message == 'false'){
this.isSubmit = true;
// newmain.$emit("isSubmit", this.isSubmit);
}
});
},
//
reload() {
this.$post(this.api.DeleteCodes, this.codeIds).then(res => {
this.getClearTime()
this.grade = '00'
this.codeIds = []
this.isSubmit = false
this.startCountFn()
});
},
Submit() {
if(!this.codeIds.length) return this.$message.error('请先完成实验')
this.$confirm("此操作将视为结束考试, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
center: true
})
.then(() => {
this.actEndTime = new Date().getTime();
this.getClearTime();
//
this.$post(this.api.Submit, {
// projectPermissions: 0,
createTime: this.startTime,
endTime: this.stopTime,
projectId: this.projectId,
projectPermissions: this.projectPermissions,
// assessmentId: 1,
assessmentId: this.assessmentId ? this.assessmentId : '',
codeIds: this.codeIds,
judgmentPointsIds: this.judgmentPointsIds,
// studentId: 54,
studentId: this.studentId,
record: {
courseId: 1,
// courseId: this.courseId,
projectId: this.projectId,
createTime: this.startTime,
endTime: this.stopTime,
startTime: this.entryTime
}
})
.then(res => {
this.isSubmit = true
// newmain.$emit("isSubmit", this.isSubmit);
this.tableData = res.message
//
var s = 0;
this.tableData.forEach(element => {
this.test = element.score;
s += this.test;
this.grade = s;
});
})
.catch(err => {});
})
.catch(() => {
this.$message({
type: "info",
message: "已取消提交"
});
});
},
//
timeFormat(param) {
return param < 10 ? "0" + param : param;
},
toggleCase() {
this.caseVisible = !this.caseVisible
},
//
getClearTime() {
// clearInterval(this.globalTimer);
clearInterval(this.countVal);
this.globalTimer = "";
// if(this.projectPermissions != 0){
this.countVal = "";
this.day = "00";
this.seconds = "00";
this.minutes = "00";
this.hour = "00";
// }else{
// this.text = ''
// }
},
handleData(project,type){
if(!this.isSelected){
this.value = project;
this.projectId = project[0].projectId;
}
this.projectId = type == 2 ? project[0].projectId : this.projectId
if(type == 2) this.getQueryProject(0,1)
this.projectPermissions = type == 1 ? project[0].projectPermissions : this.projectPermissions
this.experimentalGoal = project[0].experimentalGoal;
this.caseDescription = project[0].caseDescription;
this.experimentSuggests = project[0].experimentSuggests;
this.actEndTime = project[0].endTime;
},
getQueryProject(projectId,type) {
//++++
this.$get(this.api.QueryProject, {
// studentId: 54,
// projectId: 305,
// assessmentId: 1,
studentId: this.studentId,
projectId: projectId ? projectId : this.projectId,
assessmentId: this.assessmentId
}).then(res => {
if(!type){
this.handleData(res.message.project,1)
this.projectId = res.message.project[0].projectId
}
this.points = res.message.points;
this.tableData = res.message.points;
let arr1 = this.tableData;
let result1 = arr1.map(e => e.judgmentPointsId);
this.judgmentPointsIds = this.judgmentPointsIds.concat(result1);
this.isstartexperimentSuggests = !res.message.project[0].isstartexperimentSuggests //01
if (this.projectPermissions == "1") {
this.text = "剩余";
var interval = setInterval(() => {
//
let newTime = new Date().getTime();
//
let endTime = new Date(this.actEndTime).getTime();
let obj = null; //
if (endTime - newTime > 0) {
let time = (endTime - newTime) / 1000; //
let day = parseInt(time / (60 * 60 * 24));
let hou = parseInt((time % (60 * 60 * 24)) / 3600);
let min = parseInt(((time % (60 * 60 * 24)) % 3600) / 60);
let sec = parseInt(((time % (60 * 60 * 24)) % 3600) % 60);
obj = {
day: this.timeFormat(day),
hou: this.timeFormat(hou),
min: this.timeFormat(min),
sec: this.timeFormat(sec)
};
} else {
// '00'
obj = {
day: "00",
hou: "00",
min: "00",
sec: "00"
};
clearInterval(interval);
}
this.day = obj.day;
this.hour = obj.hou;
this.minutes = obj.min;
this.seconds = obj.sec;
}, 1000);
} else if (this.projectPermissions == "0") {
this.text = "已用";
//
this.createTime = new Date().getTime();
//
if (this.autoStart) {
this.startCountFn();
}
}
})
.catch(err => {});
},
getProjects(){
let data = {
systemId: this.systemId,
// schoolId: this.schoolId
schoolId: ''
}
this.$get(`${this.api.queryTestProject}`,data).then(res => {
this.handleData(res.message,2)
}).catch(res => {});
},
selectProject(){
this.isSelected = true
this.assessmentId = ''
this.judgmentPointsIds = []
this.codeIds = []
this.getQueryProject(this.projectId)
this.isSubmit = false
this.countVal = 0
// newmain.$emit("isSubmit", this.isSubmit)
},
counterFn(counterTime) {
let leave1 = counterTime % (24 * 3600 * 1); //
let leave2 = leave1 % (3600 * 1); //
let leave3 = leave2 % (60 * 1); //
let day = Math.floor(counterTime / (24 * 3600 * 1)); //
let hour = Math.floor(leave1 / (3600 * 1)); //
let minutes = Math.floor(leave2 / (60 * 1)); //
let seconds = Math.round(leave3 / 1); //
day = day >= 10 ? day : "0" + day;
hour = hour >= 10 ? hour : "0" + hour;
minutes = minutes >= 10 ? minutes : "0" + minutes;
seconds = seconds >= 10 ? seconds : "0" + seconds;
this.day = day;
this.hour = hour;
this.minutes = minutes;
this.seconds = seconds;
},
startCountFn() {
if (!this.isStart) {
this.countVal = this.countVal ? this.countVal : 0;
let timer = setInterval(() => {
this.counterFn(this.countVal++);
}, 1000);
this.globalTimer = timer;
this.isStart = true;
}
},
passToParent(data) {
this.$emit("getDataFromChild", data);
},
getCookie(cookie_name) {
//cookiekeyvalue
var allcookies = document.cookie; //
var cookie_pos = allcookies.indexOf(cookie_name); // cookie,
if (cookie_pos != -1) {
// cookie_pos1
//cookie1=
cookie_pos = cookie_pos + cookie_name.length + 1; //cookie
var cookie_end = allcookies.indexOf(";", cookie_pos);
if (cookie_end == -1) {
cookie_end = allcookies.length;
} //cookie
var value = unescape(allcookies.substring(cookie_pos, cookie_end));
}
return value;
}
}
};
</script>
<style lang="scss" scoped>
/deep/.el-container {
height: 80%;
&.is-vertical{
position: fixed;
top: 200px;
bottom: 20px;
left: 0;
width: 85%;
height: 70%;
background-color: #f5f5f5;
}
.el-header{
color: #333;
padding: 0 12px 0 20px;
.el-button {
background-color: $main-color;
color: #fff;
border: none;
margin: 5px 0px 5px 5px;
font-size: 16px;
}
.submit-btn{
padding-left: 30px;
padding-right: 30px;
background: $main-color url(../../assets/img/case/btn.png) 0 0/100% 100% no-repeat;
}
}
.el-aside{
color: #333;
[class*=" el-icon-"],[class^="el-icon-"]{
line-height: 40px;
font-size: 16px;
}
}
.el-main {
width: 60%;
background-color: #fff;
color: #333;
padding: 0;
font-size: 16px;
margin: 0px 20px 10px 10px;
white-space: pre-wrap;
background: #fff url(../../assets/img/case/bg.png) top right no-repeat;
}
.aside-header {
margin: 0px 10px 10px 10px;
background-color: #fff;
}
.aside-footer {
margin: 0px 10px 10px 10px;
background-color: #fff;
}
.header_h {
height: 50px;
background: url(../../assets/img/case/header.png) 0 0/100% 100% no-repeat;
justify-content: center;
i{
color: #fff;
}
p {
line-height: 40px;
font-size: 16px;
color: #fff;
padding-left: 10px;
}
}
.el-card{
border: 0;
border-radius: 0;
.el-card__body {
padding: 0;
}
}
.select{
flex: 1;
input::-webkit-input-placeholder {
color: #333;
}
.el-input__icon {
line-height: 60px;
}
.el-select__caret:before {
content: "\e78f";
font-size: 16px;
padding: 3px;
background-color: $main-color;
border-radius: 50%;
color: #ffffff;
}
.el-input--suffix .el-input__inner {
color: #333;
font-size: 14px;
border-radius: 30px;
border: none;
background-color: #fff;
margin-left: 15px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.el-input {
padding: 10px 0;
}
}
.font_css {
margin: 0 10px;
text-indent: 2em;
font-size: 14px;
padding: 10px 0;
}
.countDownBox {
font-size: 16px;
margin: 0 10px;
padding: 20px 0;
}
.timeSpan {
color: #333333;
padding: 5px 15px;
font-size: 14px;
background: #ffffff;
border-radius: 18px;
margin: 0 5px;
text-align: center;
}
.gradeSpan {
color: #878787;
padding: 10px;
font-size: 14px;
background: #e0e0e0;
border-radius: 6px;
text-align: center;
}
.el-header /deep/.el-button:hover,
.el-button:focus,
.el-button:active {
background-color: $main-color;
color: #fff;
}
.el-table{
font-size: 12px;
color: #202020;
.el-table--striped .el-table__body tr.el-table__row--striped td {
background: #eef7ff;
}
.el-table td,.el-table th.is-leaf{
border-bottom: 0;
}
thead{
color: #ffffff;
font-size: 10px;
th{
padding: 5px 0;
}
}
th > .cell{
font-weight: 100;
}
th,tr{
background-color: #badfff;
}
}
.el-collapse-item__content{
padding-left: 10px;
padding-right: 10px;
}
.el-collapse-item__wrap {
border-bottom: none;
}
.el-collapse-item__header {
border-bottom: none;
}
.el-tabs__content {
margin: 0 20px;
}
.el-icon-s-ticket:before {
font-size: 16px;
padding: 5px;
color: $main-color;
}
.el-collapse-item__arrow {
margin: 0 5px 0 0;
}
.el-icon-arrow-right:before {
font-size: 12px;
padding: 1px;
margin-left: 10px;
background-color: $main-color;
border-radius: 50%;
color: #ffffff;
}
.el-tabs__item {
font-size: 16px;
}
.el-tabs--card > .el-tabs__header .el-tabs__nav {
border: none;
}
.el-tabs--card > .el-tabs__header .el-tabs__item {
border-left: none;
}
.el-tabs--card > .el-tabs__header {
border-bottom: none;
}
.el-collapse {
border-bottom: none;
border-top: none;
height: 500px;
overflow: hidden;
overflow-y: auto;
}
.el-tabs__item.is-active {
color: #fff;
background-color: $main-color;
}
.el-tabs__header {
padding: 5px 20px;
}
}
.break-all{
word-break: break-all;
}
.panel{
position: fixed;
top: 50%;
&.active{
left: 85%;
}
img{
height: 150px;
cursor: pointer;
}
}
</style>

@ -14,49 +14,27 @@
<img class="sth company-finance" src="@/assets/img/company-finance.png" alt="">
<img class="sth personal-finance" src="@/assets/img/personal-finance.png" alt="">
<div class="case-dia" v-show="caseVisible">
<img src="@/assets/svg/close.svg" alt="" class="close" @click="caseVisible = false">
<ul class="tab">
<li :class="{active: caseType == 1}" @click="typeClick(1)">练习</li>
<li :class="{active: caseType == 2}" @click="typeClick(2)">考核</li>
</ul>
<div class="table">
<ul class="thead">
<li class="serial">序号</li>
<li class="name">项目案例名称</li>
<li class="action">操作</li>
</ul>
<ul class="tbody">
<li>
<div class="serial">01</div>
<div class="name">个人活期业务</div>
<div class="action">
<button type="button">开始</button>
</div>
</li>
</ul>
</div>
</div>
<vCase></vCase>
</div>
</template>
<script>
import vCase from '@/components/case'
export default {
name: 'index',
data() {
return {
caseVisible: true,
caseType: 1
}
},
components: {
vCase
},
mounted() {
},
methods: {
typeClick(id){
this.caseType = id
}
}
};
</script>
@ -141,92 +119,4 @@ export default {
cursor: pointer;
}
}
.case-dia{
position: absolute;
top: 200px;
left: 40px;
width: 600px;
background-color: #fff;
border-radius: 20px;
overflow: hidden;
.close{
position: absolute;
top: 15px;
right: 15px;
cursor: pointer;
}
.tab{
display: flex;
background: url(../../../assets/img/case-tab-bg.png) 0 0 /auto 100% repeat-x;
border-top-left-radius: 20px;
border-top-right-radius: 20px;
li{
flex: 1;
line-height: 72px;
font-size: 24px;
text-align: center;
cursor: pointer;
&.active{
background: #fff;
}
}
}
.table{
$serial-width: 20%;
$name-width: 50%;
.thead{
display: flex;
line-height: 60px;
border-bottom: 2px solid #F2F3F9;
li{
text-align: center;
font-size: 16px;
}
.serial{
width: $serial-width;
}
.name{
width: $name-width;
}
.action{
flex: 1;
}
}
.tbody{
li{
display: flex;
padding: 15px 0;
.serial{
width: $serial-width;
color: #5583FF;
font-size: 20px;
font-weight: bold;
text-align: center;
}
.name{
width: $name-width;
font-size: 18px;
}
.action{
flex: 1;
text-align: center;
button{
padding: 0 30px;
color: #fff;
line-height: 36px;
font-size: 18px;
text-align: center;
background-color: #5583FF;
border: 0;
border-radius: 18px;
cursor: pointer;
&:hover{
opacity: .9;
}
}
}
}
}
}
}
</style>

@ -7,7 +7,7 @@ import BasicLayout from '@/layouts/home'
const frameIn = [
{
path: '/',
redirect: '/login',
redirect: '/index/list',
},
{
path: '/',

@ -24,7 +24,7 @@ const Setting = {
// Cookies 默认保存时间,单位:天
cookiesExpires: 1,
/**
* 免登录保存的token的key
* token的key
*/
tokenKey: 'bank_token',
/**
@ -35,6 +35,10 @@ const Setting = {
* sessionStorage里username的key
*/
usernameKey: 'bank_username',
/**
* 系统id
*/
systemId: 12,
/**
* 默认密码
*/

Loading…
Cancel
Save