模型、消息通知

Branch_d40a2540
yujialong 2 years ago
parent 690554178d
commit 743ff5e560
  1. 6
      src/api/index.js
  2. 19
      src/layouts/header/index.vue
  3. 6
      src/pages/expSystem/backstage/addModel.vue
  4. 30
      src/pages/expSystem/backstage/model.vue
  5. 10
      src/pages/expSystem/backstage/modelType.vue
  6. 142
      src/pages/expSystem/backstage/sourceModel.vue
  7. 95
      src/pages/expSystem/backstage/sourceType.vue
  8. 832
      src/pages/match/list/index.vue
  9. 30
      src/pages/match/manage/matchRank.vue
  10. 36
      src/pages/station/preview/index.vue

@ -232,6 +232,9 @@ export default {
toggleTheSortingMode: `competition/competition/rank/toggleTheSortingMode`, toggleTheSortingMode: `competition/competition/rank/toggleTheSortingMode`,
selectTheLastSortStatus: `competition/competition/rank/selectTheLastSortStatus`, selectTheLastSortStatus: `competition/competition/rank/selectTheLastSortStatus`,
cancelImport: `competition/competition/rank/cancelImport`, cancelImport: `competition/competition/rank/cancelImport`,
addCompetitionStageRankingTime: `competition/competitionReleaseTime/addCompetitionStageRankingTime`,
cancelCompetitionStageRankingTime: `competition/competitionReleaseTime/cancelCompetitionStageRankingTime`,
getCompetitionStageRankingTime: `competition/competitionReleaseTime/getCompetitionStageRankingTime`,
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`,
@ -434,6 +437,9 @@ export default {
referenceDemoList: `nakadai/nakadai/model/reference/demo/referenceDemoList`, referenceDemoList: `nakadai/nakadai/model/reference/demo/referenceDemoList`,
getAllModelList: `nakadai/nakadai/model/reference/demo/getAllModelList`, getAllModelList: `nakadai/nakadai/model/reference/demo/getAllModelList`,
synchronizationMdel: `nakadai/nakadai/model/reference/demo/synchronizationMdel`, synchronizationMdel: `nakadai/nakadai/model/reference/demo/synchronizationMdel`,
builtInClassificationByNakadai: `nakadai/nakadai/model/reference/builtInClassificationByNakadai`,
disableModelDemo: `nakadai/nakadai/model/demo/disabledEvents`,
synchronizationMdelByOccupationlab: `nakadai/nakadai/model/reference/demo/synchronizationMdelByOccupationlab`,
// 教师评语 // 教师评语
addComment: `evaluation/cevaluation/comment/addComment`, addComment: `evaluation/cevaluation/comment/addComment`,

@ -73,7 +73,7 @@
<script> <script>
import { mapState, mapMutations, mapActions } from "vuex"; import { mapState, mapMutations, mapActions } from "vuex";
import util from "@/libs/util"; import util from "@/libs/util";
import Setting from "@/setting";
export default { export default {
data () { data () {
return { return {
@ -83,7 +83,8 @@ export default {
newPassword: "", newPassword: "",
reNewPassword: "" reNewPassword: ""
}, },
notices: [] notices: [],
noticeTimer: null
}; };
}, },
computed: { computed: {
@ -120,11 +121,15 @@ export default {
}, },
// //
getNotice () { getNotice () {
this.$get(this.api.messageNotificationList, { if (!Setting.isDev) {
type: 2 this.noticeTimer = setInterval(() => {
}).then(res => { this.$get(this.api.messageNotificationList, {
this.notices = res.notificationList type: 2
}).catch(res => { }); }).then(res => {
this.notices = res.notificationList
}).catch(res => { });
}, 1000)
}
}, },
// //
toComment (item) { toComment (item) {

@ -114,9 +114,7 @@ export default {
}, },
// //
getType () { getType () {
this.$post(this.api.sourceModelClassification, { this.$post(this.api.sourceModelClassification + '?founder=1').then(({ data }) => {
founder: 1
}).then(({ data }) => {
// children // children
const handleLeaf = list => { const handleLeaf = list => {
list.map(e => { list.map(e => {
@ -128,7 +126,7 @@ export default {
}) })
} }
handleLeaf(data) handleLeaf(data)
this.categoryList = data this.categoryList = data[0].children
if (this.id) { if (this.id) {
this.getData() this.getData()
} else { } else {

@ -120,7 +120,8 @@ export default {
modelVisible: false, modelVisible: false,
modelLoading: false, modelLoading: false,
modelData: [], modelData: [],
submiting: false submiting: false,
timer: null
}; };
}, },
components: { components: {
@ -134,14 +135,19 @@ export default {
}, 500) }, 500)
} }
}, },
mounted () { }, mounted () {
this.$once('hook:beforeDestroy', function () {
clearInterval(this.timer)
})
},
methods: { methods: {
getData () { getList () {
const curNode = this.$refs.tree.$refs.tree.getCurrentNode() // const curNode = this.$refs.tree.$refs.tree.getCurrentNode() //
this.isTopLevel = !curNode.level && curNode.categoryName === '全部' this.isTopLevel = !curNode.level
// //
if (this.isTopLevel) { if (this.isTopLevel) {
this.$post(this.api.getAllModelList, { this.$post(this.api.getAllModelList, {
founder: 1,
modelName: this.keyword, modelName: this.keyword,
pageNum: this.page, pageNum: this.page,
pageSize: this.pageSize, pageSize: this.pageSize,
@ -163,6 +169,11 @@ export default {
}).catch(res => { }) }).catch(res => { })
} }
}, },
getData () {
clearInterval(this.timer)
this.getList()
// this.timer = setInterval(this.getList, 1000)
},
initData () { initData () {
this.$refs.table.clearSelection() this.$refs.table.clearSelection()
this.page = 1 this.page = 1
@ -176,6 +187,7 @@ export default {
this.modelLoading = true this.modelLoading = true
// //
this.$post(this.api.getAllModelList, { this.$post(this.api.getAllModelList, {
founder: 1,
pageNum: 1, pageNum: 1,
pageSize: 10000, pageSize: 10000,
systemId: this.systemId systemId: this.systemId
@ -183,9 +195,7 @@ export default {
const modelList = res.data.records const modelList = res.data.records
// //
this.$post(this.api.sourceModelClassification, { this.$post(this.api.sourceModelClassification + '?founder=1').then(res => {
founder: 1
}).then(res => {
let { data } = res let { data } = res
const promises = [] const promises = []
const addType = list => { const addType = list => {
@ -196,7 +206,11 @@ export default {
this.$post(this.api.sysModelDemoList, { this.$post(this.api.sysModelDemoList, {
pageNum: 1, pageNum: 1,
pageSize: 10000, pageSize: 10000,
categoryId: e.id categoryId: e.id,
founder: 1,
postStatus: 1,
isOpen: 0,
ztOpen: 0
}).then(res => { }).then(res => {
const { records } = res.data const { records } = res.data
const modelChildren = [] const modelChildren = []

@ -103,7 +103,7 @@ export default {
methods: { methods: {
// //
getType () { getType () {
this.$post(`${this.api.modelClassList}?systemId=${this.systemId}`).then(res => { this.$post(`${this.api.modelClassList}?systemId=${this.systemId}&founder=1`).then(res => {
const { data } = res const { data } = res
this.orgList = data this.orgList = data
data.length && this.$nextTick(() => { data.length && this.$nextTick(() => {
@ -142,8 +142,8 @@ export default {
}, },
syncModelData () { syncModelData () {
// //
this.$post(`${this.api.delModelInfoBySystemId}?systemId=${this.systemId}`).then(res => { this.$post(`${this.api.delModelInfoBySystemId}?systemId=${this.systemId}&founder=1`).then(res => {
this.$post(`${this.api.synchronizationMdel}?systemId=${this.systemId}`).then(res => { this.$post(`${this.api.synchronizationMdelByOccupationlab}?systemId=${this.systemId}`).then(res => {
this.$router.push({ this.$router.push({
path: 'backstage', path: 'backstage',
query: { query: {
@ -169,9 +169,7 @@ export default {
// //
async addData (id) { async addData (id) {
// //
this.$post(this.api.sourceModelClassification, { this.$post(this.api.sourceModelClassification + '?founder=1').then(res => {
founder: 1
}).then(res => {
const { data } = res const { data } = res
const systemId = this.systemId const systemId = this.systemId
const promises = [] const promises = []

@ -17,7 +17,7 @@
clearable></el-input> clearable></el-input>
</li> </li>
</ul> </ul>
<div> <div v-if="!isSystem">
<el-button type="primary" <el-button type="primary"
round round
@click="add">新增模型</el-button> @click="add">新增模型</el-button>
@ -54,9 +54,14 @@
label="分类" label="分类"
width="150" width="150"
align="center"></el-table-column> align="center"></el-table-column>
<el-table-column prop="modifyName" <el-table-column v-if="isTopLevel || !isSystem"
prop="modifyName"
label="编辑人" label="编辑人"
align="center"></el-table-column> align="center">
<template slot-scope="scope">
{{ isSystem ? '系统' : scope.row.modifyName }}
</template>
</el-table-column>
<el-table-column prop="updateTime" <el-table-column prop="updateTime"
label="最新编辑时间" label="最新编辑时间"
width="150" width="150"
@ -66,10 +71,13 @@
width="100" width="100"
align="center"> align="center">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.postStatus ? '已发布' : '草稿' }} {{ isSystem ?
(scope.row.isOpen ? '禁用' : '启用') :
(scope.row.postStatus ? '已发布' : '草稿') }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" <el-table-column v-if="!isSystem"
label="操作"
width="230"> width="230">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="text" <el-button type="text"
@ -110,7 +118,9 @@ export default {
page: +this.$route.query.page || 1, page: +this.$route.query.page || 1,
pageSize: 10, pageSize: 10,
total: 0, total: 0,
multipleSelection: [] multipleSelection: [],
isSystem: 0, //
timer: null
}; };
}, },
components: { components: {
@ -125,42 +135,54 @@ export default {
} }
}, },
mounted () { mounted () {
this.$once('hook:beforeDestroy', function () {
clearInterval(this.timer)
})
}, },
methods: { methods: {
// //
getData () { async getList (school = 0) {
const curNode = this.$refs.tree.$refs.tree.getCurrentNode() // this.isSystem = school
const curNode = this.$refs.tree.$refs[school ? 'systemTree' : 'tree'].getCurrentNode() || {}//
this.isTopLevel = !curNode.level this.isTopLevel = !curNode.level
// let res
// if (!curNode.level) { //
// this.$post(this.api.getAllModelListBySys, { if (school) {
// modelName: this.keyword, //
// pageNum: this.page, const data = {
// pageSize: this.pageSize, modelName: this.keyword,
// founder: 1 pageNum: this.page,
// }).then(res => { pageSize: this.pageSize,
// this.listData = res.data.records systemId: this.systemId,
// this.total = res.data.total founder: 0
// }).catch(res => { }) }
// } else { if (curNode.level) data.categoryId = curNode.id
this.$post(this.api.InstitutionSourceModel, { res = await this.$post(this.api[!curNode.level ? 'getAllModelList' : 'referenceDemoList'], data)
modelName: this.keyword, } else {
pageNum: this.page, //
pageSize: this.pageSize, res = await this.$post(this.api.InstitutionSourceModel, {
categoryId: curNode.id, modelName: this.keyword,
systemId: this.systemId, pageNum: this.page,
founder: 1 pageSize: this.pageSize,
}).then(res => { categoryId: curNode.id,
this.listData = res.data.records systemId: this.systemId,
this.total = res.data.total founder: 1
}).catch(res => { }) })
// } }
this.listData = res.data.records
this.total = res.data.total
},
getData (school) {
clearInterval(this.timer)
this.getList(school)
// this.timer = setInterval(() => {
// this.getList(school)
// }, 1000)
}, },
initData () { initData (school) {
this.$refs.table.clearSelection() this.$refs.table.clearSelection()
this.page = 1 this.page = 1
this.getData() this.getData(school)
}, },
// //
add () { add () {
@ -183,24 +205,6 @@ export default {
this.$message.error("请先选择模型 !") this.$message.error("请先选择模型 !")
} }
}, },
//
batchOff (isOpen) {
const off = isOpen === 0
if (this.multipleSelection.length) {
//
let ids = this.multipleSelection.map(e => e.id)
this.$confirm(`确定要${off ? '启用' : '禁用'}吗?`, "提示", {
type: "warning"
}).then(() => {
this.$post(`${this.api.bulkDisable}?isOpen=${isOpen}`, ids).then(res => {
this.$message.success(`${off ? '启用' : '禁用'}成功`)
this.getData()
}).catch(res => { })
}).catch(() => { })
} else {
this.$message.error("请先选择模型 !")
}
},
// //
show (row) { show (row) {
this.$router.push(`addModel?categoryId=${this.$refs.tree.$refs.tree.getCurrentKey()}&id=${row.id}&show=1`) this.$router.push(`addModel?categoryId=${this.$refs.tree.$refs.tree.getCurrentKey()}&id=${row.id}&show=1`)
@ -219,8 +223,38 @@ export default {
}).catch(res => { }) }).catch(res => { })
}).catch(() => { }) }).catch(() => { })
}, },
//
batchOff (ztOpen) {
const off = ztOpen === 0
if (this.multipleSelection.length) {
//
let list = []
this.multipleSelection.map(e => {
list.push({
isOpen: ztOpen,
modelId: e.id,
type: 1
})
})
this.$confirm(`确定要${off ? '启用' : '禁用'}吗?`, "提示", {
type: "warning"
}).then(() => {
this.$post(this.api.disableModelDemo, list).then(res => {
this.$message.success(`${off ? '启用' : '禁用'}成功`)
this.getData()
}).catch(res => { })
}).catch(() => { })
} else {
this.$message.error("请先选择模型 !")
}
},
//
switchOff (val, row, index) { switchOff (val, row, index) {
this.$post(`${this.api.bulkDisable}?isOpen=${val}`, [row.id]).then(res => { this.$post(this.api.disableModelDemo, [{
isOpen: val,
modelId: row.id,
type: 1
}]).then(res => {
this.$message.success(val ? '禁用成功' : '启用成功') this.$message.success(val ? '禁用成功' : '启用成功')
}).catch(res => { }) }).catch(res => { })
}, },

@ -1,20 +1,13 @@
<template> <template>
<div> <div>
<div> <div>
<!-- <div class="text-right"> <el-tree :data="orgList"
<el-button type="text" ref="tree"
icon="el-icon-circle-plus-outline" node-key="id"
@click="addType(0)"> highlight-current
</el-button> :expand-on-click-node="false"
</div> --> @node-click="nodeClick"
<org-tree :data="orgList" :props="{children: 'children', label: 'categoryName', isLeaf: 'leaf'}">
default-expand-all
ref="tree"
node-key="id"
highlight-current
:expand-on-click-node="false"
@node-click="getSingle"
:props="{children: 'children', label: 'categoryName', isLeaf: 'leaf'}">
<span class="custom-tree-node" <span class="custom-tree-node"
slot-scope="{ node, data }"> slot-scope="{ node, data }">
<span style="display: inline-block; margin-right: 20px">{{ node.label }}</span> <span style="display: inline-block; margin-right: 20px">{{ node.label }}</span>
@ -35,7 +28,16 @@
</el-button> </el-button>
</span> </span>
</span> </span>
</org-tree> </el-tree>
<el-tree :data="orgListSystem"
ref="systemTree"
node-key="id"
highlight-current
:expand-on-click-node="false"
@node-click="nodeSystemClick"
:props="{children: 'children', label: 'categoryName', isLeaf: 'leaf'}">
</el-tree>
</div> </div>
<el-dialog :title="Form.id ? '编辑分类' : '新增分类'" <el-dialog :title="Form.id ? '编辑分类' : '新增分类'"
@ -69,6 +71,7 @@ export default {
return { return {
systemId: this.$route.query.systemId, systemId: this.$route.query.systemId,
orgList: [], orgList: [],
orgListSystem: [],
typeVisible: false, typeVisible: false,
Form: { Form: {
id: '', id: '',
@ -80,7 +83,7 @@ export default {
categoryName: [ categoryName: [
{ required: true, message: "请输入分类名称", trigger: "blur" } { required: true, message: "请输入分类名称", trigger: "blur" }
] ]
} },
}; };
}, },
components: { components: {
@ -90,27 +93,30 @@ export default {
this.getType() this.getType()
}, },
methods: { methods: {
getType () { async getType () {
this.$post(this.api.sourceModelClassification, { //
founder: 1 const { data } = await this.$post(this.api.sourceModelClassification + '?founder=1')
}).then(res => { this.orgList = data
const { data } = res data.length && this.$nextTick(() => {
this.orgList = data const categoryId = this.$route.query.categoryId
data.length && this.$nextTick(() => { this.$refs.tree.setCurrentKey(categoryId || data[0].id)
const categoryId = this.$route.query.categoryId this.$router.push({
this.$refs.tree.setCurrentKey(categoryId || data[0].id) path: 'backstage',
this.$router.push({ query: {
path: 'backstage', ...this.$route.query,
query: { categoryId: this.$refs.tree.getCurrentKey()
...this.$route.query, }
categoryId: this.$refs.tree.getCurrentKey() }).catch(err => { })
} this.$emit('getData')
}).catch(err => { }) })
this.$emit('getData')
}) //
}).catch(res => { }) const res = await this.$post(`${this.api.builtInClassificationByNakadai}?systemId=${this.systemId}`)
this.orgListSystem = res.data
}, },
getSingle () { //
nodeClick () {
this.$refs.systemTree.setCurrentKey(null)
this.$router.push({ this.$router.push({
path: 'backstage', path: 'backstage',
query: { query: {
@ -120,6 +126,11 @@ export default {
}).catch(err => { }) }).catch(err => { })
this.$emit('initData') this.$emit('initData')
}, },
//
nodeSystemClick () {
this.$refs.tree.setCurrentKey(null)
this.$emit('initData', 1)
},
// //
addType (node, data) { addType (node, data) {
this.typeVisible = true this.typeVisible = true
@ -186,4 +197,16 @@ export default {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.school-create {
padding: 3px 5px 3px 23px;
margin-top: 5px;
font-size: 14px;
cursor: pointer;
&.active {
background-color: #f0f7ff;
}
&:hover {
background-color: #f0f7ff;
}
}
</style> </style>

@ -1,125 +1,207 @@
<template> <template>
<div class="page"> <div class="page">
<h6 class="p-title">筛选</h6> <h6 class="p-title">筛选</h6>
<div class="tool mul"> <div class="tool mul">
<ul class="filter"> <ul class="filter">
<li> <li>
<label>创建时间</label> <label>创建时间</label>
<div class="single-choice"> <div class="single-choice">
<dl> <dl>
<dd> <dd>
<el-radio-group v-model="form.month" @change="changeType"> <el-radio-group v-model="form.month"
<el-radio v-for="(item,index) in dateList" :key="index" :label="item.id" border>{{ item.name }}</el-radio> @change="changeType">
</el-radio-group> <el-radio v-for="(item,index) in dateList"
</dd> :key="index"
</dl> :label="item.id"
</div> border>{{ item.name }}</el-radio>
</li> </el-radio-group>
<li> </dd>
<label>创建区间</label> </dl>
<el-date-picker v-model="date" align="right" unlink-panels type="daterange" start-placeholder="开始日期" end-placeholder="结束日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd" clearable></el-date-picker> </div>
</li> </li>
<li> <li>
<label>搜索</label> <label>创建区间</label>
<el-input placeholder="请输入竞赛名称/创建人" suffix-icon="el-icon-search" v-model="keyword" clearable></el-input> <el-date-picker v-model="date"
</li> align="right"
</ul> unlink-panels
</div> type="daterange"
<div class="tool mul"> start-placeholder="开始日期"
<ul class="filter"> end-placeholder="结束日期"
<li> format="yyyy-MM-dd"
<label>状态</label> value-format="yyyy-MM-dd"
<dl> clearable></el-date-picker>
<dd> </li>
<el-radio-group v-model="form.publishStatus" @change="changeType"> <li>
<el-radio v-for="(item,index) in statuses" :key="index" :label="item.id" border>{{ item.name }}</el-radio> <label>搜索</label>
</el-radio-group> <el-input placeholder="请输入竞赛名称/创建人"
</dd> suffix-icon="el-icon-search"
</dl> v-model="keyword"
</li> clearable></el-input>
</ul> </li>
<div> </ul>
<el-button type="primary" round @click="add" v-auth>创建竞赛</el-button> </div>
<el-button type="primary" round @click="delAllSelection" v-auth>批量删除</el-button> <div class="tool mul">
</div> <ul class="filter">
</div> <li>
<label>状态</label>
<el-table ref="table" :data="matchData" class="table" stripe header-align="center" @selection-change="handleSelectionChange" row-key="id"> <dl>
<el-table-column type="selection" width="55" align="center" :reserve-selection="true"></el-table-column> <dd>
<el-table-column type="index" width="60" label="序号" align="center"> <el-radio-group v-model="form.publishStatus"
<template slot-scope="scope"> @change="changeType">
{{ scope.$index + (page - 1) * pageSize + 1 }} <el-radio v-for="(item,index) in statuses"
</template> :key="index"
</el-table-column> :label="item.id"
<el-table-column prop="competitionName" label="竞赛名称" align="center"></el-table-column> border>{{ item.name }}</el-radio>
<el-table-column prop="applicantNum" label="报名人数" align="center" width="150"></el-table-column> </el-radio-group>
<el-table-column prop="status" label="状态" align="center" width="90"> </dd>
<template slot-scope="scope"> </dl>
{{ scope.row.publishStatus ? '已发布' : '未发布' }} </li>
</template> </ul>
</el-table-column> <div>
<el-table-column prop="time" label="竞赛时间" align="center" width="300"> <el-button type="primary"
<template slot-scope="scope"> round
{{ scope.row.playStartTime }} ~ {{ scope.row.playEndTime }} @click="add"
</template> v-auth>创建竞赛</el-button>
</el-table-column> <el-button type="primary"
<el-table-column prop="createTime" label="创建时间" align="center" width="160"></el-table-column> round
<el-table-column prop="founderName" label="创建人" align="center" width="130"> @click="delAllSelection"
<template slot-scope="scope"> v-auth>批量删除</el-button>
{{ scope.row.founderName || '学校超管' }} </div>
</template> </div>
</el-table-column>
<el-table-column label="操作" align="center" width="170">
<template slot-scope="scope">
<el-button v-if="scope.row.playingStages && scope.row.playingStages.length" type="text" @click="editEndTime(scope.row)" v-auth>修改结束时间</el-button>
<el-button v-auth type="text" @click="manage(scope.row)">管理</el-button>
<el-button v-auth type="text" @click="delData(scope.row)">删除</el-button>
<!-- 列表展示中台的禁启用依据zt_open展示职站的禁启用依据is_open展示 -->
<!-- 中台禁用了这个学校发布的学校这边还能看到但是学校这边不能启用 -->
<el-switch
v-if="scope.row.publishStatus"
v-auth="'禁用'"
v-model="scope.row.isOpen"
:active-value="0"
:inactive-value="1"
style="margin: 0 10px 0 5px"
:active-text="scope.row.isOpen ? '关' : '开'"
@change="switchOff($event,scope.row,scope.$index)"
></el-switch>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination background layout="total, prev, pager, next" :total="total" @current-change="handleCurrentChange" :current-page="page">
</el-pagination>
</div>
<el-dialog title="修改当前阶段结束时间" :visible.sync="modifyVisible" width="900px" :close-on-click-modal="false"> <el-table ref="table"
<el-table :data="curRow.playingStages" class="table" ref="table" stripe header-align="center"> :data="matchData"
<el-table-column prop="stageName" label="阶段名称" min-width="100" align="center"></el-table-column> class="table"
<el-table-column label="竞赛起止时间" width="300" align="center"> stripe
<template slot-scope="scope"> header-align="center"
{{ scope.row.startTime + ' ~ ' + scope.row.endTime }} @selection-change="handleSelectionChange"
</template> row-key="id">
</el-table-column> <el-table-column type="selection"
<el-table-column label="结束时间调整为" align="center" width="280"> width="55"
<template slot-scope="scope"> align="center"
<el-date-picker :reserve-selection="true"></el-table-column>
popper-class="no-atTheMoment" <el-table-column type="index"
v-model="scope.row.newEndTime" width="60"
placeholder="请选择结束时间" label="序号"
type="datetime" align="center">
:picker-options="pickerOptions"> <template slot-scope="scope">
</el-date-picker> {{ scope.$index + (page - 1) * pageSize + 1 }}
</template> </template>
</el-table-column> </el-table-column>
</el-table> <el-table-column prop="competitionName"
<span slot="footer" class="dialog-footer"> label="竞赛名称"
<el-button size="small" @click="modifyVisible = false"> </el-button> align="center"></el-table-column>
<el-button size="small" type="primary" @click="modifySubmit"> </el-button> <el-table-column prop="applicantNum"
</span> label="报名人数"
</el-dialog> align="center"
width="150"></el-table-column>
<el-table-column prop="status"
label="状态"
align="center"
width="90">
<template slot-scope="scope">
{{ scope.row.publishStatus ? '已发布' : '未发布' }}
</template>
</el-table-column>
<el-table-column prop="time"
label="竞赛时间"
align="center"
width="300">
<template slot-scope="scope">
{{ scope.row.playStartTime }} ~ {{ scope.row.playEndTime }}
</template>
</el-table-column>
<el-table-column prop="createTime"
label="创建时间"
align="center"
width="160"></el-table-column>
<el-table-column prop="founderName"
label="创建人"
align="center"
width="130">
<template slot-scope="scope">
{{ scope.row.founderName || '学校超管' }}
</template>
</el-table-column>
<el-table-column label="操作"
align="center"
width="170">
<template slot-scope="scope">
<el-button v-if="scope.row.playingStages && scope.row.playingStages.length"
type="text"
@click="editEndTime(scope.row)"
v-auth>修改结束时间</el-button>
<el-button v-auth
type="text"
@click="manage(scope.row)">管理</el-button>
<el-button v-auth
type="text"
@click="delData(scope.row)">删除</el-button>
<!-- 列表展示中台的禁启用依据zt_open展示职站的禁启用依据is_open展示 -->
<!-- 中台禁用了这个学校发布的学校这边还能看到但是学校这边不能启用 -->
<el-switch v-if="scope.row.publishStatus"
v-auth="'禁用'"
v-model="scope.row.isOpen"
:active-value="0"
:inactive-value="1"
style="margin: 0 10px 0 5px"
:active-text="scope.row.isOpen ? '关' : '开'"
@change="switchOff($event,scope.row,scope.$index)"></el-switch>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination background
layout="total, prev, pager, next"
:total="total"
@current-change="handleCurrentChange"
:current-page="page">
</el-pagination>
</div> </div>
<el-dialog title="修改当前阶段结束时间"
:visible.sync="modifyVisible"
width="900px"
:close-on-click-modal="false">
<el-table :data="curRow.playingStages"
class="table"
ref="table"
stripe
header-align="center">
<el-table-column prop="stageName"
label="阶段名称"
min-width="100"
align="center"></el-table-column>
<el-table-column label="竞赛起止时间"
width="300"
align="center">
<template slot-scope="scope">
{{ scope.row.startTime + ' ~ ' + scope.row.endTime }}
</template>
</el-table-column>
<el-table-column label="结束时间调整为"
align="center"
width="280">
<template slot-scope="scope">
<el-date-picker popper-class="no-atTheMoment"
v-model="scope.row.newEndTime"
placeholder="请选择结束时间"
type="datetime"
:picker-options="pickerOptions">
</el-date-picker>
</template>
</el-table-column>
</el-table>
<span slot="footer"
class="dialog-footer">
<el-button size="small"
@click="modifyVisible = false"> </el-button>
<el-button size="small"
type="primary"
@click="modifySubmit"> </el-button>
</span>
</el-dialog>
</div>
</template> </template>
<script> <script>
@ -129,271 +211,271 @@ import { mapMutations } from "vuex";
import { Loading } from 'element-ui' import { Loading } from 'element-ui'
export default { export default {
name: "match", name: "match",
data() { data () {
return { return {
timer: null, timer: null,
keyword: "", keyword: "",
matchData: [], matchData: [],
statuses: [ statuses: [
{ {
id: '', id: '',
name: '不限' name: '不限'
},
{
id: 0,
name: '待发布'
},
{
id: 1,
name: '已发布'
}
],
form: {
month: "",
publishStatus: "",
startTime: "",
endTime: "",
},
multipleSelection: [],
dateList: [
{
id: "",
name: "不限"
},
{
id: 1,
name: "近一个月"
},
{
id: 3,
name: "近三个月"
},
{
id: 6,
name: "近六个月"
}
],
date: [],
page: +this.$route.query.page || 1,
pageSize: 10,
total: 0,
transferPublishStatus: [ "未发布", "已发布"],
modifyVisible: false,
curRow: {
playingStages: []
},
timer: null,
redisTimer: null,
pickerOptions: {
shortcuts: [{
text: '此刻',
onClick(picker) {
picker.$emit('pick', new Date(Date.now() + 5000))
}
}]
}
};
},
watch: {
"form.month": function(val) {
if (val) {
let unit = 24 * 60 * 60 * 1000;
this.date = [util.formatDate("yyyy-MM-dd", new Date(new Date().getTime() - unit * 30 * val)), util.formatDate("yyyy-MM-dd", new Date(new Date().getTime() + unit))];
} else {
this.date = [];
}
}, },
date: function(val) { {
if (val) { id: 0,
this.form.startTime = val[0]; name: '待发布'
this.form.endTime = val[1];
} else {
this.form.startTime = "";
this.form.endTime = "";
}
this.initData();
}, },
keyword: function(val) { {
clearTimeout(this.searchTimer); id: 1,
this.searchTimer = setTimeout(() => { name: '已发布'
this.initData();
}, 500);
} }
],
form: {
month: "",
publishStatus: "",
startTime: "",
endTime: "",
},
multipleSelection: [],
dateList: [
{
id: "",
name: "不限"
},
{
id: 1,
name: "近一个月"
},
{
id: 3,
name: "近三个月"
},
{
id: 6,
name: "近六个月"
}
],
date: [],
page: +this.$route.query.page || 1,
pageSize: 10,
total: 0,
transferPublishStatus: ["未发布", "已发布"],
modifyVisible: false,
curRow: {
playingStages: []
},
timer: null,
redisTimer: null,
pickerOptions: {
shortcuts: [{
text: '此刻',
onClick (picker) {
picker.$emit('pick', new Date(Date.now() + 5000))
}
}]
}
};
},
watch: {
"form.month": function (val) {
if (val) {
let unit = 24 * 60 * 60 * 1000;
this.date = [util.formatDate("yyyy-MM-dd", new Date(new Date().getTime() - unit * 30 * val)), util.formatDate("yyyy-MM-dd", new Date(new Date().getTime() + unit))];
} else {
this.date = [];
}
}, },
mounted() { date: function (val) {
this.getData() if (val) {
this.$once('hook:beforeDestroy', function() { this.form.startTime = val[0];
clearInterval(this.timer) this.form.endTime = val[1];
clearInterval(this.redisTimer) } else {
}) this.form.startTime = "";
this.form.endTime = "";
}
this.initData();
}, },
methods: { keyword: function (val) {
...mapMutations('match', [ clearTimeout(this.searchTimer);
'setPage' this.searchTimer = setTimeout(() => {
]), this.initData();
getList() { }, 500);
// const load = Loading.service() }
const { form } = this },
this.$post(this.api.competitionPageConditionQueryByOccupationlab, { mounted () {
pageNum: this.page, this.getData()
pageSize: this.pageSize, this.$once('hook:beforeDestroy', function () {
competitionScope: 0, // (0: 1: 2.) clearInterval(this.timer)
endTime: form.endTime || null, clearInterval(this.redisTimer)
keyWord: this.keyword || null, })
platformSource: 1, // (01) },
startTime: form.startTime || null, methods: {
publishStatus: form.publishStatus === '' ? null : form.publishStatus ...mapMutations('match', [
}).then(({ data }) => { 'setPage'
// load.close() ]),
const list = data.records getList () {
// // const load = Loading.service()
this.timer = setInterval(() => { const { form } = this
const now = new Date() this.$post(this.api.competitionPageConditionQueryByOccupationlab, {
list.map(e => { pageNum: this.page,
if (!e.playingStages) { pageSize: this.pageSize,
this.$set(e, 'playingStages', []) competitionScope: 0, // (0: 1: 2.)
} else { endTime: form.endTime || null,
e.playingStages = [] keyWord: this.keyword || null,
} platformSource: 1, // (01)
// startTime: form.startTime || null,
if (now >= new Date(e.playStartTime) && now <= new Date(e.playEndTime)) { publishStatus: form.publishStatus === '' ? null : form.publishStatus
// }).then(({ data }) => {
if (e.competitionStageList) { // load.close()
for (const n of e.competitionStageList) { const list = data.records
// //
if (now >= new Date(n.startTime) && now <= new Date(n.endTime)) { this.timer = setInterval(() => {
e.playingStages.push(n) const now = new Date()
} list.map(e => {
} if (!e.playingStages) {
this.$set(e, 'playingStages', [])
} else {
e.playingStages = []
}
//
if (now >= new Date(e.playStartTime) && now <= new Date(e.playEndTime)) {
//
if (e.competitionStageList) {
for (const n of e.competitionStageList) {
//
if (now >= new Date(n.startTime) && now <= new Date(n.endTime)) {
e.playingStages.push(n)
} }
} }
}) }
}, 1000)
list.map(e => {
if (e.ztOpen) e.isOpen = 1
})
this.matchData = list
this.total = data.total
this.$refs.table.clearSelection()
if (!this.matchData.length && this.total) {
this.page--
this.getData()
} }
}).catch(res => {
// load.close()
})
},
getData() {
this.getList()
},
initData() {
this.page = 1;
this.getData();
},
// redis
getRedis() {
this.$post(this.api.getRedisCacheCompetition).then(({ data }) => {
data && this.getList()
}).catch(res => {})
},
getData() {
this.getList()
// if (!Setting.isDev) {
clearInterval(this.redisTimer)
this.redisTimer = setInterval(this.getRedis, 1000)
// }
},
add() {
this.$router.push("/match/add");
},
//
editEndTime(row) {
this.modifyVisible = true
row.newEndTime = ''
this.curRow = row
},
//
modifySubmit() {
const row = this.curRow
const data = []
row.competitionStageList.map(e => {
const stage = row.playingStages.find(n => n.contentId === e.contentId && n.newEndTime)
if (stage && stage.newEndTime) stage.endTime = this.formatDate('yyyy-MM-dd hh:mm:ss', stage.newEndTime)
data.push(stage || e)
}) })
this.$post(this.api.editCompetitionContent, { }, 1000)
competitionContents: data list.map(e => {
}).then(res => { if (e.ztOpen) e.isOpen = 1
util.successMsg('修改成功') })
this.modifyVisible = false this.matchData = list
this.getData() this.total = data.total
}).catch(err => {}) this.$refs.table.clearSelection()
}, if (!this.matchData.length && this.total) {
manage(row) { this.page--
this.$router.push(`/match/manage?id=${row.id}&name=${row.competitionName}`) this.getData()
}, }
}).catch(res => {
// load.close()
})
},
getData () {
this.getList()
},
initData () {
this.page = 1;
this.getData();
},
// redis
getRedis () {
this.$post(this.api.getRedisCacheCompetition).then(({ data }) => {
data && this.getList()
}).catch(res => { })
},
getData () {
this.getList()
if (!Setting.isDev) {
clearInterval(this.redisTimer)
this.redisTimer = setInterval(this.getRedis, 1000)
}
},
add () {
this.$router.push("/match/add");
},
//
editEndTime (row) {
this.modifyVisible = true
row.newEndTime = ''
this.curRow = row
},
//
modifySubmit () {
const row = this.curRow
const data = []
row.competitionStageList.map(e => {
const stage = row.playingStages.find(n => n.contentId === e.contentId && n.newEndTime)
if (stage && stage.newEndTime) stage.endTime = this.formatDate('yyyy-MM-dd hh:mm:ss', stage.newEndTime)
data.push(stage || e)
})
this.$post(this.api.editCompetitionContent, {
competitionContents: data
}).then(res => {
util.successMsg('修改成功')
this.modifyVisible = false
this.getData()
}).catch(err => { })
},
manage (row) {
this.$router.push(`/match/manage?id=${row.id}&name=${row.competitionName}`)
},
changeType() { changeType () {
this.$refs.table.clearSelection(); this.$refs.table.clearSelection();
this.initData(); this.initData();
}, },
delData(row) { delData (row) {
this.$confirm("此删除操作不可逆,是否确认删除选中项?", "提示", { this.$confirm("此删除操作不可逆,是否确认删除选中项?", "提示", {
type: "warning" type: "warning"
}) })
.then(() => { .then(() => {
this.$post(`${this.api.batchDeleteCompetition}?competitionIds=${row.id}`).then(res => { this.$post(`${this.api.batchDeleteCompetition}?competitionIds=${row.id}`).then(res => {
util.successMsg("删除成功"); util.successMsg("删除成功");
this.getData(); this.getData();
}).catch(res => { }).catch(res => {
}); });
}) })
.catch(() => { .catch(() => {
}); });
}, },
handleSelectionChange(val) { handleSelectionChange (val) {
this.multipleSelection = val; this.multipleSelection = val;
}, },
// //
delAllSelection() { delAllSelection () {
if (this.multipleSelection.length) { if (this.multipleSelection.length) {
this.$confirm("确定要删除吗?", "提示", { this.$confirm("确定要删除吗?", "提示", {
type: "warning" type: "warning"
}).then(() => { }).then(() => {
let ids = this.multipleSelection.map(i => 'competitionIds=' + i.id); let ids = this.multipleSelection.map(i => 'competitionIds=' + i.id);
this.$post(`${this.api.batchDeleteCompetition}?${ids.join('&')}`).then(res => { this.$post(`${this.api.batchDeleteCompetition}?${ids.join('&')}`).then(res => {
this.getData(); this.getData();
this.$message.success("删除成功"); this.$message.success("删除成功");
this.$refs.table.clearSelection() this.$refs.table.clearSelection()
}).catch(err => { }).catch(err => {
}); });
}).catch(() => { }).catch(() => {
}); });
} else { } else {
this.$message.warning("请先选择赛事 !"); this.$message.warning("请先选择赛事 !");
} }
}, },
handleCurrentChange(val) { handleCurrentChange (val) {
this.page = val; this.page = val;
this.$router.push(`list?page=${val}`) this.$router.push(`list?page=${val}`)
this.getData() this.getData()
this.setPage(val) this.setPage(val)
}, },
transferTime(date, type) { transferTime (date, type) {
if (date == "0000-00-00 00:00:00") return "---"; if (date == "0000-00-00 00:00:00") return "---";
return date; return date;
}, },
switchOff(val, row) { switchOff (val, row) {
this.$post(this.api.disabledEventsCompetition, { this.$post(this.api.disabledEventsCompetition, {
competitionId: row.id, competitionId: row.id,
isOpen: val, isOpen: val,
type: 1 // (01) type: 1 // (01)
}).then(res => { }).then(res => {
util.successMsg(val == 1 ? '禁用成功' : '启用成功') util.successMsg(val == 1 ? '禁用成功' : '启用成功')
}).catch(err => {}) }).catch(err => { })
}, },
} }
}; };
</script> </script>
@ -406,7 +488,7 @@ export default {
} }
} }
@media(max-width: 1640px) { @media (max-width: 1640px) {
.page .page-content .tool .filter { .page .page-content .tool .filter {
flex-wrap: wrap; flex-wrap: wrap;
margin-bottom: -15px; margin-bottom: -15px;

@ -40,9 +40,12 @@
<el-button v-if="!published" <el-button v-if="!published"
type="primary" type="primary"
@click="cancelPublish(1)">发布排名</el-button> @click="cancelPublish(1)">发布排名</el-button>
<el-button v-else <div v-else>
<span>{{ publishTime }}发布排名</span>
<el-button class="m-l-5"
type="primary" type="primary"
@click="cancelPublish(0)">取消发布</el-button> @click="cancelPublish(0)">取消发布</el-button>
</div>
</div> </div>
</div> </div>
<el-table :data="list" <el-table :data="list"
@ -236,7 +239,7 @@
@click="publishVisible = false"> </el-button> @click="publishVisible = false"> </el-button>
<el-button size="small" <el-button size="small"
type="primary" type="primary"
@click="publishSubmit"> </el-button> @click="publishTimeSubmit"> </el-button>
</span> </span>
</el-dialog> </el-dialog>
</div> </div>
@ -409,6 +412,7 @@ export default {
stageId: 0, stageId: 0,
stageName: '总分' stageName: '总分'
}) })
this.getPublishTime()
this.getData() this.getData()
}).catch(res => { }); }).catch(res => { });
}, },
@ -416,7 +420,6 @@ export default {
typeChange (val) { typeChange (val) {
this.$post(`${this.api.toggleTheSortingMode}?competitionId=${this.id}&stageId=${this.active || this.stageId}&isOverallRanking=${this.active ? 0 : 1}&whetherToManuallyPublish=${this.type}`).then(res => { }).catch(res => { }) this.$post(`${this.api.toggleTheSortingMode}?competitionId=${this.id}&stageId=${this.active || this.stageId}&isOverallRanking=${this.active ? 0 : 1}&whetherToManuallyPublish=${this.type}`).then(res => { }).catch(res => { })
// this.$post(`${this.api.whetherToPublish}?competitionId=${this.id}&stageId=${this.active || this.stageId}&isOverallRanking=${this.active ? 0 : 1}&publicationType=${this.type}`).then(({ whetherToPublish }) => { // this.$post(`${this.api.whetherToPublish}?competitionId=${this.id}&stageId=${this.active || this.stageId}&isOverallRanking=${this.active ? 0 : 1}&publicationType=${this.type}`).then(({ whetherToPublish }) => {
// if (whetherToPublish && !val) this.sourceType = '0' // if (whetherToPublish && !val) this.sourceType = '0'
this.getRank() this.getRank()
@ -588,9 +591,26 @@ export default {
}).catch(res => { }) }).catch(res => { })
// this.publishSubmit() // this.publishSubmit()
}, },
//
async getPublishTime () {
const res = this.$post(this.api.getCompetitionStageRankingTime, {
competitionId: this.id,
isOverallRanking: this.active ? 0 : 1,
publicationType: this.type,
stageId: this.active || this.stageId,
})
},
// //
publishSubmit () { async publishTimeSubmit () {
this.$post(this.api.addCompetitionStageRankingTime, {
competitionId: this.id,
isOverallRanking: this.active ? 0 : 1,
publicationType: this.type,
stageId: this.active || this.stageId,
releaseTime: util.formatDate("yyyy-MM-dd hh:mm:ss", this.publishTime)
})
util.successMsg('发布成功')
this.publishVisible = false
}, },
// //
cancelPublish (publish) { cancelPublish (publish) {

@ -392,11 +392,11 @@ export default {
data () { data () {
return { return {
editorConfig, editorConfig,
courseId: this.$route.query.courseId, mallId: '',
mallId: this.$route.query.mallId || '', courseId: '',
curriculumName: this.$route.query.curriculumName, curriculumName: '',
commentId: this.$route.query.commentId, // commentId: '', //
notifyId: this.$route.query.notifyId, notifyId: '',
chapter: this.$route.query.chapter, chapter: this.$route.query.chapter,
section: this.$route.query.section, section: this.$route.query.section,
fromAdmin: this.$route.query.admin, // or fromAdmin: this.$route.query.admin, // or
@ -479,6 +479,17 @@ export default {
]) ])
}, },
watch: { watch: {
'$route': {
handler () {
this.mallId = this.$route.query.mallId || ''
this.courseId = +this.$route.query.courseId
this.curriculumName = this.$route.query.curriculumName
this.commentId = this.$route.query.commentId //
this.notifyId = this.$route.query.notifyId
this.init()
},
immediate: true
},
noteKeyword: function (val) { noteKeyword: function (val) {
clearTimeout(this.searchTimer); clearTimeout(this.searchTimer);
this.searchTimer = setTimeout(() => { this.searchTimer = setTimeout(() => {
@ -487,11 +498,7 @@ export default {
} }
}, },
mounted () { mounted () {
this.insertScript(); this.init()
this.getData();
this.addRecord()
this.getNote()
this.getComment()
}, },
methods: { methods: {
goBack () { goBack () {
@ -499,6 +506,13 @@ export default {
this.$router.back() : this.$router.back() :
this.$router.push('/station') this.$router.push('/station')
}, },
init () {
this.insertScript();
this.getData();
this.addRecord()
this.getNote()
this.getComment()
},
async getData () { async getData () {
let { data } = await this.$post(`${this.api.curriculumDetail}?cid=${this.courseId}&mallId=${this.mallId}`); let { data } = await this.$post(`${this.api.curriculumDetail}?cid=${this.courseId}&mallId=${this.mallId}`);
this.courseName = data.curriculumName; this.courseName = data.curriculumName;
@ -654,7 +668,7 @@ export default {
content, content,
pid: row ? row.commentId : 0, pid: row ? row.commentId : 0,
replyAccountId: row.createAccountId || '', replyAccountId: row.createAccountId || '',
status: reply ? 2 : 1 status: row ? 2 : 1
}).then(res => { }).then(res => {
this.comment = '' this.comment = ''
this.getComment() this.getComment()

Loading…
Cancel
Save