master
yujialong 1 year ago
parent 04899545ff
commit cdf6d1de36
  1. 2
      src/api/index.js
  2. 8
      src/libs/util.js
  3. 2
      src/pages/assessment/list/index.vue
  4. 393
      src/pages/course/contentSettings/index.vue
  5. 100
      src/pages/match/add/step3.vue
  6. 9
      src/pages/match/manage/matchArch.vue
  7. 348
      src/pages/match/manage/matchArchList.vue
  8. 2
      src/pages/project/add/index.vue
  9. 4
      src/pages/station/list/index.vue
  10. 2
      src/setting.js

@ -251,6 +251,8 @@ export default {
cancelCompetitionStageRankingTime: `competition/competitionReleaseTime/cancelCompetitionStageRankingTime`, cancelCompetitionStageRankingTime: `competition/competitionReleaseTime/cancelCompetitionStageRankingTime`,
getCompetitionStageRankingTime: `competition/competitionReleaseTime/getCompetitionStageRankingTime`, getCompetitionStageRankingTime: `competition/competitionReleaseTime/getCompetitionStageRankingTime`,
frontOfficeCompetitionRanking: `competition/competition/rank/frontOfficeCompetitionRanking`, frontOfficeCompetitionRanking: `competition/competition/rank/frontOfficeCompetitionRanking`,
cCompetitionStageFileList: `competition/cCompetitionStageFile/listByEntity`,
derive: `${host}competition/cCompetitionStageFile/deriveAll`,
gradeImport: `https://www.occupationlab.com/template/赛事成绩导入模板.xlsx`, gradeImport: `https://www.occupationlab.com/template/赛事成绩导入模板.xlsx`,
rankImportTeam: `https://www.occupationlab.com/template/赛事排名导入模板(团队赛).xlsx`, rankImportTeam: `https://www.occupationlab.com/template/赛事排名导入模板(团队赛).xlsx`,
rankImportPerson: `https://www.occupationlab.com/template/赛事排名导入模板(个人赛).xlsx`, rankImportPerson: `https://www.occupationlab.com/template/赛事排名导入模板(个人赛).xlsx`,

@ -12,7 +12,8 @@ const exts = {
video: 'mp4,3gp,mov,m4v,avi,dat,mkv,flv,vob,rmvb,rm,qlv', video: 'mp4,3gp,mov,m4v,avi,dat,mkv,flv,vob,rmvb,rm,qlv',
audio: 'mp3,aac,ape,flac,wav,wma,amr,mid', audio: 'mp3,aac,ape,flac,wav,wma,amr,mid',
img: 'jpg,jpeg,png,gif,svg,psd', img: 'jpg,jpeg,png,gif,svg,psd',
doc: 'doc,docx,txt,xls,xlsx,csv,xml,ppt,pptx' doc: 'doc,docx,txt,xls,xlsx,csv,xml,ppt,pptx',
compress: 'zip,rar,7z,tar,gz,bz2',
} }
const util = { const util = {
cookies, cookies,
@ -91,6 +92,11 @@ const util = {
if (exts.doc.includes(ext)) return true; if (exts.doc.includes(ext)) return true;
return false; return false;
}, },
// 传入文件后缀判断是否是压缩包
isCompress(ext) {
if (exts.compress.includes(ext)) return true;
return false;
},
// 判断是否能够预览 // 判断是否能够预览
canPreview(ext) { canPreview(ext) {
if (!util.isVideo(ext) && !util.isAudio(ext) && !util.isImg(ext) && !util.isDoc(ext)) return false if (!util.isVideo(ext) && !util.isAudio(ext) && !util.isImg(ext) && !util.isDoc(ext)) return false

@ -156,7 +156,7 @@
label="起始时间" label="起始时间"
align="center"> align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ transferTime(scope.row.startTime) }}</span> <span>{{ (scope.row.status == 0 && scope.row.type == 1) ? '---' : transferTime(scope.row.startTime) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="stopTime" <el-table-column prop="stopTime"

@ -1,95 +1,171 @@
<template> <template>
<div> <div>
<el-card shadow="hover" class="m-b-20"> <el-card shadow="hover"
class="m-b-20">
<div class="flex-between"> <div class="flex-between">
<el-page-header @back="goBack" :content="sorting? '更改排序' : '内容设置'"></el-page-header> <el-page-header @back="goBack"
:content="sorting? '更改排序' : '内容设置'"></el-page-header>
</div> </div>
</el-card> </el-card>
<!--内容设置--> <!--内容设置-->
<el-card shadow="hover" class="m-b-20"> <el-card shadow="hover"
class="m-b-20">
<div class="page"> <div class="page">
<div class="relative"> <div class="relative">
<div class="p-title">内容设置</div> <div class="p-title">内容设置</div>
<div class="btns" style="top: -10px"> <div class="btns"
style="top: -10px">
<template v-if="!sorting"> <template v-if="!sorting">
<el-button v-auth="'/course/list:课程管理:内容设置:添加章节'" type="primary" round @click="addChapter">添加章节</el-button> <el-button v-auth="'/course/list:课程管理:内容设置:添加章节'"
<el-button v-auth="'/course/list:课程管理:内容设置:编辑顺序'" type="primary" round @click="sort">编辑顺序</el-button> type="primary"
round
@click="addChapter">添加章节</el-button>
<el-button v-auth="'/course/list:课程管理:内容设置:编辑顺序'"
type="primary"
round
@click="sort">编辑顺序</el-button>
</template> </template>
<template v-else> <template v-else>
<el-button type="primary" round @click="move">批量移动</el-button> <el-button type="primary"
<el-button type="primary" round @click="cancelSort">取消</el-button> round
<el-button type="primary" round @click="saveSort">保存</el-button> @click="move">批量移动</el-button>
<el-button type="primary"
round
@click="cancelSort">取消</el-button>
<el-button type="primary"
round
@click="saveSort">保存</el-button>
</template> </template>
</div> </div>
</div> </div>
<el-divider></el-divider> <el-divider></el-divider>
<div class="page-content"> <div class="page-content">
<div class="m-b-20" v-for="(chapter,index) in chapters" :key="chapter.id"> <div class="m-b-20"
v-for="(chapter,index) in chapters"
:key="chapter.id">
<div class="flex j-between a-center m-b-10"> <div class="flex j-between a-center m-b-10">
<div>{{ chapter.name }}</div> <div>{{ chapter.name }}</div>
<div> <div>
<template v-if="!sorting"> <template v-if="!sorting">
<el-button v-auth="'/course/list:课程管理:内容设置:修改章节名称'" class="action-btn" type="primary" round @click="editChapter(chapter)">修改章节名称</el-button> <el-button v-auth="'/course/list:课程管理:内容设置:修改章节名称'"
<el-button v-auth="'/course/list:课程管理:内容设置:添加小节'" class="action-btn" type="primary" round @click="addSection(chapter.id)">添加小节</el-button> class="action-btn"
<el-button v-auth="'/course/list:课程管理:内容设置:章节删除'" class="action-btn" type="primary" round @click="delChapter(chapter.id)">删除</el-button> type="primary"
round
@click="editChapter(chapter)">修改章节名称</el-button>
<el-button v-auth="'/course/list:课程管理:内容设置:添加小节'"
class="action-btn"
type="primary"
round
@click="addSection(chapter.id)">添加小节</el-button>
<el-button v-auth="'/course/list:课程管理:内容设置:章节删除'"
class="action-btn"
type="primary"
round
@click="delChapter(chapter.id)">删除</el-button>
</template> </template>
<template v-else> <template v-else>
<i class="el-icon-top sort-icon" :class="{disabled: index == 0}" style="margin-right: 5px" @click="sortChapter(chapter,'up',index == 0,index)"></i> <i class="el-icon-top sort-icon"
<i class="el-icon-bottom sort-icon" :class="{disabled: index == chapters.length-1}" @click="sortChapter(chapter,'down',index == chapter.length-1,index)"></i> :class="{disabled: index == 0}"
style="margin-right: 5px"
@click="sortChapter(chapter,'up',index == 0,index)"></i>
<i class="el-icon-bottom sort-icon"
:class="{disabled: index == chapters.length-1}"
@click="sortChapter(chapter,'down',index == chapter.length-1,index)"></i>
</template> </template>
</div> </div>
</div> </div>
<el-table :data="chapter.subsectionList" class="table" stripe header-align="center"> <el-table :data="chapter.subsectionList"
<el-table-column v-if="sorting" width="55" align="center"> class="table"
stripe
header-align="center">
<el-table-column v-if="sorting"
width="55"
align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<el-checkbox v-model="scope.row.check"></el-checkbox> <el-checkbox v-model="scope.row.check"></el-checkbox>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column type="index" width="100" label="序号" align="center"></el-table-column> <el-table-column type="index"
<el-table-column prop="name" label="资源名称" min-width="200"> width="100"
label="序号"
align="center"></el-table-column>
<el-table-column prop="name"
label="资源名称"
min-width="200">
</el-table-column> </el-table-column>
<el-table-column prop="fileType" label="资源类型" min-width="120" align="center"> <el-table-column prop="fileType"
label="资源类型"
min-width="120"
align="center">
<template slot-scope="scope"> <template slot-scope="scope">
{{ transferType(scope.row.fileType) }} {{ transferType(scope.row.fileType) }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="fileType" label="格式" min-width="120" align="center"> <el-table-column prop="fileType"
label="格式"
min-width="120"
align="center">
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" width="300"> <el-table-column label="操作"
align="center"
width="300">
<template slot-scope="scope"> <template slot-scope="scope">
<template v-if="!sorting"> <template v-if="!sorting">
<el-button v-auth="'/course/list:课程管理:内容设置:查看'" type="text" @click="preview(scope.row)">查看</el-button> <el-button v-auth="'/course/list:课程管理:内容设置:查看'"
<el-button v-auth="'/course/list:课程管理:内容设置:小节删除'" type="text" @click="delSection(scope.row)">删除</el-button> type="text"
<el-button v-auth="'/course/list:课程管理:内容设置:修改小节名称'" type="text" @click="editSectionName(scope.row,chapter.id)">修改小节名称</el-button> @click="preview(scope.row)">查看</el-button>
<el-button v-auth="'/course/list:课程管理:内容设置:更换文件'" type="text" @click="switchFile(scope.row,chapter.id)">更换文件</el-button> <el-button v-auth="'/course/list:课程管理:内容设置:小节删除'"
type="text"
@click="delSection(scope.row)">删除</el-button>
<el-button v-auth="'/course/list:课程管理:内容设置:修改小节名称'"
type="text"
@click="editSectionName(scope.row,chapter.id)">修改小节名称</el-button>
<el-button v-auth="'/course/list:课程管理:内容设置:更换文件'"
type="text"
@click="switchFile(scope.row,chapter.id)">更换文件</el-button>
</template> </template>
<template v-else> <template v-else>
<i class="el-icon-top sort-icon" :class="{disabled: scope.$index == 0}" style="margin-right: 5px" @click="sortSection(index,'up',scope.$index == 0,scope.$index)"></i> <i class="el-icon-top sort-icon"
<i class="el-icon-bottom sort-icon" :class="{disabled: scope.$index == chapter.subsectionList.length-1}" @click="sortSection(index,'down',scope.$index == chapter.subsectionList.length-1,scope.$index)"></i> :class="{disabled: scope.$index == 0}"
style="margin-right: 5px"
@click="sortSection(index,'up',scope.$index == 0,scope.$index)"></i>
<i class="el-icon-bottom sort-icon"
:class="{disabled: scope.$index == chapter.subsectionList.length-1}"
@click="sortSection(index,'down',scope.$index == chapter.subsectionList.length-1,scope.$index)"></i>
</template> </template>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
<el-dialog :title="chapterId ? '编辑章节' : '新增章节'" :visible.sync="chapterVisible" width="540px" :close-on-click-modal="false"> <el-dialog :title="chapterId ? '编辑章节' : '新增章节'"
:visible.sync="chapterVisible"
width="540px"
:close-on-click-modal="false">
<el-form> <el-form>
<el-form-item> <el-form-item>
<el-input placeholder="请输入章节名称,便于对小节归类" v-model="chapterName" maxlength="50"></el-input> <el-input placeholder="请输入章节名称,便于对小节归类"
v-model="chapterName"
maxlength="50"></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer"
class="dialog-footer">
<el-button @click="chapterVisible = false">取消</el-button> <el-button @click="chapterVisible = false">取消</el-button>
<el-button type="primary" @click="chapterSubmit">确定</el-button> <el-button type="primary"
@click="chapterSubmit">确定</el-button>
</span> </span>
</el-dialog> </el-dialog>
<el-dialog title="添加小节" :visible.sync="sectionVisible" width="540px" @close="closeSection" :close-on-click-modal="false"> <el-dialog title="添加小节"
:visible.sync="sectionVisible"
width="540px"
@close="closeSection"
:close-on-click-modal="false">
<el-form label-width="80px"> <el-form label-width="80px">
<el-form-item label="资源添加"> <el-form-item label="资源添加">
<el-upload <el-upload :before-upload="beforeUpload"
:before-upload="beforeUpload"
:on-remove="handleRemove" :on-remove="handleRemove"
:on-error="uploadError" :on-error="uploadError"
:on-success="uploadSuccess" :on-success="uploadSuccess"
@ -100,27 +176,37 @@
:file-list="uploadList" :file-list="uploadList"
:headers="headers" :headers="headers"
:http-request="handleRequest" :http-request="handleRequest"
name="file" name="file">
> <el-button size="small"><img src="@/assets/img/upload.png"
<el-button size="small"><img src="@/assets/img/upload.png" alt=""> 上传资源</el-button> alt=""> 上传资源</el-button>
<div slot="tip" class="el-upload__tip">视频请上传MP4格式大小不超过30Moffice文件大小不要超过10M</div> <div slot="tip"
class="el-upload__tip">视频请上传MP4格式大小不超过30Moffice文件大小不要超过10M</div>
</el-upload> </el-upload>
<el-progress v-if="showProgress" :stroke-width="3" :percentage="progressPercent"></el-progress> <el-progress v-if="showProgress"
:stroke-width="3"
:percentage="progressPercent"></el-progress>
</el-form-item> </el-form-item>
<el-form-item label="小节名称"> <el-form-item label="小节名称">
<el-input placeholder="请输入小节名称" v-model="sectionName" maxlength="50"></el-input> <el-input placeholder="请输入小节名称"
v-model="sectionName"
maxlength="50"></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer"
class="dialog-footer">
<el-button @click="sectionVisible = false">取消</el-button> <el-button @click="sectionVisible = false">取消</el-button>
<el-button type="primary" @click="sectionSubmit">确定</el-button> <el-button type="primary"
@click="sectionSubmit">确定</el-button>
</span> </span>
</el-dialog> </el-dialog>
<el-dialog title="更换文件" :visible.sync="switchVisible" width="540px" :close-on-click-modal="false" @close="closeSwitch"> <el-dialog title="更换文件"
:visible.sync="switchVisible"
width="540px"
:close-on-click-modal="false"
@close="closeSwitch">
<div style="text-align: center"> <div style="text-align: center">
<el-upload <el-upload :before-upload="beforeUpload"
:before-upload="beforeUpload"
:on-remove="handleRemove" :on-remove="handleRemove"
:on-error="uploadError" :on-error="uploadError"
:on-success="uploadSuccess" :on-success="uploadSuccess"
@ -131,83 +217,139 @@
:file-list="uploadList" :file-list="uploadList"
:headers="headers" :headers="headers"
:http-request="handleRequest" :http-request="handleRequest"
name="file" name="file">
> <el-button size="small"><img src="@/assets/img/upload.png"
<el-button size="small"><img src="@/assets/img/upload.png" alt=""> 上传资源</el-button> alt=""> 上传资源</el-button>
</el-upload> </el-upload>
<el-progress v-if="showProgress" :stroke-width="3" :percentage="progressPercent"></el-progress> <el-progress v-if="showProgress"
:stroke-width="3"
:percentage="progressPercent"></el-progress>
</div> </div>
<span slot="footer" class="dialog-footer"> <span slot="footer"
class="dialog-footer">
<el-button @click="switchVisible = false">取消</el-button> <el-button @click="switchVisible = false">取消</el-button>
<el-button type="primary" @click="switchSubmit">确定</el-button> <el-button type="primary"
@click="switchSubmit">确定</el-button>
</span> </span>
</el-dialog> </el-dialog>
<el-dialog title="修改小节名称" :visible.sync="sectionNameVisible" width="540px" :close-on-click-modal="false"> <el-dialog title="修改小节名称"
:visible.sync="sectionNameVisible"
width="540px"
:close-on-click-modal="false">
<el-form> <el-form>
<el-form-item> <el-form-item>
<el-input placeholder="请输入小节名称" v-model="sectionName" maxlength="50"></el-input> <el-input placeholder="请输入小节名称"
v-model="sectionName"
maxlength="50"></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer"
class="dialog-footer">
<el-button @click="sectionNameVisible = false">取消</el-button> <el-button @click="sectionNameVisible = false">取消</el-button>
<el-button type="primary" @click="sectionNameSubmit">确定</el-button> <el-button type="primary"
@click="sectionNameSubmit">确定</el-button>
</span> </span>
</el-dialog> </el-dialog>
<div v-show="previewImg" class="el-image-viewer__wrapper" :class="{active: previewImg}" style="z-index: 2000"> <div v-show="previewImg"
class="el-image-viewer__wrapper"
:class="{active: previewImg}"
style="z-index: 2000">
<div class="el-image-viewer__mask"></div> <div class="el-image-viewer__mask"></div>
<span class="el-image-viewer__btn el-image-viewer__close" @click="previewImg = ''"><i class="el-icon-circle-close" style="color: #fff"></i></span> <span class="el-image-viewer__btn el-image-viewer__close"
@click="previewImg = ''"><i class="el-icon-circle-close"
style="color: #fff"></i></span>
<div class="el-image-viewer__canvas"> <div class="el-image-viewer__canvas">
<img :src="previewImg" class="el-image-viewer__img" style="transform: scale(1) rotate(0deg);margin-top: -1px; max-height: 100%; max-width: 100%;"> <img :src="previewImg"
class="el-image-viewer__img"
style="transform: scale(1) rotate(0deg);margin-top: -1px; max-height: 100%; max-width: 100%;">
</div> </div>
</div> </div>
<div v-show="iframeSrc" class="el-image-viewer__wrapper" :class="{active: iframeSrc}" style="z-index: 2000"> <div v-show="iframeSrc"
class="el-image-viewer__wrapper"
:class="{active: iframeSrc}"
style="z-index: 2000">
<div class="el-image-viewer__mask"></div> <div class="el-image-viewer__mask"></div>
<span class="el-image-viewer__btn el-image-viewer__close" :class="{'doc-close': isWord}" :style="{top: isWord ? '50px' : '5px'}" @click="closeIframe"><i class="el-icon-circle-close" style="color: #fff"></i></span> <span class="el-image-viewer__btn el-image-viewer__close"
:class="{'doc-close': isWord}"
:style="{top: isWord ? '50px' : '5px'}"
@click="closeIframe"><i class="el-icon-circle-close"
style="color: #fff"></i></span>
<div class="el-image-viewer__canvas"> <div class="el-image-viewer__canvas">
<iframe v-if="iframeSrc" class="fileIframe" id="fileIframe" :src="iframeSrc" frameborder="0"></iframe> <iframe v-if="iframeSrc"
class="fileIframe"
id="fileIframe"
:src="iframeSrc"
frameborder="0"></iframe>
<template v-if="showMask"> <template v-if="showMask">
<div class="mask" style="width: 200px;height: 30px;top: 53px;right: 320px"></div> <div class="mask"
<div class="mask" style="width: 175px;height: 30px;top: 53px;right: 5px"></div> style="width: 200px;height: 30px;top: 53px;right: 320px"></div>
<div class="mask"
style="width: 175px;height: 30px;top: 53px;right: 5px"></div>
</template> </template>
<template v-if="showMask1"> <template v-if="showMask1">
<div class="word-mask1" style="width: 200px;height: 50px;"></div> <div class="word-mask1"
<div class="word-mask" style="height: 40px;top: 48px;"></div> style="width: 200px;height: 50px;"></div>
<div class="word-mask2" style="top: 55px;left: 28%;width: 44%;height: calc(100% - 80px);"></div> <div class="word-mask"
style="height: 40px;top: 48px;"></div>
<div class="word-mask2"
style="top: 55px;left: 28%;width: 44%;height: calc(100% - 80px);"></div>
</template> </template>
<template v-if="showMask2 && iframeSrc"> <template v-if="showMask2 && iframeSrc">
<div class="excel-mask1" style="height: 48px;"></div> <div class="excel-mask1"
style="height: 48px;"></div>
</template> </template>
</div> </div>
</div> </div>
<div v-show="playAuth" class="el-image-viewer__wrapper" :class="{active: playAuth}" style="z-index: 2000"> <div v-show="playAuth"
class="el-image-viewer__wrapper"
:class="{active: playAuth}"
style="z-index: 2000">
<div class="el-image-viewer__mask"></div> <div class="el-image-viewer__mask"></div>
<span class="el-image-viewer__btn el-image-viewer__close" @click="closePlayer"><i class="el-icon-circle-close" style="color: #fff"></i></span> <span class="el-image-viewer__btn el-image-viewer__close"
<div class="player" id="player"></div> @click="closePlayer"><i class="el-icon-circle-close"
style="color: #fff"></i></span>
<div class="player"
id="player"></div>
</div> </div>
<pdf :visible.sync="pdfVisible" :src.sync="pdfSrc"></pdf> <pdf :visible.sync="pdfVisible"
:src.sync="pdfSrc"></pdf>
</div> </div>
</div> </div>
</el-card> </el-card>
<el-dialog title="资源移动" :visible.sync="moveVisible" :close-on-click-modal="false" width="330px"> <el-dialog title="资源移动"
:visible.sync="moveVisible"
:close-on-click-modal="false"
width="330px">
<el-form> <el-form>
<el-form-item label="目标章节"> <el-form-item label="目标章节">
<el-select v-model="moveForm.id" placeholder="请选择目标章节" @change="chapterChange"> <el-select v-model="moveForm.id"
<el-option v-for="(item, i) in chapters" :key="i" :label="item.name" :value="item.id"></el-option> placeholder="请选择目标章节"
@change="chapterChange">
<el-option v-for="(item, i) in chapters"
:key="i"
:label="item.name"
:value="item.id"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="目标排序"> <el-form-item label="目标排序">
<el-select v-model="moveForm.sort" placeholder="请选择目标排序"> <el-select v-model="moveForm.sort"
<el-option v-for="(item, i) in sortList" :key="i" :label="item.name" :value="item.id"></el-option> placeholder="请选择目标排序">
<el-option v-for="(item, i) in sortList"
:key="i"
:label="item.name"
:value="item.id"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer"
class="dialog-footer">
<el-button @click="moveVisible = false">取消</el-button> <el-button @click="moveVisible = false">取消</el-button>
<el-button type="primary" @click="moveConfirm">确定</el-button> <el-button type="primary"
@click="moveConfirm">确定</el-button>
</span> </span>
</el-dialog> </el-dialog>
</div> </div>
@ -222,7 +364,7 @@ import axios from 'axios'
export default { export default {
name: "contentSettings", name: "contentSettings",
data() { data () {
return { return {
headers: { headers: {
token: util.local.get(Setting.tokenKey) token: util.local.get(Setting.tokenKey)
@ -284,7 +426,7 @@ export default {
}; };
}, },
components: { pdf }, components: { pdf },
mounted() { mounted () {
this.insertScript(); this.insertScript();
this.id = this.$route.query.id; this.id = this.$route.query.id;
this.id && this.getData(); this.id && this.getData();
@ -294,11 +436,11 @@ export default {
window.addEventListener("popstate", this.goBack, false); window.addEventListener("popstate", this.goBack, false);
} }
}, },
destroyed() { destroyed () {
window.removeEventListener("popstate", this.goBack, false); window.removeEventListener("popstate", this.goBack, false);
}, },
methods: { methods: {
getData() { getData () {
this.$get(`${this.api.queryChaptersAndSubsections}?courseId=${this.id}`) this.$get(`${this.api.queryChaptersAndSubsections}?courseId=${this.id}`)
.then(res => { .then(res => {
this.chapters = res.chapterList; this.chapters = res.chapterList;
@ -307,7 +449,7 @@ export default {
}); });
}, },
goBack() { goBack () {
// //
if (this.previewing) { if (this.previewing) {
this.closeIframe(); this.closeIframe();
@ -333,7 +475,7 @@ export default {
} }
} }
}, },
iframeOnload() { iframeOnload () {
document.querySelector("#fileIframe").onload = e => { document.querySelector("#fileIframe").onload = e => {
if (this.isPPT) { if (this.isPPT) {
this.showMask = true; this.showMask = true;
@ -353,7 +495,7 @@ export default {
this.loadIns.close(); this.loadIns.close();
}; };
}, },
insertScript() { insertScript () {
const linkTag = document.createElement("link"); const linkTag = document.createElement("link");
linkTag.rel = "stylesheet"; linkTag.rel = "stylesheet";
linkTag.href = "https://g.alicdn.com/de/prismplayer/2.8.2/skins/default/aliplayer-min.css"; linkTag.href = "https://g.alicdn.com/de/prismplayer/2.8.2/skins/default/aliplayer-min.css";
@ -365,7 +507,7 @@ export default {
document.body.appendChild(scriptTag); document.body.appendChild(scriptTag);
}, },
// //
beforeUpload(file) { beforeUpload (file) {
let type = this.transferType(file.name.substring(file.name.lastIndexOf(".") + 1)); let type = this.transferType(file.name.substring(file.name.lastIndexOf(".") + 1));
if (type != "视频" && type != "图片" && type != "pdf" && (file.size / 1024 / 1024) > 10) { if (type != "视频" && type != "图片" && type != "pdf" && (file.size / 1024 / 1024) > 10) {
util.errorMsg("请上传10M以内的文件"); util.errorMsg("请上传10M以内的文件");
@ -381,13 +523,13 @@ export default {
this.fileType = file.name.substring(file.name.lastIndexOf(".") + 1); this.fileType = file.name.substring(file.name.lastIndexOf(".") + 1);
this.showProgress = true this.showProgress = true
}, },
handleExceed(files, fileList) { handleExceed (files, fileList) {
util.warningMsg( util.warningMsg(
`当前限制选择 1 个文件,如需更换,请删除上一个文件再重新选择!` `当前限制选择 1 个文件,如需更换,请删除上一个文件再重新选择!`
); );
}, },
// //
handleRequest(data) { handleRequest (data) {
const param = new FormData() const param = new FormData()
param.append('file', data.file) param.append('file', data.file)
const config = { const config = {
@ -400,7 +542,6 @@ export default {
// //
onUploadProgress: progressEvent => { onUploadProgress: progressEvent => {
const per = Number((progressEvent.loaded / progressEvent.total * 100).toFixed(2)) const per = Number((progressEvent.loaded / progressEvent.total * 100).toFixed(2))
console.log("🚀 ~ file: contentSettings.vue ~ line 329 ~ handleRequest ~ per", per, this.progressPercent)
if (this.progressPercent <= 80) this.progressPercent = (per > 80) ? (Math.random() * 10 + 80).toFixed(2) : per if (this.progressPercent <= 80) this.progressPercent = (per > 80) ? (Math.random() * 10 + 80).toFixed(2) : per
} }
} }
@ -415,55 +556,55 @@ export default {
this.fileName = ossFileName this.fileName = ossFileName
}) })
}, },
uploadSuccess(res, file, fileList) { uploadSuccess (res, file, fileList) {
this.uploading = false; this.uploading = false;
this.fileId = res.data.filesResult.fileId; this.fileId = res.data.filesResult.fileId;
this.fileType = res.data.filesResult.fileType; this.fileType = res.data.filesResult.fileType;
this.fileUrl = res.data.filesResult.fileUrl; this.fileUrl = res.data.filesResult.fileUrl;
this.fileName = res.data.filesResult.ossFileName; this.fileName = res.data.filesResult.ossFileName;
}, },
uploadError(err, file, fileList) { uploadError (err, file, fileList) {
this.$message({ this.$message({
message: "上传出错,请重试!", message: "上传出错,请重试!",
type: "error", type: "error",
center: true center: true
}); });
}, },
beforeRemove(file, fileList) { beforeRemove (file, fileList) {
if ((file.size / 1024 / 1024) < 10) { if ((file.size / 1024 / 1024) < 10) {
return this.$confirm(`确定移除 ${file.name}`); return this.$confirm(`确定移除 ${file.name}`);
} }
}, },
handleRemove(file, fileList) { handleRemove (file, fileList) {
this.uploadList = fileList; this.uploadList = fileList;
}, },
uploadSure() { uploadSure () {
this.importVisible = false; this.importVisible = false;
this.pageNo = 1; this.pageNo = 1;
this.staffGradeId = ""; this.staffGradeId = "";
this.keyword = ""; this.keyword = "";
this.getTeacher(); this.getTeacher();
}, },
goback() { goback () {
this.$router.push("course"); this.$router.push("course");
}, },
transferType(ext) { transferType (ext) {
const suf = ext.toLowerCase() const suf = ext.toLowerCase()
if ("jpg,jpeg,png,gif,svg,psd".includes(suf)) return "图片"; if ("jpg,jpeg,png,gif,svg,psd".includes(suf)) return "图片";
if ("mp4,3gp,mov,m4v,avi,dat,mkv,flv,vob,rmvb,rm,qlv".includes(suf)) return "视频"; if ("mp4,3gp,mov,m4v,avi,dat,mkv,flv,vob,rmvb,rm,qlv".includes(suf)) return "视频";
return suf; return suf;
}, },
addChapter() { addChapter () {
this.chapterName = ""; this.chapterName = "";
this.chapterId = ""; this.chapterId = "";
this.chapterVisible = true; this.chapterVisible = true;
}, },
sort() { sort () {
this.originChapters = JSON.parse(JSON.stringify(this.chapters)) this.originChapters = JSON.parse(JSON.stringify(this.chapters))
this.sorting = true; this.sorting = true;
}, },
// //
move() { move () {
const list = this.chapters const list = this.chapters
const checkList = [] const checkList = []
list.map(e => { list.map(e => {
@ -493,13 +634,13 @@ export default {
} }
}, },
// //
chapterChange(id) { chapterChange (id) {
const list = [] const list = []
// //
this.chapters.find(e => e.id === id).subsectionList.map((e, i) => { this.chapters.find(e => e.id === id).subsectionList.map((e, i) => {
list.push({ list.push({
id: i, id: i,
name: i+1 name: i + 1
}) })
}) })
// //
@ -516,7 +657,7 @@ export default {
] ]
}, },
// //
moveConfirm() { moveConfirm () {
let { id, sort } = this.moveForm let { id, sort } = this.moveForm
if (!id) return this.$message.warning('请选择目标章节') if (!id) return this.$message.warning('请选择目标章节')
if (sort === '') return this.$message.warning('请选择目标排序') if (sort === '') return this.$message.warning('请选择目标排序')
@ -539,11 +680,11 @@ export default {
}) })
this.moved = true this.moved = true
}, },
cancelSort() { cancelSort () {
this.chapters = JSON.parse(JSON.stringify(this.originChapters)) this.chapters = JSON.parse(JSON.stringify(this.originChapters))
this.sorting = false; this.sorting = false;
}, },
saveSort() { saveSort () {
this.chapters.forEach((n, k) => { this.chapters.forEach((n, k) => {
n.sort = k + 1; n.sort = k + 1;
n.subsectionList.forEach((j, i) => { n.subsectionList.forEach((j, i) => {
@ -559,12 +700,12 @@ export default {
}).catch(res => { }).catch(res => {
}); });
}, },
editChapter(item) { editChapter (item) {
this.chapterId = item.id; this.chapterId = item.id;
this.chapterName = item.name; this.chapterName = item.name;
this.chapterVisible = true; this.chapterVisible = true;
}, },
delChapter(id) { delChapter (id) {
this.$confirm("此删除操作不可逆,是否确认删除选中项?", "提示", { this.$confirm("此删除操作不可逆,是否确认删除选中项?", "提示", {
type: "warning" type: "warning"
}) })
@ -578,10 +719,10 @@ export default {
.catch(() => { .catch(() => {
}); });
}, },
closeSection() { closeSection () {
this.isAddSection = false; this.isAddSection = false;
}, },
addSection(id) { addSection (id) {
this.chapterId = id; this.chapterId = id;
this.sectionName = ""; this.sectionName = "";
this.fileUrl = ""; this.fileUrl = "";
@ -590,7 +731,7 @@ export default {
this.isAddSection = true; this.isAddSection = true;
this.sectionVisible = true; this.sectionVisible = true;
}, },
chapterSubmit() { chapterSubmit () {
if (!this.chapterName) return util.warningMsg("请填写章节名称"); if (!this.chapterName) return util.warningMsg("请填写章节名称");
let data = { let data = {
courseId: this.id, courseId: this.id,
@ -615,7 +756,7 @@ export default {
}); });
} }
}, },
sectionSubmit() { sectionSubmit () {
if (!this.sectionName) return util.warningMsg("请填写小节名称"); if (!this.sectionName) return util.warningMsg("请填写小节名称");
if (this.uploading) return util.warningMsg("资源正在上传中,请稍候"); if (this.uploading) return util.warningMsg("资源正在上传中,请稍候");
if (!this.fileUrl && !this.fileId) return util.warningMsg("请上传资源"); if (!this.fileUrl && !this.fileId) return util.warningMsg("请上传资源");
@ -638,14 +779,14 @@ export default {
.catch(err => { .catch(err => {
}); });
}, },
closeSwitch() { closeSwitch () {
this.fileId = ""; this.fileId = "";
this.fileName = ""; this.fileName = "";
this.fileType = ""; this.fileType = "";
this.fileUrl = ""; this.fileUrl = "";
this.sectionId = ""; this.sectionId = "";
}, },
preview(row) { preview (row) {
if (this.transferType(row.fileType) == "视频") { if (this.transferType(row.fileType) == "视频") {
this.$get(`${this.api.getPlayAuth}/${row.fileId}`).then(res => { this.$get(`${this.api.getPlayAuth}/${row.fileId}`).then(res => {
this.playAuth = res.data.playAuth; this.playAuth = res.data.playAuth;
@ -699,13 +840,13 @@ export default {
}); });
} }
}, },
editSectionName(row, chapterId) { editSectionName (row, chapterId) {
this.chapterId = chapterId; this.chapterId = chapterId;
this.sectionId = row.id; this.sectionId = row.id;
this.sectionName = row.name; this.sectionName = row.name;
this.sectionNameVisible = true; this.sectionNameVisible = true;
}, },
switchFile(row, chapterId, sectionId) { switchFile (row, chapterId, sectionId) {
this.uploadList = []; this.uploadList = [];
this.curFile = { this.curFile = {
fileId: row.fileId, fileId: row.fileId,
@ -719,7 +860,7 @@ export default {
this.switchVisible = true; this.switchVisible = true;
}, },
switchSubmitFile() { switchSubmitFile () {
let data = { let data = {
id: this.sectionId, id: this.sectionId,
courseId: this.id, courseId: this.id,
@ -739,7 +880,7 @@ export default {
.catch(err => { .catch(err => {
}); });
}, },
switchSubmit() { switchSubmit () {
if (this.uploading) return util.warningMsg("资源正在上传中,请稍候"); if (this.uploading) return util.warningMsg("资源正在上传中,请稍候");
if (!this.fileUrl && !this.fileId) return util.warningMsg("请上传资源"); if (!this.fileUrl && !this.fileId) return util.warningMsg("请上传资源");
if (this.transferType(this.curFile.fileType) == "视频") { if (this.transferType(this.curFile.fileType) == "视频") {
@ -757,7 +898,7 @@ export default {
}); });
} }
}, },
delSection(row) { delSection (row) {
this.$confirm("此删除操作不可逆,是否确认删除选中项?", "提示", { this.$confirm("此删除操作不可逆,是否确认删除选中项?", "提示", {
type: "warning" type: "warning"
}) })
@ -771,7 +912,7 @@ export default {
.catch(() => { .catch(() => {
}); });
}, },
sortChapter(row, type, disabled, index) { sortChapter (row, type, disabled, index) {
if (!disabled) { if (!disabled) {
if (type == "up") { if (type == "up") {
let tempItem = this.chapters.splice(index - 1, 1)[0]; let tempItem = this.chapters.splice(index - 1, 1)[0];
@ -782,7 +923,7 @@ export default {
} }
} }
}, },
sortSection(chapterIndex, type, disabled, index) { sortSection (chapterIndex, type, disabled, index) {
if (!disabled) { if (!disabled) {
this.moved = true this.moved = true
let list = this.chapters[chapterIndex].subsectionList; let list = this.chapters[chapterIndex].subsectionList;
@ -797,7 +938,7 @@ export default {
} }
}, },
sectionNameSubmit() { sectionNameSubmit () {
if (!this.sectionName) return util.warningMsg("请填写小节名称"); if (!this.sectionName) return util.warningMsg("请填写小节名称");
let data = { let data = {
id: this.sectionId, id: this.sectionId,
@ -813,11 +954,11 @@ export default {
.catch(err => { .catch(err => {
}); });
}, },
closePlayer() { closePlayer () {
this.playAuth = ""; this.playAuth = "";
this.player.pause(); this.player.pause();
}, },
closeIframe() { closeIframe () {
this.iframeSrc = ""; this.iframeSrc = "";
this.showMask = false; this.showMask = false;
this.showMask1 = false; this.showMask1 = false;
@ -855,16 +996,16 @@ export default {
&.disabled { &.disabled {
color: #ccc; color: #ccc;
cursor: not-allowed cursor: not-allowed;
} }
} }
.el-image-viewer__wrapper { .el-image-viewer__wrapper {
transform: translateY(-10px); transform: translateY(-10px);
transition: transform .5s; transition: transform 0.5s;
&.active { &.active {
transform: translateY(0) transform: translateY(0);
} }
} }

@ -46,6 +46,40 @@
<el-input v-model="item.offlineAddress" <el-input v-model="item.offlineAddress"
style="width: 80%"></el-input> style="width: 80%"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="系统链接">
<el-input v-model="item.competitionStageContentSetting.systemLink"
style="width: 80%"></el-input>
</el-form-item>
<el-form-item label="是否支持上传文件">
<div>
<el-radio v-model="item.competitionStageContentSetting.whetherToUploadFiles"
:label="0"></el-radio>
</div>
<div class="flex a-center">
<el-radio v-model="item.competitionStageContentSetting.whetherToUploadFiles"
:label="1"></el-radio>
<template v-if="item.competitionStageContentSetting.whetherToUploadFiles">
<el-upload accept=".jpg,.png,.jpeg,.gif"
:on-remove="(file, fileList) => handleRemove(file, fileList, item)"
:on-error="uploadError"
:on-success="res => uploadSuccess(res, item)"
:before-remove="beforeRemove"
:action="api.fileUploadNakadai"
:headers="headers"
:file-list="item.competitionStageContentSetting.fileList"
name="file">
<el-button size="small"
type="primary">上传试卷</el-button>
</el-upload>
<span style="margin: 0 10px 0 30px;">说明</span>
<el-input maxlength="1000"
placeholder="请输入内容"
v-model="item.competitionStageContentSetting.stageExplain"
style="width: calc(80% - 216px);"></el-input>
</template>
</div>
</el-form-item>
<el-form-item class="req" <el-form-item class="req"
label="比赛内容"> label="比赛内容">
<el-input v-model="item.contentDescription" <el-input v-model="item.contentDescription"
@ -105,11 +139,15 @@
<script> <script>
import util from "@/libs/util"; import util from "@/libs/util";
import Setting from "@/setting";
import set from './set' import set from './set'
export default { export default {
props: ['setupId', 'competitionId', 'editing'], props: ['setupId', 'competitionId', 'editing'],
data () { data () {
return { return {
headers: {
token: util.local.get(Setting.tokenKey)
},
id: this.$route.query.id, id: this.$route.query.id,
updateTime: 0, updateTime: 0,
step1: this.$parent.$refs.step1.form, step1: this.$parent.$refs.step1.form,
@ -186,6 +224,26 @@ export default {
} else { } else {
form.time = [] form.time = []
} }
// 线
if (e.method === 2) {
if (!form.competitionStageContentSetting) {
form.competitionStageContentSetting = {
whetherToUploadFiles: 0,
stageExplain: '',
fileUrl: '',
systemLink: '',
fileList: []
}
}
if (form.competitionStageContentSetting.fileUrl) {
form.competitionStageContentSetting.fileList = [{
name: form.competitionStageContentSetting.fileName,
url: form.competitionStageContentSetting.fileUrl,
}]
}
form.competitionStageContentSetting.competitionId = this.id
form.competitionStageContentSetting.stageId = e.stageId
}
form.offlineButton = !!form.offlineButton form.offlineButton = !!form.offlineButton
form.onlineButton = !!form.onlineButton form.onlineButton = !!form.onlineButton
form.method = e.method form.method = e.method
@ -232,6 +290,43 @@ export default {
} }
} }
}, },
//
beforeUpload (file) {
const isLt2M = file.size / 1024 / 1024 < 10
if (!isLt2M) util.warningMsg('请上传小于10MB的附件!')
if (isLt2M) {
this.fileName = file.name
return true
} else {
return false
}
},
uploadError (err, file, fileList) {
this.$message({
message: "上传出错,请重试!",
type: "error",
center: true
})
},
beforeRemove (file, fileList) {
return this.$confirm(`确定移除 ${file.name}`);
},
handleRemove (file, fileList, item) {
item.fileName = ''
item.fileUrl = ''
},
uploadSuccess (res, item) {
const { originalFileName, fileUrl } = res.filesResult
item.competitionStageContentSetting.fileUrl = fileUrl
item.competitionStageContentSetting.fileName = originalFileName
item.competitionStageContentSetting.fileList = [{
name: originalFileName,
url: fileUrl
}]
},
// //
publish () { publish () {
this.competitionId && this.$post(`${this.api.publishCompetition}?competitionId=${this.competitionId}&publishStatus=1`).then(res => { }).catch(err => { }) this.competitionId && this.$post(`${this.api.publishCompetition}?competitionId=${this.competitionId}&publishStatus=1`).then(res => { }).catch(err => { })
@ -283,6 +378,11 @@ export default {
util.errorMsg('请输入评分规则') util.errorMsg('请输入评分规则')
break break
} }
if (e.competitionStageContentSetting.whetherToUploadFiles && !e.competitionStageContentSetting.stageExplain) {
invalid = 1
util.errorMsg('请输入说明')
break
}
} else { } else {
if (e.onlineButton && !e.onlineAddress) { if (e.onlineButton && !e.onlineAddress) {
invalid = 1 invalid = 1

@ -44,7 +44,7 @@
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="primary" <el-button type="primary"
@click="toRank(scope.row, scope.$index)">排名</el-button> @click="toRank(scope.row, scope.$index)">排名</el-button>
<el-button @click="toArch(scope.row)">成绩管理</el-button> <el-button @click="toArch(scope.row, scope.$index)">成绩管理</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -116,9 +116,10 @@ export default {
toRank (row, i) { toRank (row, i) {
this.$router.push(`rank?id=${this.id}&stageId=${row.stageId}&index=${i}&method=${row.method}&competitionType=${row.competitionType}&rule=${row.rule}`) this.$router.push(`rank?id=${this.id}&stageId=${row.stageId}&index=${i}&method=${row.method}&competitionType=${row.competitionType}&rule=${row.rule}`)
}, },
// toArch (row, i) {
toArch (row) { const cur = this.form.competitionStage[i]
this.$router.push(`archList?id=${this.id}&stageId=${row.stageId}&method=${row.method}&competitionType=${row.competitionType}`) const showFile = !!(cur.method === 2 && cur.competitionStageContentSetting && cur.competitionStageContentSetting.whetherToUploadFiles)
this.$router.push(`archList?id=${this.id}&stageId=${row.stageId}&method=${row.method}&competitionType=${row.competitionType}&showFile=${showFile}`)
} }
} }
}; };

@ -1,13 +1,17 @@
<template> <template>
<div> <div>
<el-card shadow="hover" class="m-b-20 head-card"> <el-card shadow="hover"
class="m-b-20 head-card">
<div class="flex-between m-b-20"> <div class="flex-between m-b-20">
<el-page-header @back="$router.back()" content="成绩管理"></el-page-header> <el-page-header @back="$router.back()"
content="成绩管理"></el-page-header>
</div> </div>
</el-card> </el-card>
<el-card v-if="method != 2" shadow="hover" class="m-b-20"> <el-card v-if="method != 2"
shadow="hover"
class="m-b-20">
<div class="stat"> <div class="stat">
<div class="nums"> <div class="nums">
<div class="item"> <div class="item">
@ -19,66 +23,203 @@
<p class="val">{{ avgScore }}</p> <p class="val">{{ avgScore }}</p>
</div> </div>
</div> </div>
<div class="chart" id="chart"></div> <div class="chart"
id="chart"></div>
</div> </div>
</el-card> </el-card>
<el-card shadow="hover" class="m-b-20"> <el-card shadow="hover"
class="m-b-20">
<div v-if="showFile"
class="tabs m-b-20">
<a class="item"
v-for="(item, i) in tabs"
:key="i"
:class="{active: i === active}"
@click="tabChange(i)">{{ item }}</a>
</div>
<div class="flex-between m-b-20"> <div class="flex-between m-b-20">
<div> <div>
<el-input <el-input size="small"
size="small"
placeholder="请输入学校/学生姓名" placeholder="请输入学校/学生姓名"
prefix-icon="el-icon-search" prefix-icon="el-icon-search"
v-model="keyword" clearable v-model="keyword"
style="width: 300px" clearable
></el-input> style="width: 300px"></el-input>
</div> </div>
<div> <div v-if="!active">
<el-button v-if="method == 2" type="primary" @click="batchImport">上传成绩</el-button> <el-button v-if="method == 2"
<el-button type="primary" @click="delAllData">批量删除</el-button> type="primary"
<el-button type="primary" @click="exportData">导出</el-button> @click="batchImport">上传成绩</el-button>
<el-button type="primary"
@click="delAllData">批量删除</el-button>
<el-button type="primary"
@click="exportData">导出</el-button>
</div> </div>
<div v-else>
<el-button type="primary"
@click="exportData1">批量导出</el-button>
</div> </div>
<el-table :data="list" class="table" ref="table" stripe header-align="center" @selection-change="handleSelectionChange" row-key="reportId"> </div>
<el-table-column type="selection" width="55" align="center" :reserve-selection="true"></el-table-column> <template v-if="!active">
<el-table-column type="index" width="60" label="序号" align="center"> <el-table :data="list"
class="table"
ref="table"
stripe
header-align="center"
@selection-change="handleSelectionChange"
row-key="reportId">
<el-table-column type="selection"
width="55"
align="center"
:reserve-selection="true"></el-table-column>
<el-table-column type="index"
width="60"
label="序号"
align="center">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.$index + (page - 1) * pageSize + 1 }} {{ scope.$index + (page - 1) * pageSize + 1 }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="schoolName" label="学校" min-width="150" align="center"></el-table-column> <el-table-column prop="schoolName"
<el-table-column v-if="competitionType" prop="teamName" label="团队名称" min-width="100" align="center"></el-table-column> label="学校"
<el-table-column prop="userName" label="学生姓名" min-width="100" align="center"></el-table-column> min-width="150"
<el-table-column prop="workNumber" label="学号" min-width="100" align="center"></el-table-column> align="center"></el-table-column>
<el-table-column prop="score" label="分数" width="90" align="center"></el-table-column> <el-table-column v-if="competitionType"
<el-table-column prop="timeSum" label="耗时" width="90" align="center"> prop="teamName"
label="团队名称"
min-width="100"
align="center"></el-table-column>
<el-table-column prop="userName"
label="学生姓名"
min-width="100"
align="center"></el-table-column>
<el-table-column prop="workNumber"
label="学号"
min-width="100"
align="center"></el-table-column>
<el-table-column prop="score"
label="分数"
width="90"
align="center"></el-table-column>
<el-table-column prop="timeSum"
label="耗时"
width="90"
align="center">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.timeSum }}min {{ scope.row.timeSum }}min
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="submitTime" label="提交时间" min-width="150" align="center"> <el-table-column prop="submitTime"
label="提交时间"
min-width="150"
align="center">
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" width="160"> <el-table-column label="操作"
align="center"
width="160">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button v-if="scope.row.reportId" type="text" @click="show(scope.row)">查看成绩报告</el-button> <el-button v-if="scope.row.reportId"
<el-button type="text" @click="handleDelete(scope.row)">删除</el-button> type="text"
@click="show(scope.row)">查看成绩报告</el-button>
<el-button type="text"
@click="handleDelete(scope.row)">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div class="pagination"> <div class="pagination">
<el-pagination background layout="total, prev, pager, next" :total="total" @current-change="handleCurrentChange" :current-page="page"> <el-pagination background
layout="total, prev, pager, next"
:total="total"
@current-change="handleCurrentChange"
:current-page="page">
</el-pagination> </el-pagination>
</div> </div>
</template>
<template v-else>
<el-table :data="list1"
class="table"
:key="2"
stripe
header-align="center"
@selection-change="handleSelectionChange1"
row-key="reportId">
<el-table-column type="selection"
width="55"
align="center"
:reserve-selection="true"></el-table-column>
<el-table-column type="index"
width="60"
label="序号"
align="center">
<template slot-scope="scope">
{{ scope.$index + (page1 - 1) * pageSize + 1 }}
</template>
</el-table-column>
<el-table-column prop="schoolName"
label="学校"
align="center"></el-table-column>
<el-table-column v-if="competitionType"
prop="teamName"
label="团队名称"
align="center"></el-table-column>
<el-table-column prop="userName"
label="学生姓名"
align="center"></el-table-column>
<el-table-column prop="workNumber"
label="学号"
align="center"></el-table-column>
<el-table-column prop="fileName"
label="文件名"
align="center"></el-table-column>
<el-table-column prop="fileSize"
label="文件大小"
align="center"></el-table-column>
<el-table-column prop="fileFormat"
label="文件类型"
align="center"></el-table-column>
<el-table-column prop="fileFormat"
label="文件格式"
align="center"></el-table-column>
<el-table-column prop="createTime"
label="提交时间"
width="150"
align="center">
</el-table-column>
<el-table-column label="操作"
align="center"
width="160">
<template slot-scope="scope">
<el-button v-if="!isCompress(scope.row.fileFormat)"
type="text"
@click="preview(scope.row)">预览文件</el-button>
<el-button type="text"
@click="exportFile(scope.row)">导出文件</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination background
layout="total, prev, pager, next"
:total="total1"
@current-change="handleCurrentChange1"
:current-page="page1">
</el-pagination>
</div>
</template>
</el-card> </el-card>
<el-dialog title="批量导入" :visible.sync="importVisible" width="24%" :close-on-click-modal="false"> <el-dialog title="批量导入"
:visible.sync="importVisible"
width="24%"
:close-on-click-modal="false">
<div style="text-align: center"> <div style="text-align: center">
<div style="margin-bottom: 10px;"> <div style="margin-bottom: 10px;">
<el-button type="primary" @click="download">模板下载<i class="el-icon-download el-icon--right"></i></el-button> <el-button type="primary"
@click="download">模板下载<i class="el-icon-download el-icon--right"></i></el-button>
</div> </div>
<el-upload <el-upload ref="importStaff"
ref="importStaff"
name="file" name="file"
accept=".xls,.xlsx" accept=".xls,.xlsx"
:on-remove="handleRemove" :on-remove="handleRemove"
@ -94,15 +235,21 @@
competitionId: this.id, competitionId: this.id,
stageId: this.stageId, stageId: this.stageId,
systemId: 0 systemId: 0
}" }">
> <el-button type="primary"
<el-button type="primary" class="ml20">上传文件<i class="el-icon-upload2 el-icon--right"></i></el-button> class="ml20">上传文件<i class="el-icon-upload2 el-icon--right"></i></el-button>
</el-upload> </el-upload>
<el-link v-if="uploadFaild" type="primary" @click="showFaild">部分数据导入失败查看失败原因</el-link> <el-link v-if="uploadFaild"
type="primary"
@click="showFaild">部分数据导入失败查看失败原因</el-link>
</div> </div>
<span slot="footer" class="dialog-footer"> <span slot="footer"
<el-button size="small" @click="importVisible = false"> </el-button> class="dialog-footer">
<el-button size="small" type="primary" @click="uploadSure"> </el-button> <el-button size="small"
@click="importVisible = false"> </el-button>
<el-button size="small"
type="primary"
@click="uploadSure"> </el-button>
</span> </span>
</el-dialog> </el-dialog>
</div> </div>
@ -114,12 +261,14 @@ import util from "@/libs/util";
import * as echarts from "echarts"; import * as echarts from "echarts";
import axios from 'axios'; import axios from 'axios';
export default { export default {
data() { data () {
return { return {
id: +this.$route.query.id, id: +this.$route.query.id,
stageId: +this.$route.query.stageId, stageId: +this.$route.query.stageId,
method: +this.$route.query.method, method: +this.$route.query.method,
competitionType: +this.$route.query.competitionType, competitionType: +this.$route.query.competitionType,
showFile: this.$route.query.showFile === 'true',
isCompress: util.isCompress,
keyword: "", keyword: "",
searchTimer: null, searchTimer: null,
list: [], list: [],
@ -127,6 +276,12 @@ export default {
page: 1, page: 1,
pageSize: 10, pageSize: 10,
total: 0, total: 0,
list1: [],
multipleSelection1: [],
page1: 1,
total1: 0,
totalNumber: 0, // totalNumber: 0, //
avgScore: 0, // avgScore: 0, //
importVisible: false, importVisible: false,
@ -136,22 +291,37 @@ export default {
headers: { headers: {
token: util.local.get(Setting.tokenKey) token: util.local.get(Setting.tokenKey)
}, },
statData: {} statData: {},
tabs: ['成绩列表', '文件列表'],
active: 0
}; };
}, },
watch: { watch: {
keyword: function(val) { keyword: function (val) {
clearTimeout(this.searchTimer); clearTimeout(this.searchTimer);
this.searchTimer = setTimeout(() => { this.searchTimer = setTimeout(() => {
this.initData(); this.initData();
}, 500); }, 500);
} }
}, },
mounted() { mounted () {
this.getData() this.getData()
}, },
methods: { methods: {
getData() { getData () {
//
if (this.active) {
this.$post(this.api.cCompetitionStageFileList, {
pageNum: this.page1,
pageSize: this.pageSize,
competitionId: this.id,
stageId: this.stageId,
keyWord: this.keyword,
}).then(({ data }) => {
this.list1 = data.records
this.total1 = data.total
}).catch(res => { })
} else { //
this.$post(this.api.stageGradeManagementList, { this.$post(this.api.stageGradeManagementList, {
pageNum: this.page, pageNum: this.page,
pageSize: this.pageSize, pageSize: this.pageSize,
@ -166,18 +336,19 @@ export default {
this.avgScore = (+data.avgScore).toFixed(2) this.avgScore = (+data.avgScore).toFixed(2)
this.totalNumber = data.totalNumber this.totalNumber = data.totalNumber
this.getChart() this.getChart()
}).catch(res => {}) }).catch(res => { })
}
}, },
initData() { initData () {
this.page = 1 this.page = 1
this.getData() this.getData()
}, },
// //
show(row) { show (row) {
this.$router.push(`/match/report?reportId=${row.reportId}`) this.$router.push(`/match/report?reportId=${row.reportId}`)
}, },
// () // ()
exportData() { exportData () {
// id // id
if (this.multipleSelection.length) { if (this.multipleSelection.length) {
const ids = this.multipleSelection.map(e => e.reportId) const ids = this.multipleSelection.map(e => e.reportId)
@ -187,10 +358,32 @@ export default {
headers: this.headers, headers: this.headers,
responseType: 'blob' responseType: 'blob'
}).then((res) => { }).then((res) => {
util.downloadFileDirect(`赛事成绩.xls`,new Blob([res.data])) util.downloadFileDirect(`赛事成绩.xls`, new Blob([res.data]))
}).catch(res => {}) }).catch(res => { })
},
// ()
exportData1 () {
// id
let ids
if (this.multipleSelection1.length) {
ids = this.multipleSelection1.map(e => e.id)
}
const data = {
pageNum: 1,
pageSize: 1000,
competitionId: this.id,
stageId: this.stageId,
}
if (ids) data.ids = ids
axios.post(this.api.derive, data, {
headers: this.headers,
responseType: 'blob'
}).then((res) => {
console.log("🚀 ~ file: matchArchList.vue:378 ~ exportData1 ~ res:", res)
util.downloadFileDirect(`批量导出.zip`, new Blob([res.data]))
}).catch(res => { })
}, },
handleDelete(row) { // handleDelete (row) { //
this.$confirm("确定要删除吗?", "提示", { this.$confirm("确定要删除吗?", "提示", {
type: "warning" type: "warning"
}).then(() => { }).then(() => {
@ -206,7 +399,7 @@ export default {
}).catch(() => { }).catch(() => {
}); });
}, },
delAllData() { // delAllData () { //
if (this.multipleSelection.length) { if (this.multipleSelection.length) {
this.$confirm("该项目下的所有成绩报告将会删除,是否继续?", "提示", { this.$confirm("该项目下的所有成绩报告将会删除,是否继续?", "提示", {
type: "warning" type: "warning"
@ -231,14 +424,22 @@ export default {
util.errorMsg("请先选择数据 !"); util.errorMsg("请先选择数据 !");
} }
}, },
handleSelectionChange(val) { // handleSelectionChange (val) { //
this.multipleSelection = val; this.multipleSelection = val;
}, },
handleCurrentChange(val) { // handleCurrentChange (val) { //
this.page = val; this.page = val;
this.getData(); this.getData();
}, },
getChart() { // 线
handleSelectionChange1 (val) { //
this.multipleSelection1 = val;
},
handleCurrentChange1 (val) { //
this.page1 = val;
this.getData();
},
getChart () { // 线
const data = [] const data = []
const { statData } = this const { statData } = this
for (let i = 1; i <= 10; i++) { for (let i = 1; i <= 10; i++) {
@ -269,31 +470,31 @@ export default {
}); });
}, },
// //
batchImport() { batchImport () {
this.importVisible = true this.importVisible = true
this.uploadList = [] this.uploadList = []
this.uploadFaild = false this.uploadFaild = false
}, },
// //
download() { download () {
location.href = this.api.gradeImport location.href = this.api.gradeImport
}, },
// //
handleExceed(files, fileList) { handleExceed (files, fileList) {
util.warningMsg( util.warningMsg(
`当前限制选择 1 个文件,如需更换,请删除上一个文件再重新选择!` `当前限制选择 1 个文件,如需更换,请删除上一个文件再重新选择!`
) )
}, },
// //
showFaild() { showFaild () {
axios.get(`${this.api.performanceExportFailure}?exportCode=${this.exportCode}`, { axios.get(`${this.api.performanceExportFailure}?exportCode=${this.exportCode}`, {
headers: this.headers, headers: this.headers,
responseType: 'blob' responseType: 'blob'
}).then((res) => { }).then((res) => {
util.downloadFileDirect(`批量导入成绩管理失败数据导出.xls`, new Blob([res.data])) util.downloadFileDirect(`批量导入成绩管理失败数据导出.xls`, new Blob([res.data]))
}).catch(res => {}) }).catch(res => { })
}, },
uploadSuccess(res, file, fileList) { uploadSuccess (res, file, fileList) {
this.uploadFaild = false this.uploadFaild = false
if (res.status === 200) { if (res.status === 200) {
if (res.data.exportCode) { if (res.data.exportCode) {
@ -305,30 +506,43 @@ export default {
res.message ? util.errorMsg(res.message) : util.errorMsg("上传失败,请检查数据") res.message ? util.errorMsg(res.message) : util.errorMsg("上传失败,请检查数据")
} }
}, },
uploadError(err, file, fileList) { uploadError (err, file, fileList) {
this.$message({ this.$message({
message: "上传出错,请重试!", message: "上传出错,请重试!",
type: "error", type: "error",
center: true center: true
}) })
}, },
beforeRemove(file, fileList) { beforeRemove (file, fileList) {
return this.$confirm(`确定移除 ${file.name}`) return this.$confirm(`确定移除 ${file.name}`)
}, },
handleRemove(file, fileList) { handleRemove (file, fileList) {
this.uploadList = fileList this.uploadList = fileList
this.uploadFaild = false this.uploadFaild = false
}, },
uploadSure() { uploadSure () {
this.importVisible = false this.importVisible = false
this.getData() this.getData()
} },
// tab
tabChange (i) {
this.active = i
this.getData()
},
//
preview (item) {
window.open((util.isDoc(item.fileFormat) ? 'https://view.officeapps.live.com/op/view.aspx?src=' : '') + item.filePath)
},
//
exportFile (item) {
util.downloadFile(item.userName + '-' + item.fileName, item.filePath)
},
} }
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
/deep/ .head-card { /deep/ .head-card {
.el-card__body { .el-card__body {
padding-bottom: 0px; padding-bottom: 0px;

@ -220,7 +220,7 @@
:type.sync="projectManage.experimentHintType" :type.sync="projectManage.experimentHintType"
radio radio
:minHeight="150" :minHeight="150"
:height="150" :height="400"
:index="3" /> :index="3" />
</el-form-item> </el-form-item>
</el-form> </el-form>

@ -25,10 +25,10 @@
<template v-if="curriculumList.length"> <template v-if="curriculumList.length">
<template v-for="(item,i) in curriculumList"> <template v-for="(item,i) in curriculumList">
<div class="item" <div class="item"
:title="item.curriculumName" :title="item.goodsName"
@click="goPreview(item)" @click="goPreview(item)"
:key="i" :key="i"
v-if="!keyword || item.curriculumName.includes(keyword)"> v-if="!keyword || item.goodsName.includes(keyword)">
<div v-if="isSq" <div v-if="isSq"
class="cover" class="cover"
:style="{backgroundImage: 'url(/images/' + i + '.png)'}"></div> :style="{backgroundImage: 'url(/images/' + i + '.png)'}"></div>

@ -30,7 +30,7 @@ if (isPro) {
uploadURL = `http://121.37.12.51/` uploadURL = `http://121.37.12.51/`
host = "http://121.37.12.51/"; // 中台测试服 host = "http://121.37.12.51/"; // 中台测试服
// host = 'https://www.occupationlab.com/' // 正式服 // host = 'https://www.occupationlab.com/' // 正式服
// host = "http://192.168.31.217:9000/"; // 榕 host = "http://192.168.31.217:9000/"; // 榕
// host = 'http://192.168.31.51:9000/'; // 赓 // host = 'http://192.168.31.51:9000/'; // 赓
} else if (isSq) { } else if (isSq) {
zcPath = `10.20.100.204:8883` zcPath = `10.20.100.204:8883`

Loading…
Cancel
Save