|
@@ -0,0 +1,630 @@
|
|
|
|
+<template>
|
|
|
|
+ <div class="act-info">
|
|
|
|
+ <div class="list-header">
|
|
|
|
+ <div @click="router.go(-1)">
|
|
|
|
+ <el-icon><ArrowLeft /></el-icon>
|
|
|
|
+ 返回活动列表
|
|
|
|
+ </div>
|
|
|
|
+ <p class="title">
|
|
|
|
+ <span class="type-box" :style="{'background-color': actInfo.scope === 'area' ? '#ff9900' : (actInfo.scope === 'school' ? '#19be43' : '#a8a8a8')}">
|
|
|
|
+ {{ actInfo.scope === 'public' ? '公开' : (actInfo.scope === 'area' ? '区级' : '校级') }}
|
|
|
|
+ </span>
|
|
|
|
+ {{ actInfo.name }}
|
|
|
|
+ </p>
|
|
|
|
+ <div class="join-btn" @click="openDraw">
|
|
|
|
+ {{ registered === 1 ? '已报名' : '报名' }}
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div style="height: 94%">
|
|
|
|
+ <el-scrollbar>
|
|
|
|
+ <div class="info-box">
|
|
|
|
+ <div class="sk-info">
|
|
|
|
+ <div class="img-box">
|
|
|
|
+ <img :src="actInfo.posterSas" alt="">
|
|
|
|
+ </div>
|
|
|
|
+ <div class="activity-info">
|
|
|
|
+ <h1 class="title-time">
|
|
|
|
+ <span>活动信息</span>
|
|
|
|
+ <span style="font-size: 16px; color: #205bd0;">
|
|
|
|
+ <span>{{ $tools.formatTime(actInfo.stime, 'yyyy-MM-dd') }}</span> - <span>{{ $tools.formatTime(actInfo.etime, 'yyyy-MM-dd') }}</span>
|
|
|
|
+ </span>
|
|
|
|
+ </h1>
|
|
|
|
+ <div class="detail-info">
|
|
|
|
+ <p>主题:{{ actInfo.subject || '-' }}</p>
|
|
|
|
+ <p>简介:{{ actInfo.description || '-' }}</p>
|
|
|
|
+ <p>地点:{{ actInfo.address || '-' }}</p>
|
|
|
|
+ <p>主办:
|
|
|
|
+ <span v-for="(item, index) in actInfo.zb" :key="index">{{ item || '-' }}</span>
|
|
|
|
+ </p>
|
|
|
|
+ <p>承办:
|
|
|
|
+ <span v-for="(item, index) in actInfo.zb" :key="index">{{ item || '-' }}</span>
|
|
|
|
+ </p>
|
|
|
|
+ <p>免责声明:{{ actInfo.mzsm || '-' }}</p>
|
|
|
|
+ <div style="display: flex;">
|
|
|
|
+ <p style="min-width: 50px;">附件:</p>
|
|
|
|
+ <div v-if="actInfo.attachment.length">
|
|
|
|
+ <p v-for="item in actInfo.attachment" :key="item.blob" @click="onPreview(item)" class="attach-name">{{ item.name }}</p>
|
|
|
|
+ </div>
|
|
|
|
+ <span v-else>-</span>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <template v-if="actInfo.modules">
|
|
|
|
+ <div v-if="actInfo.modules.includes('Contest')" class="activity-info">
|
|
|
|
+ <h1 class="title-time">赛课活动</h1>
|
|
|
|
+ <div class="detail-info">
|
|
|
|
+ <el-steps :active="contestStep" align-center>
|
|
|
|
+ <el-step v-for="(item, index) in contest.modules" :key="index" :title="skModuleList[index]">
|
|
|
|
+ <template v-slot:icon>
|
|
|
|
+ <el-icon v-show="item === 'sign'" size="20"><Edit /></el-icon>
|
|
|
|
+ <el-icon v-show="item === 'upload'" size="20"><Folder /></el-icon>
|
|
|
|
+ <el-icon v-show="item === 'review'" size="20"><Finished /></el-icon>
|
|
|
|
+ <el-icon v-show="item === 'score'" size="20"><CircleCheck /></el-icon>
|
|
|
|
+ </template>
|
|
|
|
+ <template v-slot:description>
|
|
|
|
+ <span>
|
|
|
|
+ {{ $tools.formatTime(contest[item].stime, 'yyyy-MM-dd') }}
|
|
|
|
+ -
|
|
|
|
+ {{ $tools.formatTime(contest[item].etime, 'yyyy-MM-dd') }}
|
|
|
|
+ </span>
|
|
|
|
+ </template>
|
|
|
|
+ </el-step>
|
|
|
|
+ </el-steps>
|
|
|
|
+ <!-- <div v-if="contestScores.length && contest.score.scoreStatus" class="score-box">
|
|
|
|
+ <div v-for="(item, index) in contestScores" :key="index">
|
|
|
|
+ <div class="score-lable" v-show="contest.score.showType">
|
|
|
|
+ <p>{{ item.lable }}</p>
|
|
|
|
+ <el-icon color="#ffd111" size="18" v-for="scores in item.scores" :key="scores.tmdid"><Trophy /></el-icon>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="score-info">
|
|
|
|
+ <div v-for="scores in item.scores" :key="scores.tmdid">
|
|
|
|
+ <el-avatar :size="35" :src="scores.picture" />
|
|
|
|
+ <p style="font-size: 14px; margin-top: 5px;">
|
|
|
|
+ {{ scores.type ? scores.teamName : scores.name }}({{ scores.score }}分)
|
|
|
|
+ </p>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div> -->
|
|
|
|
+ <div v-if="contestScores.length && contest.score.scoreStatus" style="margin-top: 20px;">
|
|
|
|
+ <el-table :data="contestScores" style="width: 100%">
|
|
|
|
+ <el-table-column prop="lable" label="奖项名称" align="center" width="200">
|
|
|
|
+ <template #default="scope">
|
|
|
|
+ <p>{{ scope.row.lable }}</p>
|
|
|
|
+ <p>
|
|
|
|
+ <el-icon color="#ffd111" size="18" v-for="scores in scope.row.scores" :key="scores.tmdid"><Trophy /></el-icon>
|
|
|
|
+ </p>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ <el-table-column label="获奖人员" align="center">
|
|
|
|
+ <template #default="scope">
|
|
|
|
+ <div class="score-table">
|
|
|
|
+ <div v-for="scores in scope.row.scores" :key="scores.tmdid">
|
|
|
|
+ <el-avatar :size="35" :src="scores.picture" />
|
|
|
|
+ <p style="font-size: 14px; margin-top: 5px;">
|
|
|
|
+ {{ scores.type ? scores.teamName : scores.name }}({{ scores.score }}分)
|
|
|
|
+ </p>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
|
|
+ </el-table>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </el-scrollbar>
|
|
|
|
+ </div>
|
|
|
|
+ <el-drawer v-model="joinDra">
|
|
|
|
+ <template #header>
|
|
|
|
+ <h4>活动报名</h4>
|
|
|
|
+ </template>
|
|
|
|
+ <template #default>
|
|
|
|
+ <div v-if="actInfo?.modules.includes('Contest')">
|
|
|
|
+ <el-form label-width="100px" class="join-box">
|
|
|
|
+ <el-form-item label="学校">
|
|
|
|
+ <el-select v-model="schoolIndex" placeholder="请选择">
|
|
|
|
+ <el-option v-for="(value, index) in schoolList" :key="index" :label="value.name" :value="index" />
|
|
|
|
+ </el-select>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </el-form>
|
|
|
|
+ <p class="module-box" @click="skModule = !skModule">
|
|
|
|
+ <el-icon v-show="skModule"><CaretBottom /></el-icon>
|
|
|
|
+ <el-icon v-show="!skModule"><CaretRight /></el-icon>
|
|
|
|
+ 赛课活动
|
|
|
|
+ </p>
|
|
|
|
+ <div v-show="skModule" v-if="contest.sign.fields.length">
|
|
|
|
+ <el-form ref="enrollForm" :rules="rules" :model="enrollData" label-width="100px" class="join-box">
|
|
|
|
+ <el-form-item :label="item.label" v-for="(item, index) in contest.sign.fields" :key="index" :prop="item.field">
|
|
|
|
+ <el-radio-group v-model="enrollData.enrollInfos[index].val" v-show="item.field === 'sex'">
|
|
|
|
+ <el-radio label="male">男</el-radio>
|
|
|
|
+ <el-radio label="female">女</el-radio>
|
|
|
|
+ <el-radio label="secrecy">保密</el-radio>
|
|
|
|
+ </el-radio-group>
|
|
|
|
+ <el-input v-special-char v-show="item.type === 'text'" v-model.trim="enrollData.enrollInfos[index].val" placeholder="请输入" />
|
|
|
|
+
|
|
|
|
+ <el-select v-show="item.type === 'select'" v-model="enrollData.enrollInfos[index].val" @change="deleteRule(item.field)" placeholder="请选择">
|
|
|
|
+ <el-option v-for="(value, index) in item.item" :key="index" :label="value" :value="value" />
|
|
|
|
+ </el-select>
|
|
|
|
+ <el-select v-if="item.field === 'school'" v-model="enrollData.enrollInfos[index].val" @change="deleteRule(item.field)" placeholder="请选择">
|
|
|
|
+ <el-option v-for="(value, index) in schoolList" :key="index" :label="value.name" :value="value.schoolId" />
|
|
|
|
+ </el-select>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <template v-if="contest.sign.type">
|
|
|
|
+ <p class="tips-box">
|
|
|
|
+ <el-icon color="#e9b207"><WarningFilled /></el-icon>
|
|
|
|
+ 本次活动为团队赛,请创建团队或加入团队
|
|
|
|
+ </p>
|
|
|
|
+ <el-form-item label="组内身份">
|
|
|
|
+ <el-select v-model="enrollData.leader" placeholder="请选择您在团队赛中的身份">
|
|
|
|
+ <el-option label="组长" :value="1" />
|
|
|
|
+ <el-option label="组员" :value="0" />
|
|
|
|
+ </el-select>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <el-form-item label="团队名称" v-if="enrollData.leader">
|
|
|
|
+ <el-input v-special-char v-model.trim="enrollData.teamName" />
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <el-form-item label="组队口令" v-if="!enrollData.leader" class="code-box">
|
|
|
|
+ <el-input v-special-char v-model.trim="enrollData.cipher" />
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <template v-if="teamMembers.length">
|
|
|
|
+ <el-form-item label="组队名称">
|
|
|
|
+ <p>{{ enrollData.teamName }}</p>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ <el-form-item label="组队成员">
|
|
|
|
+ <p v-for="(item, index) in teamMembers" :key="index">
|
|
|
|
+ {{ item.tmdName }}
|
|
|
|
+ <span v-show="item.leader">(队长)</span>
|
|
|
|
+ </p>
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </template>
|
|
|
|
+ <p class="tips-box" v-show="!enrollData.leader">
|
|
|
|
+ <el-button @click="searchCipher()" color="#626aef">搜索团队信息</el-button>
|
|
|
|
+ </p>
|
|
|
|
+ </template>
|
|
|
|
+ </el-form>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div v-if="actInfo?.modules.includes('Training')">
|
|
|
|
+ <p class="module-box" @click="yxModule = !yxModule">
|
|
|
|
+ <el-icon v-show="yxModule"><CaretBottom /></el-icon>
|
|
|
|
+ <el-icon v-show="!yxModule"><CaretRight /></el-icon>
|
|
|
|
+ 教培活动
|
|
|
|
+ </p>
|
|
|
|
+ <div v-show="yxModule">
|
|
|
|
+ <el-form label-width="100px" class="join-box">
|
|
|
|
+ <el-form-item label="醍摩豆账号">
|
|
|
|
+ <el-input v-special-char v-model.trim="enrollData.tmdid" disabled />
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </el-form>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div v-if="actInfo?.modules.includes('Research')">
|
|
|
|
+ <p class="module-box" @click="jyModule = !jyModule">
|
|
|
|
+ <el-icon v-show="jyModule"><CaretBottom /></el-icon>
|
|
|
|
+ <el-icon v-show="!jyModule"><CaretRight /></el-icon>
|
|
|
|
+ 教研活动
|
|
|
|
+ </p>
|
|
|
|
+ <div v-show="jyModule">
|
|
|
|
+ <el-form label-width="100px" class="join-box">
|
|
|
|
+ <el-form-item label="醍摩豆账号">
|
|
|
|
+ <el-input v-special-char v-model.trim="enrollData.tmdid" disabled />
|
|
|
|
+ </el-form-item>
|
|
|
|
+ </el-form>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
|
|
+ <template #footer>
|
|
|
|
+ <div style="text-align: left;" v-show="contest.sign?.type && enrollData.teamName || !contest.sign?.type">
|
|
|
|
+ <el-button type="primary" @click="genCipher(enrollForm)">报名</el-button>
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
|
|
+ </el-drawer>
|
|
|
|
+ <div v-if="previewStatus" class="image-viewer">
|
|
|
|
+ <div style="width:fit-content;position:relative;margin:auto;" v-if="previewFile.type != 'image'">
|
|
|
|
+ <el-icon class="close-icon" @click="previewStatus = false"><CloseBold /></el-icon>
|
|
|
|
+ <video v-if="previewFile.type == 'video'" id="previewVideo" :src="previewFile.urlShow" width="870"
|
|
|
|
+ controls="controls" style="max-height: 800px;">
|
|
|
|
+ 您的浏览器不支持 video 标签。
|
|
|
|
+ </video>
|
|
|
|
+ <audio v-else-if="previewFile.type === 'audio'" controls>
|
|
|
|
+ <source :src="previewFile.urlShow">
|
|
|
|
+ 您的浏览器不支持 audio 元素。
|
|
|
|
+ </audio>
|
|
|
|
+ </div>
|
|
|
|
+ <el-image-viewer v-else hide-on-click-modal @close="previewStatus = false" :url-list="[previewFile.urlShow]" />
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+</template>
|
|
|
|
+
|
|
|
|
+<script setup>
|
|
|
|
+import { ArrowLeft, WarningFilled, Search, CircleCheck, CircleClose, CaretBottom, CaretRight, Message, Edit, Finished, Folder, CloseBold, Trophy } from '@element-plus/icons-vue'
|
|
|
|
+import { ElMessageBox, ElMessage, ElLoading } from 'element-plus'
|
|
|
|
+import { useStore } from "@/pinia/common"
|
|
|
|
+import { reactive, ref, onMounted, watch, toRaw, getCurrentInstance } from 'vue'
|
|
|
|
+import { useRoute, useRouter } from 'vue-router'
|
|
|
|
+let route = useRoute()
|
|
|
|
+let router = useRouter()
|
|
|
|
+let store = useStore()
|
|
|
|
+let { proxy } = getCurrentInstance()
|
|
|
|
+
|
|
|
|
+let joinDra = ref(false)
|
|
|
|
+let skModule = ref(true)
|
|
|
|
+let yxModule = ref(true)
|
|
|
|
+let jyModule = ref(true)
|
|
|
|
+let codeSearch = ref(true) //搜索标识码
|
|
|
|
+let previewStatus = ref(false)
|
|
|
|
+let enrollForm = ref(null)
|
|
|
|
+let registered = ref(0) //是否可以报名 0:可以 1:已经报名 2:所在学校未被邀请 3:不在报名时间
|
|
|
|
+let contestStep = ref(0)
|
|
|
|
+let schoolIndex = ref('')
|
|
|
|
+let contest = ref({})
|
|
|
|
+let research = ref({})
|
|
|
|
+let training = ref({})
|
|
|
|
+const infoId = ref(route.params.info)
|
|
|
|
+const actInfo = ref({attachment: []})
|
|
|
|
+let rules = ref({})
|
|
|
|
+let previewFile = ref({})
|
|
|
|
+let teamMembers = ref([])
|
|
|
|
+let contestScores = ref([])
|
|
|
|
+
|
|
|
|
+let loading = reactive({
|
|
|
|
+ lock: true,
|
|
|
|
+ text: '加载中',
|
|
|
|
+ background: 'rgba(0, 0, 0, 0.7)'
|
|
|
|
+})
|
|
|
|
+let schoolList = reactive([])
|
|
|
|
+const enrollData = reactive({
|
|
|
|
+ tmdid: store.userInfo.sub,
|
|
|
|
+ tmdPicture: store.userInfo.picture,
|
|
|
|
+ tmdName: store.userInfo.name,
|
|
|
|
+ schoolName: '',
|
|
|
|
+ schoolPicture: '',
|
|
|
|
+ schoolId: '',
|
|
|
|
+ cipher: '', //团队赛,组队口令不能为空
|
|
|
|
+ enrollTime: '', //报名时间
|
|
|
|
+ leader: 0, //1 队长,0 队员
|
|
|
|
+ teamName: '',
|
|
|
|
+ type: null, //1团队。0个人
|
|
|
|
+ enrollInfos: [],
|
|
|
|
+})
|
|
|
|
+const skModuleList = ref(['报名', '上传', '评审', '公示'])
|
|
|
|
+
|
|
|
|
+const validateInfo = (rule, value, callback) => {
|
|
|
|
+ let info = enrollData.enrollInfos.find(item => item.code === rule.field)
|
|
|
|
+ if(!info.val) {
|
|
|
|
+ callback(new Error('请完善信息'))
|
|
|
|
+ } else {
|
|
|
|
+ callback()
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+onMounted(() => {
|
|
|
|
+ getListInfo()
|
|
|
|
+})
|
|
|
|
+
|
|
|
|
+function getListInfo() {
|
|
|
|
+ /* loading = ElLoading.service({
|
|
|
|
+ lock: true,
|
|
|
|
+ text: '加载中',
|
|
|
|
+ background: 'rgba(0, 0, 0, 0.7)'
|
|
|
|
+ }) */
|
|
|
|
+ let params = {activityId: infoId.value}
|
|
|
|
+ proxy.$api.getActInfo(params).then(async res => {
|
|
|
|
+ if(res.code === 200) {
|
|
|
|
+ res.activity.posterSas = !res?.activity.poster ? require('@/assets/img/no-poster-cn.jpg') : res?.activity.url + res?.activity.poster + '?' + res?.activity.sas
|
|
|
|
+ res?.activity.attachment.forEach(item => {
|
|
|
|
+ item.urlShow = res?.activity.url + item.url + '?' + res?.activity.sas
|
|
|
|
+ })
|
|
|
|
+ actInfo.value = res.activity
|
|
|
|
+ // 公开 && 未指定学校 可以参加
|
|
|
|
+ if(!actInfo.value?.invitedSchools.length && actInfo.value?.scope === 'public') {
|
|
|
|
+ schoolList = reactive(store.schoolList)
|
|
|
|
+ } else if(actInfo.value?.scope === 'area' || actInfo.value?.invitedSchools.length) {
|
|
|
|
+ actInfo.value?.confirmedSchools.forEach(item => {
|
|
|
|
+ let school = store.schoolList.find(sch => sch.schoolId === item.id)
|
|
|
|
+ if(school) {
|
|
|
|
+ schoolList.push(school)
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ } else if(actInfo.value?.scope === 'school') {
|
|
|
|
+ let school = store.schoolList.find(sch => sch.schoolId === actInfo.value.owner)
|
|
|
|
+ if(school) schoolList.push(school)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ let nowTime = Date.parse(new Date())
|
|
|
|
+ res.contest.modules.forEach((item, index) => {
|
|
|
|
+ res.contest[item].actState = nowTime < res.contest[item].stime ? 'notStart' : (nowTime > res.contest[item].etime ? 'finish' : 'going')
|
|
|
|
+ })
|
|
|
|
+ registered.value = nowTime > res.contest.sign.stime && nowTime < res.contest.sign.etime ? 0 : 3
|
|
|
|
+ let index = res.contest.modules.findIndex(item => {
|
|
|
|
+ return res.contest[item].actState === 'going'
|
|
|
|
+ })
|
|
|
|
+ contestStep.value = index === -1 ? (registered.value === 3 ? -1 : 4) : index
|
|
|
|
+ contest.value = res.contest
|
|
|
|
+ enrollData.type = res.contest.sign.type
|
|
|
|
+ enrollData.enrollInfos = contest.value.sign.fields.map(item => {
|
|
|
|
+ return {
|
|
|
|
+ code: item.field,
|
|
|
|
+ val: item.field === 'sex' ? 'secrecy' : ''
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ contestScores.value = res.contestScores || []
|
|
|
|
+ research.value = res.research
|
|
|
|
+ training.value = res.training
|
|
|
|
+ getEnroll()
|
|
|
|
+ } else {
|
|
|
|
+ ElMessage({
|
|
|
|
+ type: 'warning',
|
|
|
|
+ message: '活动不存在!'
|
|
|
|
+ })
|
|
|
|
+ router.go(-1)
|
|
|
|
+ }
|
|
|
|
+ }).finally(() => {
|
|
|
|
+ // loading.close()
|
|
|
|
+ })
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 判断是否已经参赛
|
|
|
|
+function getEnroll() {
|
|
|
|
+ let params = {
|
|
|
|
+ grant_type: 'get-enroll',
|
|
|
|
+ activityId: infoId.value
|
|
|
|
+ }
|
|
|
|
+ proxy.$api.teaContest(params).then(res => {
|
|
|
|
+ if(res?.enroll) {
|
|
|
|
+ registered.value = 1
|
|
|
|
+ contestStep.value = (!contestStep.value && registered.value === 1 && contest.value.upload.actState === 'going') ? 1 : contestStep.value
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ if(registered.value != 3 && actInfo.value?.scope != 'school') {
|
|
|
|
+ registered.value = schoolList.length ? (res.code === 200 ? 1 : 0) : 2
|
|
|
|
+ contestStep.value = (!contestStep.value && registered.value === 1 && contest.value.upload.actState === 'going') ? 1 : contestStep.value
|
|
|
|
+ }
|
|
|
|
+ if(!registered.value) {
|
|
|
|
+ getTeaEnroll()
|
|
|
|
+ }
|
|
|
|
+ }).finally(() => {
|
|
|
|
+ })
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+function getTeaEnroll() {
|
|
|
|
+ let params = {
|
|
|
|
+ grant_type: 'get-teacher-enroll'
|
|
|
|
+ }
|
|
|
|
+ proxy.$api.teaContest(params).then(res => {
|
|
|
|
+ if(res.code === 200) {
|
|
|
|
+ res.teacherEnroll.enrollInfos.forEach(item => {
|
|
|
|
+ let fieldsIndex = contest.value.sign.fields.findIndex(fields => fields.field === item.code)
|
|
|
|
+ if(fieldsIndex != -1) {
|
|
|
|
+ if((item.code === 'period' || item.code === 'subject') && contest.value.sign.fields[fieldsIndex].type === 'select') {
|
|
|
|
+ enrollData.enrollInfos[fieldsIndex].val = contest.value.sign.fields[fieldsIndex].item.includes(item.val) ? item.val : ''
|
|
|
|
+ } else {
|
|
|
|
+ enrollData.enrollInfos[fieldsIndex].val = item.val
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ schoolIndex.value = schoolList.findIndex(school => school.schoolId === res.teacherEnroll.schoolId)
|
|
|
|
+ schoolIndex.value = schoolIndex.value === -1 ? '' : schoolIndex.value
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+function searchCipher() {
|
|
|
|
+ let params = {
|
|
|
|
+ grant_type: 'search-team-by-cipher',
|
|
|
|
+ activityId: infoId.value,
|
|
|
|
+ cipher: enrollData.cipher
|
|
|
|
+ }
|
|
|
|
+ proxy.$api.teaContest(params).then(res => {
|
|
|
|
+ if(res.code === 200) {
|
|
|
|
+ if(res.teamMembers.length) {
|
|
|
|
+ teamMembers.value = res.teamMembers
|
|
|
|
+ enrollData.teamName = res.teamMembers.find(item => item.leader).teamName
|
|
|
|
+ } else {
|
|
|
|
+ ElMessage({
|
|
|
|
+ type: 'warning',
|
|
|
|
+ message: '未找到相关团队信息'
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ ElMessage({
|
|
|
|
+ type: 'warning',
|
|
|
|
+ message: '未找到相关团队信息'
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+ }).finally(() => {
|
|
|
|
+ })
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 队长身份要先生成组队口令
|
|
|
|
+async function genCipher(formEl) {
|
|
|
|
+ formEl.validate(async (valid, ddd) => {
|
|
|
|
+ if(valid && schoolIndex.value !== '') {
|
|
|
|
+ if(contest.value.sign.type && enrollData.leader) {
|
|
|
|
+ let params = {
|
|
|
|
+ grant_type: 'gen-cipher',
|
|
|
|
+ activityId: infoId.value
|
|
|
|
+ }
|
|
|
|
+ proxy.$api.teaContest(params).then(async res => {
|
|
|
|
+ if(res.code === 200) {
|
|
|
|
+ console.log(res);
|
|
|
|
+ enrollData.cipher = res.cipher
|
|
|
|
+ await signContest()
|
|
|
|
+ }
|
|
|
|
+ }).catch(() => {
|
|
|
|
+ })
|
|
|
|
+ } else {
|
|
|
|
+ await signContest()
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ console.log('fegjmj,', valid, schoolIndex.value);
|
|
|
|
+ ElMessage({
|
|
|
|
+ type: 'warning',
|
|
|
|
+ message: '请完善信息'
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+}
|
|
|
|
+// 保存报名信息
|
|
|
|
+function signContest() {
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
|
+ enrollData.schoolName = schoolList[schoolIndex.value].name
|
|
|
|
+ enrollData.schoolPicture = schoolList[schoolIndex.value].picture
|
|
|
|
+ enrollData.schoolId = schoolList[schoolIndex.value].schoolId
|
|
|
|
+ enrollData.enrollTime = Date.parse(new Date())
|
|
|
|
+ let params = {
|
|
|
|
+ grant_type: 'sign-contest',
|
|
|
|
+ activityId: infoId.value,
|
|
|
|
+ enrollData,
|
|
|
|
+ mock: true, //填写表示是测试数据
|
|
|
|
+ }
|
|
|
|
+ proxy.$api.teaContest(params).then(res => {
|
|
|
|
+ switch(res.code) {
|
|
|
|
+ case 1:
|
|
|
|
+ ElMessage({
|
|
|
|
+ type: 'error',
|
|
|
|
+ message: '报名信息未完善'
|
|
|
|
+ })
|
|
|
|
+ break
|
|
|
|
+ case 2:
|
|
|
|
+ ElMessage({
|
|
|
|
+ type: 'error',
|
|
|
|
+ message: '请以学校教师身份参加本次活动'
|
|
|
|
+ })
|
|
|
|
+ break
|
|
|
|
+ case 9:
|
|
|
|
+ ElMessage({
|
|
|
|
+ type: 'error',
|
|
|
|
+ message: '参加组别不一致'
|
|
|
|
+ })
|
|
|
|
+ break
|
|
|
|
+ case 11:
|
|
|
|
+ ElMessage({
|
|
|
|
+ type: 'error',
|
|
|
|
+ message: '队伍未组建或不存在'
|
|
|
|
+ })
|
|
|
|
+ break
|
|
|
|
+ case 18:
|
|
|
|
+ ElMessage({
|
|
|
|
+ type: 'error',
|
|
|
|
+ message: '报名学校与组队学校不一致'
|
|
|
|
+ })
|
|
|
|
+ break
|
|
|
|
+ case 35:
|
|
|
|
+ ElMessage({
|
|
|
|
+ type: 'error',
|
|
|
|
+ message: '已过报名时间'
|
|
|
|
+ })
|
|
|
|
+ break
|
|
|
|
+ case 200:
|
|
|
|
+ ElMessage({
|
|
|
|
+ type: 'success',
|
|
|
|
+ message: '报名成功'
|
|
|
|
+ })
|
|
|
|
+ registered.value = 1
|
|
|
|
+ contestStep.value = (!contestStep.value && contest.value.upload.actState === 'going') ? 1 : contestStep.value
|
|
|
|
+ joinDra.value = false
|
|
|
|
+ break
|
|
|
|
+ default:
|
|
|
|
+ ElMessage({
|
|
|
|
+ type: 'error',
|
|
|
|
+ message: '报名失败'
|
|
|
|
+ })
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ }).finally(() => {
|
|
|
|
+ }).finally(() => {
|
|
|
|
+ })
|
|
|
|
+ })
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+function openDraw() {
|
|
|
|
+ if(registered.value === 1) {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ if(registered.value) {
|
|
|
|
+ ElMessage({
|
|
|
|
+ type: 'warning',
|
|
|
|
+ message: registered.value === 1 ? '已经报名该活动' : (registered.value === 2 ? '您所在学校未被邀请参与活动' : '不在报名时间')
|
|
|
|
+ })
|
|
|
|
+ } else {
|
|
|
|
+ contest.value.sign.fields.forEach(item => {
|
|
|
|
+ rules.value[item.field] = { required: true, message: '不能为空', trigger: 'blur', validator: validateInfo }
|
|
|
|
+ })
|
|
|
|
+ joinDra.value = true
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* 预览 */
|
|
|
|
+async function onPreview(item) {
|
|
|
|
+ let url = item.urlShow
|
|
|
|
+ console.log('gr5e4gt4h', url);
|
|
|
|
+ if (proxy.$tools.getSuffix(item.name) === 'pdf') {
|
|
|
|
+ window.open('https://www.teammodel.cn/web/viewer.html?file=' + encodeURIComponent(url));
|
|
|
|
+ } else if(item.type === 'doc') {
|
|
|
|
+ window.open('https://view.officeapps.live.com/op/view.aspx?src=' + escape(url));
|
|
|
|
+ // } else if(item.type === 'image') {
|
|
|
|
+ // $hevueImgPreview(url)
|
|
|
|
+ } else if(item.type === 'link') {
|
|
|
|
+ window.open(/^(http:|https:)/i.test(url) ? url : "http://" + url)
|
|
|
|
+ } else {
|
|
|
|
+ previewFile.value = item
|
|
|
|
+ previewStatus.value = true
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+function deleteRule(type) {
|
|
|
|
+ enrollForm.value.clearValidate(type)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+watch(() => enrollData.cipher, (newdata) => {
|
|
|
|
+ codeSearch.value = true
|
|
|
|
+ teamMembers.value = []
|
|
|
|
+ enrollData.teamName = ''
|
|
|
|
+})
|
|
|
|
+
|
|
|
|
+</script>
|
|
|
|
+
|
|
|
|
+<style scoped lang="less">
|
|
|
|
+@import "./ActivityInfo.less";
|
|
|
|
+</style>
|
|
|
|
+
|
|
|
|
+<style lang="less">
|
|
|
|
+.join-box {
|
|
|
|
+ .el-select {
|
|
|
|
+ width: 100%;
|
|
|
|
+ }
|
|
|
|
+ .code-box {
|
|
|
|
+ position: relative;
|
|
|
|
+
|
|
|
|
+ .el-icon {
|
|
|
|
+ position: absolute;
|
|
|
|
+ top: 0;
|
|
|
|
+ right: 1px;
|
|
|
|
+ padding: 9px;
|
|
|
|
+ }
|
|
|
|
+ .icon-Search {
|
|
|
|
+ cursor: pointer;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+.detail-info {
|
|
|
|
+ .el-step__head.is-finish,
|
|
|
|
+ .el-step__title.is-finish,
|
|
|
|
+ .el-step__description.is-finish {
|
|
|
|
+ color: #85bc73;
|
|
|
|
+ border-color: #9cba92;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .el-step__head.is-process,
|
|
|
|
+ .el-step__title.is-process,
|
|
|
|
+ .el-step__description.is-process {
|
|
|
|
+ color: #409eff;
|
|
|
|
+ border-color: #409eff;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+</style>
|