赛赛用户管理页面

sale
tianea 3 years ago
parent 2cbfe68e4d
commit b71d1b00b2

@ -9,6 +9,7 @@
"version": "4.4.0",
"license": "MIT",
"dependencies": {
"@tinymce/tinymce-vue": "^3.2.8",
"axios": "0.18.1",
"core-js": "3.6.5",
"element-ui": "2.13.2",

@ -14,6 +14,7 @@
"test:ci": "npm run lint && npm run test:unit"
},
"dependencies": {
"@tinymce/tinymce-vue": "^3.2.8",
"axios": "0.18.1",
"core-js": "3.6.5",
"element-ui": "2.13.2",

@ -44,3 +44,10 @@ export function getList(query) {
data: data
})
}
export function listByIds(data){
return request({
url: baseUrl+"listByIds",
method: 'post',
data: data
})
}

@ -0,0 +1,46 @@
import request from '@/utils/request'
let baseUrl = '/pc/competition/task/'
export function getList(query) {
return request({
url: baseUrl+'list',
method: 'post',
data: query
})
}
export function add(cat) {
return request({
url: baseUrl+"add",
method: 'post',
data: cat
})
}
export function update(cat) {
return request({
url: baseUrl+"update",
method: 'post',
data: cat
})
}
export function del(cat) {
return request({
url: baseUrl+"delete",
method: 'post',
data: cat
})
}
export function get(cat) {
return request({
url: baseUrl+"get",
method: 'post',
data: cat
})
}
export function batch(data){
return request({
url: baseUrl+"batchupdate",
method: 'post',
data: data
})
}

@ -0,0 +1,64 @@
import request from '@/utils/request'
let baseUrl = '/pc/competition/team/'
export function getList(query) {
return request({
url: baseUrl+'list',
method: 'post',
data: query
})
}
export function add(cat) {
return request({
url: baseUrl+"add",
method: 'post',
data: cat
})
}
export function update(cat) {
return request({
url: baseUrl+"update",
method: 'post',
data: cat
})
}
export function del(cat) {
return request({
url: baseUrl+"delete",
method: 'post',
data: cat
})
}
export function get(cat) {
return request({
url: baseUrl+"get",
method: 'post',
data: cat
})
}
export function uploadExcel(data){
let fd = new FormData()
fd.append("file",data["file"])
fd.append("competitionId",data['competitionId'])
fd.append("stageId",data['stageId'])
return request({
url: "/api/competition/upload/excel",
method: 'post',
data: fd
})
}
export function deleteMember(dt){
return request({
url: baseUrl+'deleteMember',
method: 'post',
data: dt
})
}
export function editTeamInfo(dt){
return request({
url: baseUrl+'editTeamInfo',
method: 'post',
data: dt
})
}

@ -0,0 +1,9 @@
import request from '@/utils/request'
let baseUrl = '/pc/upload/'
export function upload(query) {
return request({
url: baseUrl+'image',
method: 'post',
data: query
})
}

@ -1,5 +1,5 @@
import request from '@/utils/request'
const baseUrl = "/api/user/"
export function login(data) {
return request({
url: '/api/user/login/password',
@ -22,3 +22,18 @@ export function logout() {
method: 'post'
})
}
export function getList(query){
return request({
url: '/pc/user/list',
method: 'post',
data: query
})
}
export function getMember(query){
return request({
url: '/pc/user/get',
method: 'post',
data: query
})
}

@ -5,6 +5,7 @@
:multiple="false"
:show-file-list="false"
:on-success="handleImageSuccess"
:headers="myHeaders"
class="image-uploader"
drag
action="/api/upload/image/upload"

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1646107352078" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2034" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M341.312 85.312l64-85.312h213.376l64 85.312H960v85.376H64V85.312h277.312zM170.688 256h682.624v768H170.688V256zM256 341.312v597.376h512V341.312H256z m213.312 85.376v426.624H384V426.688h85.312z m170.688 0v426.624H554.688V426.688H640z" fill="#262626" p-id="2035"></path></svg>

After

Width:  |  Height:  |  Size: 650 B

@ -0,0 +1,25 @@
const qType =[
{
name: '单选题',
id: 1
},
{
name: '多选题',
id: 2
},
{
name: '判断题',
id: 3
}
]
export function getName(id){
let tmp = qType.find(t=>t.id == id)
if(!tmp){
return "未知";
}
return qType.find(t=>t.id == id).name
}
export function type(){
return qType
}

@ -67,14 +67,23 @@ const actions = {
// user logout
logout({ commit, state }) {
return new Promise((resolve, reject) => {
logout(state.token).then(() => {
try{
removeToken() // must remove token first
resetRouter()
commit('RESET_STATE')
resolve()
}).catch(error => {
reject(error)
})
}catch{
reject("failed")
}
// logout(state.token).then(() => {
// removeToken() // must remove token first
// resetRouter()
// commit('RESET_STATE')
// resolve()
// }).catch(error => {
// reject(error)
// })
})
},

@ -1,8 +1,7 @@
<template>
<editor
api-key="wuyv0zkbaek2eni7uc4cj2q099vfhbibrj3cv5yjymq41bod"
initialValue=""
v-model="temp.content"
v-model="content"
:init="{
height: 500,
menubar: false,
@ -24,9 +23,21 @@
</template>
<script>
import Editor from '@tinymce/tinymce-vue'
import Edit from '../../resource/exam/add/edit.vue'
export default {
components:{ 'editor':EditorEdit}
data(){
return {
temp: {
content: ''
}
}
},
props:{
content: {
type: String,
default: ''
}
},
components:{ 'editor':Editor}
}
</script>

@ -5,7 +5,7 @@
</div>
<el-table
v-loading="listLoading"
:data="group"
:data="myGroup"
element-loading-text="Loading"
border
fit
@ -36,7 +36,7 @@
<el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="70px">
<el-form-item label="赛组名" prop="type">
<div class="tz-line">
<el-input v-model="groupName" placeholder="请输入赛组名" /><el-button>查询</el-button>
<el-input v-model="temp.name" placeholder="请输入赛组名" />
</div>
</el-form-item>
<el-form-item>
@ -75,6 +75,7 @@
<script>
import * as province from '@/api/province'
import * as level from '@/api/level'
import * as cgroup from '@/api/group'
export default {
name: 'Group',
@ -102,6 +103,7 @@ export default {
},
data() {
return {
myGroup: this.group,
minIndex: 0,
maxIndex: 0,
setAttr: false,
@ -138,8 +140,24 @@ export default {
}
}
},
watch: {
group(val){
this.myGroup = val
},
myGroup(val){
this.$emit("on-group-change",val)
}
},
created() {
this.fetchData()
if(this.$route.query.id){
cgroup.getList({competitionId: parseInt(this.$route.query.id)}).then(res=>{
if(res.code == 200 ){
// this.changeGp(res.data.list,-2)
this.myGroup = res.data.list;
}
})
}
},
methods: {
fetchData() {
@ -157,7 +175,7 @@ export default {
handleUpdate(row) {
this.temp = Object.assign({}, row) // copy obj
this.groupType = this.temp.limitType;
if(this.groupType == 1){
if(this.groupType == 2){
this.oneOptions = this.provincOptions
}else{
this.oneOptions = this.levelOptions
@ -184,7 +202,8 @@ export default {
}
},
handleDelete(row,index){
this.group.splice(index,1)
// this.changeGp(row,index)
this.myGroup.splice(index,1)
},
tboxClick(event){
let current = event.target
@ -269,10 +288,40 @@ export default {
addGroup(){
this.temp.limitType = this.groupType
this.temp.catList = this.twoOptions
this.temp.name = this.groupName
this.temp.competitionId = this.cmpId
let tmp = Object.assign({},this.temp)
this.group.push(tmp)
if(!tmp.name||tmp.name.length==0){
this.$notify({
title: '操作失败',
message: "请输入赛组名称",
type: 'error',
duration: 2000
})
return
}
if(tmp.catList.length==0){
this.$notify({
title: '操作失败',
message: "选项不能为空",
type: 'error',
duration: 2000
})
return
}
if(tmp.id>0){
let index =-1
for(var i =0;i<this.myGroup.length;i++){
if(this.myGroup[i].id == tmp.id){
index = i
}
}
if(index>=0){
this.myGroup[index] = tmp
this.myGroup = Object.assign([],this.myGroup)
}
}else{
this.myGroup.push(tmp)
}
this.dialogFormVisible = false
}
}
@ -331,6 +380,7 @@ export default {
padding-left: 3px;
border: 1px solid gray;
min-width: 200px;
width: 100%;
}
.list-box>li {
list-style-type: none;

@ -0,0 +1,389 @@
<template>
<div class="app-container">
<div class="tz-line">
<el-button type="primary" icon="el-icon-plus" @click="add"></el-button>
</div>
<el-table
v-loading="listLoading"
:data="group"
element-loading-text="Loading"
border
fit
highlight-current-row
>
<el-table-column label="赛组名" align="center">
<template slot-scope="scope">
<span>{{ scope.row.name }}</span>
</template>
</el-table-column>
<el-table-column label="包括类别">
<template slot-scope="scope">
<span class="tz-span" v-for="item in scope.row.catList" :key="item.id">{{ item.name }}</span>
</template>
</el-table-column>
<el-table-column align="center" label="操作" width="300" class-name="small-padding fixed-width">
<template slot-scope="{row,$index}">
<el-button type="primary" size="mini" @click="handleUpdate(row)">
编辑
</el-button>
<el-button v-if="row.status!='deleted'" size="mini" type="danger" @click="handleDelete(row,$index)">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible">
<el-form ref="dataForm" :rules="rules" :model="temp" label-position="left" label-width="70px">
<el-form-item label="赛组名" prop="type">
<div class="tz-line">
<el-input v-model="temp.name" placeholder="请输入赛组名" /><el-button>查询</el-button>
</div>
</el-form-item>
<el-form-item>
<div class="tab">
<div @click="changeType(2)" >所属省份</div>
<div @click="changeType(1)" >学校层次</div>
</div>
</el-form-item>
<el-form-item>
<div class="tbpanel">
<ul class="list-box" @keydown="shiftDown" @click="tboxClick" @keyup="shiftUp" data-id="1">
<li v-for="(item,$index) in oneOptions" :key="item.id" :tabindex="$index" class="" :data-id="item.id" > {{item.name}} </li>
</ul>
<div class="tbbpanel">
<div @click="removeLi"></div>
<div @click="addLi"></div>
</div>
<ul class="list-box" data-id="2" @keydown="shiftDown" @click="tboxClick" @keyup="shiftUp" >
<li v-for="(item, $index ) in twoOptions" :key="item.id" :tabindex="$index" :data-id="item.id"> {{item.name}} </li>
</ul>
</div>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="addGroup" >
确认
</el-button>
<el-button @click="dialogFormVisible = false">
取消
</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import * as province from '@/api/province'
import * as level from '@/api/level'
import * as cgroup from '@/api/group'
export default {
name: 'Group',
components: {
},
filters: {
statusFilter(status) {
const statusMap = {
published: 'success',
draft: 'info',
deleted: 'danger'
}
return statusMap[status]
}
},
props: {
group: {
type: Array,
default: []
},
cmpId: {
type: Number,
default: 0
}
},
data() {
return {
minIndex: 0,
maxIndex: 0,
setAttr: false,
list: null,
listLoading: false,
listQuery: {
pageNo: 0
},
total: 0,
limit: 20,
dgroup: 'group',
textMap: {
update: 'Edit',
create: 'Create'
},
groupName: '',
groupType: 2,
dialogFormVisible: false,
provincOptions: [],
levelOptions: [],
selectOptions: [],
oneOptions: [],
twoOptions: [],
dialogStatus: '',
statusOptions: ['published', 'draft', 'deleted'],
temp: {
competitionId: 0,
name: '',
limitType: 1,
catList: []
},
rules: {
}
}
},
created() {
this.fetchData()
if(this.$route.query.id){
cgroup.getList({competitionId: parseInt(this.$route.query.id)}).then(res=>{
if(res.code == 200 ){
this.changeGp(res.data.list,-2)
}
})
}
},
methods: {
fetchData() {
this.listLoading = true
province.getList().then(response => {
this.provincOptions = response.data.list
this.listLoading = false
})
level.getList().then(res=>{
if(res.code == 200){
this.levelOptions = res.data.list
}
})
},
handleUpdate(row) {
this.temp = Object.assign({}, row) // copy obj
this.groupType = this.temp.limitType;
if(this.groupType == 2){
this.oneOptions = this.provincOptions
}else{
this.oneOptions = this.levelOptions
}
this.twoOptions = this.temp.catList
this.dialogFormVisible = true
console.log(this.group)
},
add() {
this.dialogFormVisible = true
this.oneOptions = Object.assign([], this.provincOptions)
this.twoOptions = []
this.groupName = ''
},
shiftDown(event){
if(event.key == 'Shift'){
this.maxIndex = event.target.attributes['tabindex'].value
this.setAttr= true
}
},
shiftUp(event){
if(event.key == 'Shift'){
this.setAttr= false
this.maxIndex = -1
}
},
handleDelete(row,index){
// this.group.splice(index,1)
this.changeGp(row,index)
},
tboxClick(event){
let current = event.target
if(!current.parentElement.attributes["data-id"]) return
let parentId = parseInt(current.parentElement.attributes["data-id"].value) -1
let tempIndex = current.attributes['tabindex'].value
if(this.setAttr==false){
let eles = document.getElementsByClassName("list-box")
eles[parentId].childNodes.forEach(child =>{
let t = child.attributes['class']
if(t){
t.value=''
}
})
}
if(current.attributes['class']){
current.attributes['class'].value = 'li-selected'
}else{
var att=document.createAttribute("class");
att.value="li-selected";
current.attributes.setNamedItem(att)
}
if(tempIndex!=this.maxIndex){
if(tempIndex>this.maxIndex){
this.minIndex = this.maxIndex
this.maxIndex = tempIndex
}else{
this.minIndex = tempIndex
}
let eles = document.getElementsByClassName("list-box")
eles[parentId].childNodes.forEach(child =>{
const i = parseInt(child.attributes['tabindex'].value)
if(i>=this.minIndex&&i<=this.maxIndex){
if(this.setAttr){
if(child.attributes['class']){
child.attributes['class'].value = 'li-selected';
}else{
var att=document.createAttribute("class");
att.value="li-selected";
child.attributes.setNamedItem(att)
}
}
}
})
}
},
removeLi(){
let eles = document.getElementsByClassName("list-box")
eles[1].childNodes.forEach(child =>{
let c = child.attributes['class']
if(c&&c.value=="li-selected"){
let id = child.attributes["data-id"].value
let tmps = this.twoOptions.find(p=> p.id == parseInt(id))
let index = this.twoOptions.indexOf(tmps)
this.oneOptions.push(tmps)
this.twoOptions.splice(index,1)
}
})
},
addLi(){
let eles = document.getElementsByClassName("list-box")
eles[0].childNodes.forEach(child =>{
let c = child.attributes['class']
if(c&&c.value=="li-selected"){
let id = child.attributes["data-id"].value
let tmps = this.oneOptions.find(p=> p.id == parseInt(id))
let index = this.oneOptions.indexOf(tmps)
this.twoOptions.push(tmps)
this.oneOptions.splice(index,1)
}
})
},
changeType(type){
this.groupType = type
if(type === 1){
this.oneOptions = Object.assign([], this.levelOptions)
}else{
this.oneOptions = Object.assign([],this.provincOptions)
}
this.twoOptions = []
},
addGroup(){
this.temp.limitType = this.groupType
this.temp.catList = this.twoOptions
this.temp.competitionId = this.cmpId
let tmp = Object.assign({},this.temp)
// this.group.push(tmp)
if(tmp.id>0){
console.log(this.temp.name)
this.changeGp(tmp,-3)
}else{
this.changeGp(tmp,-1)
}
this.dialogFormVisible = false
},
changeGp(val,index){
this.$emit("changeGroup",{value: val, index: index})
}
}
}
</script>
<style lang="scss" scoped>
.tz-line{
display: flex;
width: 100%;
margin-bottom: 20px;
}
.tz-line button{
margin-left: 10px;
}
.tab{
display: flex;
}
.tab div {
color: rgb(72, 72, 241);
margin-right: 20px;
}
.board {
width: 1000px;
margin-left: 20px;
display: flex;
justify-content: space-around;
flex-direction: row;
align-items: flex-start;
}
.el-form {
width: 100%;
}
.tbpanel {
display: flex;
}
.todo {
.board-column-header {
background: #4A9FF9;
}
}
.working {
.board-column-header {
background: #f9944a;
}
}
.board-column{
min-width: 200px !important;
margin-right: 20px;
}
.done .board-column-header {
background: #2ac06d;
}
.list-box{
overflow: scroll;
height: 250px;
padding-left: 3px;
border: 1px solid gray;
min-width: 200px;
}
.list-box>li {
list-style-type: none;
height:40px;
}
.list-box>li::selection {
background-color: none;
}
.li-selected {
outline-style: none;
background: #4A9FF9;
color: white;
}
.tbbpanel{
display: flex;
align-items: center;
}
.tbbpanel div:nth-child(1){
height: 25px;
width: 25px;
background: url('/svg/left.svg');
background-size: cover;
}
.tbbpanel div:nth-child(2){
height: 25px;
width: 25px;
background: url('/svg/right_arrow.svg');
background-size: cover;
}
.hidden{
display: none;
}
.tz-span{
margin-left: 10px;
}
</style>

@ -0,0 +1,174 @@
<template>
<div class="tbpanel">
<ul class="list-box" @keydown="shiftDown" @click="tboxClick" @keyup="shiftUp" data-id="1" @scroll="handleScroll">
<li v-for="(item,$index) in oneOptions" :key="item.id" :tabindex="$index" class="" :data-id="item.id" > {{item.name}} </li>
</ul>
<div class="tbbpanel">
<div @click="removeLi"></div>
<div @click="addLi"></div>
</div>
<ul class="list-box" data-id="2" @keydown="shiftDown" @click="tboxClick" @keyup="shiftUp" >
<li v-for="(item, $index ) in twoOptions" :key="item.id" :tabindex="$index" :data-id="item.id"> {{item.name}} </li>
</ul>
</div>
</template>
<script>
export default {
data(){
return {
oneOptions: [],
twoOptions: []
}
},
props: {
list: {
type: Array
}
},
created(){
this.oneOptions = Object.assign([],this.list)
},
methods:{
shiftDown(event){
if(event.key == 'Shift'){
this.maxIndex = event.target.attributes['tabindex'].value
this.setAttr= true
}
},
shiftUp(event){
if(event.key == 'Shift'){
this.setAttr= false
this.maxIndex = -1
}
},
tboxClick(event){
let current = event.target
if(!current.parentElement.attributes["data-id"]) return
let parentId = parseInt(current.parentElement.attributes["data-id"].value) -1
let tempIndex = current.attributes['tabindex'].value
if(this.setAttr==false){
let eles = document.getElementsByClassName("list-box")
eles[parentId].childNodes.forEach(child =>{
let t = child.attributes['class']
if(t){
t.value=''
}
})
}
if(current.attributes['class']){
current.attributes['class'].value = 'li-selected'
}else{
var att=document.createAttribute("class");
att.value="li-selected";
current.attributes.setNamedItem(att)
}
if(tempIndex!=this.maxIndex){
if(tempIndex>this.maxIndex){
this.minIndex = this.maxIndex
this.maxIndex = tempIndex
}else{
this.minIndex = tempIndex
}
let eles = document.getElementsByClassName("list-box")
eles[parentId].childNodes.forEach(child =>{
const i = parseInt(child.attributes['tabindex'].value)
if(i>=this.minIndex&&i<=this.maxIndex){
if(this.setAttr){
if(child.attributes['class']){
child.attributes['class'].value = 'li-selected';
}else{
var att=document.createAttribute("class");
att.value="li-selected";
child.attributes.setNamedItem(att)
}
}
}
})
}
},
removeLi(){
let eles = document.getElementsByClassName("list-box")
eles[1].childNodes.forEach(child =>{
let c = child.attributes['class']
if(c&&c.value=="li-selected"){
let id = child.attributes["data-id"].value
let tmps = this.twoOptions.find(p=> p.id == parseInt(id))
let index = this.twoOptions.indexOf(tmps)
this.oneOptions.push(tmps)
this.twoOptions.splice(index,1)
}
})
},
addLi(){
let eles = document.getElementsByClassName("list-box")
eles[0].childNodes.forEach(child =>{
let c = child.attributes['class']
if(c&&c.value=="li-selected"){
let id = child.attributes["data-id"].value
let tmps = this.oneOptions.find(p=> p.id == parseInt(id))
let index = this.oneOptions.indexOf(tmps)
this.twoOptions.push(tmps)
this.oneOptions.splice(index,1)
}
})
},
handleScroll(e){
if(e.srcElement.scrollTopMax == e.srcElement.scrollTop){
console.log(e.srcElement)
console.log(e.srcElement.scrollTopMax, e.target.scrollTop)
}
}
}
}
</script>
<style scoped>
.tbpanel {
display: flex;
width: 100%;
min-width: 250px;
min-height: 250px;
}
.list-box{
overflow: scroll;
height: 250px;
padding-left: 3px;
border: 1px solid gray;
min-width: 200px;
width: 100%;
}
.list-box>li {
list-style-type: none;
height:40px;
display: flex;
justify-content: center;
align-items: center;
}
.list-box>li::selection {
background-color: none;
}
.li-selected {
outline-style: none;
background: #4A9FF9;
color: white;
}
.tbbpanel{
display: flex;
flex-direction: row;
align-items: center;
}
.tbbpanel div:nth-child(1){
height: 25px;
width: 25px;
background: url('/svg/left.svg');
background-size: cover;
}
.tbbpanel div:nth-child(2){
height: 25px;
width: 25px;
background: url('/svg/right_arrow.svg');
background-size: cover;
}
</style>

@ -20,9 +20,18 @@
<el-input v-model="survey.supporter" style="width: 33%;" />
</el-form-item>
<el-form-item v-for="(item ,$index) in survey.stageList" :key="item.name" :label="item.name" class="form-item-line">
<div>
<el-date-picker v-model="item.startTime" type="datetime" placeholder="请选择开始时间" />
<el-date-picker v-model="item.endTime" type="datetime" placeholder="请选择结束时间" />
<el-button type="danger" @click="deleteStage(item.id,$index)" >删除</el-button>
</div>
<div>
<el-checkbox label="开启报名" v-model="item.enableSignUp"/> <el-checkbox v-model="item.demo" label="试玩" />
<div v-if="item.enableSignUp">
<el-date-picker v-model="item.signUpStartTime" placeholder="请选择报名时间"/>
<el-date-picker v-model="item.singUpEndTime" placeholder="请选择报名截止时间"/>
</div>
</div>
</el-form-item>
<el-form-item class="form-item-line">
<el-input v-model="stageTemp.name" style="width: 20%; margin-right: 20px;" placeholder="赛段名称" />
@ -31,16 +40,17 @@
</el-form-item>
<el-form-item class="form-item-line" label="大赛缩略图">
<upload-image :url.sync="survey.thumbnail" />
</el-form-item>
<el-form-item v-for="(item,$index) in survey.bannerList" :label="'轮播'+($index+1)" :key="$index" class="form-item-line" >
<el-popover trigger="hover"><el-image fit="fit" :src="item.img" />{{ item.link}}<el-button slot="reference">查看</el-button></el-popover> <el-button type="danger" @click="deleteBanner($index)" ></el-button>
</el-form-item>
<el-form-item class="form-item-line" label="大赛轮播图">
<el-input v-model="tempBanner.link" placeholder="链接地址" />
<upload-image :url.sync="tempBanner.img" />
<el-button @click="addBanner" type="primary">添加</el-button>
</el-form-item>
<el-form-item v-for="(item,$index) in survey.bannerList" :label="'轮播'+($index+1)" :key="$index" class="form-item-line" >
<el-popover trigger="hover"><el-image fit="fit" :src="item.img" />{{ item.link}}<el-button slot="reference">查看</el-button></el-popover> <el-button type="danger" @click="deleteBanner($index)" ></el-button>
</el-form-item>
</el-form>
</div>
</template>

@ -1,28 +1,426 @@
<template>
<div class="app-container">
<el-form>
<el-form-item >
<div class="tab">
<div v-for="(item,index) in survey.stage" :key="item.name" :style="'background-color:'+stageColor[index]" class="stage"> {{ item.name }} </div>
<div v-for="(item,$index) in survey.stageList" :key="item.id" :style="'background-color:'+stageColor[$index]" class="stage" @click="changeTab($index)" >
<div v-if="editStageId == item.id" class="edit_stage">
<el-input size="small" v-model="stage.name" /> <el-button size="small" @click="confirmEdit">确定</el-button> <el-button size="small" @click="editStageId =0"></el-button>
</div>
<i v-else class = "el-icon-edit" @click="editStage(item)" >{{ item.name }} </i>
</div>
</div>
<div class="tabContent">
<div class="tabBox">
<div class="boxHeader">成绩权重设置</div>
<div>
综合得分=证券投资×<el-input-number v-model="temp.financePower" />+金融实操×<el-input-number v-model="temp.examPower" />
</div>
</div>
<div class="tabBox">
<div class="boxHeader">证券投资赛项设置</div>
<div class="bx-content">
<el-form-item label="开始时间">
<el-date-picker type="datetime" v-model="temp.operationStartTime" />
</el-form-item>
<el-form-item label="结束时间">
<el-date-picker type="datetime" v-model="temp.operationEndTime" />
</el-form-item>
<el-form-item label="交易品种">
<el-select v-model="temp.tradeType">
<el-option v-for="item in tradeTypeOptions" :key="item.id" :label="item.name" :value="item.id">{{ item.name }}</el-option>
</el-select>
</el-form-item>
<el-form-item label="初始资金">
<el-input type="number" v-model="temp.initCapital" />
</el-form-item>
</div>
<el-form-item label="赛项logo" style="width:90%">
<upload-image :url.sync ="temp.operationLogo" />
</el-form-item>
<el-form-item label="操作分">
<el-input-number v-model="temp.financeProfitPower" />+[用户收益率基准收益率÷最高收益率基准收益率]×<el-input-number v-model="temp.financeBasePower" />
</el-form-item>
</div>
<div class="tabBox">
<div class="boxHeader">金融实操赛项设置</div>
<el-form-item label="客观题选择">
<el-button type="primary" @click="chooseQuestion" >选择</el-button>
<el-date-picker v-model="temp.examStartTime" placeholder="开始时间" type="datetime"></el-date-picker>
<el-date-picker v-model="temp.examEndTime" placeholder="结束时间" type="datetime"></el-date-picker>
</el-form-item>
<el-form-item label="题目设置">
<el-table :data="singleTable">
<el-table-column label="题型" align="center">
<template slot-scope="scope">
<span>{{ scope.row.name }}</span>
</template>
</el-table-column>
<el-table-column label="总数量" align="center">
<template slot-scope="scope">
<span>{{ scope.row.total }}</span>
</template>
</el-table-column>
<el-table-column label="选题量" align="center">
<template slot-scope="scope">
<span>{{ scope.row.selectCount }}</span>
</template>
</el-table-column>
<el-table-column label="分值" align="center">
<template slot-scope="scope">
<span>{{ scope.row.totalScore }}</span>
</template>
</el-table-column>
<el-table-column label="合计" align="center">
<template slot-scope="scope">
<span>{{ scope.row.sumScore }}</span>
</template>
</el-table-column>
</el-table>
<div>
总分
</div>
</el-form-item>
<el-form-item label="案例题选择">
<div class="tab">
<div v-for="(item,$index) in group.filter(g=>g.limitType == 1)" :key="item.id" :style="'background-color:'+stageColor[$index]" class="stage" @click=" groupId = item.id" > {{ item.name }} </div>
</div>
<el-table :data="singleTable">
<el-table-column label="案例名称" align="center">
<template slot-scope="scope">
<span>{{ scope.row.name }}</span>
</template>
</el-table-column>
<el-table-column label="所属课程" align="center">
<template slot-scope="scope">
<span>{{ scope.row.total }}</span>
</template>
</el-table-column>
<el-table-column label="选题量" align="center">
<template slot-scope="scope">
<span>{{ scope.row.selectCount }}</span>
</template>
</el-table-column>
<el-table-column label="每小题分值" align="center">
<template slot-scope="scope">
<span>{{ scope.row.totalScore }}</span>
</template>
</el-table-column>
<el-table-column label="合计" align="center">
<template slot-scope="scope">
<span>{{ scope.row.sumScore }}</span>
</template>
</el-table-column>
</el-table>
<div>
总分
</div>
</el-form-item>
</div>
</div>
</el-form-item>
</el-form>
<el-dialog ref="dialog" title="添加客观题" :visible.sync="dialogFormVisible" width="80%" >
<div class="filter-container">
<el-select v-model="questionTempQuery.courseId" placeholder="请选择课程">
<el-option v-for="item in courseOptions" :key="item.id" :value="item.id" :label="item.name">{{ item.name}}</el-option>
</el-select>
<el-select v-model="questionTempQuery.levelId" placeholder="请选择层次">
<el-option v-for="item in levelOptions" :key="item.id" :value="item.id" :label="item.name" >{{ item.name}}</el-option>
</el-select>
<el-select v-model="questionTempQuery.questionType">
<el-option v-for="item in typeOptions" :key="item.id" :value="item.id" :label="item.name" >{{ item.name}}</el-option>
</el-select>
<span>分值</span> <el-input-number v-model="questionTempQuery.score" class="small" placeholder="分值"/>
<el-input v-model="questionTempQuery.stem" placeholder="题干/id" />
<el-button @click="queryQuestion"></el-button>
</div>
<el-table ref="questionTable" :data="questionList"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" />
<el-table-column label="题干" align="center">
<template slot-scope="scope">
<span>{{ scope.row.stem }}</span>
</template>
</el-table-column>
<el-table-column label="层次" align="center">
<template slot-scope="scope">
<span>{{ levelToName(scope.row.levelId) }}</span>
</template>
</el-table-column>
<el-table-column label="课程" align="center">
<template slot-scope="scope">
<span>{{ courseToName(scope.row.courseId) }}</span>
</template>
</el-table-column>
<el-table-column label="型题" align="center">
<template slot-scope="scope">
<span>{{ getName(scope.row.questionType) }}</span>
</template>
</el-table-column>
<el-table-column label="分值" align="center">
<template slot-scope="scope">
<span>{{ scope.row.score }}</span>
</template>
</el-table-column>
</el-table>
<el-pagination
:current-page.sync="questionTempQuery.pageNo"
:page-sizes="[10,20,30]"
:page-size.sync="questionTempQuery.pageSize"
layout="total,prev,pager,next,jumper,sizes"
:total="questionTempQuery.total"
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
/>
<div>
<el-button @click="addQuestion"></el-button>
<el-button @click="dialogFormVisible = false">取消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import uploadImage from '@/components/Upload/SingleImage2'
import * as question from '@/api/question'
import * as level from '@/api/level'
import * as course from '@/api/course'
import * as qType from '@/model/questiontype'
import SelectPanel from './selectPanel.vue'
export default {
name: 'task',
components: {
"upload-image": uploadImage,
"select-panel": SelectPanel
},
props: {
survey:{
type: Object,
default() {}
},
group: {
type: Array
},
task: {
type: Array
},
cmpId: {
type: Number
}
},
created(){
level.getList().then(res=>{
if(res.code == 200){
this.levelOptions = res.data.list
}
}),
course.getList({pageNo: 0,pageSize: 100}).then(res=>{
if(res.code == 200 ){
this.courseOptions = res.data.page.content
}
})
if(this.task.length == 0){
for(var i=0;i<this.survey.stageList.length;i++){
const stage = this.survey.stageList[i]
this.temp.competitionId = this.cmpId
this.temp.stageId = stage.id
this.task.push(Object.assign({},this.temp))
}
}else{
this.temp = this.task[0]
}
},
watch: {
task: {
handler: function(nv,ov){
}
},
group: {
handler: function(nv,ov){
}
}
},
data(){
return {
dialogFormVisible: false,
stageColor: [
'#1490ce',
'#ff8e8e',
'#8e00c6',
]
],
levelOptions:[],
courseOptions:[],
questionList:[],
typeOptions: qType.type(),
editStageId: 0,
stage:{},
tabId: 0,
groupId: 0,
singleTable:[{
name: '单选题',
total: 0,
selectCount: 0,
totalScore: 0,
sumScore: 0
}, {
name: '多选题',
total: 0,
selectCount: 0,
totalScore: 0,
sumScore: 0
}, {
name: '判断题',
total: 0,
selectCount: 0,
totalScore: 0,
sumScore: 0
}],
temp:{
id: null,
competitionId: null,
stageId: null,
financePower: 0,
examPower: 0,
operationStartTime: '',
operationEndTime: '',
tradeType: 1,
initCapital: 1000000,
financeBasePower: 40,
financeProfitPower: 60,
operationLogo:'',
examStartTime: '',
examEndTime: '',
questionList:[]
},
tradeTypeOptions:[
{
id: 1,
name: '股票基金',
},
{
id: 2,
name: '期货'
}
],
questQuery: {
pageNo: 0,
pageSize: 10,
type: 0,
courseId: null,
levelId: null ,
total: 0,
score: 1,
questionType: null,
stem: ''
},
questionTempQuery:{},
chooseList: []
}
},
methods: {
changeTab(val){
this.tabId = val
this.temp = this.task[val]
},
chooseQuestion(){
// question.getList(this.questQuery).then(res =>{
// if(res.code == 200){
// this.questList = res.data.page
// }
// })
this.groupId = 0
this.$nextTick(()=>{
const qt = this.$refs.questionTable
if(this.$refs.questionTable){
this.questionList.forEach(item=>{
qt.toggleRowSelection(item,true)
})
}
})
this.questionTempQuery = Object.assign({},this.questQuery)
this.dialogFormVisible =true
},
queryQuestion(){
question.getList(this.questionTempQuery).then(res => {
if(res.code == 200){
this.questionList = res.data.page.content
this.questionTempQuery.total = res.data.page.totalElements
}
})
},
handleSelectionChange(val){
this.chooseList= val
},
confirmChoose(){
this.chooseList = this.questionList
let singleSelect = this.chooseList.filter(t => t.questionType==1)
let multiSelect = this.chooseList.filter(t => t.questionType == 2)
let judgeSelect = this.chooseList.filter(t => t.questionType ==3)
this.singleTable[0].selectCount = singleSelect.length
this.singleTable[0].totalScore =this.sumScore(singleSelect)
this.singleTable[1].selectCount = multiSelect.length
this.singleTable[1].totalScore =this.sumScore(multiSelect)
this.singleTable[2].selectCount = judgeSelect.length
this.singleTable[2].totalScore =this.sumScore(judgeSelect)
this.dialogFormVisible = false
},
getName(id){
return qType.getName(id)
},
handleSizeChange(){
this.queryQuestion()
},
handleCurrentChange(){
this.queryQuestion()
},
editStage(item){
this.editStageId = item.id
this.stage = item
},
confirmEdit(){
},
addQuestion(){
let ids = []
this.chooseList.forEach(item => ids.push(item.id))
let tmp = this.task[this.tabId].questionList.find(t=> t.groupId ==this.groupId)
if(tmp){
tmp.questionIds = ids
} else {
this.task[this.tabId].questionList.push({
groupId: this.groupId,
questionIds: ids
})
}
},
levelToName(levelId){
const l = this.levelOptions.find(level=>level.id == levelId)
if(l){
return l.name
}
return "未知";
},
courseToName(courseId){
const c = this.courseOptions.find(coure => coure.id ==courseId)
if(c){
return c.name
}
return "未知"
},
sumScore(list=[]){
let score = 0
list.forEach(item => score+=item.score)
return score
}
}
}
@ -41,4 +439,30 @@ export default {
padding-left: 80px;
padding-right: 80px;
}
.bx-content{
display: flex;
flex-wrap: wrap;
}
.bx-content .el-form-item{
width: 50%;
margin-top: 20px;
}
.bx-content .el-input{
width: 80%;
}
.tabBox{
border: 1px solid rgb(211, 209, 209);
padding: 20px;
margin-top: 20px;
border-radius: 5px;
}
.boxHeader{
border-bottom-style: dashed;
border-bottom-color: rgb(211, 209, 209);
border-bottom-width: 1px;
margin-bottom: 20px;
}
.edit_stage{
display: flex;
}
</style>

@ -0,0 +1,388 @@
<template>
<div class="app-container">
<div class="tab">
<div v-for="(item,$index) in survey.stageList" :key="item.name" :style="'background-color:'+stageColor[$index]" class="stage" @click="changeTab($index,item.id)" > {{ item.name }} </div>
</div>
<div class="tab">
<div v-for="(item,$index) in teamList" :key="item.name" :style="'background-color:'+teamColor[$index]" class="stage" @click="changeTeamTab($index)" > {{ item.name }} </div>
</div>
<div v-if="teamTabId == 0" class="tbPanel">
<div class="filter-container">
<el-input placeholder="团队名称" />
<el-button>搜索</el-button>
<el-button @click="dialogVisable = true">添加团队</el-button>
<el-button @click="batchImport"><input ref="excel-upload-input" class="excel-upload-input" type="file" accept=".xlsx" @change="handleClick"></el-button>
</div>
<el-table :data.sync="tableData">
<el-table-column label="团队名称">
<template slot-scope="scope">
{{ scope.row.teamName}}<i class="el-icon-edit" @click="handleEditTeamInfo(scope.row,1)" />
</template>
</el-table-column>
<el-table-column label="院校" prop="school">
</el-table-column>
<el-table-column v-for="item in columnList" :key="item.id" :label="item.lable">
<template slot-scope="scope">
{{ scope.row[item.name].name }} <i v-if="scope.row[item.name].name" @click="deleteMember(scope.row,item.name)" class="el-icon-delete" />
</template>
</el-table-column>
<el-table-column label="指导老师">
<template slot-scope="scope">
{{ scope.row.teacher}}<i class="el-icon-edit" @click="handleEditTeamInfo(scope.row,2)" />
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button class="small" @click="addMember(scope.row)" >添加成员</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
:current-page.sync="teamQuery.pageNo"
:page-sizes="[10,15,20]"
:page-size.sync="teamQuery.pageSize"
layout="total,prev,pager,next,jumper,sizes"
:total="teamQuery.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
<div v-if="teamTabId == 1">
<div class="filter-container">
<el-input placeholder="姓名/学号" /> <el-button>搜索</el-button> <el-button></el-button><el-button></el-button>
</div>
<el-table v-model="userList">
<el-table-column label="姓名">
<template slot-scope="scope">
{{ scope.row.name }}
</template>
</el-table-column>
<el-table-column label="学号">
<template slot-scope="scope">
{{ scope.row.studentNo }}
</template>
</el-table-column>
<el-table-column label="学校">
<template slot-scope="scope">
{{ scope.row.school }}
</template>
</el-table-column>
<el-table-column label="指导教师">
<template slot-scope="scope">
{{ scope.row.name }}
</template>
</el-table-column>
<el-table-column label="操作">
<el-button type="danger">移除</el-button>
</el-table-column>
</el-table>
</div>
<el-dialog title="添加团队" :visible.sync="dialogVisable">
<div class="filter-container">
<el-input placeholder="输入团队名" class="small" />
<el-input placeholder="输入指导老师" class="small"/>
<el-input placeholder="输入学号/姓名检索"/>
</div>
<div class="app-container">
<select-panel :list="userList" />
</div>
</el-dialog>
<el-dialog ref="editTeam" :title="editTeamInfo.title" :visible.sync="editTeamNameVisable" >
<el-form>
<el-form-item>
<el-input v-model="editTeamInfo.name" />
</el-form-item>
</el-form>
<el-button class="small" @click="confirmEditTeam" >确定</el-button>
<el-button class="small">取消</el-button>
</el-dialog>
<el-dialog title="添加队员" :visible.sync="addMemberVisable">
<div class="filter-container">
<el-input v-model="memberQuery.name" placeholder="输入学号或姓名"/>
<el-button @click="searchMember"></el-button>
</div>
<el-table :data="addMemberList"
@selection-change="onSelect"
>
<el-table-column type="selection" />
<el-table-column label="学号">
<template slot-scope="scope">
{{ scope.row.studentNo}}
</template>
</el-table-column>
<el-table-column label="姓名">
<template slot-scope="scope">
{{ scope.row.name}}
</template>
</el-table-column>
<el-table-column label="层次">
<template slot-scope="scope">
{{ scope.row.level}}
</template>
</el-table-column>
</el-table>
<el-button @click="addTeamMember"></el-button>
<el-button @click="addMemberVisable = false">取消</el-button>
</el-dialog>
</div>
</template>
<script>
import SelectPanel from './selectPanel.vue'
import * as userApi from '@/api/user'
import * as teamApi from '@/api/team'
export default {
components: {
'select-panel': SelectPanel
},
props: {
survey: {
type: Object,
default: {}
},
team: {
type: Array
},
competitionType:{
type: Number,
default: 1
},
teamMinCount: {
type: Number,
default: 2
},
teamMaxCount: {
type: Number,
default: 5
},
cmpId: {
type: Number
}
},
data(){
return {
dialogVisable: false,
stageColor: [
'#1490ce',
'#ff8e8e',
'#8e00c6',
],
teamColor: [
"#fec52e",
"#1490ce"
],
editTeamInfo: {
dv:true,
item: {},
title: '编辑团队名称',
name: '',
type:1
},
editTeamNameVisable: false,
addMemberVisable: false,
teamList: [],
tabId: 0,
teamTabId: 0,
stageId: null,
columnList: [],
tableData:[],
teamTab: 0,
userQuery: {
pageNo: 0
},
teamQuery: {
competitionId: this.cmpId,
stageId: this.stageId,
pageNo: 0,
pageSize: 20,
total: 0
},
userList: [],
addMemberList:[],
willAddMemberList:[],
memberQuery: {
name: ''
}
}
},
created(){
if(this.competitionType){
this.teamList = [{id: 1,name: '参赛团队'},{id: 2,name: '参赛人员'}]
}
userApi.getList(this.userQuery).then(res=>{
if(res.code == 200){
this.userList = res.data.userPage.content
}
})
this.stageId = this.survey.stageList[0].id
this.teamQuery.stageId = this.stageId
for(var i = 0 ;i< this.teamMaxCount;i++){
let tmp = {
id: i,
lable: '组员'+(i+1),
name: 'member_'+(i+1)
}
this.columnList.push(tmp)
}
this.loadData()
},
methods: {
changeTab(index,id){
this.tabId = index
this.stageId = id
this.teamQuery.stageId = this.stageId
this.loadData()
},
changeTeamTab(index){
this.teamTabId = index
},
addMember(item){
console.log(item)
this.addMemberList = []
this.addMemberVisable=true
},
batchImport(){
this.$refs['excel-upload-input'].click()
},
handleClick(e) {
const files = e.target.files
const rawFile = files[0] // only use files[0]
console.log(rawFile)
teamApi.uploadExcel({
file: rawFile,
competitionId: this.cmpId,
stageId: this.stageId
})
// if (!rawFile) return
// this.upload(rawFile)
},
handleSizeChange(){
this.loadData()
},
handleCurrentChange(){
this.loadData()
},
deleteMember(row,name){
let item = row[name]
console.log(item.id)
teamApi.deleteMember({id: item.id}).then(res=>{
if(res.code == 200){
this.loadData()
}
})
},
handleEditTeamInfo(item,type){
this.editTeamNameVisable = true
this.editTeamInfo.item = item
this.editTeamInfo.type=type
if(type==1){
this.editTeamInfo.name = item.teamName
}else{
this.editTeamInfo.name = item.teacher
}
},
confirmEditTeam(){
teamApi.editTeamInfo({
type: this.editTeamInfo.type,
name: this.editTeamInfo.name,
id: this.editTeamInfo.item.id
}).then(res=>{
if(res.code == 200){
this.loadData()
this.editTeamNameVisable =false
}
})
},
loadData(){
teamApi.getList(this.teamQuery).then(res=>{
if(res.code == 200){
const teamArray = res.data.page.content
this.teamQuery.total = res.data.page.totalElements
const memberList = res.data.list
this.tableData =[]
teamArray.forEach(team =>{
const teamMembers = memberList.filter(m => m.teamId == team.id)
let teamInfo = {
id: 0,
teamName: '',
school: '',
member_1: "",
member_2: "",
member_3: "",
member_4: '',
member_5: '',
teacher: ''
}
teamInfo.teamName = team.teamName
teamInfo.school = team.school
teamInfo.teacher = team.teacherName
teamInfo.id = team.id
for(var i = 0 ;i< teamMembers.length;i++){
const m = teamMembers[i]
teamInfo["member_"+(i+1)] = m
teamInfo.school = m.school
}
this.tableData.push(teamInfo)
})
}
})
},
onSelect(val){
console.log(val)
this.willAddMemberList =val
},
searchMember(){
userApi.getMember(this.memberQuery).then(res=>{
if(res.code == 200){
const tmp = this.addMemberList.find(item=>item.id == res.data.id)
console.log(tmp)
if(!tmp){
this.addMemberList.push(res.data)
}
}else{
this.$notify({
title: '操作失败',
message: res.msg,
type: 'warning',
duration: 2000
})
}
})
},
addTeamMember(){
console.log(this.willAddMemberList)
}
}
}
</script>
<style scoped>
.tab {
display: flex;
line-height: 40px;
}
.tab div{
margin-right: 20px;
}
.stage{
padding: 3px;
color: white;
border-radius: 5px;
padding-left: 80px;
padding-right: 80px;
margin-bottom: 10px;
}
.excel-upload-input{
display: none;
z-index: -9999;
}
</style>

@ -8,8 +8,21 @@
</div>
<div class="tz-content">
<survey v-if="tabId==0" :survey="comp.survey" />
<group v-if="tabId==1" :group="comp.group" :cmpId="competitionId" />
<task v-if="tabId==2" :survey="comp.survey" />
<group v-if="tabId==1" :group="comp.group" :cmpId="competitionId" @on-group-change="chgGroup" />
<task v-if="tabId==2" :survey="comp.survey" :group="comp.group" :task="comp.task" :cmpId="competitionId"/>
<team v-if="tabId==3" :survey="comp.survey" :team="comp.team" :competitionType="comp.type" :cmpId="competitionId" />
<common-editor v-if="tabId==4" :content.sync="comp.summary" />
<common-editor v-if="tabId==5" :content.sync="comp.rule" />
<common-editor v-if="tabId==6" :content.sync="comp.prize" />
<div v-if="tabId==7">
<common-editor :content.sync="comp.prize" />
<div v-for="item in comp.news" :key="item.id">
<image :src="item.img" />
<pre>
{{ item.content}}
</pre>
</div>
</div>
</div>
<div>
<el-button v-if="tabId>0" type="primary" @click="backStep">上一步</el-button> <el-button type="primary" @click="save">保存</el-button> <el-button v-if="tabId<this.tabList.length - 1" type="primary" @click="nextStep"></el-button>
@ -21,11 +34,15 @@
import Survey from './components/survey.vue'
import Group from './components/group.vue'
import Task from './components/task.vue'
import Team from "./components/team.vue"
import CommonEditor from './components/commonEditor.vue'
import * as competition from '@/api/competition'
import * as cgroup from '@/api/group'
import * as taskApi from '@/api/task'
export default {
components: { 'survey': Survey, 'group': Group ,'task': Task },
components: { 'survey': Survey, 'group': Group ,'task': Task, 'team': Team ,"common-editor": CommonEditor},
data() {
return {
competitionId: 0,
@ -41,7 +58,14 @@ export default {
bannerList: [],
thumbnail: ''
},
group: []
group: [],
task: [],
team: [],
summary: '',
rule: '',
prize: '',
news:[],
schoolNews:[]
},
tabId: 0,
tabList: [{
@ -75,18 +99,34 @@ export default {
{
name: '大赛新闻',
id: 7
},
{
name: '校园风采',
id: 8
}
]
}
},
created() {
if(this.$route.query.id){
this.competitionId = this.$route.query.id
this.competitionId = parseInt(this.$route.query.id)
competition.get({id: this.$route.query.id}).then(res=>{
if(res.code==200){
this.comp.survey = res.data
}
})
taskApi.getList({competitionId: this.competitionId}).then(res=>{
if(res.code == 200 ){
console.log(res.data.list)
this.comp.task = res.data.list
}
})
cgroup.getList({competitionId: parseInt(this.$route.query.id)}).then(res=>{
if(res.code == 200 ){
// this.changeGp(res.data.list,-2)
this.comp.group = res.data.list;
}
})
}
},
methods: {
@ -104,7 +144,6 @@ export default {
}
},
save(){
console.log(this.tabId)
if(this.tabId == 0){
competition.add(this.comp.survey).then(res => {
if(res.code == 200) {
@ -120,9 +159,35 @@ export default {
cgroup.add({"list": this.comp.group}).then(res=>{
if(res.code == 200){
this.comp.group = res.data.list;
if(res.code == 200) {
this.$notify({
title: '操作成功',
message: "success",
type: 'success',
duration: 2000
})
}
}
})
} else if(this.tabId == 2){
console.log(this.comp.task)
taskApi.add({list: this.comp.task}).then(res=>{
if(res.code == 200) {
this.comp.task = res.data.list
this.$notify({
title: '操作成功',
message: "success",
type: 'success',
duration: 2000
})
}
})
}
},
chgGroup(val){
this.comp.group = val
}
}
}

@ -22,9 +22,9 @@
{{ scope.row.name }}
</template>
</el-table-column>
<el-table-column label="当前赛段" align="center">
<el-table-column label="参赛人数" align="center">
<template slot-scope="scope">
{{ scope.row.stageName }}
<span>{{ scope.row.studentCount }}</span>
</template>
</el-table-column>
<el-table-column label="大赛模式" align="center">
@ -32,11 +32,6 @@
<span>{{ scope.row.type==1?'团队赛':'个人赛' }}</span>
</template>
</el-table-column>
<el-table-column label="参赛人数" align="center">
<template slot-scope="scope">
<span>{{ scope.row.studentCount }}</span>
</template>
</el-table-column>
<el-table-column label="开始时间" align="center">
<template slot-scope="scope">
<span>{{ new Date(scope.row.startTime).Format('yyyy-MM-dd hh:mm:ss') }}</span>

@ -78,7 +78,7 @@ export default {
password: '111111'
},
loginRules: {
username: [{ required: true, trigger: 'blur', validator: validateUsername }],
// username: [{ required: true, trigger: 'blur', validator: validateUsername }],
password: [{ required: true, trigger: 'blur', validator: validatePassword }]
},
loading: false,

@ -28,15 +28,12 @@
border
fit
highlight-current-row
@selection-change="handleSelectionChange"
>
<el-table-column type="selection"/>
<el-table-column label="序号" align="center">
<template slot-scope="scope">
<input type="checkbox" name="checkList" :data-id="scope.row.id" />
</template>
</el-table-column>
<el-table-column label="选择" width="60px" align="center">
<template slot-scope="scope">
<el-checkbox v-model="checkList" :key="scope.row.id" />
<span>{{ scope.row.id }}</span>
</template>
</el-table-column>
<el-table-column label="案例名称" align="center">
@ -124,7 +121,6 @@ export default {
cousrseOptions:[],
levelOption:[],
checkList:[],
checkedArr:[],
dialogStatus: '',
statusOptions: ['published', 'draft', 'deleted'],
temp: {
@ -190,6 +186,9 @@ export default {
}
})
},
handleSelectionChange(val){
this.checkList = val
},
updateStatus(item,status){
item.status = status
question.batch({ids:[item.id],status: status}).then(response=>{
@ -245,12 +244,9 @@ export default {
},
batch(stat){
let ids =[]
let cks = document.getElementsByName("checkList")
for(var i=0;i<cks.length;i++){
if(cks[i].checked){
ids.push(cks[i].getAttribute("data-id"))
}
}
this.checkList.forEach(item=>{
ids.push(item.id)
})
if(ids.length>0){
question.batch({ids:ids,status: stat}).then(res=>{
@ -274,15 +270,6 @@ export default {
})
}
}
},
watch:{
"checkList" : function(){
if(this.checkList.length == this.checkedArr.length){
this.checkAll = true
}else{
this.checkAll = false
}
}
}
}
</script>

@ -28,17 +28,14 @@
border
fit
highlight-current-row
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" />
<el-table-column label="序号" align="center">
<template slot-scope="scope">
<span>{{ scope.row.id }}</span>
</template>
</el-table-column>
<el-table-column label="选择" width="60px" align="center">
<template slot-scope="scope">
<el-checkbox v-model="checkList" :key="scope.row.id" />
</template>
</el-table-column>
<el-table-column label="案例名称" align="center">
<template slot-scope="scope">
<span>{{ scope.row.stem }}</span>
@ -124,7 +121,6 @@ export default {
cousrseOptions:[],
levelOption:[],
checkList:[],
checkedArr:[],
dialogStatus: '',
statusOptions: ['published', 'draft', 'deleted'],
temp: {
@ -236,48 +232,34 @@ export default {
}
}
},
selectAll(val){
if(this.checkAll){
this.checkList = []
this.list.filter(item => item.checked).forEach( item => checkList.push(item.id))
}else{
this.checkList = []
}
handleSelectionChange(val){
this.checkList = val
},
batch(stat){
let ids =[]
console.log(this.checkList)
// this.list.filter(item => item.checked).forEach( item => ids.push(item.id))
// console.log(ids)
// if(ids.length>0){
// question.batch({ids:ids,status: stat}).then(res=>{
// if(res.code==200){
// if(stat==0){
// this.$notify({
// title: '',
// message: "success",
// type: 'success',
// duration: 2000
// })
// }else{
// this.$notify({
// title: '',
// message: "success",
// type: 'success',
// duration: 2000
// })
// }
// }
// })
// }
}
},
watch:{
"checkList" : function(){
if(this.checkList.length == this.checkedArr.length){
this.checkAll = true
this.checkList.forEach(item=>{
ids.push(item.id)
})
if(ids.length>0){
question.batch({ids:ids,status: stat}).then(res=>{
if(res.code==200){
if(stat==0){
this.$notify({
title: '下架成功',
message: "success",
type: 'success',
duration: 2000
})
}else{
this.checkAll = false
this.$notify({
title: '上架成功',
message: "success",
type: 'success',
duration: 2000
})
}
}
})
}
}
}

@ -18,9 +18,6 @@
<el-button @click="batch(0)"></el-button>
</div>
<div class="tz-line">
<el-checkbox label="全选" v-model="checkAll" @change="selectAll" />
</div>
<el-table
v-loading="listLoading"
:data="list"
@ -28,14 +25,10 @@
border
fit
highlight-current-row
@selection-change="handleSelectionChange"
>
<el-table-column label="选择" width="60px" align="center">
<template slot-scope="scope">
<!-- <el-checkbox :key="scope.row.id" v-model="scope.row.checked" /> -->
<input type="checkbox" name="checkList" :data-id="scope.row.id" />
</template>
</el-table-column>
<el-table-column type="selection" />
<el-table-column label="序号" align="center">
<template slot-scope="scope">
<span>{{ scope.row.id }}</span>
@ -115,9 +108,9 @@ export default {
listLoading: true,
listQuery: {
pageNo: 0,
courseId: 0,
stem: '',
type:0
courseId: null,
stem: null,
type: null
},
total: 0,
limit: 20,
@ -131,7 +124,6 @@ export default {
cousrseOptions:[],
levelOption:[],
checkList:[],
checkedArr:[],
dialogStatus: '',
statusOptions: ['published', 'draft', 'deleted'],
temp: {
@ -196,6 +188,9 @@ export default {
}
})
},
handleSelectionChange(val) {
this.checkList = val
},
updateStatus(item,status){
item.status = status
question.batch({ids:[item.id],status: status}).then(response=>{
@ -242,28 +237,11 @@ export default {
}
}
},
selectAll(val){
let cks = document.getElementsByName("checkList")
console.log(cks.length)
for(var i=0;i<cks.length;i++){
cks[i].checked = val;
}
//this.list.forEach(i => i.checked = val)
// if(this.checkAll){
// this.checkList = []
// this.list.filter(item => item.checked).forEach( item => checkList.push(item.id))
// }else{
// this.checkList = []
// }
},
batch(stat){
let ids =[]
let cks = document.getElementsByName("checkList")
for(var i=0;i<cks.length;i++){
if(cks[i].checked){
ids.push(cks[i].getAttribute("data-id"))
}
}
this.checkList.forEach(item =>{
ids.push(item.id)
})
if(ids.length>0){
question.batch({ids:ids,status: stat}).then(res=>{

@ -35,22 +35,22 @@
</el-table-column>
<el-table-column label="省份" align="center">
<template slot-scope="scope">
<span>{{ scope.row.mobile }}</span>
<span>{{ scope.row.pronvice }}</span>
</template>
</el-table-column>
<el-table-column label="所属区域" align="center">
<template slot-scope="scope">
<span>{{ scope.row.mobile }}</span>
<span>{{ scope.row.regionId }}</span>
</template>
</el-table-column>
<el-table-column label="学校层次" align="center">
<template slot-scope="scope">
<span>{{ scope.row.mobile }}</span>
<span>{{ scope.row.levelId }}</span>
</template>
</el-table-column>
<el-table-column label="添加时间" align="center">
<template slot-scope="scope">
<span>{{ scope.row.gmtCreate }}</span>
<span>{{ new Date(scope.row.gmtCreate).Format("yyyy-MM-dd") }}</span>
</template>
</el-table-column>
<el-table-column align="center" label="操作" width="300" class-name="small-padding fixed-width">
@ -90,17 +90,17 @@
</el-form-item>
<el-form-item label="省份">
<el-select v-model="temp.pronvice" class="filter-item" placeholder="请选择">
<el-option v-for="item in provincOtions" :key="item.id" :label="item.name" :value="item.key" />
<el-option v-for="item in provincOtions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="区域">
<el-select v-model="temp.region" class="filter-item" placeholder="请选择">
<el-option v-for="item in regionOptions" :key="item.id" :label="item.name" :value="item.key" />
<el-option v-for="item in regionOptions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="学校层次">
<el-select v-model="temp.leve" class="filter-item" placeholder="请选择">
<el-option v-for="item in levelOtions" :key="item.id" :label="item.name" :value="item.key" />
<el-option v-for="item in levelOtions" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-form>

Loading…
Cancel
Save