dev_202412
yujialong 7 months ago
parent c2cd09c29f
commit 5f20a498af
  1. 17
      src/layouts/header/index.vue
  2. 252
      src/layouts/home/index.vue
  3. 96
      src/pages/match/details/index.vue
  4. 2
      src/pages/match/list/index.vue
  5. 49
      src/pages/match/theoryExam/index.vue

@ -1,5 +1,5 @@
<template>
<div class="header">
<div v-if="showHeader" class="header">
<a class="logo" @click="toIndex">
<template v-if="isIndex">
<img v-if="isZj" src="/images/4.png" alt="">
@ -74,6 +74,7 @@ import navbar from "../navbar";
import axios from 'axios'
import Bus from '@/libs/bus'
export default {
props: ['showHeader'],
data () {
return {
isDev: Setting.isDev,
@ -85,7 +86,6 @@ export default {
isIndex: Setting.whiteList.find(e => e === this.$route.path), //
isZxy: Setting.isZxy,
notices: [],
noticeTimer: null,
ip: localStorage.getItem('localIp') ? +localStorage.getItem('localIp') : 0,
mobileMenuStatus: false,
timer: null,
@ -101,14 +101,14 @@ export default {
},
mounted () {
if (Util.local.get(Setting.tokenKey)) {
this.getSystemDetail();
this.getUserInfo();
this.getNotice()
if (this.showHeader) {
this.getSystemDetail()
this.getNotice()
}
this.getUserInfo()
if (Setting.isPro || Setting.isZxy) this.heartbeatDetection()
}
this.$once('hook:beforeDestroy', function () {
clearInterval(this.noticeTimer)
})
document.body.addEventListener('click', e => {
e.stopPropagation()
this.mobileMenuStatus = false
@ -180,7 +180,6 @@ export default {
}, 58 * 1000)
},
//
getNotice () {
this.$get(this.api.messageNotificationList, {

@ -1,55 +1,38 @@
<template>
<div class="main">
<v-head></v-head>
<div class="layout">
<v-head :showHeader.sync="showHeader" />
<div :class="{ layout: showHeader }">
<div class="content">
<transition name="move"
mode="out-in">
<transition name="move" mode="out-in">
<router-view class="view"></router-view>
</transition>
<el-backtop target=".content"></el-backtop>
<v-footer ref="footer"></v-footer>
</div>
<div class="log-mask"
v-if="logVisible"></div>
<div class="log-dia"
v-if="logVisible">
<img class="bg1"
src="@/assets/img/log-bg.png"
alt="">
<img class="bg2"
src="@/assets/img/log-bg1.png"
alt="">
<div class="log-mask" v-if="logVisible"></div>
<div class="log-dia" v-if="logVisible">
<img class="bg1" src="@/assets/img/log-bg.png" alt="">
<img class="bg2" src="@/assets/img/log-bg1.png" alt="">
<p class="log-title">更新日志</p>
<div class="log-wrap">
<div class="logs">
<div class="item"
v-for="(item, i) in list"
:key="i"
v-show="!i || (i && logAll)">
<div class="item" v-for="(item, i) in list" :key="i" v-show="!i || (i && logAll)">
<h6>{{ item.versionName }}</h6>
<img v-if="item.coverUrl"
:src="item.coverUrl"
alt=""
class="cover">
<img v-if="item.coverUrl" :src="item.coverUrl" alt="" class="cover">
<ul class="detail">
<li v-for="(item, i) in item.logContents"
:key="i">
<p class="name"><img :src="require('@/assets/img/' + funcList.find(e => e.id === item.type).icon + '.png')"
alt=""> {{ funcList.find(e => e.id === item.type).name }}</p>
<li v-for="(item, i) in item.logContents" :key="i">
<p class="name"><img
:src="require('@/assets/img/' + funcList.find(e => e.id === item.type).icon + '.png')" alt=""> {{
funcList.find(e => e.id === item.type).name }}</p>
<div class="val">
<p v-for="(item, i) in item.content"
:key="i">{{ i + 1 }}{{ item }}</p>
<p v-for="(item, i) in item.content" :key="i">{{ i + 1 }}{{ item }}</p>
</div>
</li>
</ul>
</div>
</div>
<div class="more-wrap">
<el-button class="know"
type="primary"
size="small"
@click="closeLog">知道了</el-button>
<el-button class="know" type="primary" size="small" @click="closeLog">知道了</el-button>
</div>
</div>
</div>
@ -86,7 +69,8 @@ export default {
name: '优化',
icon: 'optimize'
}
]
],
showHeader: this.$route.path !== '/match/theoryExam', //
};
},
components: {
@ -171,105 +155,123 @@ export default {
</script>
<style lang="scss" scoped>
.main {
min-height: calc(100% - 64px);
.layout {
padding-top: 64px;
}
.index {
padding: 0;
}
min-height: calc(100% - 64px);
.layout {
padding-top: 64px;
}
.index {
padding: 0;
}
}
.log-mask {
position: fixed;
top: 0;
left: 0;
bottom: 0;
right: 0;
background-color: rgba(0, 0, 0, 0.4);
position: fixed;
top: 0;
left: 0;
bottom: 0;
right: 0;
background-color: rgba(0, 0, 0, 0.4);
}
/deep/.log-dia {
z-index: 11;
z-index: 11;
position: absolute;
top: 250px;
left: 50%;
width: 550px;
transform: translateX(-50%);
background-color: #fff;
border-radius: 6px;
.bg1 {
width: 100%;
height: 140px;
}
.bg2 {
position: absolute;
top: 250px;
left: 50%;
width: 550px;
transform: translateX(-50%);
background-color: #fff;
border-radius: 6px;
.bg1 {
width: 100%;
height: 140px;
}
.bg2 {
position: absolute;
top: -130px;
left: 48px;
max-width: 100%;
height: 250px;
}
.log-title {
position: absolute;
top: 65px;
left: 0;
width: 100%;
text-align: center;
font-size: 22px;
color: #fff;
font-weight: 600;
}
.log-wrap {
padding-bottom: 30px;
}
.logs {
max-height: 250px;
padding: 0 100px;
margin: 30px 0;
overflow: auto;
}
h6 {
margin-bottom: 15px;
font-size: 16px;
color: #333;
line-height: 1;
}
.more-wrap {
padding: 0 60px;
font-size: 14px;
color: #333;
text-align: center;
}
.know {
margin-top: 15px;
top: -130px;
left: 48px;
max-width: 100%;
height: 250px;
}
.log-title {
position: absolute;
top: 65px;
left: 0;
width: 100%;
text-align: center;
font-size: 22px;
color: #fff;
font-weight: 600;
}
.log-wrap {
padding-bottom: 30px;
}
.logs {
max-height: 250px;
padding: 0 100px;
margin: 30px 0;
overflow: auto;
}
h6 {
margin-bottom: 15px;
font-size: 16px;
color: #333;
line-height: 1;
}
.more-wrap {
padding: 0 60px;
font-size: 14px;
color: #333;
text-align: center;
}
.know {
margin-top: 15px;
}
.cover {
max-width: 250px;
max-height: 160px;
margin: 10px 0 20px;
}
.detail {
li {
margin-bottom: 20px;
}
.cover {
max-width: 250px;
max-height: 160px;
margin: 10px 0 20px;
.name {
display: flex;
align-items: center;
margin-bottom: 5px;
font-size: 14px;
img {
width: 20px;
margin-right: 8px;
}
}
.detail {
li {
margin-bottom: 20px;
}
.name {
display: flex;
align-items: center;
margin-bottom: 5px;
font-size: 14px;
img {
width: 20px;
margin-right: 8px;
}
}
.val {
font-size: 15px;
line-height: 1.8;
white-space: pre-wrap;
p {
position: relative;
font-size: 13px;
color: #727272;
}
}
.val {
font-size: 15px;
line-height: 1.8;
white-space: pre-wrap;
p {
position: relative;
font-size: 13px;
color: #727272;
}
}
}
}
</style>

@ -374,24 +374,54 @@
<el-button size="small" @click="peopleSignupVisible = false">取消</el-button>
</span>
</el-dialog>
<el-dialog title="报名" :visible.sync="enterVisible" :close-on-click-modal="false" width="300px" @close="enterClose">
<el-form class="dia-form">
<p style="margin-bottom: 5px">请选择要加入的团队</p>
<el-form-item>
<el-select class="w-100" v-model="enterForm.teamId" filterable>
<el-option v-for="(item, i) in teams" :key="i" :label="item.teamName" :value="item.teamId"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-input placeholder="请输入团队邀请码" maxlength="6" v-model="enterForm.invitationCode"></el-input>
</el-form-item>
<el-form-item v-if="form.completeCompetitionSetup.isNeedCode">
<el-input placeholder="请输入大赛邀请码" maxlength="6" v-model="enterForm.registrationInvitationCode"></el-input>
</el-form-item>
<p class="tips">
查找不到团队点击 <el-link :underline="false" type="primary" @click="toTeam">创建团队</el-link>
</p>
</el-form>
<el-dialog title="报名" :visible.sync="enterVisible" :close-on-click-modal="false" width="850px"
custom-class="enter-dia" @close="enterClose">
<div class="flex">
<el-form class="dia-form" label-width="90px">
<el-form-item label="姓名">
<el-input disabled v-model="userName"></el-input>
</el-form-item>
<el-form-item label="来自学校">
<el-select v-model="enterForm.studentAffiliatedInstitutionId" filterable style="width: 100%">
<el-option v-for="(item, i) in schools" :key="i" :label="item.schoolName"
:value="item.schoolId"></el-option>
</el-select>
</el-form-item>
<p class="m-t-20 m-b-5">请选择要加入的团队</p>
<el-form-item label="团队">
<el-select class="w-100" v-model="enterForm.teamId" filterable>
<el-option v-for="(item, i) in teams" :key="i" :label="item.teamName" :value="item.teamId"></el-option>
</el-select>
</el-form-item>
<el-form-item label="团队邀请码">
<el-input placeholder="请输入团队邀请码" maxlength="6" v-model="enterForm.invitationCode"></el-input>
</el-form-item>
<el-form-item label="大赛邀请码" v-if="form.completeCompetitionSetup.isNeedCode">
<el-input placeholder="请输入大赛邀请码" maxlength="6" v-model="enterForm.registrationInvitationCode"></el-input>
</el-form-item>
<p class="tips">
查找不到团队点击 <el-link :underline="false" type="primary" @click="toTeam">创建团队</el-link>
</p>
</el-form>
<div class="agreement">
<h6>指导老师承诺书</h6>
<div class="text">
<p class="line">本人自愿参加2024年安徽省大学生金融投资创新大赛工作为进一步提高廉洁自律意识客观公正的履行职责我以参赛团队领队/指导教师的身份和荣誉郑重作出如下承诺</p>
<p class="line">1.尊重大赛组委会及秘书处尊重专家和仲裁尊重其他参赛单位和选手认真指导学生参加安徽省大学生金融投资创新大赛客观公正地履行职责</p>
<p class="line">2.遵守道德遵守大赛纪律在确定大赛指导教师身份后至大赛结束前不私下接触其他参赛单位和团队成员专家裁判员仲裁员不参与以大赛名义举办的收费培训不收受他人的财物或其他好处
</p>
<p class="line">3.遵守公正公平原则不干预裁判员仲裁员等工作影响比赛成绩</p>
<p class="line">4.不为所带队学生的违纪行为说情解脱</p>
<p class="line">5.不发表不传播没有根据并对大赛产生不利影响的言论</p>
<p class="line">6.不隐瞒按规定应该回避的事项</p>
<p class="line">7.对于涉嫌泄密事宜愿接受协助配合相关部门的监督检查并履行举证义务</p>
<p class="line">8.如若发生上述问题自愿承担相关责任</p>
<p class="line">特此承诺</p>
<p class="line">勾选后才可登录和注册</p>
<el-checkbox class="m-t-10" v-model="agreeCheck">同意我已阅读</el-checkbox>
</div>
</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button size="small" type="primary" @click="enterSubmit">报名</el-button>
<el-button size="small" @click="enterVisible = false">取消</el-button>
@ -590,6 +620,8 @@ export default {
registrationInvitationCode: '',
whetherSignUp: 1
},
schools: [],
agreeCheck: false,
teamVisible: false,
teams: [],
@ -661,7 +693,7 @@ export default {
},
computed: {
...mapState("user", [
"userId", 'account', 'logView'
"userId", 'account', 'logView', 'userName'
]),
},
components: {
@ -1274,6 +1306,7 @@ export default {
},
//
enterSubmit () {
if (!this.agreeCheck) return Util.errorMsg('请勾选同意,才可继续报名!')
const form = this.enterForm
if (!form.teamId) return Util.errorMsg('请选择团队')
if (!form.invitationCode) return Util.errorMsg('请输入团队邀请码')
@ -1646,7 +1679,7 @@ export default {
mallId = mallId || ''
//
if (method === 1) {
this.$router.push(`/match/theoryExam?id=${form.id}&stageId=${stageId}&teamId=${teamId}`)
window.open(this.$router.resolve(`/match/theoryExam?id=${form.id}&stageId=${stageId}&teamId=${teamId}`).href)
} else {
let token = Util.local.get(Setting.tokenKey);
if (systemId == 11) {
@ -2166,4 +2199,27 @@ export default {
}
}
}
/deep/.enter-dia {
.agreement {
width: 600px;
padding: 10px 20px;
margin-left: 20px;
box-shadow: 0 0 7px rgba(235, 235, 235, .8);
h6 {
font-size: 20px;
font-weight: 600;
text-align: center;
}
.text {
line-height: 1.6;
}
.line {
margin-top: 7px;
}
}
}
</style>

@ -975,7 +975,7 @@ export default {
mallId = mallId || ''
//
if (method === 1) {
this.$router.push(`/match/theoryExam?id=${form.id}&stageId=${stageId}&teamId=${teamId}`)
window.open(this.$router.resolve(`/match/theoryExam?id=${form.id}&stageId=${stageId}&teamId=${teamId}`).href)
} else {
let token = Util.local.get(Setting.tokenKey)
if (systemId == 11) {

@ -23,7 +23,7 @@
</div>
<el-button class="submit" :loading="submiting" :disabled="submited" @click="confirmSubmit">提交</el-button>
<img class="exit" src="@/assets/img/exit.svg" alt="" @click="$router.back()">
<img class="exit" src="@/assets/img/exit.svg" alt="" @click="close">
</div>
</div>
@ -141,6 +141,7 @@ import _ from 'lodash'
import Oss from '@/components/upload/upload.js'
import Upload from '@/components/upload'
import UeditorPlus from '@/components/ueditorPlus'
import Bus from '@/libs/bus'
export default {
components: {
@ -200,12 +201,17 @@ export default {
this.submited || this.submit(0)
})
this.getCompetition()
// websocket
Bus.$on('matchSocket', () => {
this.getCompetition()
})
this.getCompetition(1)
},
methods: {
//
async getCompetition () {
this.loading = true
async getCompetition (load) {
if (load) this.loading = true
const { competition } = await this.$post(`${this.api.getCompetition}?competitionId=${this.id}`)
const stages = competition.contentList
if (stages) {
@ -227,7 +233,7 @@ export default {
this.submit(1)
} else { //
this.countVal = (endTime - now) / 1000
this.getPaper(now)
load && this.getPaper(now)
}
}
},
@ -379,7 +385,7 @@ export default {
}
} else {
// 15
if (counterTime <= 900) {
if (counterTime === 900) {
this.warned || this.$alert(`请注意,${this.per == 2 ? '比赛' : '考核'}还剩15分钟,请尽快完成答题并提交试卷。`, '提示', {
confirmButtonText: '确定',
type: 'warning'
@ -588,7 +594,7 @@ export default {
confirmButtonText: '确定',
type: 'success',
callback: () => {
this.$router.back()
this.close()
}
})
} else {
@ -599,6 +605,9 @@ export default {
this.submiting = false
}
},
close () {
window.close()
},
}
};
</script>
@ -660,7 +669,7 @@ export default {
}
.type-wrap {
max-height: calc(100vh - 358px);
max-height: calc(100vh - 294);
padding: 10px;
overflow: auto;
@ -760,7 +769,7 @@ export default {
.ques-wrap {
width: calc(100% - 308px);
height: calc(100vh - 192px);
height: calc(100vh - 128px);
background-color: #fff;
overflow: auto;
outline: none;
@ -865,11 +874,11 @@ export default {
display: inline;
min-width: 50px;
height: 28px;
padding: 0 3px;
padding: 3px;
margin: 0 10px;
font-size: 13px;
font-size: 14px;
line-height: 28px;
color: #0818eb;
color: #333;
border: 0;
border-bottom: 1px solid #DCDEE0;
outline: none;
@ -877,22 +886,6 @@ export default {
&:empty {
display: inline-block;
width: 3em;
&:after {
content: attr(placeholder);
position: absolute;
top: 50%;
left: 50%;
font-size: 14px;
color: #226fff;
transform: translate(-50%, -50%);
}
&:focus {
&:after {
opacity: 0;
}
}
}
}

Loading…
Cancel
Save