master
parent
356f120dcd
commit
68af41a4b7
27 changed files with 962 additions and 754 deletions
@ -1,264 +0,0 @@ |
||||
<template> |
||||
<div> |
||||
<el-form :disabled="isDetail"> |
||||
<el-card shadow="hover" class="m-b-20"> |
||||
<div class="flex j-between"> |
||||
<div class="per_title" v-throttle @click="goback()"> |
||||
<i class="el-icon-arrow-left"></i> |
||||
<span class="per_back">返回</span> |
||||
<span class="per_school">{{isDetail ? '查看' : (id ? '更新' : '创建')}}考核</span> |
||||
</div> |
||||
<div> |
||||
<el-button type="primary" size="small" round v-throttle @click="save" v-show="!isDetail">{{id ? '更新' : '创建'}}</el-button> |
||||
</div> |
||||
</div> |
||||
</el-card> |
||||
|
||||
<el-card shadow="hover" class="m-b-20"> |
||||
<div> |
||||
<p class="m-b-20">考核名称</p> |
||||
<el-input |
||||
placeholder="请输入考核名称" |
||||
v-model="assessmentName" |
||||
clearable |
||||
maxlength="25" |
||||
class="inline_input" |
||||
></el-input> |
||||
</div> |
||||
</el-card> |
||||
|
||||
<el-card shadow="hover" class="m-b-20"> |
||||
<div> |
||||
<p class="m-b-20">考核类型</p> |
||||
<div class="inline_input"> |
||||
<el-select v-model="classificationId" placeholder="请选择考核类型"> |
||||
<el-option |
||||
v-for="item in classificationList" |
||||
:key="item.id" |
||||
:label="item.name" |
||||
:value="item.id"> |
||||
</el-option> |
||||
</el-select> |
||||
</div> |
||||
</div> |
||||
</el-card> |
||||
|
||||
<el-card shadow="hover" class="m-b-20"> |
||||
<div> |
||||
<p class="m-b-20">考核时间</p> |
||||
<el-date-picker |
||||
size="small" |
||||
v-model="date" |
||||
value-format="yyyy-MM-dd HH:mm:ss" |
||||
type="datetimerange" |
||||
range-separator="-" |
||||
start-placeholder="开始日期" |
||||
end-placeholder="结束日期" |
||||
:picker-options="pickerOptions" |
||||
></el-date-picker> |
||||
</div> |
||||
</el-card> |
||||
|
||||
<el-card shadow="hover" class="m-b-20"> |
||||
<div> |
||||
<p class="m-b-20">试卷选择</p> |
||||
<div class="inline_input"> |
||||
<el-button type="primary" @click="openSelect">试卷选择</el-button> |
||||
</div> |
||||
</div> |
||||
</el-card> |
||||
|
||||
<el-card shadow="hover" class="m-b-20"> |
||||
<div> |
||||
<p class="m-b-20">发布班级</p> |
||||
<div class="inline_input"> |
||||
<div class="per-wrap"> |
||||
<el-tree |
||||
ref="per" |
||||
:data="permissions" |
||||
show-checkbox |
||||
node-key="id" |
||||
:default-expanded-keys="checkedIds" |
||||
:default-checked-keys="checkedIds" |
||||
:props="defaultProps"> |
||||
</el-tree> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</el-card> |
||||
</el-form> |
||||
|
||||
<el-dialog title="试卷选择" :visible.sync="selectVisible" width="40%" @close="closeSelect" :close-on-click-modal="false"> |
||||
<div class="flex-justify-end"> |
||||
<el-form label-width="80px" inline> |
||||
<el-form-item class="no-mb" label="所属考核"> |
||||
<el-select v-model="publishStatus" clearable placeholder="请选择所属考核" @change="getData"> |
||||
<el-option v-for="(item,index) in statusList" :key="index" :label="item.name" :value="item.value"></el-option> |
||||
</el-select> |
||||
</el-form-item> |
||||
<el-form-item class="no-mb"> |
||||
<el-input |
||||
placeholder="请输入试卷名称" |
||||
prefix-icon="el-icon-search" |
||||
v-model="keyword" |
||||
clearable |
||||
></el-input> |
||||
</el-form-item> |
||||
</el-form> |
||||
</div> |
||||
|
||||
<el-table |
||||
:data="listData" |
||||
ref="table" |
||||
row-key="id" |
||||
class="table" |
||||
stripe |
||||
header-align="center" |
||||
@selection-change="handleSelectionChange" |
||||
> |
||||
<el-table-column width="60" label="选择" align="center"> |
||||
<template slot-scope="scope"> |
||||
<el-radio v-model="projectId" :label="scope.row.projectId"> </el-radio> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column type="index" width="100" label="序号" align="center"> |
||||
<template |
||||
slot-scope="scope" |
||||
>{{scope.$index + (page - 1) * pageSize + 1}}</template> |
||||
</el-table-column> |
||||
<el-table-column prop="name" label="试卷名称" align="center"></el-table-column> |
||||
<el-table-column label="操作" align="center"> |
||||
<template slot-scope="scope"> |
||||
<el-button type="text" @click="showQues(scope.row)">预览</el-button> |
||||
</template> |
||||
</el-table-column> |
||||
</el-table> |
||||
<div class="pagination"> |
||||
<el-pagination |
||||
background |
||||
@current-change="handleCurrentChange" |
||||
:current-page="page" |
||||
:page-size="pageSize" |
||||
layout="total,prev, pager, next" |
||||
:total="total" |
||||
></el-pagination> |
||||
</div> |
||||
|
||||
<span slot="footer" class="dialog-footer"> |
||||
<el-button @click="importVisible = false">取消</el-button> |
||||
<el-button type="primary" @click="uploadSure">确定</el-button> |
||||
</span> |
||||
</el-dialog> |
||||
</div> |
||||
</template> |
||||
<script> |
||||
import { mapState } from 'vuex' |
||||
export default { |
||||
data() { |
||||
return { |
||||
id: '', |
||||
assessmentName: '', |
||||
classId: '', |
||||
date: [], |
||||
startTime: '', |
||||
endTime: '', |
||||
state: '', |
||||
testPaperId: '', |
||||
type: '', |
||||
page: 1, |
||||
pageSize: 10, |
||||
total: 0, |
||||
isDetail: Boolean(this.$route.query.show), |
||||
selectVisible: false |
||||
}; |
||||
}, |
||||
computed: { |
||||
...mapState('user', [ |
||||
'userId','clientId' |
||||
]) |
||||
}, |
||||
watch: { |
||||
date: function(val){ |
||||
if(val){ |
||||
this.startTime = val[0] |
||||
this.endTime = val[1] |
||||
}else{ |
||||
this.startTime = '' |
||||
this.endTime = '' |
||||
} |
||||
this.getData() |
||||
} |
||||
}, |
||||
mounted() { |
||||
this.id = this.$route.query.id |
||||
this.id && this.getData() |
||||
}, |
||||
methods: { |
||||
save() { |
||||
if(this.assessmentName === '') return this.$message.warning('请填写考核名称') |
||||
if(this.type === '') return this.$message.warning('请选择考核类型') |
||||
if(this.startTime === '') return this.$message.warning('请选择考核时间') |
||||
if(this.testPaperId === '') return this.$message.warning('请选择试卷') |
||||
|
||||
let data = { |
||||
id: this.id, |
||||
userId: this.userId, |
||||
assessmentName: this.assessmentName, |
||||
type: this.type, |
||||
startTime: this.startTime, |
||||
endTime: this.endTime, |
||||
} |
||||
if(this.id){ |
||||
this.$put(this.api.editCourse, data).then(res => { |
||||
this.$message.success('修改成功'); |
||||
this.$router.back() |
||||
}) |
||||
.catch(err => { |
||||
}); |
||||
}else{ |
||||
this.$post(this.api.addCourse, data).then(res => { |
||||
this.$message.success('创建成功'); |
||||
this.$router.back() |
||||
}) |
||||
.catch(err => { |
||||
}); |
||||
} |
||||
}, |
||||
getData() { |
||||
this.$get(`${this.api.getCourse}/${this.id}`) |
||||
.then(res => { |
||||
|
||||
}) |
||||
.catch(err => { |
||||
|
||||
}); |
||||
}, |
||||
goback() { |
||||
if(this.isDetail){ |
||||
this.$router.back() |
||||
}else{ |
||||
this.$confirm('确定返回?未更新的信息将不会保存。', '提示', { |
||||
type: 'warning' |
||||
}) |
||||
.then(() => { |
||||
this.$router.back() |
||||
}) |
||||
.catch(() => {}); |
||||
} |
||||
}, |
||||
openSelect(){ |
||||
this.selectVisible = true |
||||
} |
||||
}, |
||||
}; |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
.inline_input { |
||||
width: 300px; |
||||
} |
||||
.per-wrap{ |
||||
max-height: 400px; |
||||
overflow: auto; |
||||
} |
||||
</style> |
@ -0,0 +1,139 @@ |
||||
<template> |
||||
<div> |
||||
<div> |
||||
<lctree :data="majorList" @fircheckitem="fircheckitem" @twocheckitem="twocheckitem" @threecheckitem="threecheckitem" @fourcheckitem="fourcheckitem"></lctree> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
<script> |
||||
import lctree from './studentTree' |
||||
import { mapState } from 'vuex' |
||||
export default { |
||||
props:["Data",'classId','studentId'], |
||||
data() { |
||||
return { |
||||
majorList: [], |
||||
firactive: 0, |
||||
twoactive: 0, |
||||
threeactive: 0, |
||||
isaddClassMajor: false, |
||||
isAddDepartment: false, |
||||
isAddClass: false, |
||||
Form: { |
||||
classmajorId: '', |
||||
classmajorName: '', |
||||
}, |
||||
Form2: { |
||||
departmentId: '', |
||||
departmentName: '', |
||||
}, |
||||
Form3: { |
||||
classId: '', |
||||
className: '' |
||||
}, |
||||
majorNoAdd: true, |
||||
}; |
||||
}, |
||||
computed: { |
||||
...mapState('user', [ |
||||
'userId','clientId' |
||||
]) |
||||
}, |
||||
components: { |
||||
lctree |
||||
}, |
||||
mounted(){ |
||||
this.getStaff() |
||||
}, |
||||
methods: { |
||||
getStaff(){ |
||||
let data = { |
||||
schoolId: this.clientId |
||||
} |
||||
let classId = this.classId ? this.classId.split(',') : [] |
||||
let studentId = this.studentId |
||||
this.$get(this.api.queryStudentProfessionalArchitecture,data).then(res => { |
||||
let StaffProfessionalArchitectureList = res.data.StaffProfessionalArchitectureList |
||||
StaffProfessionalArchitectureList.map(n => { |
||||
(n.ifVisible = false), (n.ischeck = false), (n.label = n.stuProfessionalArchitectureName); |
||||
let data = { |
||||
stuProfessionalArchitectureId: n.stuProfessionalArchitectureId |
||||
} |
||||
this.$get(this.api.queryGrade,data).then(res => { |
||||
n.children = res.data.Grade |
||||
n.children.map(j => { |
||||
(j.ifVisible = false), (j.ischeck = false), (j.label = j.gradeName); |
||||
let data = { |
||||
gradeId: j.gradeId |
||||
} |
||||
this.$get(this.api.queryClass,data).then(res => { |
||||
res.data.Class.map(e => { |
||||
(e.ifVisible = false), (e.ischeck = false), (e.label = e.className) |
||||
let data = { |
||||
searchContent: '', |
||||
professionalIds: n.stuProfessionalArchitectureId, |
||||
gradeIds: j.gradeId, |
||||
classIds: e.classId, |
||||
schoolId: this.clientId |
||||
} |
||||
this.$get(`${this.api.queryStudent}/1/200`,data).then(res => { |
||||
res.data.studentList.map(s => { |
||||
(s.ifVisible = false), (s.ischeck = false), (s.label = s.studentName) |
||||
if(studentId.includes(s.userId)){ |
||||
s.ischeck = true |
||||
e.ifVisible = true |
||||
j.ifVisible = true |
||||
n.ifVisible = true |
||||
} |
||||
}) |
||||
e.children = res.data.studentList |
||||
}).catch(res => {}) |
||||
|
||||
if(classId.includes(String(e.classId))){ |
||||
e.ischeck = true |
||||
j.ifVisible = true |
||||
n.ifVisible = true |
||||
} |
||||
}) |
||||
j.children = res.data.Class |
||||
if(j.children.every(i => i.ischeck)){ |
||||
j.ischeck = true |
||||
} |
||||
if(n.children.every(i => i.ischeck)){ |
||||
n.ischeck = true |
||||
} |
||||
}).catch(res => {}); |
||||
}) |
||||
}).catch(res => {}); |
||||
}) |
||||
setTimeout(() => { |
||||
this.majorList = StaffProfessionalArchitectureList |
||||
this.majorList[0].ifVisible = true |
||||
}, 500); |
||||
}).catch(res => {}); |
||||
}, |
||||
// 选择专业 |
||||
fircheckitem(item){ |
||||
this.$emit("fircheck",item,this.majorList) |
||||
}, |
||||
// 选择年级 |
||||
twocheckitem(item){ |
||||
this.$emit("twocheck",item,this.majorList) |
||||
}, |
||||
threeClick(index){ |
||||
this.threeactive = index |
||||
}, |
||||
// 选择班级 |
||||
threecheckitem(three){ |
||||
this.$emit("threecheck",three,this.majorList) |
||||
}, |
||||
// 选择学生 |
||||
fourcheckitem(four){ |
||||
this.$emit("fourcheck",four,this.majorList) |
||||
}, |
||||
} |
||||
}; |
||||
</script> |
||||
<style lang="scss" scoped> |
||||
|
||||
</style> |
@ -0,0 +1,154 @@ |
||||
<template> |
||||
<div class="side_view"> |
||||
<div class="side_tree" @click.stop="open(item)" v-for="(item,index) in data" :key="index"> |
||||
<div class="item" @click.stop="open(item)"> |
||||
<img |
||||
v-if="item.children&&item.children.length!=0" |
||||
:class="{ 'arrowTransform': !item.ifVisible, 'arrowTransformReturn': item.ifVisible}" |
||||
src="../../../assets/img/icon-xiangyou.png" |
||||
alt |
||||
/> |
||||
<i v-else class="empty"></i> |
||||
<i :class="item.ischeck ? 'icon-yigouxuan' : 'icon-weigouxuan'" @click.stop="fircheckitem(item)"></i> |
||||
<span>{{item.label}}</span> |
||||
</div> |
||||
|
||||
<div v-show="item.ifVisible" v-if="item.children&&item.children.length!=0"> |
||||
<div v-for="(item1,index1) in item.children" :key="index1"> |
||||
<div class="item1" @click.stop="open(item1)"> |
||||
<img |
||||
v-if="item1.children&&item1.children.length!=0" |
||||
:class="{ 'arrowTransform': !item1.ifVisible, 'arrowTransformReturn': item1.ifVisible}" |
||||
src="../../../assets/img/icon-xiangyou.png" |
||||
alt |
||||
/> |
||||
<i v-else class="empty"></i> |
||||
<i :class="item1.ischeck ? 'icon-yigouxuan' : 'icon-weigouxuan'" @click.stop="twocheckitem(item1)"></i> |
||||
<span>{{item1.label}}年级</span> |
||||
</div> |
||||
|
||||
<div v-show="item1.ifVisible" v-if="item1.children&&item1.children.length!=0"> |
||||
<div v-for="(item2,index2) in item1.children" :key="index2"> |
||||
<div class="item2" @click.stop="open(item2)"> |
||||
<img |
||||
v-if="item2.children&&item2.children.length!=0" |
||||
:class="{ 'arrowTransform': !item2.ifVisible, 'arrowTransformReturn': item2.ifVisible}" |
||||
src="../../../assets/img/icon-xiangyou.png" |
||||
alt |
||||
/> |
||||
<i v-else class="empty"></i> |
||||
<i :class="item2.ischeck ? 'icon-yigouxuan' : 'icon-weigouxuan'" @click.stop="threecheckitem(item2)"></i> |
||||
<span>{{item2.label}}班</span> |
||||
</div> |
||||
|
||||
<div v-show="item2.ifVisible" v-if="item2.children&&item2.children.length!=0"> |
||||
<div v-for="(item3,index3) in item2.children" :key="index3"> |
||||
<div class="item3" @click.stop="open(item3)"> |
||||
<i :class="item3.ischeck ? 'icon-yigouxuan' : 'icon-weigouxuan'" @click.stop="fourcheckitem(item3)"></i> |
||||
<span>{{item3.label}}</span> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
|
||||
<script> |
||||
Array.prototype.removeByValue = function (val) { |
||||
for (var i = 0; i < this.length; i++) { |
||||
if (JSON.stringify(this[i]).indexOf(JSON.stringify(val)) != -1) { |
||||
this.splice(i, 1); |
||||
break; |
||||
} |
||||
} |
||||
}; |
||||
export default { |
||||
data() { |
||||
return { |
||||
chooseList: [] |
||||
}; |
||||
}, |
||||
watch: { |
||||
chooseList(n, o) { |
||||
this.$emit('chooseNode', n); |
||||
} |
||||
}, |
||||
|
||||
props: { |
||||
data: { |
||||
type: Array |
||||
} |
||||
}, |
||||
methods: { |
||||
//点击节点时伸展或收缩列表 |
||||
open(item) { |
||||
item.ifVisible = !item.ifVisible; |
||||
}, |
||||
|
||||
//选中叶子节点时将选中的叶子节点添加进数组,如果叶子节点存在则删除,removeByvalue函数定义在main.js中 |
||||
choose(item) { |
||||
item.ifVisible = !item.ifVisible; |
||||
if (item.ifVisible) { |
||||
this.chooseList.push(item); |
||||
} else { |
||||
this.chooseList.removeByValue(item); |
||||
} |
||||
}, |
||||
fircheckitem(item){ |
||||
this.$emit('fircheckitem',item); |
||||
}, |
||||
twocheckitem(item){ |
||||
console.log(22,item) |
||||
this.$emit('twocheckitem',item); |
||||
}, |
||||
threecheckitem(item){ |
||||
this.$emit('threecheckitem',item); |
||||
}, |
||||
fourcheckitem(item){ |
||||
this.$emit('fourcheckitem',item); |
||||
}, |
||||
//判断数组中是否包含某个对象 |
||||
isHasObj(arr, val) { |
||||
var flag = 0; //1为有 0为没有 |
||||
for (var i = 0; i < arr.length; i++) { |
||||
if (JSON.stringify(arr[i]).indexOf(JSON.stringify(val)) != -1) { |
||||
flag = 1; |
||||
} |
||||
} |
||||
if (flag == 1) { |
||||
return true; |
||||
} else { |
||||
return false; |
||||
} |
||||
} |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
@import '../../../styles/pages/tree.scss'; |
||||
|
||||
.side_view{ |
||||
max-height: 300px; |
||||
overflow: auto;; |
||||
padding: 10px 20px; |
||||
i { |
||||
color: #cb221c; |
||||
} |
||||
} |
||||
.item{ |
||||
padding: 5px 0; |
||||
margin-top: 10px; |
||||
} |
||||
.item2 { |
||||
margin-left:43px |
||||
} |
||||
.item1,.item2,.item3{ |
||||
padding: 0; |
||||
margin-top: 0; |
||||
} |
||||
</style> |
@ -0,0 +1,104 @@ |
||||
$insideColor: rgba(245, 242, 255, 0.8); //内部节点的边框颜色 |
||||
$outColor: rgba(255, 255, 255, 0.8); //外部节点的边框颜色 |
||||
//混合代码,提取item共同样式 |
||||
@mixin public { |
||||
cursor: pointer; |
||||
font-size: 14px; |
||||
color: #333333; |
||||
display: flex; |
||||
align-items: center; |
||||
img { |
||||
height: 20px; |
||||
width: 20px; |
||||
margin-left: 10px; |
||||
} |
||||
} |
||||
|
||||
.side_tree{ |
||||
width: 100%; |
||||
font-size: 14px; |
||||
color: #333; |
||||
i{ |
||||
margin-left: 5px; |
||||
font-size: 17px; |
||||
} |
||||
span{ |
||||
margin-left: 5px; |
||||
font-size: 14px; |
||||
} |
||||
} |
||||
.item { |
||||
@include public; |
||||
width: 100%; |
||||
padding: 15px 0; |
||||
background:rgba(255,255,255,1); |
||||
box-shadow:1px 14px 29px 0px rgba(255,69,69,0.19); |
||||
border-radius:10px; |
||||
text-align: left; |
||||
margin-top: 20px; |
||||
} |
||||
.empty{ |
||||
width: 25px; |
||||
} |
||||
.item:first{ |
||||
margin-top: 0; |
||||
} |
||||
.item1 { |
||||
@include public; |
||||
margin-top: 20px; |
||||
margin-left: 23px; |
||||
} |
||||
.item2 { |
||||
@include public; |
||||
margin-top: 20px; |
||||
margin-left:80px |
||||
} |
||||
.item3 { |
||||
@include public; |
||||
margin-top: 20px; |
||||
margin-left:95px |
||||
} |
||||
.item2:hover{ |
||||
color: #cb221c; |
||||
} |
||||
.edit{ |
||||
display: inline-block; |
||||
width: 17px; |
||||
height: 17px; |
||||
background: url(../../../assets/svg/edit.svg) 0 0/cover no-repeat; |
||||
} |
||||
// 使三角形旋转动画 |
||||
.arrowTransform { |
||||
transition: 0.4s; |
||||
transform-origin: center; |
||||
transform: rotateZ(0deg); |
||||
} |
||||
.arrowTransformReturn { |
||||
transition: 0.4s; |
||||
transform-origin: center; |
||||
transform: rotateZ(90deg); |
||||
} |
||||
|
||||
//复选框样式 |
||||
.checkBox { |
||||
width: 14px; |
||||
height: 14px; |
||||
border-radius: 7px; |
||||
margin-left: 10px; |
||||
margin-right: 10px; |
||||
border: 2px solid rgba(146, 120, 255, 1); |
||||
} |
||||
|
||||
//当点击复选框时候切换背景图片 |
||||
.isActive { |
||||
background: url('../../../assets/img/icon-yigouxuan.png'); |
||||
background-size: 14px 14px; /*按比例缩放*/ |
||||
} |
||||
|
||||
.side_icon{ |
||||
text-align: right; |
||||
} |
||||
.side_icon i{ |
||||
cursor:pointer; |
||||
font-size: 20px; |
||||
} |
Loading…
Reference in new issue