|
@@ -0,0 +1,210 @@
|
|
|
+<template>
|
|
|
+ <div class="page-exam-question-box">
|
|
|
+ <van-nav-bar title="考试" />
|
|
|
+ <!-- 倒计时 -->
|
|
|
+ <div class="exam-question-countdown">
|
|
|
+ <span>剩余考试时间:{{ timeDiff }}</span>
|
|
|
+ </div>
|
|
|
+ <!-- 题序 -->
|
|
|
+ <div></div>
|
|
|
+ <!-- 题目卡片 -->
|
|
|
+ <div class="exam-question-div">
|
|
|
+ <div class="exam-question-card">
|
|
|
+ <div class="exam-question-title">题目标题</div>
|
|
|
+ <div class="exam-question-options">
|
|
|
+ <div class="exam-question-button-box">
|
|
|
+ <van-button
|
|
|
+ class="exam-question-button"
|
|
|
+ type="primary"
|
|
|
+ color="#FE6347"
|
|
|
+ @click="handleSureFun"
|
|
|
+ >确定</van-button
|
|
|
+ >
|
|
|
+ <van-button
|
|
|
+ class="exam-question-button"
|
|
|
+ type="primary"
|
|
|
+ color="#FE6347"
|
|
|
+ @click="handleSubmitFun"
|
|
|
+ >交卷</van-button
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import { mapState } from "vuex";
|
|
|
+export default {
|
|
|
+ name: "page-exam-question-",
|
|
|
+ components: {},
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ examItemData: {}, // 当前考试的信息
|
|
|
+ startTimeSeconds: null, // 考试开始时间的信息
|
|
|
+ timeDiff: "00:00:00", // 距离考试结束的时间
|
|
|
+ interval: null // 计时器
|
|
|
+ };
|
|
|
+ },
|
|
|
+ created() {
|
|
|
+ this.initDataFun(); // 初始化数据信息
|
|
|
+ },
|
|
|
+ beforeDestroy() {
|
|
|
+ if (this.interval) {
|
|
|
+ clearInterval(this.interval); // 销毁前清空计时器
|
|
|
+ }
|
|
|
+ },
|
|
|
+ watch: {
|
|
|
+ timeDiff(val) {
|
|
|
+ if (val === "00:00:00") {
|
|
|
+ console.log("结束了");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ computed: {
|
|
|
+ ...mapState({
|
|
|
+ examItem: state => state.exam.examItem
|
|
|
+ })
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ // 初始化数据信息
|
|
|
+ initDataFun() {
|
|
|
+ console.log("考试信息:", this.examItem);
|
|
|
+ if (!this.examItem) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ this.getExamItemQuestionsListFun(); // 查询:当前考试的信息
|
|
|
+ this.getExamTimeFun(); // 获取:当前时间及考试限时
|
|
|
+ this.setIntervalFun(); // 设置:倒计时定时器
|
|
|
+ },
|
|
|
+ // 查询:当前考试的信息
|
|
|
+ getExamItemQuestionsListFun() {
|
|
|
+ // TODO...
|
|
|
+ this.examItemData = [{ id: 1 }];
|
|
|
+ },
|
|
|
+ // 获取:当前时间及考试限时
|
|
|
+ getExamTimeFun() {
|
|
|
+ let tarTime = this.timeEvent(this.examItem.examTimeMins);
|
|
|
+ let curTime = new Date();
|
|
|
+ // 在当前时间curTime变量上加上小时
|
|
|
+ let addHour = curTime.setHours(curTime.getHours() + tarTime.hours);
|
|
|
+ curTime = new Date(addHour);
|
|
|
+ // 在当前时间curTime变量上加上分钟
|
|
|
+ let addMinute = new Date(
|
|
|
+ curTime.setMinutes(curTime.getMinutes() + tarTime.minute)
|
|
|
+ );
|
|
|
+ curTime = new Date(addMinute);
|
|
|
+ // 在当前时间curTime变量上加上秒
|
|
|
+ let addSeconds = new Date(
|
|
|
+ curTime.setSeconds(curTime.getSeconds() + tarTime.seconds)
|
|
|
+ );
|
|
|
+ curTime = new Date(addSeconds);
|
|
|
+ this.startTimeSeconds = curTime.getTime();
|
|
|
+ },
|
|
|
+ // 方法:分别获取时 分 秒
|
|
|
+ timeEvent(e) {
|
|
|
+ let time = e;
|
|
|
+ let len = time.split(":");
|
|
|
+ if (len.length === 3) {
|
|
|
+ let hour = time.split(":")[0];
|
|
|
+ let min = time.split(":")[1];
|
|
|
+ let sec = time.split(":")[2];
|
|
|
+ return {
|
|
|
+ hours: Number(hour),
|
|
|
+ minute: Number(min),
|
|
|
+ seconds: Number(sec)
|
|
|
+ };
|
|
|
+ }
|
|
|
+ if (len.length === 2) {
|
|
|
+ let min = time.split(":")[0];
|
|
|
+ let sec = time.split(":")[1];
|
|
|
+ return { hours: 0, minute: Number(min), seconds: Number(sec) };
|
|
|
+ }
|
|
|
+ if (len.length === 1) {
|
|
|
+ let sec = time.split(":")[0];
|
|
|
+ return { hours: 0, minute: 0, seconds: Number(sec) };
|
|
|
+ }
|
|
|
+ return { hours: 0, minute: 0, seconds: 0 };
|
|
|
+ },
|
|
|
+ // 设置:倒计时定时器
|
|
|
+ setIntervalFun() {
|
|
|
+ let _self = this;
|
|
|
+ // 获取距离目标时间的毫秒时间戳
|
|
|
+ this.interval = setInterval(() => {
|
|
|
+ let curTime = Date.now(); // 获取当前时间的毫秒时间戳
|
|
|
+ let diffTime = this.startTimeSeconds - curTime; // 计算出当前时间距离目标时间的时间差
|
|
|
+ // 判断倒计时是否完成,成立则清除定时器,关闭函数执行
|
|
|
+ if (diffTime <= 0) {
|
|
|
+ clearInterval(_self.interval);
|
|
|
+ _self.timeDiff = "00:00:00";
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ let hours = Math.floor(diffTime / (1000 * 60 * 60));
|
|
|
+ let minutes = Math.floor(
|
|
|
+ (diffTime - hours * 60 * 60 * 1000) / (1000 * 60)
|
|
|
+ );
|
|
|
+ let seconds = Math.floor(
|
|
|
+ (diffTime - hours * 60 * 60 * 1000 - minutes * 60 * 1000) / 1000
|
|
|
+ );
|
|
|
+ let timeDiff = zero(hours) + ":" + zero(minutes) + ":" + zero(seconds);
|
|
|
+ _self.timeDiff = timeDiff;
|
|
|
+ // 数字补零
|
|
|
+ function zero(num) {
|
|
|
+ return num < 10 ? "0" + num : num;
|
|
|
+ }
|
|
|
+ }, 1000);
|
|
|
+ },
|
|
|
+ // 操作:确定
|
|
|
+ handleSureFun() {},
|
|
|
+ // 操作:交卷
|
|
|
+ handleSubmitFun() {}
|
|
|
+ }
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+.page-exam-question-box {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ overflow-y: auto;
|
|
|
+ overflow-x: hidden;
|
|
|
+ font-size: 0.6rem;
|
|
|
+ .exam-question-countdown {
|
|
|
+ height: 2rem;
|
|
|
+ background-color: #f8e7d7;
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-end;
|
|
|
+ align-items: center;
|
|
|
+ span {
|
|
|
+ color: #666;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .exam-question-div {
|
|
|
+ padding: 0.5rem 0.5rem;
|
|
|
+ .exam-question-card {
|
|
|
+ padding: 0 0.5rem 0.5rem;
|
|
|
+ background-color: #fff;
|
|
|
+ border-radius: 4px;
|
|
|
+ box-shadow: 0px 3px 6px rgba(0, 0, 0, 0.16);
|
|
|
+ .exam-question-title {
|
|
|
+ }
|
|
|
+ .exam-question-options {
|
|
|
+ }
|
|
|
+ .exam-question-button-box {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ .exam-question-button {
|
|
|
+ width: 6rem;
|
|
|
+ height: auto;
|
|
|
+ padding: 0.5rem 0.5rem;
|
|
|
+ font-size: 0.65rem;
|
|
|
+ margin-top: 0.75rem;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|