InternetCompetition/src/views/examModule/index.vue

542 lines
14 KiB
Vue

<script>
import { GetSubjectType, GetPractice, getPracticeRecords } from "@/api/user";
export default {
name: "index",
data() {
return {
typeOptions: [],
examIndex: 0,
// 获取考试数据参数
form: {
PageIndex: 1,
PageSize: 8,
state: "",
user_id: "",
SubjectType: "",
},
// 考试场次
testList: [],
total: 0, //总数
isVisible: false, //考试记录弹窗
examRecordsTable: [], //考试记录表格
};
},
methods: {
//根据科目查询
onQuery() {
this.getTestList();
},
getTestList() {
GetPractice(this.form).then((res) => {
this.testList = res.data.data;
this.total = parseInt(res.data.message);
});
},
// 进入考试
enterExam(item) {
this.$router.push(
`/examPage?id=${item.batch_id}&totalScore=${item.total_score}&minute=${item.ks_minute}&passScore=${item.pass_score}`
);
let data = {
user_id: this.form.user_id,
batch_id: item.batch_id,
list_item_answer: [],
};
let testMsg = {
testTitle: item.subject, //考试名称
endTime: item.ks_minute, //考试结束时间
};
// 存储考试数据
sessionStorage.setItem("testMsg", JSON.stringify(testMsg));
sessionStorage.setItem("params", JSON.stringify(data));
},
//练习记录
enterExamRecords(row) {
let dataMap = {
batch_id: row.batch_id,
user_id: this.form.user_id,
};
getPracticeRecords(dataMap)
.then((res) => {
this.examRecordsTable = res.data.data;
this.isVisible = true;
})
.catch((err) => {
console.log(err);
});
},
//查看考试详情
goDetails(row){
console.log(row,'行');
this.$router.push(
`/examDetails?id=${row.result_id}&score=${row.score}&user_id=${this.form.user_id}&examine_time=${row.examine_time}&exam_name=${row.exam_name}&pass_score=${row.pass_score}`
);
let data = {
user_id: this.form.user_id,
batch_id: row.result_id,
list_item_answer: [],
};
sessionStorage.setItem("params", JSON.stringify(data));
},
//关闭练习记录
closeExamRecords() {
this.isVisible = false;
},
currentChange(current) {
this.form.PageIndex = current;
this.getTestList();
},
getCountdown(time) {
let endTime = new Date(time).getTime();
let startTime = new Date().getTime();
let remainder = endTime - startTime;
let d = parseInt(remainder / 1000 / 60 / 60 / 24); //算出天数
let h = parseInt((remainder / 1000 / 60 / 60) % 24); //算出小时数
let m = parseInt((remainder / 1000 / 60) % 60); //算出分钟数
let s = parseInt((remainder / 1000) % 60); //算出秒数
h = d * 24 + h;
if (h < 10) {
h = "0" + h;
}
if (m < 10) {
m = "0" + m;
}
if (s < 10) {
s = "0" + s;
}
return h + "小时" + m + "分" + s + "秒后开始";
// return h+':'+m+':'+s
},
//获取科目类别
getSubjectTypeList() {
GetSubjectType()
.then((res) => {
this.typeOptions = res.data.data;
})
.catch((err) => {
console.log(err);
});
},
//表格样式
tableRowClassName({ row, rowIndex }) {
if (rowIndex % 2 == 1) {
return "warning-row";
} else {
return "success-row";
}
return "";
},
},
mounted() {
// 用户id赋值
// this.form.user_id = window.location.href.split("?")[1];
this.form.user_id = "USER202311172256420502";
this.getSubjectTypeList();
this.getTestList();
},
computed: {},
};
</script>
<template>
<div class="test-box">
<div class="test-box-title">考试场次选择</div>
<div class="test-box-status">
<el-form v-model="form" :inline="true">
<el-form-item label="科目类别:">
<el-select
v-model="form.SubjectType"
placeholder="请选择科目类别"
:popper-append-to-body="false"
clearable
>
<el-option
v-for="(item, index) in typeOptions"
:key="index"
:label="item"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onQuery">查询</el-button>
</el-form-item>
</el-form>
</div>
<div class="test-box-site">
<div v-for="item in testList" class="test-box-site-item">
<div class="test-box-site-item-name">
{{ item.subject }}
</div>
<div class="test-box-site-item-time">
<span>考试时长:{{ item.ks_minute }}分钟</span>
</div>
<div class="test-box-site-item-score">
<span>满分:{{ item.total_score }}分</span>
</div>
<div class="test-box-site-item-score">
<span>及格分:{{ item.pass_score }}分</span>
</div>
<div class="test-box-site-item-btn">
<!-- <span> 考试记录 </span> -->
<span>
<img
src="@/assets/image/ksjl.png"
v-show="item.ks_count > 0"
@click="enterExamRecords(item)"
/>
</span>
<!-- <div class="time" v-if="item.batch_state.trim() === '未开始'">
{{ getCountdown(item.start_time) }}
</div> -->
<!-- <span @click="enterExam(item)"> 进入考试 </span> -->
<span>
<img src="@/assets/image/jrks.png" @click="enterExam(item)" />
</span>
</div>
</div>
</div>
<div class="test-no-data" v-if="!testList.length"></div>
<div class="test-box-pagination">
<span>共{{ total }}条</span>
<el-pagination
@current-change="currentChange"
:current-page="form.PageIndex"
layout="prev, pager, next"
:page-size="form.PageSize"
:total="total"
>
</el-pagination>
</div>
<!-- 考试记录弹窗 -->
<div class="examRecords" v-if="isVisible">
<div class="examRecords-title">
<span>考试记录</span>
<img src="@/assets/image/close.png" @click="closeExamRecords" />
</div>
<div class="diyTable">
<el-table
class="my-el-table"
:data="examRecordsTable"
height="320"
:header-cell-style="{
background: 'rgba(131, 129, 177, 0.5) !important',
color: '#ededed !important',
}"
:row-class-name="tableRowClassName"
>
<el-table-column type="index" label="序号" align="center" />
<el-table-column prop="examine_time" label="考试时间" align="center" />
<el-table-column prop="score" label="考试成绩" align="center" />
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button type="primary" size="small" @click="goDetails(scope.row)">查看详情</el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
</template>
<style lang="less" scoped>
.test-no-data {
background-image: url("../../assets/image/examSelect/not_data.png");
width: 228px;
height: 244px;
background-size: 100% 100%;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
}
::v-deep .el-pager li {
background-image: none;
background-color: transparent;
font-size: 14px;
font-weight: normal;
width: 34px;
height: 34px;
line-height: 34px;
}
::v-deep .el-pagination .btn-next,
::v-deep .el-pagination .btn-prev {
background-color: transparent;
width: 34px;
color: #ffffff;
height: 34px;
line-height: 34px;
}
::v-deep .el-pagination button:disabled {
color: rgba(255, 255, 255, 0.3);
background-color: transparent;
}
::v-deep .el-pager li:hover {
color: #ffffff;
}
::v-deep .el-pager li.active {
background-color: rgba(255, 255, 255, 0.12);
color: #ffffff;
}
.test-box {
width: 1773px;
height: 858px;
background-image: url("../../assets/image/examSelect/test-box.png");
background-size: 100% 100%;
position: absolute;
padding: 0 68px;
box-sizing: border-box;
top: 0;
right: 0;
left: 0;
bottom: 0;
margin: auto;
//
&-pagination {
position: absolute;
display: flex;
bottom: 40px;
left: 50%;
transform: translateX(-50%);
align-items: center;
span {
color: #ffffff;
font-size: 14px;
}
}
&-title {
position: absolute;
top: 14px;
left: 50%;
font-size: 24px;
margin-left: -72px;
color: rgba(255, 255, 255, 1);
}
// 状态的tab栏
&-status {
margin-top: 42px;
margin-bottom: 26px;
display: flex;
list-style: none;
::v-deep .el-input__inner {
background: rgba(0, 0, 0, 0.4);
border-color: rgba(255, 255, 255, 0.5);
color: #fff;
}
::v-deep .el-input.is-focus .el-input__inner {
border-color: rgba(255, 255, 255, 0.5);
}
::v-deep .el-select-dropdown {
left: 0 !important;
}
::v-deep .el-select-dropdown__item {
color: #fff;
}
::v-deep .el-select-dropdown__item.hover {
background: rgba(0, 0, 0, 0.7);
}
::v-deep .el-select-dropdown__list {
background: rgba(57, 57, 67);
border-color: rgba(255, 255, 255, 0.3);
}
.select {
background-image: url("../../assets/image/examSelect/select-status.png");
color: rgba(255, 255, 255, 1);
}
// li {
// background-image: url("../../assets/image/examSelect/default-status.png");
// color: rgba(255, 255, 255, 0.6);
// width: 136px;
// height: 40px;
// margin-right: 14px;
// text-align: center;
// line-height: 40px;
// }
}
// 考试场次选择
&-site {
height: 552px;
&-item {
float: left;
width: 372px;
margin-right: 49px;
margin-bottom: 49px;
height: 232px;
box-sizing: border-box;
padding: 0 18px;
background-image: url("../../assets/image/examSelect/exam-plate.png");
background-size: 100% 100%;
display: flex;
flex-direction: column;
justify-content: flex-start;
padding-bottom: 20px;
// 理论考试名字
&-name {
font-size: 18px;
margin-top: 10px !important;
}
div {
color: rgba(255, 255, 255, 1);
font-size: 16px;
margin-top: 20px;
}
//开始时间
&-start {
display: flex;
justify-content: space-between;
margin-top: 23px !important;
span:nth-child(2) {
text-align: center;
line-height: 22px;
width: 62px;
height: 22px;
background-size: 100% 100%;
}
.end {
background-image: url("../../assets/image/examSelect/end.png");
}
.not-started {
background-image: url("../../assets/image/examSelect/not-started.png");
}
.started {
background-image: url("../../assets/image/examSelect/started.png");
}
}
// 进入考场
&-btn {
display: flex;
justify-content: flex-end;
position: relative;
margin-top: 30px !important;
padding: 0 40px;
.time {
color: rgba(101, 140, 246, 1);
font-size: 14px;
position: absolute;
top: -30px;
right: 0;
margin: 0;
}
span:nth-child(1) {
margin-right: 45px;
}
span {
// background-image: url("../../assets/image/examSelect/enter-not.png");
font-size: 14px;
width: 101px;
line-height: 28px;
color: rgba(255, 255, 255, 0.5);
text-align: center;
background-size: 100% 100%;
cursor: pointer;
}
.starting {
background-image: url("../../assets/image/examSelect/enter.png");
color: rgba(255, 255, 255, 1);
}
}
}
&-item:nth-child(4n) {
margin-right: 0;
}
}
.examRecords {
position: fixed; /* Stay in place */
// z-index: 1; /* Sit on top */
left: 28%;
top: 30%;
transform: translate(-50%, -50%);
width: 807px; /* Could be more or less, depending on screen size */
height: 391px;
background: #fff;
border-radius: 5px;
padding: 0 20px;
background: url("@/assets/image/examRecords.png") no-repeat;
background-size: 100% 100%;
animation: popup-enter 0.7s ease-out forwards;
&-title {
height: 40px;
font-size: 24px;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
span {
left: 42%;
position: relative;
}
img {
cursor: pointer;
margin-left: auto;
margin-top: 20px;
}
}
}
@keyframes popup-enter {
from {
opacity: 0;
transform: translateY(-20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.diyTable {
margin-top: 20px;
}
::v-deep .my-el-table {
overflow-x: hidden;
.el-table__header-wrapper {
.el-table__header {
width: calc(100% + 32px) !important;
}
}
.el-table__body-wrapper {
width: calc(100% + 20px) !important;
.el-table__body {
width: calc(100% + 20px) !important;
}
}
.el-table__body tr:hover > td {
background-color: transparent;
}
}
// 去掉table表格底部白色线条
::v-deep .el-table::before {
background-color: transparent;
}
::v-deep .el-table td.el-table__cell,
::v-deep .el-table th.el-table__cell.is-leaf {
border: none;
}
::v-deep .el-table__row.warning-row {
background: rgba(60, 58, 74, 0.15) !important;
}
::v-deep .el-table__row.success-row {
background: rgba(131, 129, 177, 0.2) !important;
}
::v-deep .el-table tr {
color: #fff;
background-color: transparent;
}
}
</style>