yujialong 1 year ago
parent 4544cb7d95
commit ce8cd2d0a7
  1. 275
      src/pages/match/manage/matchInfo.vue
  2. 21
      src/pages/product/list/index.vue
  3. 24
      src/pages/product/show/index.vue

@ -1,27 +1,35 @@
<template>
<div style="padding: 0 100px;">
<el-card shadow="hover" class="m-b-20 head-card">
<el-card shadow="hover"
class="m-b-20 head-card">
<div class="flex-between">
<el-page-header @back="$router.back()" content="参赛信息与成绩"></el-page-header>
<el-page-header @back="$router.back()"
content="参赛信息与成绩"></el-page-header>
</div>
</el-card>
<el-card shadow="hover" class="m-b-20">
<el-card shadow="hover"
class="m-b-20">
<div style="display: flex;align-items: center">
<table v-if="form.completeCompetitionSetup.competitionType" class="table m-b-20 m-r-10">
<table v-if="form.completeCompetitionSetup.competitionType"
class="table m-b-20 m-r-10">
<tr>
<th width="150">团队名称</th>
<td>
<el-input :disabled="!editing" v-model="info.team.teamName"></el-input>
<el-input :disabled="!editing"
v-model="info.team.teamName"></el-input>
</td>
<th width="150">团队邀请码</th>
<td>
<el-input :disabled="!editing" v-model="info.team.invitationCode"></el-input>
<el-input :disabled="!editing"
v-model="info.team.invitationCode"></el-input>
</td>
</tr>
</table>
<div v-if="form.completeCompetitionSetup.competitionType && status < 4" class="m-b-20 text-center">
<el-button type="primary" @click="edit(1)">{{ editing ? '保存' : '编辑' }}</el-button>
<div v-if="form.completeCompetitionSetup.competitionType && status < 4"
class="m-b-20 text-center">
<el-button type="primary"
@click="edit(1)">{{ editing ? '保存' : '编辑' }}</el-button>
</div>
</div>
<table class="table">
@ -48,7 +56,9 @@
<tr>
<th>团队成员</th>
<td>
<el-tag v-for="(item, i) in info.teamDetail" :key="i" style="margin-right: 5px">{{ item.userName }}</el-tag>
<el-tag v-for="(item, i) in info.teamDetail"
:key="i"
style="margin-right: 5px">{{ item.userName }}</el-tag>
</td>
</tr>
</template>
@ -56,17 +66,40 @@
<tr>
<th width="130">指导老师</th>
<td>
<div v-if="status < 5" class="plus">
<i class="el-icon-circle-plus-outline icon" @click="addAdvisor"></i>
<div v-if="status < 5"
class="plus">
<i class="el-icon-circle-plus-outline icon"
@click="addAdvisor"></i>
</div>
<div v-for="(item, i) in info.teamInstructors" :key="i" class="line">
<el-input placeholder="请输入姓名" v-model="item.name" clearable size="mini" :disabled="!item.edit"></el-input>
<el-input placeholder="请输入职务" maxlength="10" v-model="item.position" clearable size="mini" :disabled="!item.edit"></el-input>
<el-input placeholder="请输入手机号" maxlength="11" v-model="item.phone" clearable size="mini" :disabled="!item.edit"></el-input>
<div v-for="(item, i) in info.teamInstructors"
:key="i"
class="line">
<el-input placeholder="请输入姓名"
v-model="item.name"
clearable
size="mini"
:disabled="!item.edit"></el-input>
<el-input placeholder="请输入职务"
maxlength="10"
v-model="item.position"
clearable
size="mini"
:disabled="!item.edit"></el-input>
<el-input placeholder="请输入手机号"
maxlength="11"
v-model="item.phone"
clearable
size="mini"
:disabled="!item.edit"></el-input>
<template v-if="status < 5">
<i v-if="item.edit" class="el-icon-check icon" @click="submitAdvisor(item)"></i>
<i v-else class="el-icon-edit icon" @click="editAdvisor(item)"></i>
<i class="el-icon-delete icon" @click="delAdvisor(item, i)"></i>
<i v-if="item.edit"
class="el-icon-check icon"
@click="submitAdvisor(item)"></i>
<i v-else
class="el-icon-edit icon"
@click="editAdvisor(item)"></i>
<i class="el-icon-delete icon"
@click="delAdvisor(item, i)"></i>
</template>
</div>
</td>
@ -86,15 +119,15 @@
<th>竞赛成绩</th>
</tr>
<template v-if="info.stages.length">
<tr v-for="(item, i) in info.stages" :key="i">
<tr v-for="(item, i) in info.stages"
:key="i">
<td>{{ i + 1 }}</td>
<td>{{ item.stageName }}</td>
<template v-if="form.completeCompetitionSetup.competitionType">
<td>{{ item.teamNumLimit || '不限制' }}</td>
<td>
<template v-if="item.participants">
<el-tag
v-for="tag in item.participants"
<el-tag v-for="tag in item.participants"
:key="tag.name"
class="m-r-5"
closable
@ -102,14 +135,20 @@
{{tag.name}}
</el-tag>
</template>
<span v-else class="m-r-5"></span>
<i class="el-icon-edit icon" @click="selectPar(item)"></i>
<span v-else
class="m-r-5"></span>
<i class="el-icon-edit icon"
@click="selectPar(item)"></i>
</td>
</template>
<td v-if="form.rule === 0 && !i" :rowspan="info.stages.length">{{ info.totalScore }}</td>
<td v-if="form.rule === 0 && !i"
:rowspan="info.stages.length">{{ info.totalScore }}</td>
<td>
<span v-if="item.score >= 0" class="m-r-10">分数{{item.score}}</span>
<el-button type="text" :disabled="item.resultsDetails === 1 || (form.completeCompetitionSetup.competitionType && !item.reportId) || (form.completeCompetitionSetup.competitionType === 0 && !item.reportId)" @click="show(item)">查看成绩详情</el-button>
<span v-if="item.score >= 0"
class="m-r-10">分数{{item.score}}</span>
<el-button type="text"
:disabled="item.resultsDetails === 1 || (form.completeCompetitionSetup.competitionType && !item.reportId) || (form.completeCompetitionSetup.competitionType === 0 && !item.reportId)"
@click="show(item)">查看成绩详情</el-button>
</td>
</tr>
</template>
@ -117,8 +156,7 @@
<td colspan="6">暂无数据</td>
</tr>
</table>
<el-alert
v-if="form.completeCompetitionSetup.competitionType"
<el-alert v-if="form.completeCompetitionSetup.competitionType"
style="margin-top: 10px;"
:title="'注:请团长(团队创建人)设置各阶段参赛成员,只有被选择的允许参赛成员可进入对应阶段比赛' + (info.teamLimit ? ',每个团队成员只能参加一个赛项阶段' : '') + '!'"
type="warning"
@ -132,43 +170,86 @@
<div class="l-title m-t-20">团队成员</div>
<div class="flex-center">
<p>队长{{ info.caption.userName }}</p>
<el-button type="primary" @click="transfer">转让队长</el-button>
<el-button type="primary"
@click="transfer">转让队长</el-button>
</div>
<el-table :data="info.teamDetail" stripe header-align="center">
<el-table-column prop="userName" label="成员姓名" min-width="100" align="center"></el-table-column>
<el-table-column prop="schoolName" 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="createTime" label="加入时间" width="180" align="center"></el-table-column>
<el-table-column label="操作" align="center" width="160">
<el-table :data="info.teamDetail"
stripe
header-align="center">
<el-table-column prop="userName"
label="成员姓名"
min-width="100"
align="center"></el-table-column>
<el-table-column prop="schoolName"
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="createTime"
label="加入时间"
width="180"
align="center"></el-table-column>
<el-table-column label="操作"
align="center"
width="160">
<template slot-scope="scope">
<el-button v-if="scope.row.captain" type="text" @click="removeLine(scope.row)">踢出团队</el-button>
<el-button v-if="scope.row.captain"
type="text"
@click="removeLine(scope.row)">踢出团队</el-button>
</template>
</el-table-column>
</el-table>
</template>
</el-card>
<el-dialog title="选择参赛成员" :visible.sync="transferVisible" :close-on-click-modal="false" width="400px">
<el-dialog title="选择参赛成员"
:visible.sync="transferVisible"
:close-on-click-modal="false"
width="400px">
<template v-for="(item, i) in info.teamDetail">
<el-radio v-if="item.captain" :key="i" v-model="checkedPlayer" :label="item.teamId">{{ item.userName }}</el-radio>
<el-radio v-if="item.captain"
:key="i"
v-model="checkedPlayer"
:label="item.teamId">{{ item.userName }}</el-radio>
</template>
<span slot="footer" class="dialog-footer">
<el-button size="small" type="primary" @click="transferSubmit">确定</el-button>
<el-button size="small" @click="transferVisible = false">取消</el-button>
<span slot="footer"
class="dialog-footer">
<el-button size="small"
type="primary"
@click="transferSubmit">确定</el-button>
<el-button size="small"
@click="transferVisible = false">取消</el-button>
</span>
</el-dialog>
<el-dialog title="选择参赛成员" :visible.sync="chooseVisible" :close-on-click-modal="false" width="400px">
<el-dialog title="选择参赛成员"
:visible.sync="chooseVisible"
:close-on-click-modal="false"
width="400px">
<el-checkbox-group v-model="checkedMembers">
<el-checkbox v-for="(item, i) in chooses" :key="i" :label="item.accountId">{{ item.userName }}</el-checkbox>
<el-checkbox v-for="(item, i) in chooses"
:key="i"
:label="item.accountId">{{ item.userName }}</el-checkbox>
</el-checkbox-group>
<p v-if="info.teamLimit && curRow.teamNumLimit" style="margin-top: 15px;font-size: 12px;">当前阶段限制{{ curRow.teamNumLimit }}人参赛且此竞赛每个成员只能参加一个阶段赛项</p>
<span slot="footer" class="dialog-footer">
<el-button size="small" type="primary" @click="chooseSubmit">确定</el-button>
<el-button size="small" @click="chooseVisible = false">取消</el-button>
<p v-if="info.teamLimit && curRow.teamNumLimit"
style="margin-top: 15px;font-size: 12px;">当前阶段限制{{ curRow.teamNumLimit }}人参赛且此竞赛每个成员只能参加一个阶段赛项</p>
<span slot="footer"
class="dialog-footer">
<el-button size="small"
type="primary"
@click="chooseSubmit">确定</el-button>
<el-button size="small"
@click="chooseVisible = false">取消</el-button>
</span>
</el-dialog>
<el-dialog title="团队得分详情" :visible.sync="memberVisible" width="900px" :close-on-click-modal="false">
<h6 v-if="members.length" style="margin-bottom: 10px;font-size: 16px;">团队名称{{ members[0].teamName }} 阶段名称{{ curRow.stageName }}</h6>
<el-dialog title="团队得分详情"
:visible.sync="memberVisible"
width="900px"
:close-on-click-modal="false">
<h6 v-if="members.length"
style="margin-bottom: 10px;font-size: 16px;">团队名称{{ members[0].teamName }} 阶段名称{{ curRow.stageName }}</h6>
<table class="table tc">
<tr>
<th width="60">序号</th>
@ -179,14 +260,16 @@
<th width="100">得分详情</th>
</tr>
<template v-if="members.length">
<tr v-for="(item, i) in members" :key="i">
<tr v-for="(item, i) in members"
:key="i">
<td>{{ i + 1 }}</td>
<td>{{ item.userName }}</td>
<td>{{ item.schoolName }}</td>
<td>{{ item.timeSum }}min</td>
<td>{{ item.score }}</td>
<td>
<el-button type="text" @click="toReport(item)">查看</el-button>
<el-button type="text"
@click="toReport(item)">查看</el-button>
</td>
</tr>
</template>
@ -194,8 +277,11 @@
<td colspan="6">暂无数据</td>
</tr>
</table>
<span slot="footer" class="dialog-footer">
<el-button size="small" type="primary" @click="memberVisible = false">确定</el-button>
<span slot="footer"
class="dialog-footer">
<el-button size="small"
type="primary"
@click="memberVisible = false">确定</el-button>
</span>
</el-dialog>
</div>
@ -205,7 +291,7 @@
import Setting from "@/setting";
import util from "@/libs/util";
export default {
data() {
data () {
return {
id: +this.$route.query.id,
accountId: +this.$route.query.accountId,
@ -263,8 +349,8 @@ export default {
timer: null
};
},
mounted() {
this.$once('hook:beforeDestroy', function() {
mounted () {
this.$once('hook:beforeDestroy', function () {
clearInterval(this.timer)
this.timerList.forEach(n => {
clearTimeout(n)
@ -274,15 +360,15 @@ export default {
this.getData()
},
methods: {
getData() {
getData () {
this.$post(`${this.api.getCompetition}?competitionId=${this.id}`).then(({ competition }) => {
this.form = competition
this.timer = setInterval(this.handleStatus, 1000)
this.getInfo()
}).catch(err => {})
}).catch(err => { })
},
//
getInfo() {
getInfo () {
this.$post(`${this.api.entryInformation}?competitionId=${this.id}&accountId=${this.accountId}`).then(res => {
const info = res.entryInformation
//
@ -326,10 +412,10 @@ export default {
}
})
this.info = info
}).catch(err => {});
}).catch(err => { });
},
//
handleStatus() {
handleStatus () {
let status
const n = this.form
let now = new Date().getTime();
@ -352,7 +438,7 @@ export default {
console.log("🚀 ~ file: matchInfo.vue:350 ~ handleStatus ~ status", status)
},
//
edit(showMsg) {
edit (showMsg) {
if (this.editing || !showMsg) {
const { teamId, teamName, invitationCode } = this.info.team
this.$post(this.api.editCompetitionTeam, {
@ -367,13 +453,13 @@ export default {
this.editing = false
this.getInfo()
showMsg && util.successMsg('保存成功')
}).catch(res => {})
}).catch(res => { })
} else {
this.editing = !this.editing
}
},
//
delAdvisor(row, i) {
delAdvisor (row, i) {
if (row.id) {
this.$confirm('确定要删除吗?', '提示', {
type: 'warning'
@ -381,23 +467,23 @@ export default {
this.$post(`${this.api.deleteAnAdvisor}?id=${row.id}`).then(res => {
util.successMsg('删除成功')
this.getInfo()
}).catch(res => {})
}).catch(() => {})
}).catch(res => { })
}).catch(() => { })
} else {
this.info.teamInstructors.splice(i, 1)
}
},
//
addAdvisor() {
addAdvisor () {
if (this.info.teamInstructors.length > 4) return util.errorMsg('指导老师仅限添加5个!')
this.info.teamInstructors.push(JSON.parse(JSON.stringify(this.originIns)))
},
//
editAdvisor(row) {
editAdvisor (row) {
this.$set(row, 'edit', 1)
},
//
submitAdvisor(row) {
submitAdvisor (row) {
if (!row.name) return util.errorMsg('请输入姓名')
const { phone } = row
if (phone && !/^1[3456789]\d{9}$/.test(phone)) return util.errorMsg('请输入正确手机号格式')
@ -411,10 +497,10 @@ export default {
}).then(res => {
util.successMsg((row.id ? '修改' : '新增') + '成功')
this.getInfo()
}).catch(res => {})
}).catch(res => { })
},
//
transfer() {
transfer () {
//
const now = new Date()
let start = 0
@ -428,7 +514,7 @@ export default {
if (!start) this.transferVisible = true
},
//
transferSubmit() {
transferSubmit () {
if (!this.checkedPlayer) return util.errorMsg('请选择成员')
this.$post(this.api.captainOfTransfer, {
captainId: this.info.caption.teamId,
@ -438,20 +524,20 @@ export default {
util.successMsg('转让成功')
this.transferVisible = false
this.getInfo()
}).catch(res => {})
}).catch(res => { })
},
//
removeLine(row) {
removeLine (row) {
//
const now = new Date()
let start = 0
for (const e of this.form.competitionStage) {
if (now >= new Date(e.startTime) && now <= new Date(e.endTime)) {
util.errorMsg('比赛已经开始,无法踢出成员!')
start = 1
break
}
}
// for (const e of this.form.competitionStage) {
// if (now >= new Date(e.startTime) && now <= new Date(e.endTime)) {
// util.errorMsg('')
// start = 1
// break
// }
// }
if (!start) {
let include
for (const e of this.info.stages) {
@ -469,12 +555,12 @@ export default {
this.$post(`${this.api.removeTheLine}?teamId=${this.info.teamId}&competitionId=${this.id}&accountId=${row.accountId}`).then(res => {
util.successMsg('移除成功')
this.getInfo()
}).catch(res => {})
}).catch(() => {})
}).catch(res => { })
}).catch(() => { })
}
},
//
removePar(e, stage) {
removePar (e, stage) {
this.$confirm('确定要移除该成员吗?', '提示', {
type: 'warning'
}).then(() => {
@ -486,11 +572,11 @@ export default {
}).then(res => {
util.successMsg('移除成功')
this.getInfo()
}).catch(res => {})
}).catch(() => {})
}).catch(res => { })
}).catch(() => { })
},
//
selectPar(row) {
selectPar (row) {
const item = this.form.competitionStage.find(e => e.stageId == row.stageId)
if (item) {
//
@ -523,7 +609,7 @@ export default {
}
},
//
chooseSubmit() {
chooseSubmit () {
const accountIds = this.checkedMembers
if (!accountIds.length) return util.errorMsg('请选择参赛成员!')
const limit = this.curRow.teamNumLimit //
@ -538,10 +624,10 @@ export default {
util.successMsg('修改成功')
this.getInfo()
this.chooseVisible = false
}).catch(res => {})
}).catch(res => { })
},
//
show(row) {
show (row) {
//
if (this.form.completeCompetitionSetup.competitionType) { //
this.curRow = row
@ -556,7 +642,7 @@ export default {
teamId
}).then(({ list }) => {
this.members = list
}).catch(res => {})
}).catch(res => { })
} else {
this.members = []
}
@ -565,7 +651,7 @@ export default {
}
},
//
toReport(row) {
toReport (row) {
this.$router.push(`/match/report?reportId=${row.reportId}`)
},
}
@ -583,7 +669,8 @@ export default {
.table {
width: 100%;
border-collapse: collapse;
th, td {
th,
td {
padding: 12px;
border: 1px solid #ebeef5;
}
@ -600,7 +687,7 @@ export default {
color: #7a7a7a;
cursor: pointer;
&:hover {
color: #007EFF;
color: #007eff;
}
}
.plus {

@ -47,14 +47,19 @@
</div>
<div class="filter">
<dl v-if="curTab == 1">
<dt>学科专业</dt>
<dt>学科类别</dt>
<div class="vals">
<dd :class="{active: categoryId === ''}"
@click="catetoryClick('')">全部</dd>
<dd :class="{active: categoryId === 1}"
style="margin-right: 20px"
@click="catetoryClick(1)">不限</dd>
<div v-for="(item, i) in category"
<dd v-for="(item, i) in category"
:key="i"
:class="{active: categoryId === item.value}"
@click="categoryClick(item, 1)">{{ item.label }}</dd>
<!-- <div v-for="(item, i) in category"
:key="i"
:class="['category-item', {active: item.disciplineId == categoryId}]">
<span class="name"
@ -65,8 +70,8 @@
:options="item.list"
:props="{ checkStrictly: true }"
placeholder=""
@change="id => categoryChange(id, item, i)"></el-cascader>
</div>
@change="id => categoryChange(id, item, i)"></el-cascader> -->
<!-- </div> -->
</div>
</dl>
<dl v-if="curTab == 3">
@ -425,6 +430,14 @@ export default {
e.val = []
})
},
categoryClick (item, i) {
this.clearCategory()
item.val = val
this[i === 1 ? 'categoryId' : i === 2 ? 'professionalCategoryId' : 'professionalId'] = item.disciplineId
this.professionalCategoryId = val[0] || ''
this.professionalId = val[1] || ''
this.initData()
},
categoryChange (val, item, i) {
const name = this.$refs['category' + i][0].getCheckedNodes()[0].pathLabels
console.log("🚀 ~ file: index.vue:431 ~ categoryChange ~ val, item:", val, item, name)

@ -90,7 +90,8 @@
@click="toSystem">进入系统</button>
</div>
</div>
<div class="course">
<div class="course"
id="part0">
<div class="detail">
<ul class="tab">
<li v-for="(tab, i) in tabs"
@ -99,12 +100,10 @@
@click="tabChange(tab)">{{ tab.name }}</li>
</ul>
<div class="courses">
<template v-if="!curTab">
<div class="des"
v-html="form.mall.detailedIntroduction"></div>
</template>
<template v-else>
<div class="chapter"
id="part1"
v-for="(item, i) in chapterList"
:key="i">
<div class="chapterName">{{ item.name }}</div>
@ -143,7 +142,6 @@
</div>
</div>
</div>
</template>
</div>
</div>
<div class="products">
@ -304,6 +302,9 @@ export default {
// tab
tabChange ({ id }) {
this.curTab = id
document.querySelector(`#part${id}`).scrollIntoView({
behavior: 'smooth'
})
},
//
toPreview (i, j) {
@ -470,10 +471,12 @@ export default {
}
}
.tab {
z-index: 100;
position: sticky;
// top: 120px;
display: inline-flex;
margin-left: 10px;
top: 0;
display: flex;
padding: 10px 10px 20px;
background-color: #fff;
li {
position: relative;
margin-right: 20px;
@ -503,11 +506,11 @@ export default {
padding: 20px 24px;
background-color: #fff;
border-radius: 10px;
overflow: hidden;
}
}
.courses {
margin-top: 40px;
padding-top: 10px;
overflow: hidden;
/deep/.des {
div,
p,
@ -521,6 +524,7 @@ export default {
overflow: auto;
}
.chapter {
padding-top: 60px;
margin-bottom: 20px;
}
.chapterName {

Loading…
Cancel
Save