JayChou 2 weeks ago
commit a2b15566cb
  1. 1209
      package-lock.json
  2. 2
      package.json
  3. 25
      src/api/user.ts
  4. BIN
      src/assets/images/Button.png
  5. BIN
      src/assets/images/FakeAnimateForPrototype.png
  6. BIN
      src/assets/images/bg10.png
  7. BIN
      src/assets/images/bg11.png
  8. BIN
      src/assets/images/bg12.png
  9. BIN
      src/assets/images/bg4.png
  10. BIN
      src/assets/images/bg5.png
  11. BIN
      src/assets/images/bg6.png
  12. BIN
      src/assets/images/bg7.png
  13. BIN
      src/assets/images/bg8.png
  14. BIN
      src/assets/images/bg9.png
  15. BIN
      src/assets/images/left.png
  16. BIN
      src/assets/images/right.png
  17. 478
      src/layout/loginPage.vue
  18. 5
      src/router/index.ts
  19. 231
      src/views/resultsAnnounced/index.vue
  20. 365
      src/views/subjectTest/index.vue
  21. 2
      tsconfig.json

1209
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -43,6 +43,8 @@
"postcss-scss": "^4.0.9",
"px2rem-loader": "^0.1.9",
"typescript": "^5.2.2",
"unplugin-auto-import": "^19.1.1",
"unplugin-vue-components": "^28.4.1",
"vite": "^5.3.1",
"vue-tsc": "^2.0.21"
}

@ -0,0 +1,25 @@
import request from '@/utils/request'
export const getCode = (time: any) => {
return request({
url: '/sys/randomImage/' + time,
})
}
// 获取院系列表
export const getFaculties = (params: any) => {
return request({
url: '/sys/sysDepart/stu',
params,
})
}
// 注册
export const sturegister = (data: any) => {
return request({
url: '/sys/user/stuRegister',
method: 'POST',
data,
})
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1018 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 829 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 838 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

@ -6,68 +6,146 @@
<div class="main-content">
<el-row style="display: flex; justify-content: center">
<el-col>
<el-form
:rules="rules"
:model="formModel"
ref="formRef"
size="large"
autocomplete="off"
v-if="isRegister"
>
<el-form-item prop="username">
<el-input
v-model="formModel.username"
:prefix-icon="User"
placeholder="请输入账号"
></el-input>
</el-form-item>
<el-form-item prop="studentNumb">
<el-input
v-model="formModel.studentNumb"
:prefix-icon="Avatar"
placeholder="请输入学号"
></el-input>
</el-form-item>
<el-form-item prop="name">
<el-input
v-model="formModel.name"
:prefix-icon="Stamp"
placeholder="请输入姓名"
></el-input>
<el-form :rules="rules" :model="formModel" ref="formRef" size="large" autocomplete="off" v-if="isRegister">
<el-form-item prop="username" class="custom-form-item">
<div style="display: flex; align-items: center; color: pink">
<div class="left" style="display: flex; align-items: center;width: 90px;">
<div style="padding-right: 10px; color: #1084c1">
<el-icon class="bold-icon">
<User />
</el-icon>
</div>
<div style="padding-right: 10px; color: #2592a1">用户账号</div>
</div>
<div class="right">
<el-input v-model="formModel.username" style="border-color: #20bec8;"
placeholder="请输入用户账号"></el-input>
</div>
</div>
</el-form-item>
<el-form-item prop="password">
<el-input
v-model="formModel.password"
:prefix-icon="Lock"
type="password"
placeholder="请输入密码"
></el-input>
<div style="display: flex; align-items: center;">
<div class="left" style="display: flex; align-items: center ;width: 90px;">
<div style="padding-right: 10px; color: #1084c1">
<el-icon class="bold-icon">
<Lock />
</el-icon>
</div>
<div style="padding-right: 10px; color: #2592a1">用户密码</div>
</div>
<div class="right">
<el-input type="password" v-model="formModel.password" style="border-color: #20bec8"
placeholder="请输入密码" show-password></el-input>
</div>
</div>
</el-form-item>
<el-form-item prop="repassword">
<el-input
v-model="formModel.repassword"
:prefix-icon="Lock"
type="password"
placeholder="请输入再次密码"
></el-input>
<div style="display: flex; align-items: center;">
<div class="left" style="display: flex; align-items: center ;width: 90px;">
<div style="padding-right: 10px; color: #1084c1">
<el-icon class="bold-icon">
<Lock />
</el-icon>
</div>
<div style="padding-right: 10px; color: #2592a1">确认密码</div>
</div>
<div class="right">
<el-input type="password" v-model="formModel.repassword" style="border-color: #20bec8"
placeholder="请再次输入密码" show-password></el-input>
</div>
</div>
</el-form-item>
<el-form-item prop="name" class="custom-form-item">
<div style="display: flex; align-items: center; color: pink">
<div class="left" style="display: flex; align-items: center;width: 90px;">
<div style="padding-right: 10px; color: #1084c1">
<el-icon class="bold-icon">
<Stamp />
</el-icon>
</div>
<div style="padding-right: 10px; color: #2592a1">姓名</div>
</div>
<div class="right">
<el-input v-model="formModel.name" style="border-color: #20bec8;" placeholder="请输入姓名"></el-input>
</div>
</div>
</el-form-item>
<el-form-item prop="clssid">
<div style="display: flex; align-items: center;">
<div class="left" style="display: flex; align-items: center ;width: 90px;">
<div style="padding-right: 10px; color: #1084c1">
<el-icon class="bold-icon">
<Avatar />
</el-icon>
</div>
<div style="padding-right: 10px; color: #2592a1">班级</div>
</div>
<div class="right">
<el-cascader placeholder="请选择所属班级" :props="props" style="width: 142%; height: 0.2344rem"
v-model="formModel.clssid" @change="handleChange" />
</div>
</div>
</el-form-item>
<!-- <el-cascader :props="props" style="width: 100%; height: 0.2344rem" v-model="formModel.clssid" /> -->
<el-form-item prop="studentNumb">
<div style="display: flex; align-items: center;">
<div class="left" style="display: flex; align-items: center ;width: 90px;">
<div style="padding-right: 10px; color: #1084c1">
<el-icon class="bold-icon">
<Avatar />
</el-icon>
</div>
<div style="padding-right: 10px; color: #2592a1">学号</div>
</div>
<div class="right">
<el-input v-model="formModel.studentNumb" style="border-color: #20bec8"
placeholder="请输入学号"></el-input>
</div>
</div>
</el-form-item>
<el-form-item prop="mobile">
<div style="display: flex; align-items: center;">
<div class="left" style="display: flex; align-items: center ;width: 90px;">
<div style="padding-right: 10px; color: #1084c1">
<el-icon class="bold-icon">
<Iphone />
</el-icon>
</div>
<div style="padding-right: 10px; color: #2592a1">手机号</div>
</div>
<div class="right">
<el-input v-model="formModel.mobile" style="border-color: #20bec8" placeholder="请输入手机号"></el-input>
</div>
</div>
</el-form-item>
<el-form-item>
<el-button
style="color: #3ad7e2; background-color: #0e2e5e; width: 150px"
class="button"
type="primary"
auto-insert-space
@click="register"
>
<div style="display: flex; align-items: center;">
<div class="left" style="display: flex; align-items: center ;width: 90px;">
<div style="padding-right: 10px; color: #1084c1">
<el-icon class="bold-icon">
<Grid />
</el-icon>
</div>
<div style="padding-right: 10px; color: #2592a1">验证码</div>
</div>
<div class="right">
<div class="captcha">
<el-input v-model="formModel.captcha" style="height: 0.2344rem" maxlength="4" />
<div class="code" @click="getcodeinfo">
<img :src="codeUrl" alt="" srcset="" />
</div>
</div>
</div>
</div>
</el-form-item>
<el-form-item style="margin-bottom: -30px;">
<el-button style="color: #3ad7e2; background-color: #0e2e5e; width: 165px" class="button" type="primary"
auto-insert-space @click="register">
注册
</el-button>
<el-button
style="color: #3ad7e2; background-color: #0e2e5e; width: 150px"
class="button"
type="primary"
auto-insert-space
@click="isRegister = false"
>
<el-button style="color: #3ad7e2; background-color: #0e2e5e; width: 165px" class="button" type="primary"
auto-insert-space @click="toLogin">
返回到登录页
</el-button>
</el-form-item>
@ -78,77 +156,87 @@
</el-link>
</el-form-item> -->
</el-form>
<el-form
:model="formModel"
:rules="rules"
ref="formRef"
size="large"
autocomplete="off"
v-else
class="custom-form"
>
<el-form-item prop="username">
<el-form :model="formModel" :rules="rules" ref="formRef" size="large" autocomplete="off" v-else
class="custom-form">
<el-form-item prop="username" class="custom-form-item">
<div style="display: flex; align-items: center; color: pink">
<div class="left" style="display: flex; align-items: center">
<div class="left" style="display: flex; align-items: center;width: 90px;">
<div style="padding-right: 10px; color: #1084c1">
<el-icon class="bold-icon">
<user />
<User />
</el-icon>
</div>
<div style="padding-right: 10px; color: #2592a1">用户名</div>
</div>
<div class="right">
<el-input
v-model="formModel.username"
style="border-color: #20bec8; background-color: pink"
placeholder="请输入用户名"
></el-input>
<el-input v-model="formModel.username" style="border-color: #20bec8;" placeholder="请输入用户名"></el-input>
</div>
</div>
</el-form-item>
<el-form-item label="学号" prop="studentNumb">
<el-input
v-model="formModel.studentNumb"
:prefix-icon="Avatar"
placeholder="请输入学号"
></el-input>
<el-form-item prop="studentNumb">
<div style="display: flex; align-items: center;">
<div class="left" style="display: flex; align-items: center ;width: 90px;">
<div style="padding-right: 10px; color: #1084c1">
<el-icon class="bold-icon">
<Avatar />
</el-icon>
</div>
<div style="padding-right: 10px; color: #2592a1">学号</div>
</div>
<div class="right">
<el-input v-model="formModel.studentNumb" style="border-color: #20bec8"
placeholder="请输入学号"></el-input>
</div>
</div>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input
name="password"
:prefix-icon="Lock"
type="password"
placeholder="请输入密码"
v-model="formModel.password"
></el-input>
<el-form-item prop="password">
<div style="display: flex; align-items: center;">
<div class="left" style="display: flex; align-items: center ;width: 90px;">
<div style="padding-right: 10px; color: #1084c1">
<el-icon class="bold-icon">
<Lock />
</el-icon>
</div>
<div style="padding-right: 10px; color: #2592a1">密码</div>
</div>
<div class="right">
<el-input type="password" v-model="formModel.password" style="border-color: #20bec8"
placeholder="请输入密码"></el-input>
</div>
</div>
</el-form-item>
<el-form-item label="验证码">
<div class="captcha">
<el-input
v-model="formModel.captcha"
style="height: 0.2344rem"
maxlength="4"
/>
<div class="code" @click="getcodeinfo">
<img :src="codeUrl" alt="" srcset="" />
<el-form-item>
<div style="display: flex; align-items: center;">
<div class="left" style="display: flex; align-items: center ;width: 90px;">
<div style="padding-right: 10px; color: #1084c1">
<el-icon class="bold-icon">
<Grid />
</el-icon>
</div>
<div style="padding-right: 10px; color: #2592a1">验证码</div>
</div>
<div class="right">
<div class="captcha">
<el-input v-model="formModel.captcha" style="height: 0.2344rem" maxlength="4" />
<div class="code" @click="getcodeinfo">
<img :src="codeUrl" alt="" srcset="" />
</div>
</div>
</div>
</div>
</el-form-item>
<!-- <el-form-item label="验证码">
<div class="captcha">
<el-input v-model="formModel.captcha" style="height: 0.2344rem" maxlength="4" />
<div class="code" @click="getcodeinfo">
<img :src="codeUrl" alt="" srcset="" />
</div>
</div>
</el-form-item> -->
<el-form-item>
<el-button
class="hexagon-button"
type="primary"
auto-insert-space
@click="login"
>登录</el-button
>
<el-button
class="hexagon-button"
type="primary"
auto-insert-space
@click="isRegister = true"
>去注册</el-button
>
<el-button class="hexagon-button" type="primary" auto-insert-space @click="login">登录</el-button>
<el-button class="hexagon-button" type="primary" auto-insert-space @click="toRegister">去注册</el-button>
</el-form-item>
</el-form>
</el-col>
@ -161,11 +249,12 @@
<script setup lang="ts">
// import { ref } from "vue"
// import { onMounted, reactive, ref, toRefs, watch } from "vue";
import { ElMessage, ElMessageBox } from 'element-plus'
import settingStore from "@/store/modules/setting";
import { User, Lock, Avatar, Stamp } from "@element-plus/icons-vue";
import { User, Lock, Avatar, Stamp, Grid, Iphone } from "@element-plus/icons-vue";
import { ref } from "vue";
import userStore from "@/store/modules/user";
import { getCode } from "@/api";
import { getCode, sturegister, getFaculties } from '@/api/user'
import { useRouter } from "vue-router";
const router = useRouter()
const setting = settingStore();
@ -176,12 +265,48 @@ const isRegister = ref(false);
const formRef = ref();
const formModel = ref({
username: "",
studentNumb: "",
name: "",
password: "",
repassword: "",
name: "",
clssid: '',
studentNumb: "",
mobile: '',
captcha: "",
});
const FacultiesList = ref([])
const getFacultiesList = async (data: any) => {
const res: any = await getFaculties(data)
console.log(res, 'res11')
FacultiesList.value = res.result
}
const deepValues = ref([])
//
const props = {
lazy: true,
checkStrictly: true,
emitPath: false,
async lazyLoad(node: any, resolve: any) {
console.log(node);
deepValues.value = node.pathValues
await getFacultiesList({
primaryType: node.level + 1,
pid: node.value,
})
const nodes = FacultiesList.value.map((item: any) => ({
value: item.id,
label: item.name,
}))
resolve(nodes)
},
}
const handleChange = (e: any) => {
console.log(e);
formModel.value.clssid = e
}
//
const rules = {
username: [
@ -198,7 +323,7 @@ const rules = {
{
min: 5,
max: 11,
message: "学号长度最小五位最大十位",
message: "学号长度最小五位最大十位",
trigger: ["change", "blur"],
},
],
@ -231,10 +356,64 @@ const rules = {
trigger: "blur",
},
],
clssid: [
{ required: true, message: "请选择所属班级", trigger: "blur" },
],
mobile: [
{ required: true, message: "请输入手机号", trigger: "blur" },
{
pattern: /^1[3-9]\d{9}$/,
message: "手机号格式不正确",
trigger: ["change", "blur"],
},
]
};
const register = async () => {
await formRef.value.validate();
console.log("开始注册i请求");
console.log("开始注册请求");
let data = {
clssid: formModel.value.clssid,
mobile: formModel.value.mobile,
captcha: formModel.value.captcha,
checkKey: 1629428467008,
password: formModel.value.password,
username: formModel.value.username,
realname: formModel.value.name,
workno: formModel.value.studentNumb,
depid: deepValues.value.slice(0, 2).join(',')
};
try {
const res: any = await sturegister(data)
formModel.value = {
username: "",
password: "",
repassword: "",
name: "",
clssid: '',
studentNumb: "",
mobile: '',
captcha: "",
}
ElMessage.success(`注册成功`)
isRegister.value = false
} catch (error) {
console.log(error);
getcodeinfo()
}
// getcodeinfo()
// console.log(11111);
// ElMessage.warning(res.message)
// console.log(res)
};
const codeUrl = ref("");
const getcodeinfo = async () => {
@ -258,11 +437,19 @@ const login = async () => {
username: formModel.value.username,
};
const res = await user.logIn(data);
if(res){
if (res) {
router.push('/')
}
};
const toRegister = () => {
isRegister.value = true
getcodeinfo();
}
const toLogin = () => {
isRegister.value = false
getcodeinfo();
}
</script>
<style lang="less" scoped>
@ -299,27 +486,32 @@ const login = async () => {
margin: 0;
background: url("../assets/images/login.png") no-repeat;
background-position: center;
background-size: 50% auto;
}
.captcha {
width: 100%;
height: 100%;
position: relative;
.code {
width: 100%;
height: 100%;
position: absolute;
top: 0;
right: 0;
width: 105px;
height: 100%;
// background-color: pink;
display: flex;
align-items: center;
img {
width: 100%;
height: 100%;
position: relative;
.code {
width: 100%;
height: 100%;
position: absolute;
top: 0;
right: 0;
width: 105px;
height: 100%;
// background-color: pink;
display: flex;
align-items: center;
img {
width: 100%;
height: 100%;
}
}}
}
}
}
}
.hexagon-button {
@ -337,17 +529,17 @@ const login = async () => {
font-size: 18px;
}
// .custom-form .el-form-item__label {
// color: #409eff;
// /* */
// font-size: 14px;
// font-weight: bold;
// .el-form-item__label {
// color: #0e2e5e;
// }
// .bold-icon svg {
// stroke-width: 9;
// /* */
// .el-form-item__error {
// left: 80px;
// }
.el-form-item__label {
color: #0e2e5e;
.el-input {
width: 300px;
}
:deep(.el-form-item__error) {
left: 110px;
}
</style>

@ -27,6 +27,11 @@ const routerList: any = [
},
],
},
{
path: '/subjectTest', // 题目测试页面
name: 'SubjectTest',
component: () => import('@/views/subjectTest/index.vue'),
},
{
path: '/login',
name: 'Login',

@ -0,0 +1,231 @@
<template>
<div class="container">
<div class="top">总分</div>
<div class="header">
<img
v-if="score >= 60"
class="pattern"
src="@/assets/images/bg8.png"
/>
<img
v-else
class="pattern"
src="@/assets/images/bg9.png"
/>
<img
class="patternBig"
src="@/assets/images/bg8.png"
v-if="score >= 80"
/>
<img
v-else
class="patternBig"
src="@/assets/images/bg9.png"
/>
<img
v-if="score >= 100"
class="pattern"
src="@/assets/images/bg8.png"
/>
<img
v-else
class="pattern"
src="@/assets/images/bg9.png"
/>
</div>
<div class="mainContent">
<div class="up">{{score}}</div>
<div class="down">SCORE</div>
</div>
<div class="bottoms">
<div class="bottom">
<img src="@/assets/images/bg10.png"/>
<div class="txt">
{{0}}
</div>
</div>
<div class="bottom">
<img src="@/assets/images/bg11.png"/>
<div class="txt">
{{ formattedTime }}
</div>
</div><div class="bottom">
<img src="@/assets/images/bg12.png"/>
<div class="txt">
100
</div>
</div>
</div>
<div class="footer">
<button class="btn1">去学习</button>
<button class="btn2" @click="Recreate">重做</button>
<button class="btn3" @click="Back">回首页</button>
</div>
</div>
</template>
<script setup lang="ts">
import {ref,defineProps,defineEmits } from 'vue'
import { useRouter } from 'vue-router';
// Props
const Props = defineProps({
score: Number,
formattedTime :String
});
//
const emit = defineEmits(['recreate']);
//
const Recreate=()=>{
//
emit('recreate');
}
//
const router = useRouter();
const Back =()=>{
router.push('/'); //
}
</script>
<style lang="scss" scoped>
.container {
width: 600px;
height: 540px;
background: url("@/assets/images/bg4.png") no-repeat center center;
background-size: contain;
padding-top: 15px;
padding-left: 25px;
padding-right:25px;
}
.top{
color: #b6b3b3;
font-size: 18px;
text-align: center;
}
.header{
height: 140px;
margin-top: 20px;
display: flex;
flex-direction: row;
gap: 30px;
padding-left: 90px;
padding-right: 70px;
}
.header{
height: 140px;
margin-top: 20px;
display: flex;
flex-direction: row;
gap: 30px;
padding-left: 90px;
padding-right: 70px;
}
.pattern{
width: 100px;
height: 100px;
margin-top: 35px;
}
.patternBig{
width: 120px;
height: 120px;
margin-top: 5px;
}
.mainContent{
display: flex;
flex-direction: column; /* 垂直排列 */
align-items: center; /*水平居中 */
margin-top: 25px;
}
.up{
color: #fff;
font-size: 45px;
}
.down{
color: rgb(165, 129, 45);
font-size: 17px;
font-weight: bold; /* 字母加粗 */
margin-top: 15px;
}
.bottoms{
display: flex;
height: 28px;
width: 100%;
position: absolute; /* 绝对定位 */
bottom: 200px;
gap: 90px;
left: 110px;
}
.bottom{
display: flex;
flex-direction: row;
}
.txt{
color: #b8b5b5;
font-size: 15px;
margin-left: 8px;
margin-top: 8px;
}
.footer{
width: 560px;
height: 160px;
position: absolute; /* 绝对定位 */
bottom: 0; /* 置于底部 */
display: flex;
flex-direction: row;
padding-left: 50px;
gap: 50px;
}
.btn1{
background: url("@/assets/images/bg5.png") no-repeat;
background-size: contain;
background-color: transparent; /* 背景颜色设置为透明 */
border: none; /* 移除边框 */
cursor: pointer; /* 鼠标悬停时显示手型 */
width: 120px;
height: auto;
font-size: 17px;
color:rgb(13, 58, 102);
/* 调整文字位置 */
padding: 10px 0 20px; /* 上内边距为 10px,下内边距为 20px */
display: flex; /* 使用 Flexbox 布局 */
align-items: flex-end; /* 文字对齐到底部 */
justify-content: center; /* 文字水平居中 */
}
.btn2{
background: url("@/assets/images/bg6.png") no-repeat;
background-size: contain;
background-color: transparent; /* 背景颜色设置为透明 */
border: none; /* 移除边框 */
cursor: pointer; /* 鼠标悬停时显示手型 */
width: 120px;
height: auto;
font-size: 17px;
color:rgb(13, 58, 102);
/* 调整文字位置 */
padding: 10px 0 20px; /* 上内边距为 10px,下内边距为 20px */
display: flex; /* 使用 Flexbox 布局 */
align-items: flex-end; /* 文字对齐到底部 */
justify-content: center; /* 文字水平居中 */
}
.btn3{
background: url("@/assets/images/bg7.png") no-repeat;
background-size: contain;
background-color: transparent; /* 背景颜色设置为透明 */
border: none; /* 移除边框 */
cursor: pointer; /* 鼠标悬停时显示手型 */
width: 120px;
height: auto;
font-size: 17px;
color:rgb(13, 58, 102);
/* 调整文字位置 */
padding: 10px 0 20px; /* 上内边距为 10px,下内边距为 20px */
display: flex; /* 使用 Flexbox 布局 */
align-items: flex-end; /* 文字对齐到底部 */
justify-content: center; /* 文字水平居中 */
}
</style>

@ -0,0 +1,365 @@
<template>
<div class="container-bgc">
<div class="top">
<div class="title">{{ setting.title }}</div>
</div>
<!-- 右边箭头 -->
<button class="submit-right" @click="SubRight"></button>
<!-- 左边按钮 -->
<button class="submit-left" @click="SubLeft"></button>
<div class="question-body">
<div class="question" >
<span class="question-count" >{{ currentSum }}</span>
<div class="timer">{{ formattedTime }} </div>
</div>
<p class="questions"><span class="questions-count">10</span></p>
<!-- 遍历题目 -->
<div v-if="currentQuestionIndex < questions.length" class="txt">
<span>{{ currentQuestion.question }}</span>
</div>
<!-- 遍历选项 -->
<div class="options">
<button
v-for="option in currentQuestion.options"
:key="option.option"
:class="{ option: true, selected: selectedOption[currentQuestionIndex] === option.option }"
@click="selectOption(option.option)"
class="option"
>
<span class="option-letter">{{ option.option }}</span>
{{ option.content }}
</button>
</div>
</div>
<div class="submit-buttons">
<button class="submit-btn" @click="resetAnswers">退出答题</button>
<button class="submit-btn" @click="submitAnswers">提交成绩</button>
</div>
<el-dialog
v-model="isVisible" :close-on-click-modal="false" :show-close="false">
<resultsAnnounced :score = "score" :formattedTime ="formattedTime "@recreate="handleRecreate"/>
</el-dialog>
</div>
</template>
<script lang="ts" setup>
import resultsAnnounced from '@/views/resultsAnnounced/index.vue'
import settingStore from "@/store/modules/setting";
import { ref,computed,onMounted, onUnmounted} from "vue"
import { ElMessage } from 'element-plus'
const setting = settingStore();
//
const SubLeft =()=>{
console.log(currentQuestionIndex.value)
if(currentQuestionIndex.value >= 1){
currentQuestionIndex.value = currentQuestionIndex.value - 1
}else{
ElMessage.warning('无法上翻')
}
}
//
const SubRight =()=>{
//
if (selectedOption.value[currentQuestionIndex.value] === currentQuestion.value.correctAnswer) {
if(currentSum.value < questions.length){
setTimeout(() => {
currentQuestionIndex.value++; //
}, 200); // 0.2
}
else{
ElMessage.success('答题已完成,请提交')
}
}
else{
if(selectedOption.value[currentQuestionIndex.value] == null){
ElMessage.warning('请先答题')
}else{
ElMessage.error('回答错误')
}
}
}
const questions = [
{
//
question: "根据基尔霍夫电压定律(KVL),下列说法正确的是:",
//
options: [
{ option: "A", content: "在任一瞬时,沿任一闭合回路各段电压的代数和为零。" },
{ option: "B", content: "在任一瞬时,沿任一闭合回路各段电压的代数和不为零。" },
{ option: "C", content: "在任一瞬时,沿任一闭合回路各段电压的代数和为正。" },
{ option: "D", content: "在任一瞬时,沿任一闭合回路各段电压的代数和为负。" }
],
correctAnswer: "A" //
},
{
question: "根据欧姆定律,下列说法正确的是:",
options: [
{ option: "A", content: "电流与电压成反比,与电阻成正比。" },
{ option: "B", content: "电流与电压成正比,与电阻成反比。" },
{ option: "C", content: "电流与电压和电阻无关。" },
{ option: "D", content: "电流与电压成正比,与电阻成正比。" }
],
correctAnswer: "B" //
},
{
question: "在电路分析中,欧姆定律是一个基本而重要的原理,它描述了电流、电压和电阻之间的关系。根据欧姆定律,通过导体的电流与导体两端的电压成正比,与导体的电阻成反比。请根据这一定律,选择下列哪个选项最准确地描述了这一关系?此外,考虑到实际应用中,导体的电阻可能会受到温度、材料和几何尺寸等因素的影响,这些因素如何改变电流与电压和电阻之间的关系?",
options: [
{ option: "A", content: "电流与电压成正比,与电阻成正比。" },
{ option: "B", content: "电流与电压成正比,与电阻成反比。" },
{ option: "C", content: "电流与电压成反比,与电阻无关。" },
{ option: "D", content: "电流与电压和电阻均无关,仅受外部磁场影响。" }
],
correctAnswer: "C" //
}
];
//
const currentQuestionIndex = ref(0);
//1
const currentSum = computed(() => currentQuestionIndex.value + 1);
//
const currentQuestion = computed(() => questions[currentQuestionIndex.value]);
//
const selectedOption = ref<string[]>(Array(questions.length).fill(null)); // null
//
const selectOption = (option: string) => {
selectedOption.value[currentQuestionIndex.value] = option; //
console.log(selectedOption.value);
};
const score = ref(0); // 0
const isVisible = ref (false) //
//
const submitAnswers = () => {
console.log(selectedOption.value[currentQuestionIndex.value])
//
if(selectedOption.value[questions.length - 1] == null){
ElMessage.warning('请先完成答题')
}else{
if (selectedOption.value[currentQuestionIndex.value] !== currentQuestion.value.correctAnswer){
ElMessage.error('回答错误')
}else{
stopTimer(); //
score.value = 0; //
isVisible.value = true;
for (let i = 0; i < questions.length; i++) {
// 10
if (selectedOption.value[i] === questions[i].correctAnswer) {
score.value += 10;
}
}
}
}
};
// 退
const resetAnswers = () => {
isVisible.value = false;
};
//
const timer = ref<number | null>(null); // setInterval
const elapsedTime = ref(0); //
//
const formattedTime = computed(() => {
const minutes = Math.floor(elapsedTime.value / 60); //
const seconds = elapsedTime.value % 60; //
return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
});
//
const startTimer = () => {
timer.value = setInterval(() => {
elapsedTime.value += 1; // 1
}, 1000);
};
//
const stopTimer = () => {
if (timer.value) {
clearInterval(timer.value);
timer.value = null;
}
};
//
onMounted(() => {startTimer();});
//
onUnmounted(() => {stopTimer();});
//
const handleRecreate = () => {
console.log(timer.value,"子组件触发了重做事件");
isVisible.value = false; //
selectedOption.value = Array(questions.length).fill(null); //
currentQuestionIndex.value = 0; //
stopTimer()//
elapsedTime.value = 0
startTimer()
};
</script>
<style lang="scss" scoped>
.container-bgc {
position: relative;
width: 100%;
// height: 1000px;
min-height: 100vh;
// background-color: #091d22;
background: url("@/assets/images/bg3.png") no-repeat;
background-size: cover;
.submit-right{
background: url("@/assets/images/right.png") no-repeat;
background-size: contain;
width: 60px; /* 按钮宽度 */
height: 60px; /* 按钮高度 */
border: none;
cursor: pointer;
position: absolute;
right: 0; /* 紧靠右部 */
top: 40%; /* 垂直居中*/
}
.submit-left{
background: url("@/assets/images/left.png") no-repeat;
background-size: contain;
width: 60px; /* 按钮宽度 */
height: 60px; /* 按钮高度 */
border: none;
cursor: pointer;
position: absolute;
left: 0; /* 紧靠左部 */
top: 40%; /* 垂直居中*/
}
.top {
width: 100%;
height: 75px;
text-align: center;
font-size: 42px;
line-height: 75px;
font-style: italic;
background: url("@/assets/images/topbgc.png") no-repeat;
background-size: cover;
.title {
color: #fff;
}
}
.question-body {
background: url("@/assets/images/FakeAnimateForPrototype.png") no-repeat center center; /* 添加 background-position */
background-size: contain; /* 确保背景图片覆盖整个元素 */
width: 1100px; /* 100% 宽度以确保背景图片完全显示 */
height: 500px; /* 固定高度 */
margin-top: 100px;
margin-left: auto;
margin-right: auto;
padding-left: 50px;
padding-right: 50px;
padding-top: 30px;
.question{
font-size: 42px; /* 字体大小 */
text-align: center; /* 水平居中 */
letter-spacing: 3px; /* 字符间距,单位可以是 px、em 等 */
// margin-top: 50px;
color: #fff;
}
.question-count {
font-weight: bold; /* 数字加粗 */
color: rgb(165, 144, 95); /* 数字颜色为红色 */
font-size: 55px; /* 数字字体大小 */
}
.timer{
font-size: 20px; /* 字体大小 */
letter-spacing: 3px; /* 字符间距 */
text-align: right;
position: absolute; /* 使用绝对定位 */
top: 24.5%; /* 距离顶部 50% */
left: 71%; /* 距离左侧 50% */
}
.questions{
font-size: 23px; /* 字体大小 */
letter-spacing: 3px; /* 字符间距 */
text-align: right;
color: #fff;
}
.questions-count {
font-weight: bold; /* 数字加粗 */
color: rgb(165, 144, 95); /* 数字颜色为红色 */
font-size: 25px; /* 数字字体大小 */
}
.txt {
margin-top: 18px;
font-size: 18px; /* 字体大小 */
font-family: Consolas, sans-serif; /* 字体样式 */
letter-spacing: 1.5px; /* 字符间距,单位可以是 px、em 等 */
line-height: 1.5; /* 行间距,1.5 表示字体大小的 1.5 倍 */
color: #9b9a9a;
}
/* 选项容器样式 */
.options {
margin-top: 10px;
color: #9b9a9a;
display: flex; /* 使用 Flexbox 布局 */
flex-direction: column; /* 垂直排列按钮 */
}
/* 单个选项样式 */
.option {
padding: 5px 10px; /* 内边距,让按钮看起来更舒适 */
font-size: 18px; /* 字体大小 */
letter-spacing: 1.5px; /* 字符间距,单位可以是 px、em 等 */
text-align: left; /* 设置文字左对齐 */
margin-top: 5px;
background-color: transparent; /* 背景颜色设置为透明 */
border: none; /* 移除边框 */
cursor: pointer; /* 鼠标悬停时显示手型 */
transition: background-color 0.3s ease; /* 平滑过渡效果 */
}
.option:hover {
color: #e7e2e2; /* 鼠标悬停时的字体颜色 */
}
.option.selected{
color: #d4cb48; /* 按钮按下或获得焦点时的背景颜色 */
}
.option-letter{
font-size: 30px;
font-weight: bold; /* 字母加粗 */
margin-right: 5px; /* 字母与后面文字的间距 */
color: rgb(165, 144, 95);
}
}
.submit-buttons {
display: flex; /* 使用 Flexbox 布局 */
flex-direction: row; /* 水平排列按钮 */
justify-content: center; /* 水平居中 */
gap: 450px; /* 按钮之间的间距 */
margin-top: 50px;
}
.submit-btn {
background: url("@/assets/images/Button.png") center;
background-size: contain; /* 确保背景图片覆盖整个元素 */
background-color: transparent; /* 背景颜色设置为透明 */
border: none; /* 移除边框 */
cursor: pointer; /* 鼠标悬停时显示手型 */
width: 300px;
height: 41px;
font-size: 17px;
font-weight: bold; /* 文字加粗 */
color: #fff;
}
/* 覆盖 el-dialog 的背景和边框样式 */
:deep(.el-dialog){
background: transparent !important; /* 设置背景为透明 */
border: none !important; /* 移除边框 */
box-shadow: none !important; /* 移除阴影 */
overflow: hidden; /* 防止内容溢出 */
width: 640px;
}
}
</style>

@ -7,7 +7,7 @@
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"moduleResolution": "node",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,

Loading…
Cancel
Save