Merge branch 'zcwy-0520-out' into zcwy-zsx0223
165
src/api/examineApi.js
Normal file
@@ -0,0 +1,165 @@
|
|||||||
|
import { data } from "jquery";
|
||||||
|
import http from "./configPublic";
|
||||||
|
//认证审批项目列表
|
||||||
|
export const getexamineList = (data) => {
|
||||||
|
return http({
|
||||||
|
url: "/activityApi/examine/list",
|
||||||
|
method: "post",
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
export const getexamine = (data) => {
|
||||||
|
return http({
|
||||||
|
url: "/activityApi/teacher/list",
|
||||||
|
method: "post",
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
//创建认证
|
||||||
|
export const CreateAuthentication = (data)=>{
|
||||||
|
return http({
|
||||||
|
url:'/activityApi/examine/launchOrUpdate',
|
||||||
|
method: "post",
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//删除认证
|
||||||
|
export const delExamine = (data)=>{
|
||||||
|
return http({
|
||||||
|
url:'/activityApi/examine/deleteExamine',
|
||||||
|
method: "post",
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//讲师列表
|
||||||
|
export const getTeacherList = (data)=>{
|
||||||
|
return http({
|
||||||
|
url:'/activityApi/teacher/list',
|
||||||
|
method: "post",
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//删除教师
|
||||||
|
export const deleTeTeacher = (data)=>{
|
||||||
|
return http({
|
||||||
|
url:'/activityApi//teacher/deleTeTeacher',
|
||||||
|
method: "post",
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//发起评审列表
|
||||||
|
export const getReview = (data) =>{
|
||||||
|
return http({
|
||||||
|
url:'/activityApi/review/list',
|
||||||
|
method: "post",
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//删除评审
|
||||||
|
export const delreview=(data) =>{
|
||||||
|
return http({
|
||||||
|
url:'/activityApi/review/delete',
|
||||||
|
method: "post",
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//查看评审
|
||||||
|
export const reviewdetail =(data)=>{
|
||||||
|
return http({
|
||||||
|
url:'/activityApi/review/detail',
|
||||||
|
method: "post",
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//发起评审
|
||||||
|
export const reviewSave = (data) =>{
|
||||||
|
return http({
|
||||||
|
url:'/activityApi/review/save',
|
||||||
|
method: "post",
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//添加教师
|
||||||
|
export const addTeacher= (data)=>{
|
||||||
|
return http({
|
||||||
|
url:'/activityApi/review/selectTeacher',
|
||||||
|
method: "post",
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//结束评审并通知结果
|
||||||
|
export const endreview = (data) =>{
|
||||||
|
return http({
|
||||||
|
url:'/activityApi/review/endReview',
|
||||||
|
method: "post",
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//编辑评审
|
||||||
|
export const editreview = (data) =>{
|
||||||
|
return http({
|
||||||
|
url:'/activityApi/review/edit',
|
||||||
|
method: "post",
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//添加导师
|
||||||
|
export const addTutor = (data) =>{
|
||||||
|
return http({
|
||||||
|
url:'/activityApi/teacher/saveTeacher',
|
||||||
|
method: "post",
|
||||||
|
data: data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//线上学习课列表
|
||||||
|
export const getOnlineLearningList = (data) => http.post('/activityApi/examine/getOnlineLearningList',data)
|
||||||
|
//删除线上学习课
|
||||||
|
export const deleteCourse = (data) => http.post('/activityApi/examine/deleteCourse',data)
|
||||||
|
//新增线上学习课
|
||||||
|
export const addCourse = (data) => http.post('/activityApi/examine/addCourse',data)
|
||||||
|
//保存导入的教师信息
|
||||||
|
export const saveTeacher = (data) => http.post('/activityApi/teacher/saveTeacher',data)
|
||||||
|
//退回初稿或终稿
|
||||||
|
export const backDraft = (data) => http.post('/activityApi/examine/rejected',data)
|
||||||
|
//获取教师详情
|
||||||
|
export const getDataById = (data) => http.post('/activityApi/teacher/getDataById',data)
|
||||||
|
//获取认证状态
|
||||||
|
export const getCertificationProcess = (data) => http.post('/activityApi/teacher/getCertificationProcess',data)
|
||||||
|
//编辑认证
|
||||||
|
export const updateExamine = (data) => http.post('/activityApi/examine/updateExamine',data)
|
||||||
|
//添加权限 0: 查看 2: 管理
|
||||||
|
export const addPermission = (data) => http.post('/activityApi/examinePermission/addPermission',data)
|
||||||
|
|
||||||
|
//权限列表
|
||||||
|
export const removePermission = (data)=>{
|
||||||
|
return http({
|
||||||
|
url:'/activityApi/examinePermission/list',
|
||||||
|
method: "post",
|
||||||
|
data:data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//转移归属权
|
||||||
|
export const transferPermission =(data)=>{
|
||||||
|
return http({
|
||||||
|
url:'/activityApi/examinePermission/transferPermission',
|
||||||
|
method: "post",
|
||||||
|
data:data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//删除权限
|
||||||
|
export const deletedPermission = (data) => http.get('/activityApi/examinePermission/deletedPermission',{params:data})
|
||||||
|
//添加权限
|
||||||
|
// export const addPermission = (data)=>{
|
||||||
|
// return http({
|
||||||
|
// url:'/activityApi/permission/addPermission',
|
||||||
|
// method: "post",
|
||||||
|
// data:data
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
|
||||||
|
//依旧id查找教师
|
||||||
|
export const getTeacherId = (data) => http.get('/activityApi/teacher/getTeacherId',{params:data})
|
||||||
|
//更改状态
|
||||||
|
export const updateStatus = (data) => http.post('/activityApi/examine/updateStatus',data)
|
||||||
BIN
src/assets/2.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
src/assets/27.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
src/assets/30.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
src/assets/33.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
src/assets/39.png
Normal file
|
After Width: | Height: | Size: 93 KiB |
BIN
src/assets/44.png
Normal file
|
After Width: | Height: | Size: 145 KiB |
BIN
src/assets/46.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
src/assets/47.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
src/assets/49.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
src/assets/50.png
Normal file
|
After Width: | Height: | Size: 98 KiB |
BIN
src/assets/8.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
src/assets/images/gratefulteacher/Avatarman.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
src/assets/images/gratefulteacher/AvatarmanNew.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
src/assets/images/gratefulteacher/Avatarwoman.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
src/assets/images/gratefulteacher/AvatarwomanNew.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
src/assets/images/gratefulteacher/e1.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
src/assets/images/gratefulteacher/e2.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
src/assets/images/gratefulteacher/e3.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
src/assets/images/gratefulteacher/j1.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
src/assets/images/gratefulteacher/j2.png
Normal file
|
After Width: | Height: | Size: 7.3 KiB |
BIN
src/assets/images/gratefulteacher/ppt.png
Normal file
|
After Width: | Height: | Size: 834 B |
BIN
src/assets/images/gratefulteacher/s1.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
src/assets/images/gratefulteacher/s2.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
src/assets/images/gratefulteacher/s3.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
src/assets/images/gratefulteacher/s4.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
src/assets/images/gratefulteacher/s5.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
src/assets/images/gratefulteacher/su1.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
src/assets/images/gratefulteacher/su2.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
src/assets/images/gratefulteacher/su3.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
src/assets/images/gratefulteacher/su4.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
src/assets/images/gratefulteacher/su5.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
src/assets/images/gratefulteacher/success.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
src/assets/教师认证封面图/教师认证封面图/27.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
src/assets/教师认证封面图/教师认证封面图/30.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
src/assets/教师认证封面图/教师认证封面图/33.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
src/assets/教师认证封面图/教师认证封面图/39.png
Normal file
|
After Width: | Height: | Size: 93 KiB |
BIN
src/assets/教师认证封面图/教师认证封面图/44.png
Normal file
|
After Width: | Height: | Size: 145 KiB |
BIN
src/assets/教师认证封面图/教师认证封面图/46.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
src/assets/教师认证封面图/教师认证封面图/47.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
src/assets/教师认证封面图/教师认证封面图/49.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
src/assets/教师认证封面图/教师认证封面图/50.png
Normal file
|
After Width: | Height: | Size: 98 KiB |
@@ -495,6 +495,30 @@
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
if (
|
||||||
|
n.indexOf("/InstructorCertification") !== -1 ||
|
||||||
|
n.indexOf("/instructorcertification") !== -1
|
||||||
|
) {
|
||||||
|
state.list = [
|
||||||
|
{
|
||||||
|
name: "教师专区",
|
||||||
|
}, {
|
||||||
|
name:'讲师认证'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
n.indexOf("/LecturerManagement") !== -1 ||
|
||||||
|
n.indexOf("/lecturermanagement") !== -1
|
||||||
|
) {
|
||||||
|
state.list = [
|
||||||
|
{
|
||||||
|
name: "教师专区",
|
||||||
|
}, {
|
||||||
|
name:'讲师认证'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
if (
|
if (
|
||||||
n.indexOf("/tooldown") !== -1 ||
|
n.indexOf("/tooldown") !== -1 ||
|
||||||
n.indexOf("/ToolDown") !== -1
|
n.indexOf("/ToolDown") !== -1
|
||||||
|
|||||||
@@ -339,7 +339,7 @@
|
|||||||
</a-menu-item>
|
</a-menu-item>
|
||||||
</a-sub-menu>
|
</a-sub-menu>
|
||||||
<!-- 教师专区 -->
|
<!-- 教师专区 -->
|
||||||
<a-sub-menu key="sub22" @titleClick="titleClick" v-if="checkMenu('gratefulnotice,gratefulcarousel,teacherempowerment,teachertopic,tooldown,teacheropinion')">
|
<a-sub-menu key="sub22" @titleClick="titleClick" v-if="checkMenu('gratefulnotice,gratefulcarousel,teacherempowerment,teachertopic,tooldown,teacheropinion,instructorcertification')">
|
||||||
<template #icon>
|
<template #icon>
|
||||||
<div class="imgBox">
|
<div class="imgBox">
|
||||||
<img
|
<img
|
||||||
@@ -376,6 +376,17 @@
|
|||||||
></span>
|
></span>
|
||||||
<router-link to="/teacherempowerment">教师赋能</router-link>
|
<router-link to="/teacherempowerment">教师赋能</router-link>
|
||||||
</a-menu-item>
|
</a-menu-item>
|
||||||
|
|
||||||
|
<a-menu-item key="sub22-7" v-if="checkMenu('instructorcertification')">
|
||||||
|
<span
|
||||||
|
:class="{
|
||||||
|
circleActive: selectedKeys[0] === 'sub22-7' ? true : false,
|
||||||
|
circle: selectedKeys[0] === 'sub22-7' ? false : true,
|
||||||
|
}"
|
||||||
|
></span>
|
||||||
|
<router-link to="/instructorcertification">讲师认证</router-link>
|
||||||
|
</a-menu-item>
|
||||||
|
|
||||||
<a-menu-item key="sub22-4" v-if="checkMenu('teachertopic')">
|
<a-menu-item key="sub22-4" v-if="checkMenu('teachertopic')">
|
||||||
<span
|
<span
|
||||||
:class="{
|
:class="{
|
||||||
@@ -938,6 +949,12 @@ export default {
|
|||||||
selectedKeys: "sub22-6",
|
selectedKeys: "sub22-6",
|
||||||
pagename: "意见",
|
pagename: "意见",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
href: "/instructorcertification",
|
||||||
|
openKeys: "sub22",
|
||||||
|
selectedKeys: "sub22-7",
|
||||||
|
pagename: "讲师认证",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
href: "/articlemanage",
|
href: "/articlemanage",
|
||||||
openKeys: "sub13",
|
openKeys: "sub13",
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
<img :src="types[type]" alt=""/>
|
<img :src="types[type]" alt=""/>
|
||||||
</div>
|
</div>
|
||||||
<span>提示</span>
|
<span>提示</span>
|
||||||
|
<div class="close_exit" @click="close"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<div><span>{{ content }}</span></div>
|
<div><span>{{ content }}</span></div>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
>
|
>
|
||||||
<div class="drawerMain" id="stuadd">
|
<div class="drawerMain" id="stuadd">
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<div class="headerTitle">添加学员</div>
|
<div class="headerTitle">添加讲师</div>
|
||||||
<img
|
<img
|
||||||
style="width: 29px; height: 29px; cursor: pointer"
|
style="width: 29px; height: 29px; cursor: pointer"
|
||||||
src="../../assets/images/basicinfo/close.png"
|
src="../../assets/images/basicinfo/close.png"
|
||||||
|
|||||||
@@ -131,4 +131,5 @@ async function init() {
|
|||||||
initDict("course_pic"); //课程封面
|
initDict("course_pic"); //课程封面
|
||||||
initDict("job_type"); //岗位
|
initDict("job_type"); //岗位
|
||||||
initDict("band"); //band
|
initDict("band"); //band
|
||||||
|
initDict("examine_cover")
|
||||||
}
|
}
|
||||||
14
src/utils/qrCode2.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import { createApp } from 'vue'
|
||||||
|
import QrCode from "../views/gratefulteacher/QrCode.vue";
|
||||||
|
import Antd from "ant-design-vue";
|
||||||
|
|
||||||
|
function mountContent (option = {}) {
|
||||||
|
const dom = document.createElement('div')
|
||||||
|
document.body.appendChild(dom)
|
||||||
|
const app = createApp(QrCode, {
|
||||||
|
close: () => { app.unmount(dom); document.body.removeChild(dom) },
|
||||||
|
...option
|
||||||
|
})
|
||||||
|
app.use(Antd).mount(dom)
|
||||||
|
}
|
||||||
|
export default mountContent
|
||||||
185
src/views/gratefulteacher/AddInstructor.vue
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
<script setup >
|
||||||
|
import { ref } from 'vue'
|
||||||
|
import { ElMessageBox } from 'element-plus'
|
||||||
|
const props = defineProps(["AddSwitch"])
|
||||||
|
console.log(1111,props.AddSwitch);
|
||||||
|
const emit = defineEmits(['myClick'])
|
||||||
|
const handleClose = (done) => {
|
||||||
|
ElMessageBox.confirm('Are you sure to close this dialog?')
|
||||||
|
.then(() => {
|
||||||
|
|
||||||
|
emit('myClick', false)
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
// catch error
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const activeName = ref('first')
|
||||||
|
const handleNodeClick = (data) => {
|
||||||
|
console.log(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
const data= [
|
||||||
|
{
|
||||||
|
label: 'Level one 1',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
label: 'Level two 1-1',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
label: 'Level three 1-1-1',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Level one 2',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
label: 'Level two 2-1',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
label: 'Level three 2-1-1',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Level two 2-2',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
label: 'Level three 2-2-1',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Level one 3',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
label: 'Level two 3-1',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
label: 'Level three 3-1-1',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Level two 3-2',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
label: 'Level three 3-2-1',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
const defaultProps = {
|
||||||
|
children: 'children',
|
||||||
|
label: 'label',
|
||||||
|
}
|
||||||
|
const tags = ref([
|
||||||
|
{ name: 'Tag 1', type: 'primary' },
|
||||||
|
{ name: 'Tag 2', type: 'success' },
|
||||||
|
{ name: 'Tag 3', type: 'info' },
|
||||||
|
{ name: 'Tag 4', type: 'warning' },
|
||||||
|
{ name: 'Tag 5', type: 'danger' },
|
||||||
|
])
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="-page">
|
||||||
|
<el-drawer style="padding:0 10px;" :before-close="handleClose" v-model="props.AddSwitch" size="80%">
|
||||||
|
<template #title>
|
||||||
|
<h1 style="font-weight: 700;">添加讲师</h1>
|
||||||
|
</template>
|
||||||
|
<div style="width: 100%; height: 1px; background: #d8d8d8;margin-top: -16px; "></div>
|
||||||
|
<div style="width: 100%; height: 70%; display: flex; ">
|
||||||
|
<div style="width: 90%; height: 70%;">
|
||||||
|
<div style="width: 100%; margin-top: 16px">
|
||||||
|
<el-tabs v-model="activeName">
|
||||||
|
<el-tab-pane label="快速选人" name="first"></el-tab-pane>
|
||||||
|
<el-tab-pane label="添加组织" name="second"></el-tab-pane>
|
||||||
|
<el-tab-pane label="受众关联" name="thirdly"></el-tab-pane>
|
||||||
|
|
||||||
|
</el-tabs>
|
||||||
|
</div>
|
||||||
|
<div style="display: flex; margin-bottom: 15px">
|
||||||
|
<p style="width: 40px;">姓名:</p>
|
||||||
|
<el-input style="width: 200px;" placeholder="请输入姓名"></el-input>
|
||||||
|
<el-button type="primary" style="margin-left: 15px;">搜索</el-button>
|
||||||
|
<el-button type="primary">重置</el-button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="width: 100%; display: flex;">
|
||||||
|
<div style="width: 24%;">
|
||||||
|
<el-tree
|
||||||
|
style="max-width: 600px; border: 1px solid #d8d8d8;"
|
||||||
|
:data="data"
|
||||||
|
:props="defaultProps"
|
||||||
|
@node-click="handleNodeClick"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div style="width: 74%; flex: 1;margin-left: 10px;"></div>
|
||||||
|
<el-table :checked="true" :data="tableData" style="width: 100%">
|
||||||
|
<el-table-column fixed type="selection" style="width: 2%;" >
|
||||||
|
|
||||||
|
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="date" label="姓名" />
|
||||||
|
|
||||||
|
<el-table-column prop="date" label="工号" />
|
||||||
|
|
||||||
|
|
||||||
|
<el-table-column prop="city" label="归属组织" />
|
||||||
|
<el-table-column prop="city" label="部门" />
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div style="width: 1px ;height: 70%;background-color: #f5f8fe; margin-left: 10px;margin-right: 10px;"></div>
|
||||||
|
<div style="width: 10%; height: 70%; margin-top: 25px;">
|
||||||
|
<div style="margin-bottom: 30px;">已选</div>
|
||||||
|
<div style="width: 100% ;height: 1px;background-color: #f5f8fe; "></div>
|
||||||
|
|
||||||
|
<div>快速选人</div>
|
||||||
|
<div class="flex gap-2">
|
||||||
|
<el-tag v-for="tag in tags" :key="tag.name" closable :type="tag.type" color="#fff" style="width: 64px; margin-top: 10px; display: block; color: #4fa5f8; border: 1px solid #4fa5f8;">
|
||||||
|
{{ tag.name }}
|
||||||
|
</el-tag>
|
||||||
|
</div>
|
||||||
|
<div style="margin-top: 30px;">添加组织</div>
|
||||||
|
<div style="width: 100% ;height: 1px;background-color: #f5f8fe; "></div>
|
||||||
|
|
||||||
|
<div style="margin-top: 30px;">受众关联</div>
|
||||||
|
<div style="width: 100% ;height: 1px;background-color: #f5f8fe; "></div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div style="width: 100%; text-align: center;" >
|
||||||
|
<el-button type="primary" plain style="width: 100px; height: 40px; margin-right: 10px;">取消</el-button>
|
||||||
|
<el-button type="primary" style="width: 100px; height: 40px; margin-left: 10px;">确认</el-button>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</el-drawer>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
::deep(.el-drawer__header){
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
::deep(.el-table .cell){
|
||||||
|
color: #030303
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
642
src/views/gratefulteacher/AddLevelImportTec.vue
Normal file
@@ -0,0 +1,642 @@
|
|||||||
|
<template>
|
||||||
|
<a-drawer
|
||||||
|
:visible="AddImpStuvisible"
|
||||||
|
class="drawerStyle AddLevelImpStu"
|
||||||
|
placement="right"
|
||||||
|
width="800px"
|
||||||
|
@after-visible-change="afterVisibleChange"
|
||||||
|
>
|
||||||
|
<div class="drawerMain">
|
||||||
|
<div class="header">
|
||||||
|
<div class="headerTitle">导入讲师</div>
|
||||||
|
<img
|
||||||
|
style="width: 29px; height: 29px; cursor: pointer"
|
||||||
|
src="../../assets/images/basicinfo/close.png"
|
||||||
|
@click="closeDrawer"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="main">
|
||||||
|
<div class="minatitl">
|
||||||
|
<div class="up1">请下载</div>
|
||||||
|
<span class="up2" @click="downloadTemplate">模板</span>
|
||||||
|
<div class="up1">,按要求填写数据并导入</div>
|
||||||
|
</div>
|
||||||
|
<div class="upload">
|
||||||
|
<div class="text">上传:</div>
|
||||||
|
<div class="right">
|
||||||
|
<div style="height: 176px; margin-bottom: 20px">
|
||||||
|
<a-upload-dragger
|
||||||
|
v-model:fileList="fileList"
|
||||||
|
:action="importStudent"
|
||||||
|
name="file"
|
||||||
|
:headers="headers"
|
||||||
|
:multiple="false"
|
||||||
|
@change="handleChange"
|
||||||
|
:data="{
|
||||||
|
examineId: Number(courseId),
|
||||||
|
}"
|
||||||
|
:showUploadList="false"
|
||||||
|
>
|
||||||
|
<p class="ant-upload-drag-icon">
|
||||||
|
<inbox-outlined></inbox-outlined>
|
||||||
|
</p>
|
||||||
|
<p class="ant-upload-text">点击或将文件拖拽到此处上传</p>
|
||||||
|
<p class="ant-upload-hint">支持扩展名:.xls/.xlsx</p>
|
||||||
|
</a-upload-dragger>
|
||||||
|
</div>
|
||||||
|
<!-- <div class="load">
|
||||||
|
<div class="cloud"></div>
|
||||||
|
<div class="tip">点击或将文件拖拽到此处上传</div>
|
||||||
|
<div class="tipz">支持扩展名:.xls/.xlsx</div>
|
||||||
|
</div> -->
|
||||||
|
<div class="loadstate">
|
||||||
|
<div v-if="uploadpercent !== -1" class="loadborder">
|
||||||
|
<div class="content">
|
||||||
|
<div class="img"></div>
|
||||||
|
<div class="timebox">
|
||||||
|
<div class="timetop">
|
||||||
|
<div class="tit" :title="fileName">{{ fileName }}</div>
|
||||||
|
<div
|
||||||
|
v-if="uploadErr"
|
||||||
|
class="stateloading"
|
||||||
|
style="color: red"
|
||||||
|
>
|
||||||
|
上传失败
|
||||||
|
</div>
|
||||||
|
<div v-else class="stateloading">
|
||||||
|
{{ uploadpercent == 100 ? "上传成功" : "正在上传" }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="prog">
|
||||||
|
<div
|
||||||
|
class="inprogloading"
|
||||||
|
:style="{
|
||||||
|
width: uploadpercent == -1 ? 0 : uploadpercent + '%',
|
||||||
|
background: uploadErr ? '#ff7474' : '#35ae69',
|
||||||
|
}"
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="curloading">
|
||||||
|
<div class="cur">
|
||||||
|
{{ uploadpercent == -1 ? 0 : uploadpercent }}%
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="cancel"
|
||||||
|
style="margin-left: 20px; cursor: pointer"
|
||||||
|
@click="removeUpload"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</div>
|
||||||
|
<div class="cancel" style="margin-left: 15px"></div>
|
||||||
|
</div>
|
||||||
|
<div class="defeat" v-if="errorIds.length > 0">
|
||||||
|
<div class="detext" @click="downloadEeeorData">
|
||||||
|
下载失败数据
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="successNum || errfile "
|
||||||
|
:class="errfile >0 ? 'defeatbox' : 'succebox'"
|
||||||
|
>
|
||||||
|
<div class="lefimg"></div>
|
||||||
|
<div class="tacl">
|
||||||
|
{{ successNum }}条数据导入成功,{{
|
||||||
|
errfile
|
||||||
|
}}条数据导入失败
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="btnn">
|
||||||
|
<button class="btn2" @click="closeDrawer">取消</button>
|
||||||
|
<button class="btn2" @click="closeDrawerTrue">确定</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- 加载动画 -->
|
||||||
|
<div class="aeLoading" :style="{ display: addLoading ? 'flex' : 'none' }">
|
||||||
|
<a-spin :spinning="addLoading" tip="" />
|
||||||
|
</div>
|
||||||
|
</a-drawer>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { computed, reactive, toRefs,ref,onMounted} from "vue";
|
||||||
|
import { message } from "ant-design-vue";
|
||||||
|
import * as api from "../../api/index1";
|
||||||
|
import { BATCH_IMPORT_SCORE } from "@/api/config";
|
||||||
|
import { useStore } from "vuex";
|
||||||
|
import {getCookieForName} from "@/api/method";
|
||||||
|
import { saveTeacher,getTeacherId } from "@/api/examineApi";
|
||||||
|
import {boeRequest} from "@/api/request";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "ImpStu",
|
||||||
|
props: {
|
||||||
|
AddImpStuvisible: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
courseId: {
|
||||||
|
type: String,
|
||||||
|
default: "",
|
||||||
|
},
|
||||||
|
courseType: {
|
||||||
|
type: String,
|
||||||
|
default: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
setup(props, ctx) {
|
||||||
|
const store = useStore();
|
||||||
|
const state = reactive({
|
||||||
|
locationHref: process.env.VUE_APP_FILE_PATH,
|
||||||
|
template: process.env.VUE_APP_UP_LOAD_STUDENT_TEMPLATE,
|
||||||
|
importStudent:'/activityApi/teacher/importTeacher',
|
||||||
|
timers: "", // 定时器,用于清空定时器使用
|
||||||
|
isAddStudent: false, // 用于判断用户是否关闭弹框需要重新获取学员列表
|
||||||
|
uploadpercent: -1,
|
||||||
|
uploadErr: false, //上传失败
|
||||||
|
addLoading: false,
|
||||||
|
fileList: [],
|
||||||
|
succNum: 0, //成功数据数
|
||||||
|
errNum: 0, //失败数据数
|
||||||
|
downloadErrUrl: "",
|
||||||
|
showBottomBar: false, // 显示底部成功条数和失败条数
|
||||||
|
fileName: "",
|
||||||
|
successIds: [],
|
||||||
|
errorIds: [],
|
||||||
|
courseList: [],
|
||||||
|
studentLists: [],
|
||||||
|
});
|
||||||
|
const headers = { token: getCookieForName("token") };
|
||||||
|
const userInfo = computed(() => store.state.userInfo);
|
||||||
|
const CountingBar =ref(null)
|
||||||
|
const successNum =ref(null)
|
||||||
|
const errfile = ref(null)
|
||||||
|
onMounted(()=>{
|
||||||
|
onlineLearningList()
|
||||||
|
})
|
||||||
|
const onlineLearningList = () =>{
|
||||||
|
boeRequest('/activityApi/examine/getOnlineLearningList post').then(res=>{
|
||||||
|
state.courseList = res.data.map(item => item.courseId)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const closeDrawerTrue = () => {
|
||||||
|
if(state.errorIds.length==0&&state.successIds.length==0){
|
||||||
|
message.warning("请导入数据");
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if(state.successIds.length!=0){
|
||||||
|
getTeacherId({ids:state.successIds.join(',')}).then(res=>{
|
||||||
|
state.studentLists = res.data
|
||||||
|
if(state.courseList.length!=0){
|
||||||
|
state.courseList.map(item=>{
|
||||||
|
api.saveStu({
|
||||||
|
targetId: item,
|
||||||
|
type: 13,
|
||||||
|
clear: false,
|
||||||
|
deptIds: [],
|
||||||
|
groupIds: [],
|
||||||
|
studentList: state.studentLists,
|
||||||
|
projectList: [],
|
||||||
|
groupName: null,
|
||||||
|
groupId: null,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
saveTeacher({
|
||||||
|
examineId:props.courseId,
|
||||||
|
teacherIds:state.successIds
|
||||||
|
}).then(res=>{
|
||||||
|
|
||||||
|
if(res.code == 200){
|
||||||
|
ctx.emit("AddImpStuvisibleClose", state.isAddStudent);
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
closeDrawer()
|
||||||
|
}
|
||||||
|
const closeDrawer = () => {
|
||||||
|
|
||||||
|
state.successIds = []
|
||||||
|
state.errorIds = []
|
||||||
|
// clearInterval(state.timers);
|
||||||
|
state.fileList = [];
|
||||||
|
state.uploadpercent = -1;
|
||||||
|
state.addLoading = false;
|
||||||
|
state.uploadErr = false; //上传失败
|
||||||
|
state.showBottomBar = false;
|
||||||
|
state.succNum = 0;
|
||||||
|
state.errNum = 0;
|
||||||
|
state.downloadErrUrl = "";
|
||||||
|
ctx.emit("update:AddImpStuvisible", false);
|
||||||
|
// 通知父组件重新获取学员列表
|
||||||
|
// ctx.emit("AddImpStuvisibleClose", state.isAddStudent);
|
||||||
|
state.isAddStudent = false;
|
||||||
|
errfile.value= null
|
||||||
|
successNum.value = null
|
||||||
|
};
|
||||||
|
|
||||||
|
const afterVisibleChange = (bool) => {
|
||||||
|
console.log("state", bool);
|
||||||
|
console.log("store", store.state.userInfo);
|
||||||
|
};
|
||||||
|
const downloadTemplate = (info) => {
|
||||||
|
window.open(`${process.env.VUE_APP_BOE_API_URL}/upload/activityfile/教师专区-导入教师信息模板.xlsx`)
|
||||||
|
}
|
||||||
|
//上传文件
|
||||||
|
const handleChange = (info) => {
|
||||||
|
console.log("info", info);
|
||||||
|
|
||||||
|
if (info) {
|
||||||
|
var FileExt = info.file.name.replace(/.+\./, "");
|
||||||
|
if (["xls", "xlsx"].indexOf(FileExt.toLowerCase()) === -1) {
|
||||||
|
state.fileList = [];
|
||||||
|
state.uploadpercent = -1;
|
||||||
|
message.destroy();
|
||||||
|
message.error("请上传正确的文件格式");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const sizeBig = info.file.size < 50000000
|
||||||
|
if(!sizeBig){
|
||||||
|
state.fileList = [];
|
||||||
|
state.uploadpercent = -1;
|
||||||
|
message.destroy();
|
||||||
|
message.error("文件大小超出50M,请重新上传")
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// state.addLoading = true;
|
||||||
|
state.uploadErr = false;
|
||||||
|
state.uploadpercent = parseInt(info.file.percent);
|
||||||
|
|
||||||
|
console.log("我是文件上传的进度---------->", info.file.percent);
|
||||||
|
const status = info.file.status;
|
||||||
|
if (status !== "uploading") {
|
||||||
|
console.log(info.file, info.fileList);
|
||||||
|
}
|
||||||
|
if (status === "done") {
|
||||||
|
console.log("上传成---功返回的UUID", info.file.response.data);
|
||||||
|
CountingBar.value = info.file.response.data
|
||||||
|
errfile.value = CountingBar.value.fail
|
||||||
|
successNum.value = CountingBar.value.success
|
||||||
|
console.log(CountingBar.value.fail,'sssssssssssssssssssss'); //success
|
||||||
|
console.log("上传成功返回的UUID----->", info);
|
||||||
|
console.log("我是导入学员接口传递的参数", {
|
||||||
|
file: info.file.originFileObj,
|
||||||
|
examineId: props.courseId,
|
||||||
|
});
|
||||||
|
state.successIds = info.file.response.data.successIds
|
||||||
|
state.errorIds = info.file.response.data.failIds
|
||||||
|
state.fileName = info.file.name;
|
||||||
|
let i = 0;
|
||||||
|
} else if (status === "error") {
|
||||||
|
state.addLoading = false;
|
||||||
|
state.uploadErr = true;
|
||||||
|
message.error(`${info.file.name}上传失败`);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 下载失败数据
|
||||||
|
const downloadEeeorData = () => {
|
||||||
|
if (state.errorIds.length !== 0) {
|
||||||
|
window.open(`/activityApi/teacher/errorExport?ids=${state.errorIds.join(',')}`);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//删除
|
||||||
|
const removeUpload = () => {
|
||||||
|
state.isAddStudent = false;
|
||||||
|
state.showBottomBar = false;
|
||||||
|
state.fileList = [];
|
||||||
|
state.uploadpercent = -1;
|
||||||
|
state.addLoading = false;
|
||||||
|
state.uploadErr = false; //上传失败
|
||||||
|
state.succNum = 0;
|
||||||
|
state.errNum = 0;
|
||||||
|
state.downloadErrUrl = "";
|
||||||
|
successNum.value = null
|
||||||
|
errfile.value = null
|
||||||
|
state.successIds = []
|
||||||
|
state.errorIds = []
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
...toRefs(state),
|
||||||
|
afterVisibleChange,
|
||||||
|
userInfo,
|
||||||
|
closeDrawer,
|
||||||
|
closeDrawerTrue,
|
||||||
|
// change,
|
||||||
|
headers,
|
||||||
|
handleChange,
|
||||||
|
downloadTemplate,
|
||||||
|
BATCH_IMPORT_SCORE,
|
||||||
|
downloadEeeorData,
|
||||||
|
removeUpload,
|
||||||
|
successNum,
|
||||||
|
errfile,
|
||||||
|
onlineLearningList
|
||||||
|
};
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.AddLevelImpStu > .ant-drawer-content-wrapper {
|
||||||
|
min-width: 800px !important;
|
||||||
|
width: 800px !important;
|
||||||
|
}
|
||||||
|
.AddLevelImpStu {
|
||||||
|
.drawerMain {
|
||||||
|
min-width: 450px;
|
||||||
|
margin: 0px 32px 0px 32px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
.header {
|
||||||
|
height: 73px;
|
||||||
|
border-bottom: 1px solid #e8e8e8;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
flex-shrink: 0;
|
||||||
|
// background-color: red;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
.headerTitle {
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #333333;
|
||||||
|
line-height: 25px;
|
||||||
|
// margin-left: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.main {
|
||||||
|
overflow: auto;
|
||||||
|
.minatitl {
|
||||||
|
display: flex;
|
||||||
|
.up1 {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
.up2 {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #4ea6ff;
|
||||||
|
margin-left: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.upload {
|
||||||
|
margin-top: 32px;
|
||||||
|
display: flex;
|
||||||
|
.text {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #333333;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.right {
|
||||||
|
margin-left: 6px;
|
||||||
|
.load {
|
||||||
|
width: 500px;
|
||||||
|
height: 176px;
|
||||||
|
background: #f5f9fd;
|
||||||
|
border-radius: 4px;
|
||||||
|
// opacity: 0.3;
|
||||||
|
border: 1px dashed #caddfd;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
.cloud {
|
||||||
|
margin-top: 52px;
|
||||||
|
width: 28px;
|
||||||
|
height: 28px;
|
||||||
|
background-image: url(../../assets/images/basicinfo/cloud.png);
|
||||||
|
}
|
||||||
|
.tip {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #4ea6ff;
|
||||||
|
margin-top: 15px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.tipz {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #999999;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.loadstate {
|
||||||
|
width: 500px;
|
||||||
|
margin-bottom: 100px;
|
||||||
|
|
||||||
|
.loadborder {
|
||||||
|
width: 500px;
|
||||||
|
height: 173px;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px dashed #eaeaea;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
margin-top: 10px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
.content {
|
||||||
|
display: flex;
|
||||||
|
margin-left: 20px;
|
||||||
|
position: relative;
|
||||||
|
.defeat {
|
||||||
|
position: absolute;
|
||||||
|
left: 46px;
|
||||||
|
top: 42px;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 500;
|
||||||
|
width: 120px;
|
||||||
|
height: 32px;
|
||||||
|
border-radius: 2px;
|
||||||
|
border: 1px solid #387df7;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
cursor: pointer;
|
||||||
|
.detext {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #387df7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.img {
|
||||||
|
width: 30px;
|
||||||
|
height: 34px;
|
||||||
|
background-image: url(../../assets/images/basicinfo/exl.png);
|
||||||
|
}
|
||||||
|
.timebox {
|
||||||
|
margin-left: 15px;
|
||||||
|
margin-top: -5px;
|
||||||
|
.timetop {
|
||||||
|
display: flex;
|
||||||
|
width: 262px;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
.tit {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #333333;
|
||||||
|
width: 200px;
|
||||||
|
height: 21px;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
.stateloading {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #4ea6ff;
|
||||||
|
}
|
||||||
|
.statedefeat {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #ff7474;
|
||||||
|
}
|
||||||
|
.statesucce {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #35ae69;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.prog {
|
||||||
|
width: 262px;
|
||||||
|
height: 5px;
|
||||||
|
background: #eaf1fe;
|
||||||
|
border-radius: 4px;
|
||||||
|
.inprogloading {
|
||||||
|
width: 55%;
|
||||||
|
height: 5px;
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
|
background: #4ea6ff;
|
||||||
|
}
|
||||||
|
//下载失败条
|
||||||
|
.inprogdefeat {
|
||||||
|
width: 55%;
|
||||||
|
height: 5px;
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
|
background: #ff7474;
|
||||||
|
}
|
||||||
|
//下载成功条
|
||||||
|
.inprogsucce {
|
||||||
|
width: 100%;
|
||||||
|
height: 5px;
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
|
background: #57c887;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.curloading {
|
||||||
|
margin-left: 15px;
|
||||||
|
margin-top: 15px;
|
||||||
|
display: flex;
|
||||||
|
.cur {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #333333;
|
||||||
|
}
|
||||||
|
.cancel {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #387df7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.defeatbox {
|
||||||
|
width: 500px;
|
||||||
|
height: 40px;
|
||||||
|
background: rgba(255, 116, 116, 0.1);
|
||||||
|
border: 1px solid #ff7474;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
.lefimg {
|
||||||
|
width: 14px;
|
||||||
|
height: 14px;
|
||||||
|
margin-left: 17px;
|
||||||
|
margin-right: 8px;
|
||||||
|
background-image: url(../../assets/images/leveladd/nodone.png);
|
||||||
|
background-size: 100%;
|
||||||
|
}
|
||||||
|
.tacl {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #ff7474;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.succebox {
|
||||||
|
width: 500px;
|
||||||
|
height: 40px;
|
||||||
|
background: rgba(53, 174, 105, 0.1);
|
||||||
|
border: 1px solid #35ae69;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
.lefimg {
|
||||||
|
width: 14px;
|
||||||
|
height: 14px;
|
||||||
|
margin-left: 17px;
|
||||||
|
margin-right: 8px;
|
||||||
|
background-image: url(../../assets/images/leveladd/done.png);
|
||||||
|
background-size: 100%;
|
||||||
|
}
|
||||||
|
.tacl {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
|
||||||
|
color: rgba(0, 0, 0, 0.65);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.btnn {
|
||||||
|
height: 72px;
|
||||||
|
width: 100%;
|
||||||
|
position: absolute;
|
||||||
|
background-color: #fff;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.16);
|
||||||
|
.btn1 {
|
||||||
|
width: 100px;
|
||||||
|
height: 40px;
|
||||||
|
border: 1px solid #4ea6ff;
|
||||||
|
border-radius: 8px;
|
||||||
|
color: #4ea6ff;
|
||||||
|
background-color: #fff;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.btn2 {
|
||||||
|
cursor: pointer;
|
||||||
|
width: 100px;
|
||||||
|
height: 40px;
|
||||||
|
background: #4ea6ff;
|
||||||
|
border-radius: 8px;
|
||||||
|
border: 0;
|
||||||
|
margin-left: 15px;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
950
src/views/gratefulteacher/CommonTeacher.vue
Normal file
@@ -0,0 +1,950 @@
|
|||||||
|
<!-- eslint-disable vue/no-parsing-error -->
|
||||||
|
<!-- eslint-disable vue/require-v-for-key -->
|
||||||
|
<template>
|
||||||
|
<div class="CommonStudent">
|
||||||
|
<a-drawer :visible="visiable" class="drawerStyle ProjCheckship CommonStudent" placement="right" width="60%">
|
||||||
|
<div class="drawerMain" id="ProjCheckship" style="">
|
||||||
|
<div class="header">
|
||||||
|
<div class="headerTitle">
|
||||||
|
{{ { 1: "添加学员", 2: "添加学员", 3: "添加学员" }[type] || title }}
|
||||||
|
</div>
|
||||||
|
<img style="width: 29px; height: 29px; cursor: pointer" src="../../assets/images/basicinfo/close.png"
|
||||||
|
@click="closeDrawer"/>
|
||||||
|
</div>
|
||||||
|
<div style="display: flex; overflow-x: auto; overflow-y: auto">
|
||||||
|
<div class="tabs" style="min-width: 800px">
|
||||||
|
<a-tabs v-model:activeKey="activeKey">
|
||||||
|
<a-tab-pane v-if="infoType" :key="4" tab="项目内学员">
|
||||||
|
<div :style="{ height: screenHeight - 235 + 'px' }">
|
||||||
|
<div>
|
||||||
|
<a-form-item label="姓名:">
|
||||||
|
<a-input v-model:value="projectParams.studentName"
|
||||||
|
style="width: 260px; height: 40px; border-radius: 8px"
|
||||||
|
placeholder="请输入姓名"/>
|
||||||
|
<a-button type="primary" @click="getProjectStu" style="margin-left: 20px; border-radius: 4px">
|
||||||
|
<template #icon>
|
||||||
|
<SearchOutlined/>
|
||||||
|
</template>
|
||||||
|
搜索
|
||||||
|
</a-button>
|
||||||
|
<a-button type="primary" @click="resetProjectStu" style="margin-left: 20px; border-radius: 4px">重置
|
||||||
|
</a-button>
|
||||||
|
</a-form-item>
|
||||||
|
</div>
|
||||||
|
<div class="tableBox tabb">
|
||||||
|
<BaseTable ref="projectStuTableRef" :columns="projectStuColumns" :url="STUDENT_LIST"
|
||||||
|
v-model:params="projectParams" v-model:selectedRows="projectSelectRows"
|
||||||
|
type="checkbox"></BaseTable>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane :key="1" tab="快速选人">
|
||||||
|
<div :style="{ height: screenHeight - 235 + 'px' }">
|
||||||
|
<div class="tab1">
|
||||||
|
<a-form-item label="姓名">
|
||||||
|
<a-input v-model:value="nameSearch.keyword" style="width: 270px; height: 40px; border-radius: 8px"
|
||||||
|
placeholder="请输入姓名"/>
|
||||||
|
<a-button type="primary" @click="onSearchStu" style="margin-left: 20px; border-radius: 4px">
|
||||||
|
<template #icon>
|
||||||
|
<SearchOutlined/>
|
||||||
|
</template>
|
||||||
|
搜索
|
||||||
|
</a-button>
|
||||||
|
<a-button type="primary" @click="resetStu" style="margin-left: 20px; border-radius: 4px">重置
|
||||||
|
</a-button>
|
||||||
|
</a-form-item>
|
||||||
|
</div>
|
||||||
|
<div class="chooseLeft" style="display: grid; grid-template-columns: 250px auto">
|
||||||
|
<div :style="{
|
||||||
|
height: screenHeight - 180 + 'px',
|
||||||
|
overflowY: 'auto',
|
||||||
|
}" style="border: 1px solid #f0f0f0">
|
||||||
|
<div class="tree" style="margin: 10px 4px 220px 10px">
|
||||||
|
<a-tree allow-clear tree-default-expand-all :tree-data="treeData" :loading="orgLoading"
|
||||||
|
:load-data="onLoadData" v-model:selectedKeys="stuTreeSelectKeys"
|
||||||
|
v-model:expandedKeys="stuTreeExpandedKeys" :fieldNames="{
|
||||||
|
children: 'treeChildList',
|
||||||
|
key: 'id',
|
||||||
|
title: 'name',
|
||||||
|
value: 'name',
|
||||||
|
}" @select="stuStuOrgSelect">
|
||||||
|
</a-tree>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="tableBox tabb" style="
|
||||||
|
margin: 0px 4px 120px 10px;
|
||||||
|
border: 1px solid #f0f0f0;
|
||||||
|
">
|
||||||
|
<BaseTable ref="stuTableRef" :columns="stuColumns" :url="USER_LIST_PAGE" pageKey="pageNo"
|
||||||
|
v-model:params="nameSearch" :request="useNewRowsPageNoInit"
|
||||||
|
v-model:selectedRows="stuSelectRows" type="checkbox"></BaseTable>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane v-if="!selectStu&&typeLists&&false" :key="2" tab="添加组织">
|
||||||
|
<div :style="{ height: screenHeight - 235 + 'px' }">
|
||||||
|
<div class="tab2">
|
||||||
|
<a-form-item label="组织:">
|
||||||
|
<a-input v-model:value="searchOrgName.keyword"
|
||||||
|
style="width: 230px; height: 40px; border-radius: 8px" placeholder="请输入组织"
|
||||||
|
@click="orgValue"/>
|
||||||
|
<a-button type="primary" @click="searchOrg" style="margin-left: 20px; border-radius: 4px">
|
||||||
|
<template #icon>
|
||||||
|
<SearchOutlined/>
|
||||||
|
</template>
|
||||||
|
搜索
|
||||||
|
</a-button>
|
||||||
|
<a-button type="primary" @click="resetOrg" style="margin-left: 20px; border-radius: 4px">重置
|
||||||
|
</a-button>
|
||||||
|
</a-form-item>
|
||||||
|
</div>
|
||||||
|
<div class="boeTree">
|
||||||
|
<a-tree v-model:selectedKeys="selectedOrgKeys"
|
||||||
|
:tree-data="searchOrgName.keyword ? orgData : treeOrgData" @select="onOrgSelectChange"
|
||||||
|
:loading="orgOrgLoading" :load-data="onLoadOrgData" :fieldNames="{
|
||||||
|
children: 'treeChildList',
|
||||||
|
key: 'id',
|
||||||
|
title: 'name',
|
||||||
|
value: 'name',
|
||||||
|
}" row-key="id" :row-selection="orgRowSelection" multiple>
|
||||||
|
</a-tree>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane v-if="!selectStu&&typeLists&&false" :key="3" tab="受众关联">
|
||||||
|
<div :style="{ height: screenHeight - 235 + 'px' }">
|
||||||
|
<div>
|
||||||
|
<a-form-item label="受众名称:">
|
||||||
|
<a-input v-model:value="audienceName.keyword"
|
||||||
|
style="width: 260px; height: 40px; border-radius: 8px"
|
||||||
|
placeholder="请输入受众名称"/>
|
||||||
|
<a-button type="primary" @click="searchAudi" style="margin-left: 20px; border-radius: 4px">
|
||||||
|
<template #icon>
|
||||||
|
<SearchOutlined/>
|
||||||
|
</template>
|
||||||
|
搜索
|
||||||
|
</a-button>
|
||||||
|
<a-button type="primary" @click="resetAudienceInfo" style="margin-left: 20px; border-radius: 4px">
|
||||||
|
重置
|
||||||
|
</a-button>
|
||||||
|
</a-form-item>
|
||||||
|
</div>
|
||||||
|
<div class="tableBox tabb">
|
||||||
|
<BaseTable ref="auditTableRef" :columns="audiColums" :url="AUDIENCE_LIST" page-key="pageNo"
|
||||||
|
v-model:params="audienceName" :request="useTotalPage"
|
||||||
|
v-model:selectedRows="auditSelectRows" v-model:selectedRowKeys="auditSelectRowKeys"
|
||||||
|
type="checkbox"></BaseTable>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-tab-pane>
|
||||||
|
</a-tabs>
|
||||||
|
</div>
|
||||||
|
<div v-if="typeLists" class="right1" style="min-width: 200px">
|
||||||
|
<div class="onerow">
|
||||||
|
<div class="onleft">
|
||||||
|
<div class="already">已选</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div :style="{ 'max-height': screenHeight - 235 + 'px' }" style="overflow-y: auto">
|
||||||
|
<div class="selecteds" v-if="infoType">
|
||||||
|
<div class="person">项目内学员</div>
|
||||||
|
<div v-for="(item, i) in projectSelectRows" :key="i">
|
||||||
|
<div v-if="i < 11">
|
||||||
|
<div class="chose">
|
||||||
|
{{ item.studentName }}
|
||||||
|
<div class="ch" @click="auditTableRef.remove(i)"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<div v-if="person">
|
||||||
|
<div class="chose">
|
||||||
|
{{ item.studentName }}
|
||||||
|
<div class="ch" @click="auditTableRef.remove(i)"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="!member && projectSelectRows?.length > 10" class="ifsw">
|
||||||
|
<div @click="member = !member" class="“sw”">查看更多></div>
|
||||||
|
</div>
|
||||||
|
<div v-if="member && projectSelectRows?.length > 10" class="ifsw">
|
||||||
|
<div @click="member = !member" class="sw">收起<</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="selecteds">
|
||||||
|
<div class="person">快速选人</div>
|
||||||
|
<div v-for="(item, i) in stuSelectRows" :key="i">
|
||||||
|
<div v-if="i < 11">
|
||||||
|
<div class="chose">
|
||||||
|
{{ item.realName }}
|
||||||
|
<div class="ch" @click="stuTableRef.remove(i)"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<div v-if="person">
|
||||||
|
<div class="chose">
|
||||||
|
{{ item.realName }}
|
||||||
|
<div class="ch" @click="stuTableRef.remove(i)"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="!person && stuSelectRows.length > 10" class="ifsw">
|
||||||
|
<div @click="person = !person" class="“sw”">查看更多></div>
|
||||||
|
</div>
|
||||||
|
<div v-if="person && stuSelectRows.length > 10" class="ifsw">
|
||||||
|
<div @click="person = !person" class="sw">收起<</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="!selectStu&&false" class="selecteds">
|
||||||
|
<div class="dept">添加组织</div>
|
||||||
|
<div v-for="(item, i) in deptList" :key="i">
|
||||||
|
<div v-if="i < 11">
|
||||||
|
<div class="chose1">
|
||||||
|
<div class="span">{{ item.name }}</div>
|
||||||
|
<div class="ch1" @click="orgDel(i)" style="cursor: pointer;"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<div v-if="dept">
|
||||||
|
<div class="chose1">
|
||||||
|
<div class="span">{{ item.name }}</div>
|
||||||
|
<div class="ch1" @click="orgDel(i)"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="!dept && deptList.length > 10" class="ifsw">
|
||||||
|
<div @click="dept = !dept" class="“sw”">查看更多></div>
|
||||||
|
</div>
|
||||||
|
<div v-if="dept && deptList.length > 10" class="ifsw">
|
||||||
|
<div @click="dept = !dept" class="sw">收起<</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!--受众-->
|
||||||
|
<div v-if="!selectStu&&false" class="selecteds">
|
||||||
|
<div class="group">受众关联</div>
|
||||||
|
<div v-for="(item, i) in auditSelectRows" :key="i">
|
||||||
|
<div v-if="i < 11">
|
||||||
|
<div class="chose2">
|
||||||
|
<div class="span">{{ item.audienceName }}</div>
|
||||||
|
<div class="ch2" @click="auditTableRef.remove(i)"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<div v-if="group">
|
||||||
|
<div class="chose2">
|
||||||
|
<div class="span">{{ item.audienceName }}</div>
|
||||||
|
<div class="ch2" @click="auditTableRef.remove(i)"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="!group && auditSelectRows.length > 10" class="ifsw">
|
||||||
|
<div @click="group = !group" class="“sw”">查看更多></div>
|
||||||
|
</div>
|
||||||
|
<div v-if="group && auditSelectRows.length > 10" class="ifsw">
|
||||||
|
<div @click="group = !group" class="sw">收起<</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="btnn" style="display: flex;justify-content: center;">
|
||||||
|
<button style=" cursor: pointer;border: none; margin-right: 15px;height: 38px; width: 100px;background: #4ea6ff; line-height: 38px;text-align: center;border-radius: 8px;color: #ffffff;" class="btn2" @click="closeDrawer">取消</button>
|
||||||
|
<button style=" cursor: pointer;border: none; margin-right: 15px;height: 38px; width: 100px;background: #4ea6ff; line-height: 38px;text-align: center;border-radius: 8px;color: #ffffff;" class="btn2" @click="submitAuth">确定</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-drawer>
|
||||||
|
<a-button @click="openDrawer" type="link">
|
||||||
|
<slot></slot>
|
||||||
|
</a-button>
|
||||||
|
</div>
|
||||||
|
<a-modal :style="{ padding: 0, position:'relative', right: '-20%' }" :closable="true" :visible="stageVisible"
|
||||||
|
:footer="null" centered="true" @ok="handleStageOk" wrapClassName="changeModal">
|
||||||
|
<div class="con">
|
||||||
|
<div class="header">
|
||||||
|
<div class="inhe">
|
||||||
|
<div class="tz">{{ type === 1 ? "选择阶段" : "添加学员到关卡" }}</div>
|
||||||
|
<div class="mg" @click="closeChangeModal"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mid">
|
||||||
|
<div class="inher">
|
||||||
|
<div class="select">
|
||||||
|
<a-select style="width: 400px" :placeholder="type === 1 ? '选择阶段' : '选择关卡'" v-model:value="stageId"
|
||||||
|
className="cus-select">
|
||||||
|
<a-select-option v-for="(item, i) in stageIds" :key="i" :value="item.id">{{ item.name || "默认" }}
|
||||||
|
</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</div>
|
||||||
|
<span style="color: #999999; margin-left: 10px"><minus-circle-outlined/>已在其他关卡的学员,不会被添加到该关卡</span>
|
||||||
|
<div class="btn" style="margin-top: 50px">
|
||||||
|
<button class="sameb btn1" @click="closeChangeModal" style="cursor: pointer">
|
||||||
|
取消
|
||||||
|
</button>
|
||||||
|
<button class="sameb btn2" @click="handleDialogOk" style="cursor: pointer">
|
||||||
|
确定
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-modal>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import {message} from "ant-design-vue";
|
||||||
|
import {computed, defineEmits, defineProps, ref, watch} from "vue";
|
||||||
|
import {useNewRowsPageNoInit, request, useRequest, useTotalPage} from "@/api/request";
|
||||||
|
import {
|
||||||
|
saveStu,
|
||||||
|
} from "@/api/index1";
|
||||||
|
import dialog from "@/utils/dialog";
|
||||||
|
import BaseTable from "@/components/common/BaseTable";
|
||||||
|
import {AUDIENCE_LIST, ORG_CHILD_LIST, ORG_LIST, STUDENT_LIST, USER_LIST_PAGE} from "@/api/apis";
|
||||||
|
import {addPermission,transferPermission} from '@/api/examineApi.js'
|
||||||
|
const emit = defineEmits({});
|
||||||
|
const props = defineProps({
|
||||||
|
type: Number,
|
||||||
|
pid:Number,
|
||||||
|
infoType: Number,
|
||||||
|
infoId: Number,
|
||||||
|
id: String,
|
||||||
|
title: {
|
||||||
|
type: String,
|
||||||
|
default: "",
|
||||||
|
},
|
||||||
|
clear: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
selectStu: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
selectOne: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
stage: {
|
||||||
|
type: Array,
|
||||||
|
default: () => [],
|
||||||
|
},
|
||||||
|
isGroup: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
projectId: {
|
||||||
|
type: Number,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
groupId: {
|
||||||
|
type: Number,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
groupName: {
|
||||||
|
type: String,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
groupMemberCount: {
|
||||||
|
type: Number,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
groupMemberNumber: {
|
||||||
|
type: Number,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
activeKey1: {
|
||||||
|
type: String,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
permissionType:{
|
||||||
|
type: Number,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
examineId:{
|
||||||
|
type: String,
|
||||||
|
default: null
|
||||||
|
},
|
||||||
|
typeLists:{
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const projectSelectKeys = ref([]);
|
||||||
|
const projectSelectRows = ref([]);
|
||||||
|
const stuSelectRows = ref([]);
|
||||||
|
const auditSelectRows = ref([]);
|
||||||
|
const auditSelectRowKeys = ref([]);
|
||||||
|
const deptList = ref([]);
|
||||||
|
const member = ref(false);
|
||||||
|
const dept = ref(false);
|
||||||
|
const projectStuTableRef = ref();
|
||||||
|
const stuTableRef = ref();
|
||||||
|
const projectParams = ref({ pid: props.infoId, type: props.infoType, studentName: "" });
|
||||||
|
|
||||||
|
const getProjectStu = () => projectStuTableRef.value.fetch();
|
||||||
|
const resetProjectStu = () => {
|
||||||
|
projectParams.value.studentName = "";
|
||||||
|
projectStuTableRef.value.reset();
|
||||||
|
};
|
||||||
|
|
||||||
|
const person = ref(false);
|
||||||
|
const group = ref(false);
|
||||||
|
const visiable = ref(false);
|
||||||
|
const activeKey = ref(props.infoType ? 4 : 1);
|
||||||
|
const stageVisible = ref(false);
|
||||||
|
const stageId = ref();
|
||||||
|
|
||||||
|
const nameSearch = ref({
|
||||||
|
keyword: "",
|
||||||
|
departId: '',
|
||||||
|
});
|
||||||
|
const stuTreeSelectKeys = ref([]);
|
||||||
|
const stuTreeExpandedKeys = ref([]);
|
||||||
|
const audienceName = ref({
|
||||||
|
keyword: "",
|
||||||
|
});
|
||||||
|
const searchOrgName = ref({
|
||||||
|
keyword: "",
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
});
|
||||||
|
const stageIds = computed(() => props.stage);
|
||||||
|
|
||||||
|
const { data: orgData, fetchData: searchOrg } = useRequest(
|
||||||
|
ORG_LIST,
|
||||||
|
searchOrgName.value,
|
||||||
|
);
|
||||||
|
const { data: treeData, loading: orgLoading } = useRequest(
|
||||||
|
ORG_LIST,
|
||||||
|
{ keyword: "" },
|
||||||
|
);
|
||||||
|
const { data: treeOrgData, loading: orgOrgLoading } = useRequest(
|
||||||
|
ORG_LIST,
|
||||||
|
{ keyword: "" },
|
||||||
|
);
|
||||||
|
|
||||||
|
const projectStuColumns = ref([
|
||||||
|
{
|
||||||
|
title: "姓名",
|
||||||
|
dataIndex: "studentName",
|
||||||
|
key: "studentName",
|
||||||
|
width: 80,
|
||||||
|
align: "center",
|
||||||
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "工号",
|
||||||
|
dataIndex: "studentUserNo",
|
||||||
|
key: "studentUserNo",
|
||||||
|
width: 80,
|
||||||
|
align: "center",
|
||||||
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "归属组织",
|
||||||
|
dataIndex: "studentOrgName",
|
||||||
|
key: "studentOrgName",
|
||||||
|
width: 80,
|
||||||
|
align: "center",
|
||||||
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "部门",
|
||||||
|
dataIndex: "studentDepartName",
|
||||||
|
key: "studentDepartName",
|
||||||
|
width: 80,
|
||||||
|
align: "center",
|
||||||
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
const stuColumns = ref([
|
||||||
|
{
|
||||||
|
title: "姓名",
|
||||||
|
dataIndex: "realName",
|
||||||
|
key: "realName",
|
||||||
|
width: 80,
|
||||||
|
align: "center",
|
||||||
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "工号",
|
||||||
|
dataIndex: "userNo",
|
||||||
|
key: "userNo",
|
||||||
|
width: 80,
|
||||||
|
align: "center",
|
||||||
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "归属组织",
|
||||||
|
dataIndex: "orgName",
|
||||||
|
key: "orgName",
|
||||||
|
width: 80,
|
||||||
|
align: "center",
|
||||||
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "部门",
|
||||||
|
dataIndex: "departName",
|
||||||
|
key: "departName",
|
||||||
|
width: 80,
|
||||||
|
align: "center",
|
||||||
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
const audiColums = ref([
|
||||||
|
{
|
||||||
|
title: "受众名称",
|
||||||
|
dataIndex: "audienceName",
|
||||||
|
key: "audienceName",
|
||||||
|
width: 30,
|
||||||
|
align: "left",
|
||||||
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "人数",
|
||||||
|
dataIndex: "totalMember",
|
||||||
|
key: "totalMember",
|
||||||
|
width: 30,
|
||||||
|
align: "center",
|
||||||
|
className: "h",
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
const orgSelectKeys = ref([]);
|
||||||
|
const auditTableRef = ref();
|
||||||
|
const screenHeight = ref(document.body.clientHeight);
|
||||||
|
|
||||||
|
const orgRowSelection = computed(() => ({
|
||||||
|
columnWidth: 20,
|
||||||
|
selectedRowKeys: orgSelectKeys.value,
|
||||||
|
onChange: onOrgSelectChange,
|
||||||
|
preserveSelectedRowKeys: true,
|
||||||
|
}));
|
||||||
|
|
||||||
|
const closeDrawer = () => {
|
||||||
|
deleteDepSelect();
|
||||||
|
visiable.value = false;
|
||||||
|
nameSearch.value.keyword = "";
|
||||||
|
selectedOrgKeys.value = [];
|
||||||
|
};
|
||||||
|
|
||||||
|
function searchAudi() {
|
||||||
|
auditTableRef.value.reset(audienceName.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onLoadData(treeNode) {
|
||||||
|
return request(ORG_CHILD_LIST, { keyword: "", orgId: treeNode.id }).then(
|
||||||
|
(r) => {
|
||||||
|
treeNode.dataRef.treeChildList = r.data;
|
||||||
|
treeData.value = [...treeData.value];
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onLoadOrgData(treeNode) {
|
||||||
|
return request(ORG_CHILD_LIST, { keyword: "", orgId: treeNode.id }).then(
|
||||||
|
(r) => {
|
||||||
|
treeNode.dataRef.treeChildList = r.data;
|
||||||
|
treeOrgData.value = [...treeOrgData.value];
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const closeChangeModal = () => {
|
||||||
|
stageVisible.value = false;
|
||||||
|
};
|
||||||
|
const openDrawer = () => {
|
||||||
|
visiable.value = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
function onSearchStu() {
|
||||||
|
stuTableRef.value.reset(nameSearch.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function stuStuOrgSelect(e) {
|
||||||
|
nameSearch.value.departId = e.join("");
|
||||||
|
stuTableRef.value.fetch();
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectedOrgKeys = ref([]);
|
||||||
|
|
||||||
|
watch(selectedOrgKeys, () => {
|
||||||
|
console.log("selectedKeys", selectedOrgKeys);
|
||||||
|
});
|
||||||
|
|
||||||
|
function orgDel(i) {
|
||||||
|
orgSelectKeys.value = orgSelectKeys.value.filter(e => e !== deptList.value[i].id);
|
||||||
|
selectedOrgKeys.value.splice(i, 1);
|
||||||
|
deptList.value.splice(i, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onOrgSelectChange(e, l) {
|
||||||
|
orgRowSelection.value = e;
|
||||||
|
deptList.value = l.selectedNodes;
|
||||||
|
}
|
||||||
|
|
||||||
|
const resetStu = () => {
|
||||||
|
nameSearch.value.keyword = "";
|
||||||
|
stuTableRef.value.reset({ keyword: "", departId: '' });
|
||||||
|
};
|
||||||
|
//清空选择部门信息
|
||||||
|
const deleteDepSelect = () => {
|
||||||
|
stuSelectRows.value = [];
|
||||||
|
dataLists.value = []
|
||||||
|
selectedOrgKeys.value = [];
|
||||||
|
projectSelectKeys.value = [];
|
||||||
|
};
|
||||||
|
//重置组织
|
||||||
|
const resetOrg = () => {
|
||||||
|
searchOrgName.value = { keyword: "" };
|
||||||
|
};
|
||||||
|
//重置受众
|
||||||
|
const resetAudienceInfo = () => {
|
||||||
|
audienceName.value.keyword = "";
|
||||||
|
auditTableRef.value.reset({ keyword: "" });
|
||||||
|
};
|
||||||
|
|
||||||
|
//确定添加授权
|
||||||
|
const submitAuth = () => {
|
||||||
|
if (props.pid === 2) {
|
||||||
|
stageVisible.value = true;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
handleDialogOk();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function handleDialogOk() {
|
||||||
|
if (auditSelectRowKeys.value.length || deptList.value.length) {
|
||||||
|
dialog({ content: "您选择了组织或受众,此添加为异步添加,请稍后手动刷新学员!", ok: handleStageOk });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
handleStageOk();
|
||||||
|
}
|
||||||
|
const dataLists = ref([])
|
||||||
|
watch(()=>stuSelectRows.value,(val)=>{
|
||||||
|
if(val.length!=0){
|
||||||
|
console.log(val,'val')
|
||||||
|
dataLists.value = val.map(item=>{
|
||||||
|
return{
|
||||||
|
examineId:props.examineId,
|
||||||
|
name:item.realName,
|
||||||
|
userNo:item.userNo,
|
||||||
|
departName:item.departName,
|
||||||
|
permissionType:props.permissionType}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
function handleStageOk() {
|
||||||
|
if (props.type === 1 && props.groupId && (props.groupMemberCount < (props.groupMemberNumber * 1 + projectSelectRows.value.length + stuSelectRows.value.length))) {
|
||||||
|
return message.warning("添加小组学员超过最大值");
|
||||||
|
}
|
||||||
|
// emit("finash", false);
|
||||||
|
nameSearch.value.keyword = "";
|
||||||
|
if(!props.typeLists){
|
||||||
|
if(stuSelectRows.value.length==0){
|
||||||
|
message.error("请选择人员")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if(stuSelectRows.value.length>1){
|
||||||
|
message.error("归属权仅可选择一人,请重新选择")
|
||||||
|
stuTableRef.value.clear()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
transferPermission({
|
||||||
|
id: props.id,
|
||||||
|
examinePermission: {
|
||||||
|
examineId: props.examineId,
|
||||||
|
name: stuSelectRows.value[0].realName,
|
||||||
|
userNo: stuSelectRows.value[0].userNo,
|
||||||
|
departName: stuSelectRows.value[0].departName,
|
||||||
|
permissionType: 2
|
||||||
|
}
|
||||||
|
}).then(res=>{
|
||||||
|
console.log(res,'res')
|
||||||
|
deleteDepSelect();
|
||||||
|
emit("finash", true);
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
addPermission(dataLists.value).then(() => {
|
||||||
|
deleteDepSelect();
|
||||||
|
emit("finash", true);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
stageVisible.value = false;
|
||||||
|
visiable.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 搜索受众值发生变化
|
||||||
|
function orgValue(value) {
|
||||||
|
console.log("", value.target.value);
|
||||||
|
searchOrgName.value.keyword = value.target.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(visiable, () => {
|
||||||
|
orgSelectKeys.value = [];
|
||||||
|
deptList.value = [];
|
||||||
|
audienceName.value.keyword = "";
|
||||||
|
nameSearch.value.departId = '';
|
||||||
|
stuTreeExpandedKeys.value = [];
|
||||||
|
stuTreeSelectKeys.value = [];
|
||||||
|
activeKey.value = props.isGroup ? 4 : 1;
|
||||||
|
projectParams.value.studentName = "";
|
||||||
|
nameSearch.value.keyword = "";
|
||||||
|
searchOrgName.value.keyword = "";
|
||||||
|
audienceName.value.keyword = "";
|
||||||
|
|
||||||
|
if (!visiable.value) {
|
||||||
|
auditTableRef.value && auditTableRef.value.clear();
|
||||||
|
auditTableRef.value && auditTableRef.value.reset({ keyword: "" });
|
||||||
|
stuTableRef.value && stuTableRef.value.clear();
|
||||||
|
stuTableRef.value && stuTableRef.value.reset({ keyword: "", departId: '' });
|
||||||
|
projectStuTableRef.value && projectStuTableRef.value.clear();
|
||||||
|
projectStuTableRef.value && projectStuTableRef.value.reset({ pid: props.infoId, type: props.infoType, studentName: "" });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<style lang="scss">
|
||||||
|
.CommonStudent > .ant-drawer-content-wrapper {
|
||||||
|
min-width: 1200px !important;
|
||||||
|
width: 1200px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CommonStudent {
|
||||||
|
.ant-btn-primary {
|
||||||
|
background-color: #4ea6ff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cus-select {
|
||||||
|
height: 40px;
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tableBox .ant-table-row .ant-table-cell {
|
||||||
|
height: 48px;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #4f5156;
|
||||||
|
line-height: 29px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tableBox .ant-table-thead tr th {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-tabs-tabpane {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-tabs {
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
.right1 {
|
||||||
|
border-left: 1px solid #f2f6fe;
|
||||||
|
margin-left: 20px;
|
||||||
|
|
||||||
|
.onerow {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-right: 40px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
.onleft {
|
||||||
|
display: flex;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
.already {
|
||||||
|
color: rgba(51, 51, 51, 1);
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 500;
|
||||||
|
margin-left: 32px;
|
||||||
|
white-space: nowrap;
|
||||||
|
// margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.count {
|
||||||
|
color: #4ea6ff;
|
||||||
|
font-size: 16px;
|
||||||
|
margin: 0 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.peo {
|
||||||
|
color: rgba(51, 51, 51, 1);
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.clbox {
|
||||||
|
margin-right: 50px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
cursor: pointer;
|
||||||
|
width: 104px;
|
||||||
|
height: 32px;
|
||||||
|
border-radius: 4px;
|
||||||
|
background: #4ea6ff;
|
||||||
|
|
||||||
|
.colose {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
// border-radius: 8px;
|
||||||
|
// background: #ffffff;
|
||||||
|
// position: relative;
|
||||||
|
background-image: url(../../assets/images/basicinfo/ch.png);
|
||||||
|
background-size: 100%;
|
||||||
|
margin-right: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.allclear {
|
||||||
|
color: rgba(255, 255, 255, 1);
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.selecteds {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
margin-left: 32px;
|
||||||
|
|
||||||
|
.person {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 20px;
|
||||||
|
border-top: 1px solid #f2f6fe;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chose {
|
||||||
|
width: 64px;
|
||||||
|
height: 24px;
|
||||||
|
margin-top: 25px;
|
||||||
|
margin-right: 25px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 2px;
|
||||||
|
border: 1px solid rgba(56, 139, 225, 1);
|
||||||
|
color: rgba(56, 139, 225, 1);
|
||||||
|
font-size: 12px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.ch {
|
||||||
|
position: absolute;
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
background-image: url(../../assets/images/basicinfo/ch.png);
|
||||||
|
right: -8px;
|
||||||
|
top: -8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.ifsw {
|
||||||
|
display: flex;
|
||||||
|
align-items: end;
|
||||||
|
justify-content: center;
|
||||||
|
color: #4ea6ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sw {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: justify;
|
||||||
|
color: #4ea6ff;
|
||||||
|
margin-top: 23px;
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dept {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 30px;
|
||||||
|
border-top: 1px solid #f2f6fe;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chose1 {
|
||||||
|
//width: 90px;
|
||||||
|
height: 24px;
|
||||||
|
margin-top: 25px;
|
||||||
|
margin-right: 25px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 2px;
|
||||||
|
border: 1px solid rgba(56, 139, 225, 1);
|
||||||
|
color: rgba(56, 139, 225, 1);
|
||||||
|
font-size: 12px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.span {
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ch1 {
|
||||||
|
position: absolute;
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
background-image: url(../../assets/images/basicinfo/ch.png);
|
||||||
|
right: -8px;
|
||||||
|
top: -8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.group {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 30px;
|
||||||
|
border-top: 1px solid #f2f6fe;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chose2 {
|
||||||
|
//width: 120px;
|
||||||
|
height: 24px;
|
||||||
|
margin-top: 25px;
|
||||||
|
margin-right: 25px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 2px;
|
||||||
|
border: 1px solid rgba(56, 139, 225, 1);
|
||||||
|
color: rgba(56, 139, 225, 1);
|
||||||
|
font-size: 12px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.span {
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ch2 {
|
||||||
|
position: absolute;
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
background-image: url(../../assets/images/basicinfo/ch.png);
|
||||||
|
right: -8px;
|
||||||
|
top: -8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
126
src/views/gratefulteacher/EvaluationForm.vue
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
<script setup >
|
||||||
|
import {ref} from 'vue'
|
||||||
|
import ViewReview from "./ViewReview.vue";
|
||||||
|
const column = [
|
||||||
|
{
|
||||||
|
name: 'Name',
|
||||||
|
dataIndex: 'name',
|
||||||
|
key: 'name',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '评审名称',
|
||||||
|
dataIndex: 'age',
|
||||||
|
key: 'age',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '认证讲师',
|
||||||
|
dataIndex: 'address',
|
||||||
|
key: 'address',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '认证时间',
|
||||||
|
key: 'tags',
|
||||||
|
dataIndex: 'tags',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '认证状态',
|
||||||
|
key: 'tags',
|
||||||
|
dataIndex: 'tags',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '操作',
|
||||||
|
key: 'action',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const datas = [
|
||||||
|
{
|
||||||
|
key: '1',
|
||||||
|
name: 'John Brown',
|
||||||
|
age: 32,
|
||||||
|
address: 'New York No. 1 Lake Park',
|
||||||
|
tags: ['nice', 'developer'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: '2',
|
||||||
|
name: 'Jim Green',
|
||||||
|
age: 42,
|
||||||
|
address: 'London No. 1 Lake Park',
|
||||||
|
tags: ['loser'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: '3',
|
||||||
|
name: 'Joe Black',
|
||||||
|
age: 32,
|
||||||
|
address: 'Sidney No. 1 Lake Park',
|
||||||
|
tags: ['cool', 'teacher'],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const InitiateReviewShow =ref(false)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="-page">
|
||||||
|
<div class="table">
|
||||||
|
<a-table :columns="column" :data-source="datas" :scroll="{ x: 1000 }" :pagination="false">
|
||||||
|
<template #headerCell="{ column }">
|
||||||
|
<template v-if="column.key === 'name'">
|
||||||
|
<span>
|
||||||
|
序号
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #bodyCell="{ column, record }">
|
||||||
|
<template v-if="column.key === 'name'">
|
||||||
|
<a>
|
||||||
|
{{ record.name }}
|
||||||
|
</a>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="column.key === 'tags'">
|
||||||
|
<span>
|
||||||
|
<a-tag
|
||||||
|
v-for="tag in record.tags"
|
||||||
|
:key="tag"
|
||||||
|
:color="tag === 'loser' ? 'volcano' : tag.length > 5 ? 'geekblue' : 'green'"
|
||||||
|
>
|
||||||
|
{{ tag.toUpperCase() }}
|
||||||
|
</a-tag>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="column.key === 'action'">
|
||||||
|
<span style="text-align: center;">
|
||||||
|
<a style="margin-right: 7px;" @click="centerDialogVisible=true">二维码</a>
|
||||||
|
|
||||||
|
<a style="margin-right: 7px;" @click='InitiateReviewShow=true'>查看</a>
|
||||||
|
|
||||||
|
<a style="margin-right: 7px;">
|
||||||
|
编辑
|
||||||
|
</a>
|
||||||
|
<a style="color: #de2139">删除</a>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
</a-table>
|
||||||
|
</div>
|
||||||
|
<div style="text-align: center; margin-top: 18px;">
|
||||||
|
<a-pagination v-model:current="current1" show-quick-jumper :total="500" @change="onChange" />
|
||||||
|
</div>
|
||||||
|
<!-- <ViewReview :InitiateReviewShow="InitiateReviewShow"></ViewReview> -->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
|
||||||
|
.table {
|
||||||
|
margin-left: 14px;
|
||||||
|
|
||||||
|
margin-top: 28px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</style>
|
||||||
77
src/views/gratefulteacher/InitiateReview.vue
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
<script setup >
|
||||||
|
const props = defineProps(['InitiateReviewShow'])
|
||||||
|
import { reactive } from 'vue';
|
||||||
|
import InitiateReviewTable from './InitiateReviewTable.vue'
|
||||||
|
const formState = reactive({
|
||||||
|
username: '',
|
||||||
|
password: '',
|
||||||
|
remember: true,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="-page">
|
||||||
|
<el-drawer v-model="props.InitiateReviewShow" title="发起评审" size="45%">
|
||||||
|
<div style="display: flex;flex-direction: column;">
|
||||||
|
<div style="width: 100%;height: 1px;background-color: #b6b7b8;"></div>
|
||||||
|
<div style="display: flex;">
|
||||||
|
<div style="display: flex;flex-direction: column;">
|
||||||
|
<a-form
|
||||||
|
:model="formState"
|
||||||
|
name="basic"
|
||||||
|
:label-col="{ span: 8 }"
|
||||||
|
:wrapper-col="{ span: 16 }"
|
||||||
|
autocomplete="off"
|
||||||
|
@finish="onFinish"
|
||||||
|
@finishFailed="onFinishFailed"
|
||||||
|
>
|
||||||
|
<a-form-item
|
||||||
|
style="margin-top: 29px;"
|
||||||
|
label="评审名字"
|
||||||
|
name="username"
|
||||||
|
:rules="[{ required: true, message: 'Please input your username!' }]"
|
||||||
|
>
|
||||||
|
<a-input v-model:value="formState.username" />
|
||||||
|
</a-form-item>
|
||||||
|
|
||||||
|
<a-form-item
|
||||||
|
label="评审时间"
|
||||||
|
name="password"
|
||||||
|
:rules="[{ required: true, message: 'Please input your password!' }]"
|
||||||
|
>
|
||||||
|
<a-date-picker v-model:value="value8" placeholder="请选择评审时间" />
|
||||||
|
</a-form-item>
|
||||||
|
<div>选择讲师</div>
|
||||||
|
<div style="width: 430px; height: 1px;background-color: #e2e0e0;margin-top: 8px;"></div>
|
||||||
|
<div style="display: flex;margin-top: 13px;">
|
||||||
|
<a-input placeholder="请输入姓名/工号" style="width: 150px;"/>
|
||||||
|
<a-button type="primary" style="width: 70px; height: 31px; border-radius: 5px;margin-left: 15px;">搜索</a-button>
|
||||||
|
<a-button type="primary" style="width: 70px; height: 31px; border-radius: 5px;margin-left: 12px;" ghost>重置</a-button>
|
||||||
|
</div>
|
||||||
|
<p style="margin-top: 11px; color: #b6b7b8;">说明:列表仅显示终稿已上传且未认证的讲师</p>
|
||||||
|
<div style="display: flex;flex-direction: column;">
|
||||||
|
<InitiateReviewTable></InitiateReviewTable>
|
||||||
|
</div>
|
||||||
|
<a-pagination size="small" v-model:current="current1" show-quick-jumper :total="500" @change="onChange" />
|
||||||
|
</a-form>
|
||||||
|
</div>
|
||||||
|
<div style="height: 500px; width: 1px; background: #b9e6fb;margin-left: 91px; margin-top: 10px"></div>
|
||||||
|
<div style="display: flex; flex-direction: column;width: 160px;margin-left: 24px;margin-top: 20px;">
|
||||||
|
<div style="font-size: 16px; font-weight: 900;">已选</div>
|
||||||
|
<div style="width: 16opx; height: 1px;background-color: #b9e6fb;margin: 11px 0;"></div>
|
||||||
|
<a-tag closable @close="log" style="border:1px solid #3da8f0; color: #3da8f0;">Tag 2</a-tag>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div style="width: 100%;text-align: center;margin-top: 65px">
|
||||||
|
<a-button type="primary" style="width: 70px; height: 31px; border-radius: 5px ;margin: 0 15px 0 15px;" ghost>取消</a-button>
|
||||||
|
<a-button type="primary" style="width: 70px; height: 31px; border-radius: 5px" >确认</a-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-drawer>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
109
src/views/gratefulteacher/InitiateReviewTable.vue
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
<script setup >
|
||||||
|
const columns = [
|
||||||
|
{
|
||||||
|
name: 'Name',
|
||||||
|
dataIndex: 'name',
|
||||||
|
key: 'name',
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
title: 'Tags',
|
||||||
|
key: 'tags',
|
||||||
|
dataIndex: 'tags',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Action',
|
||||||
|
key: 'action',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const data = [
|
||||||
|
{
|
||||||
|
key: '1',
|
||||||
|
|
||||||
|
age: 32,
|
||||||
|
address: 'New ',
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: '2',
|
||||||
|
|
||||||
|
age: 42,
|
||||||
|
address: 'London ',
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: '3',
|
||||||
|
|
||||||
|
age: 32,
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const rowSelection = {
|
||||||
|
onChange: (selectedRowKeys, selectedRows) => {
|
||||||
|
console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
|
||||||
|
},
|
||||||
|
getCheckboxProps: record => ({
|
||||||
|
disabled: record.name === 'Disabled User',
|
||||||
|
// Column configuration not to be checked
|
||||||
|
name: record.name,
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="-page">
|
||||||
|
<a-table
|
||||||
|
|
||||||
|
:row-selection="rowSelection"
|
||||||
|
:pagination="false"
|
||||||
|
:row-class-name="(_record, index) => (index % 2 === 1 ? 'table-striped' : null)"
|
||||||
|
:columns="columns"
|
||||||
|
:data-source="data"
|
||||||
|
class="ant-table-striped"
|
||||||
|
size="middle"
|
||||||
|
>
|
||||||
|
<template #headerCell="{ column }">
|
||||||
|
<template v-if="column.key === 'name'">
|
||||||
|
<span >
|
||||||
|
<smile-outlined />
|
||||||
|
Name
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #bodyCell="{ column, record }">
|
||||||
|
<template v-if="column.key === 'name'">
|
||||||
|
<a>
|
||||||
|
{{ record.name }}
|
||||||
|
</a>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="column.key === 'tags'">
|
||||||
|
<span>
|
||||||
|
<a-tag
|
||||||
|
v-for="tag in record.tags"
|
||||||
|
:key="tag"
|
||||||
|
:color="tag === 'loser' ? 'volcano' : tag.length > 5 ? 'geekblue' : 'green'"
|
||||||
|
>
|
||||||
|
{{ tag.toUpperCase() }}
|
||||||
|
</a-tag>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="column.key === 'action'">
|
||||||
|
<span>
|
||||||
|
|
||||||
|
<a>Delete</a>
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
</a-table>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
|
||||||
|
// [data-doc-theme='light'] .ant-table-striped :deep(.ant-table-striped .table-striped ) td {
|
||||||
|
// background-color: #fafafa;
|
||||||
|
// }
|
||||||
|
</style>
|
||||||
727
src/views/gratefulteacher/InstructorCertification.vue
Normal file
@@ -0,0 +1,727 @@
|
|||||||
|
<script setup >
|
||||||
|
import { ref,onMounted,computed } from 'vue';
|
||||||
|
import { useRoute, useRouter } from 'vue-router'
|
||||||
|
import {getexamineList,CreateAuthentication,delExamine,getOnlineLearningList,deleteCourse,addCourse,updateExamine,removePermission,updateStatus} from '@/api/examineApi.js'
|
||||||
|
import dialog from "@/utils/dialog";
|
||||||
|
import DropDown from "@/components/common/DropDown";
|
||||||
|
import OwnerTableModelStudent from "./tablemodel";
|
||||||
|
import CommonStudent from "./CommonTeacher";
|
||||||
|
import CreateOnline from "@/components/drawers/CreateOnline.vue";
|
||||||
|
import { message } from "ant-design-vue";
|
||||||
|
import { useStore } from "vuex";
|
||||||
|
const route = useRoute()
|
||||||
|
const router = useRouter()
|
||||||
|
const visible = ref(false);
|
||||||
|
const loading = ref(false);
|
||||||
|
const store = useStore();
|
||||||
|
const userInfo = computed(() => store.state.userInfo);
|
||||||
|
const uploadAdmin = (admin)=>{
|
||||||
|
const roleCode = userInfo.value.roleList.map((item)=>item.roleCode)
|
||||||
|
if (admin){
|
||||||
|
return roleCode.some(t => t == admin)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const onlineRef = ref(false);
|
||||||
|
const columns = [
|
||||||
|
{
|
||||||
|
name: 'serial',
|
||||||
|
dataIndex: 'serial',
|
||||||
|
key: 'serial',
|
||||||
|
width: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '认证项目名称',
|
||||||
|
dataIndex: 'name',
|
||||||
|
key: 'name',
|
||||||
|
ellipsis: true,
|
||||||
|
width: 500,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '创建人',
|
||||||
|
dataIndex: 'createName',
|
||||||
|
key: 'createName',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '创建时间',
|
||||||
|
key: 'createTime',
|
||||||
|
dataIndex: 'createTime',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '操作',
|
||||||
|
key: 'action',
|
||||||
|
fixed: "right",
|
||||||
|
width: 250,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const ViewReviewcolumns =[
|
||||||
|
{
|
||||||
|
title: "课程名称",
|
||||||
|
name: 'courseName',
|
||||||
|
dataIndex: 'courseName',
|
||||||
|
key: 'id',
|
||||||
|
ellipsis: true,
|
||||||
|
width: 300,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "创建人",
|
||||||
|
name: 'createName',
|
||||||
|
dataIndex: 'createName',
|
||||||
|
key: 'id',
|
||||||
|
align: "center",
|
||||||
|
width: 50,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "发布时间",
|
||||||
|
name: 'createTime',
|
||||||
|
dataIndex: 'createTime',
|
||||||
|
key: 'id',
|
||||||
|
align: "center",
|
||||||
|
ellipsis: true,
|
||||||
|
width: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "操作",
|
||||||
|
width: 50,
|
||||||
|
dataIndex: "id",
|
||||||
|
key: "id",
|
||||||
|
align: "center",
|
||||||
|
slots: { customRender: "action" },
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const imgData = ref([
|
||||||
|
{id:1,img:'50.png'},
|
||||||
|
{id:2,img:'39.png'},
|
||||||
|
{id:3,img:'46.png'},
|
||||||
|
{id:4,img:'33.png'},
|
||||||
|
{id:5,img:'47.png'},
|
||||||
|
{id:6,img:'49.png'},
|
||||||
|
{id:7,img:'27.png'},
|
||||||
|
{id:8,img:'30.png'},
|
||||||
|
{id:9,img:'44.png'},
|
||||||
|
])
|
||||||
|
const createParam = ref({
|
||||||
|
name: '',
|
||||||
|
description: '',
|
||||||
|
cover: '',
|
||||||
|
index:''
|
||||||
|
})
|
||||||
|
const imgClick = (item) => {
|
||||||
|
createParam.value.cover = item.value
|
||||||
|
createParam.value.index = item.code
|
||||||
|
}
|
||||||
|
//创建认证确定
|
||||||
|
const handleOk = async () => {
|
||||||
|
if(createParam.value.name.trim()==''||createParam.value.name.trim()==null){
|
||||||
|
message.info('请输入认证项目名称')
|
||||||
|
createParam.value.name = ''
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if(createParam.value.cover==''||createParam.value.cover==null){
|
||||||
|
message.info('请选择封面图')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
visible.value = false
|
||||||
|
await CreateAuthentication(createParam.value).then(res=>{
|
||||||
|
message.success('创建成功')
|
||||||
|
getlist()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const handleEdit = async () => {
|
||||||
|
if(createParam.value.name.trim()==''||createParam.value.name.trim()==null){
|
||||||
|
message.info('请输入认证项目名称')
|
||||||
|
createParam.value.name = ''
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if(createParam.value.cover==''||createParam.value.cover==null){
|
||||||
|
message.info('请选择认证项目封面图')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
visible.value = false
|
||||||
|
await updateExamine({
|
||||||
|
name:createParam.value.name,
|
||||||
|
cover:createParam.value.cover,
|
||||||
|
id:createParam.value.id,
|
||||||
|
description: createParam.value.description
|
||||||
|
}).then(res=>{
|
||||||
|
message.success('编辑成功')
|
||||||
|
getlist()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const editId = ref('')
|
||||||
|
//编辑认证
|
||||||
|
const editFee = (record) => {
|
||||||
|
editId.value = record.id
|
||||||
|
visible.value = true
|
||||||
|
createParam.value = {...record}
|
||||||
|
}
|
||||||
|
//线上学习课列表显示
|
||||||
|
const ViewReviewdata = ref([])
|
||||||
|
const ViewReviewDataShow = ref([])
|
||||||
|
function selectCourse(row) {
|
||||||
|
row.courseName = row.name
|
||||||
|
row.createName = row.sysCreateBy
|
||||||
|
row.createTime = row.publishTime
|
||||||
|
row.newId = 2
|
||||||
|
if (!ViewReviewDataShow.value.some(item => item.id === row.id)) {
|
||||||
|
if (ViewReviewdata.value.some(item => item.courseName == row.name)) {
|
||||||
|
message.error('该课程已添加')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ViewReviewdata.value.push(row);
|
||||||
|
ViewReviewDataShow.value.push(row);
|
||||||
|
}
|
||||||
|
onlineRef.value.closeModal();
|
||||||
|
}
|
||||||
|
const OnlineLearning = async (i, row) => {
|
||||||
|
window.selectCourse = selectCourse;
|
||||||
|
// row && (ViewReviewdata.value = [row.info]);
|
||||||
|
ViewReviewShow.value = true
|
||||||
|
await getOnlineLearningList().then(res=>{
|
||||||
|
if(res.code == 200){
|
||||||
|
ViewReviewdata.value = res.data
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//创建认证
|
||||||
|
const createData = () => {
|
||||||
|
editId.value = ''
|
||||||
|
createParam.value = {
|
||||||
|
name: '',
|
||||||
|
description: '',
|
||||||
|
cover: '',
|
||||||
|
}
|
||||||
|
visible.value = true
|
||||||
|
}
|
||||||
|
//删除数据
|
||||||
|
const deleteReview = (record,index) =>{
|
||||||
|
dialog({
|
||||||
|
content: '确认删除吗?删除后数据不可恢复',
|
||||||
|
ok: () => {
|
||||||
|
if(record.newId==2){
|
||||||
|
ViewReviewdata.value = ViewReviewdata.value.filter(item => item.id !== record.id);
|
||||||
|
message.success('删除成功')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
deleteCourse({id:record.id}).then(res=>{
|
||||||
|
if(res.code == 200){
|
||||||
|
message.success('删除成功')
|
||||||
|
OnlineLearning()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const resizeRe = (record) => {
|
||||||
|
//启用 0 禁用 1
|
||||||
|
dialog({
|
||||||
|
content: record.status==1?'确定启用吗?启用后新报名的讲师会显示该课程信息':'确定禁用吗?禁用后新报名的讲师不显示该课程信息',
|
||||||
|
ok: () => {
|
||||||
|
updateStatus({
|
||||||
|
id:record.id,
|
||||||
|
status: record.status==1?0:1
|
||||||
|
}).then(res=>{
|
||||||
|
message.success(record.status==1?'启用成功':'禁用成功')
|
||||||
|
OnlineLearning()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const falseData = () => {
|
||||||
|
ViewReviewdata.value = []
|
||||||
|
ViewReviewDataShow.value = []
|
||||||
|
ViewReviewShow.value = false
|
||||||
|
}
|
||||||
|
const AddList = () => {
|
||||||
|
if(ViewReviewDataShow.value.length==0){
|
||||||
|
message.error('请选择课程')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const filteredData = ViewReviewdata.value.filter(item => item.newId === 2);
|
||||||
|
if(filteredData.length==0){
|
||||||
|
message.error('请选择课程')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const transformedData = filteredData.map(item => ({
|
||||||
|
courseName: item.name,
|
||||||
|
courseId: item.id
|
||||||
|
}));
|
||||||
|
addCourse(transformedData).then(res=>{
|
||||||
|
})
|
||||||
|
falseData()
|
||||||
|
}
|
||||||
|
//认证审批项目列表数据
|
||||||
|
const data = ref([])
|
||||||
|
const delVisible = ref(false)
|
||||||
|
//页数
|
||||||
|
const current1 = ref(1);
|
||||||
|
//表格行数
|
||||||
|
const pageSize = ref(15)
|
||||||
|
//总条数
|
||||||
|
const total = ref(0)
|
||||||
|
//封面图
|
||||||
|
const url = ref('http://localhost:8070/manage/img/50.34e94524.png')
|
||||||
|
//搜索值
|
||||||
|
const searchValue = ref('')
|
||||||
|
//搜索功能
|
||||||
|
const Administrator= ref(1)
|
||||||
|
const search = async()=>{
|
||||||
|
current1.value = 1
|
||||||
|
loading.value = true
|
||||||
|
if(uploadAdmin('examine-admin')){
|
||||||
|
Administrator.value = 0
|
||||||
|
}
|
||||||
|
const res = await getexamineList({
|
||||||
|
pageNo: current1.value,
|
||||||
|
pageSize: pageSize.value,
|
||||||
|
name: searchValue.value,
|
||||||
|
isSuper:Administrator.value
|
||||||
|
})
|
||||||
|
loading.value = false
|
||||||
|
|
||||||
|
data.value= res.data.records
|
||||||
|
total.value = res.data.total
|
||||||
|
}
|
||||||
|
//重置
|
||||||
|
const handleRest = ()=>{
|
||||||
|
current1.value = 1
|
||||||
|
searchValue.value = null
|
||||||
|
getlist()
|
||||||
|
|
||||||
|
}
|
||||||
|
//删除认证
|
||||||
|
const deleteExamine = async(id)=>{
|
||||||
|
await delExamine({
|
||||||
|
id
|
||||||
|
})
|
||||||
|
if (data.value.length == 1) {
|
||||||
|
current1.value = current1.value - 1
|
||||||
|
|
||||||
|
}
|
||||||
|
message.success('删除成功')
|
||||||
|
getlist()
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const onChange = (pageNo,pageSize) => {
|
||||||
|
current1.value = pageNo
|
||||||
|
getlist()
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
const ViewReviewShow =ref(null)
|
||||||
|
|
||||||
|
const centerDialogVisible = ref(false)
|
||||||
|
const SkipManagement = (id,description,time,isView)=>{
|
||||||
|
|
||||||
|
router.push({
|
||||||
|
path: '/LecturerManagement',
|
||||||
|
query: {id,
|
||||||
|
description:description,
|
||||||
|
time:time,
|
||||||
|
isView
|
||||||
|
},
|
||||||
|
// name:'LecturerManagement',
|
||||||
|
// params:{
|
||||||
|
// description:description,
|
||||||
|
// time:time
|
||||||
|
// }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const toLecture = (id,description,time,isView) =>{
|
||||||
|
router.push({
|
||||||
|
path: '/LecturerManagement',
|
||||||
|
query: {id,
|
||||||
|
description:description,
|
||||||
|
time:time,
|
||||||
|
lecture:true,
|
||||||
|
isView
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
//讲师认证列表数据
|
||||||
|
const InstructorCertificationlist = ref([])
|
||||||
|
const getlist = async() =>{
|
||||||
|
loading.value = true
|
||||||
|
if(uploadAdmin('examine-admin')){
|
||||||
|
Administrator.value = 0
|
||||||
|
}
|
||||||
|
const res = await getexamineList({
|
||||||
|
pageNo: current1.value,
|
||||||
|
pageSize: pageSize.value,
|
||||||
|
name: !searchValue.value?'':searchValue.value,
|
||||||
|
isSuper:Administrator.value
|
||||||
|
|
||||||
|
})
|
||||||
|
loading.value = false
|
||||||
|
total.value = res.data.total
|
||||||
|
data.value= res.data.records
|
||||||
|
}
|
||||||
|
const imageList = ref([])
|
||||||
|
onMounted(()=>{
|
||||||
|
imageList.value = store.state.examine_cover?.map((e) => ({
|
||||||
|
code: e.id,
|
||||||
|
value: e.value,
|
||||||
|
label: e.name,
|
||||||
|
}));
|
||||||
|
getlist()
|
||||||
|
})
|
||||||
|
|
||||||
|
const customRow=(column) =>{
|
||||||
|
column.forEach((e, index) => {
|
||||||
|
column[index].className = 'tableClass'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const handleMsg = {
|
||||||
|
del: "你确定删除该教师信息吗?",
|
||||||
|
};
|
||||||
|
|
||||||
|
function handleOper(record, type, status = "") {
|
||||||
|
dialog({
|
||||||
|
content: "确认删除吗?数据删除后不可恢复",
|
||||||
|
// ok:deleteExamine(record.id)
|
||||||
|
ok:()=>{
|
||||||
|
|
||||||
|
deleteExamine(record.id)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="page">
|
||||||
|
<!-- 线上学习课程设置 -->
|
||||||
|
<a-drawer v-model:visible="ViewReviewShow"
|
||||||
|
class="custom-class"
|
||||||
|
|
||||||
|
:closable="false"
|
||||||
|
placement="right"
|
||||||
|
width="70%">
|
||||||
|
<div class="header">
|
||||||
|
<div class="headerTitle">线上学习课程设置</div>
|
||||||
|
<img
|
||||||
|
style="width: 29px; height: 29px; cursor: pointer"
|
||||||
|
src="../../assets/images/basicinfo/close.png"
|
||||||
|
@click="falseData"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div style="display: flex;flex-direction: column;">
|
||||||
|
<!-- <div @click="ViewReviewShow=true" style="margin-bottom: 15px; height: 38px; width: 150px;background: #4ea6ff;line-height: 40px;text-align: center;border-radius: 8px;color: #ffffff;">选择/新建课程</div> -->
|
||||||
|
<CreateOnline ref="onlineRef" :id="''" :type="''">
|
||||||
|
<a-button type="primary" style="border-radius: 4px;margin-bottom:15px;">{{
|
||||||
|
"选择/新建课程"
|
||||||
|
}}
|
||||||
|
</a-button>
|
||||||
|
</CreateOnline>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<a-table
|
||||||
|
|
||||||
|
:row-selection="rowSelection"
|
||||||
|
:pagination="false"
|
||||||
|
:scroll="{ x: 1000 }"
|
||||||
|
:columns="ViewReviewcolumns"
|
||||||
|
:data-source="ViewReviewdata"
|
||||||
|
|
||||||
|
|
||||||
|
>
|
||||||
|
<template #action="{ record, column }">
|
||||||
|
<a-space>
|
||||||
|
<a-button type="link" @click="resizeRe(record,index)">
|
||||||
|
<span>{{record.status==1?'启用':'禁用'}}</span>
|
||||||
|
</a-button>
|
||||||
|
<a-button type="link" @click="deleteReview(record,index)">
|
||||||
|
<span>删除</span>
|
||||||
|
</a-button>
|
||||||
|
</a-space>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
</a-table>
|
||||||
|
</div>
|
||||||
|
<div style=" display: flex;justify-content: center;">
|
||||||
|
<div @click="falseData" style="margin-right: 30px; border-radius: 8px; color: #fff;font-size: 16px; display: flex; justify-content: center;align-items: center; width: 100px; height: 38px; margin-top: 36px;background: #3da8f0;">取消</div>
|
||||||
|
<div @click="AddList" style="border-radius: 8px; color: #fff;font-size: 16px; display: flex; justify-content: center;align-items: center; width: 100px; height: 38px; margin-top: 36px;background: #3da8f0;">确定</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</a-drawer>
|
||||||
|
<div class="filter">
|
||||||
|
<div class="filterItems">
|
||||||
|
<div style="display: flex;">
|
||||||
|
<a-input :max="50" v-model:value="searchValue" style="width: 270px; height: 41px; border-radius: 8px"
|
||||||
|
placeholder="请输入认证项目名称" />
|
||||||
|
<div style="display: flex; margin-left: 20px">
|
||||||
|
<div class="btn btn1" @click="search()">
|
||||||
|
<div class="search"></div>
|
||||||
|
<div class="btnText ">搜索</div>
|
||||||
|
</div>
|
||||||
|
<div class="btn btn2" style="width: 105px" @click="handleRest">
|
||||||
|
<div class="search"></div>
|
||||||
|
<div class="btnText">重置</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div style="display: flex;justify-content: space-between;align-self: end;">
|
||||||
|
<div v-if="uploadAdmin('examine-admin')" @click="OnlineLearning" style=" cursor: pointer;margin-right: 15px;height: 38px; width: 150px;background: #4ea6ff; line-height: 40px;text-align: center;border-radius: 8px;color: #ffffff;">线上学习课程设置</div>
|
||||||
|
<div class="btns" @click="centerDialogVisible=true">
|
||||||
|
<div style="margin-right: 0;" class="btn btn3" @click="createData">
|
||||||
|
<div class="search"></div>
|
||||||
|
<div class="btnText">创建认证</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- 表格 -->
|
||||||
|
<div class="table">
|
||||||
|
<a-table :columns="columns"
|
||||||
|
:customHeaderRow="customRow"
|
||||||
|
:data-source="data"
|
||||||
|
:scroll="{ x: 1000 }"
|
||||||
|
:loading="loading"
|
||||||
|
class="ant-table"
|
||||||
|
:row-class-name="(_record, index) => 'table' "
|
||||||
|
:pagination="false">
|
||||||
|
<template #headerCell="{ column }">
|
||||||
|
<template v-if="column.key === 'serial'">
|
||||||
|
<span>
|
||||||
|
序号
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #bodyCell="{ column, record,index }">
|
||||||
|
<template v-if="column.key === 'serial'">
|
||||||
|
<span>
|
||||||
|
{{ index+1 }}
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="column.key === 'tags'">
|
||||||
|
<span>
|
||||||
|
{{ record.name }}
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="column.key === 'action'">
|
||||||
|
<span style="text-align: center;">
|
||||||
|
<a style="margin-right: 7px;" v-if="record.isView!=0||uploadAdmin('examine-admin')" @click="editFee(record)">编辑</a>
|
||||||
|
|
||||||
|
<a style="margin-right: 7px;" @click='SkipManagement(record.id,record.description,record.name,record.isView)'>管理</a>
|
||||||
|
|
||||||
|
<a style="margin-right: 7px;" @click="toLecture(record.id,record.description,record.name,record.isView)">
|
||||||
|
评审
|
||||||
|
</a>
|
||||||
|
<DropDown v-if="uploadAdmin('examine-admin')" value="授权">
|
||||||
|
<OwnerTableModelStudent
|
||||||
|
:types="[7, 8, 9]"
|
||||||
|
:id="record.id"
|
||||||
|
:type="9"
|
||||||
|
:searchTrue="true"
|
||||||
|
>权限名单</OwnerTableModelStudent
|
||||||
|
>
|
||||||
|
<CommonStudent :type="7" :permissionType="0" :examineId="record.id" :id="record.id" title="查看权"
|
||||||
|
>查看权</CommonStudent
|
||||||
|
>
|
||||||
|
<CommonStudent :type="8" :permissionType="1" :examineId="record.id" :id="record.id" title="管理权"
|
||||||
|
>管理权</CommonStudent
|
||||||
|
>
|
||||||
|
</DropDown>
|
||||||
|
<a style="color: #de2139;margin-left: 7px" v-if="record.isView!=0||uploadAdmin('examine-admin')" @click="handleOper(record, 'del')">删除</a>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
</a-table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div style="text-align: center; margin-top: 18px;">
|
||||||
|
|
||||||
|
|
||||||
|
<a-pagination :defaultPageSize="pageSize" :showSizeChanger="false" v-model:current="current1" show-quick-jumper :total="total" @change="onChange" />
|
||||||
|
</div>
|
||||||
|
<!--创建认证和编辑认证 -->
|
||||||
|
<a-modal v-model:visible="visible" :title="editId?'编辑认证':'创建认证'" @ok="!editId?handleOk():handleEdit()" width="610px">
|
||||||
|
<a-form class="form_item">
|
||||||
|
|
||||||
|
<a-form-item :rules="[{ required: true, message: 'Please input your password!' }]" label="认证项目名称" style="margin-left: 32px;margin-top: 24px">
|
||||||
|
<a-input :showCount="true" :maxlength="50" v-model:value="createParam.name" placeholder="认证项目名称" style="border-radius: 8px;width: 410px;height: 36px;" />
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item :rules="[{ required: true, message: 'Please input your password!' }]" label="封面图" style="width: 560px;margin-left: 73px;margin-top: 24px;">
|
||||||
|
<div class="img_box_item" @click="imgClick(item)" v-for="(item,index) in imageList" :key="index">
|
||||||
|
<img :style="createParam?.cover==item.value?{border:'3px solid rgba(78, 166, 255, 1)'}:{border:'1px solid #ccc'}" style="width: 127px; height: 70px;" :src="item.value" alt="">
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item style="margin-left: 71px;margin-top: 24px;" label="具体说明">
|
||||||
|
<a-textarea
|
||||||
|
style="width: 410px;height: 130px;overflow: auto;position: relative;resize: none;"
|
||||||
|
:maxlength="150"
|
||||||
|
v-model:value="createParam.description"
|
||||||
|
/>
|
||||||
|
<span style="position:absolute;right:71px;bottom:0px;color: #c7cbd2;">{{ createParam.description.length }}/150</span>
|
||||||
|
</a-form-item>
|
||||||
|
</a-form>
|
||||||
|
</a-modal>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
::v-deep .ant-pagination{
|
||||||
|
margin-bottom: 18px;
|
||||||
|
}
|
||||||
|
.btn3 {
|
||||||
|
margin-right: 0;
|
||||||
|
|
||||||
|
.search {
|
||||||
|
width: 17px;
|
||||||
|
height: 18px;
|
||||||
|
background-image: url("@/assets/images/courseManage/add0.png");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn3:active {
|
||||||
|
background: #0982ff;
|
||||||
|
}
|
||||||
|
.btn1 {
|
||||||
|
.search {
|
||||||
|
width: 15px;
|
||||||
|
height: 17px;
|
||||||
|
background-image: url("@/assets/images/courseManage/search0.png");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn2 {
|
||||||
|
.search {
|
||||||
|
width: 16px;
|
||||||
|
height: 18px;
|
||||||
|
background-image: url("@/assets/images/courseManage/reset0.png");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn1:active {
|
||||||
|
background: #0982ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn2:active {
|
||||||
|
background: rgba(64, 158, 255, 0.2);
|
||||||
|
}
|
||||||
|
.btn {
|
||||||
|
padding: 0 26px 0 26px;
|
||||||
|
height: 38px;
|
||||||
|
background: #4ea6ff;
|
||||||
|
border-radius: 8px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin-right: 14px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
.search {
|
||||||
|
background-size: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btnText {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #ffffff;
|
||||||
|
line-height: 36px;
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.form_item{
|
||||||
|
::v-deep .ant-form-item-control-input-content {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
.img_box_item{
|
||||||
|
cursor: pointer;
|
||||||
|
margin-right: 15px;
|
||||||
|
margin-bottom: 13px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.page {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.filter {
|
||||||
|
margin-left: 40px;
|
||||||
|
margin-right: 40px;
|
||||||
|
margin-top: 28px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
.filterItems{
|
||||||
|
width: 100%;
|
||||||
|
height: 41px;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.table {
|
||||||
|
margin-left: 40px;
|
||||||
|
margin-right: 40px;
|
||||||
|
margin-top: 28px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
:deep(.ant-table-tbody > tr > td ){
|
||||||
|
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
}
|
||||||
|
.custom-dialog-title {
|
||||||
|
text-align: left; /* 让标题文本居左 */
|
||||||
|
/* 其他你需要的样式 */
|
||||||
|
}
|
||||||
|
.imgs {
|
||||||
|
width: 560px;
|
||||||
|
margin-left: 44.5px;
|
||||||
|
|
||||||
|
}
|
||||||
|
.explain {
|
||||||
|
width: 560px;
|
||||||
|
margin-left: 44.5px;
|
||||||
|
|
||||||
|
}
|
||||||
|
:deep(.imgs .el-form-item__label){
|
||||||
|
margin-top: 29px;
|
||||||
|
}
|
||||||
|
:deep(.demo-pagination-block) {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
:deep(.ant-table-tbody > tr > td){
|
||||||
|
text-align: center;
|
||||||
|
} .header {
|
||||||
|
margin-top: -20px;
|
||||||
|
height: 73px;
|
||||||
|
border-bottom: 1px solid #e8e8e8;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
flex-shrink: 0;
|
||||||
|
// background-color: red;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
.headerTitle {
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #333333;
|
||||||
|
line-height: 25px;
|
||||||
|
// margin-left: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
:deep(.ant-table-tbody > tr > td:nth-last-child(4)) {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
55
src/views/gratefulteacher/LeadInstructor.vue
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
<script setup >
|
||||||
|
import { ElMessageBox } from 'element-plus'
|
||||||
|
import { UploadFilled } from '@element-plus/icons-vue'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
const props = defineProps(["imprtlecturer"])
|
||||||
|
const emit = defineEmits(['CloseImprt'])
|
||||||
|
const Closeimprtlecturer = (done) => {
|
||||||
|
ElMessageBox.confirm('Are you sure to close this dialog?')
|
||||||
|
.then(() => {
|
||||||
|
|
||||||
|
emit('CloseImprt', false)
|
||||||
|
done()
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
// catch error
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="-page" >
|
||||||
|
<el-drawer v-model="props.imprtlecturer" :before-close="Closeimprtlecturer" style="padding:0 10px; width: 100%;" size="65%">
|
||||||
|
<template #title>
|
||||||
|
<h1 style="font-weight: 700;">导入讲师</h1>
|
||||||
|
</template>
|
||||||
|
<div >
|
||||||
|
<div style="width: 100%;">请下载 <span style="color: #409EFF;">模板</span> ,按要求填写数据并导入</div>
|
||||||
|
</div>
|
||||||
|
<div style="margin-left: 20px; margin-top: 37px;">
|
||||||
|
<el-upload
|
||||||
|
style="width: 33%;"
|
||||||
|
class="upload-demo"
|
||||||
|
drag
|
||||||
|
action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
|
||||||
|
multiple
|
||||||
|
>
|
||||||
|
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
|
||||||
|
<div class="el-upload__text">
|
||||||
|
点击或将文件拖拽到此处上传件
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div style="color: #d7d7d7;">支持.xls .xlsx</div>
|
||||||
|
</el-upload>
|
||||||
|
</div>
|
||||||
|
<div style="text-align: center;">
|
||||||
|
<el-button plain type="primary" style="width: 100px; height: 40px;margin-right: 20px;" >取消</el-button>
|
||||||
|
<el-button type="primary" style="width: 100px; height: 40px;margin-left: 20px; ">确认</el-button>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</el-drawer>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="scss" scoped></style>
|
||||||
1763
src/views/gratefulteacher/LecturerManagement.vue
Normal file
295
src/views/gratefulteacher/QrCode.vue
Normal file
@@ -0,0 +1,295 @@
|
|||||||
|
<template>
|
||||||
|
<a-modal
|
||||||
|
:visible="true"
|
||||||
|
:footer="null"
|
||||||
|
:title="null"
|
||||||
|
:centere="true"
|
||||||
|
:closable="false"
|
||||||
|
style="margin-top: 400px"
|
||||||
|
:zIndex="9999"
|
||||||
|
@cancel="close"
|
||||||
|
>
|
||||||
|
<div id="qrcode" class="QR">
|
||||||
|
<div class="qr_header"></div>
|
||||||
|
<div class="qr_main">
|
||||||
|
<div class="qrm_header">
|
||||||
|
|
||||||
|
<span>{{ title }}</span>
|
||||||
|
<div class="close_exit" @click="close"></div>
|
||||||
|
</div>
|
||||||
|
<div class="downloadCode" style="">
|
||||||
|
<div class="qrm_body">
|
||||||
|
<div class="qrm_body_info" style=" text-align: center;
|
||||||
|
display: flex;
|
||||||
|
align-self: center;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
flex-direction: column-reverse;
|
||||||
|
align-content: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
">
|
||||||
|
|
||||||
|
<div class="codename" :title="name">{{ name }}</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<QrcodeVue :value="url" :size="size" style="width: 200px; height: 200px"></QrcodeVue>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="copyAble" class="codeUrl" :style="{ display: 'flex'}">
|
||||||
|
<div class="codeUrlLink">链接</div>
|
||||||
|
<a-input :value="url" disabled class="codeUrlInp"/>
|
||||||
|
<a-input
|
||||||
|
:value="url"
|
||||||
|
id="courseUrl"
|
||||||
|
class="codeUrlInp"
|
||||||
|
style="position: absolute; opacity: 0; z-index: -1"
|
||||||
|
/>
|
||||||
|
<div @click="copyUrl" class="codeUrlCopy">复制链接</div>
|
||||||
|
</div>
|
||||||
|
<div class="qrm_footer">
|
||||||
|
<span style="color: #387df7; cursor: pointer" @click="download(200)">下载二维码</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-modal>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import {defineProps, onMounted} from "vue";
|
||||||
|
import html2canvas from "html2canvas";
|
||||||
|
import QrcodeVue from "qrcode.vue";
|
||||||
|
import {message} from "ant-design-vue";
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
close: {
|
||||||
|
type: Function,
|
||||||
|
default: () => ({})
|
||||||
|
},
|
||||||
|
ok: {
|
||||||
|
type: Function,
|
||||||
|
default: () => ({})
|
||||||
|
},
|
||||||
|
url: String,
|
||||||
|
copyAble: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
type: Number,
|
||||||
|
default: 800
|
||||||
|
},
|
||||||
|
name: String,
|
||||||
|
createName: String,
|
||||||
|
courseName: String,
|
||||||
|
title: {
|
||||||
|
type: String,
|
||||||
|
default: "二维码"
|
||||||
|
},
|
||||||
|
cancel: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
duration: {
|
||||||
|
type: Number,
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
onMounted(() => props.duration && setTimeout(() => props.close(), props.duration));
|
||||||
|
|
||||||
|
function download() {
|
||||||
|
html2canvas(
|
||||||
|
document.querySelector(".downloadCode"),
|
||||||
|
{ useCORS: true,
|
||||||
|
allowTaint: true,
|
||||||
|
logging: true,
|
||||||
|
}
|
||||||
|
).then((canvas) => {
|
||||||
|
let a = document.createElement("a");
|
||||||
|
a.style.display = "none";
|
||||||
|
a.download = `${new Date().getTime()}.png`;
|
||||||
|
a.href = canvas.toDataURL("image/png");
|
||||||
|
document.body.appendChild(a);
|
||||||
|
a.click();
|
||||||
|
}).catch((err) => console.log('html2canvas',err));
|
||||||
|
}
|
||||||
|
|
||||||
|
function copyUrl() {
|
||||||
|
const input = document.createElement("input"); // 创建input对象
|
||||||
|
input.value = props.url;
|
||||||
|
document.body.appendChild(input); // 添加临时实例
|
||||||
|
input.select(); // 选择实例内容
|
||||||
|
document.execCommand("Copy"); // 执行复制
|
||||||
|
document.body.removeChild(input); // 删除临时实例
|
||||||
|
message.success("复制成功!");
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.QR {
|
||||||
|
z-index: 9999;
|
||||||
|
width: 520px;
|
||||||
|
background: #ffffff;
|
||||||
|
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.21);
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
top: 10%;
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
|
||||||
|
.qr_header {
|
||||||
|
position: absolute;
|
||||||
|
width: calc(100%);
|
||||||
|
height: 40px;
|
||||||
|
background: linear-gradient(
|
||||||
|
rgba(78, 166, 255, 0.2) 0%,
|
||||||
|
rgba(78, 166, 255, 0) 100%
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
.qr_main {
|
||||||
|
width: 100%;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.qrm_header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding-top: 20px;
|
||||||
|
padding-left: 26px;
|
||||||
|
font-size: 16px;
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #333333;
|
||||||
|
line-height: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.close_exit {
|
||||||
|
position: absolute;
|
||||||
|
right: 42px;
|
||||||
|
cursor: pointer;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
background-image: url(@/assets/images/coursewareManage/close.png);
|
||||||
|
background-size: 100% 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.qrm_body {
|
||||||
|
width: 100%;
|
||||||
|
padding-top: 22px;
|
||||||
|
padding-bottom: 32px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
.qrm_body_info{
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
}
|
||||||
|
.codename {
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #333333;
|
||||||
|
line-height: 25px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
margin-left: 20px;
|
||||||
|
margin-right: 20px;
|
||||||
|
text-align: left;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
max-width: 300px;
|
||||||
|
}
|
||||||
|
// .codename:hover{
|
||||||
|
// overflow: visible;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
.codeUrl {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
|
||||||
|
.codeUrlLink {
|
||||||
|
width: 72px;
|
||||||
|
height: 40px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #c7cbd2;
|
||||||
|
line-height: 20px;
|
||||||
|
border: 1px solid #c7cbd2;
|
||||||
|
border-right: 0px solid #c7cbd2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.codeUrlInp {
|
||||||
|
width: 305px;
|
||||||
|
height: 40px;
|
||||||
|
border: 1px solid #c7cbd2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-input-disabled {
|
||||||
|
background-color: rgba(0, 0, 0, 0) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-input[disabled] {
|
||||||
|
background-color: rgba(0, 0, 0, 0) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.codeUrlCopy {
|
||||||
|
width: 96px;
|
||||||
|
height: 40px;
|
||||||
|
background-color: #4ea6ff;
|
||||||
|
border-radius: 8px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #ffffff;
|
||||||
|
line-height: 20px;
|
||||||
|
cursor: pointer;
|
||||||
|
margin-left: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.qrm_footer {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin-bottom: 44px;
|
||||||
|
|
||||||
|
.qrmbtn {
|
||||||
|
width: 80px;
|
||||||
|
height: 32px;
|
||||||
|
display: flex;
|
||||||
|
line-height: 32px;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid #387df7;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
.btntext {
|
||||||
|
color: #387df7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.codeModal {
|
||||||
|
.ant-modal {
|
||||||
|
.ant-modal-content {
|
||||||
|
width: 479px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<style lang="scss">
|
||||||
|
.ant-modal-body {
|
||||||
|
padding: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
33
src/views/gratefulteacher/ViewInstructor.vue
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<script setup>
|
||||||
|
const props = defineProps({
|
||||||
|
showViewInstructor: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const emit = defineEmits(["update:visible"]);
|
||||||
|
|
||||||
|
const afterVisibleChange = (bool) => {
|
||||||
|
console.log("visible", bool);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="-page">
|
||||||
|
<a-drawer
|
||||||
|
v-model:visible="visible"
|
||||||
|
class="custom-class"
|
||||||
|
style="color: red"
|
||||||
|
title="Basic Drawer"
|
||||||
|
placement="right"
|
||||||
|
@after-visible-change="afterVisibleChange"
|
||||||
|
>
|
||||||
|
<p>Some contents...</p>
|
||||||
|
<p>Some contents...</p>
|
||||||
|
<p>Some contents...</p>
|
||||||
|
</a-drawer>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="scss" scoped></style>
|
||||||
83
src/views/gratefulteacher/ViewReview.vue
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
<script setup >
|
||||||
|
const props = defineProps(['ViewReviewShow'])
|
||||||
|
import { reactive } from 'vue';
|
||||||
|
import InitiateReviewTable from './InitiateReviewTable.vue'
|
||||||
|
const formState = reactive({
|
||||||
|
username: '',
|
||||||
|
password: '',
|
||||||
|
remember: true,
|
||||||
|
});
|
||||||
|
const ViewReviewcolumns = [
|
||||||
|
{
|
||||||
|
title: 'Name',
|
||||||
|
dataIndex: 'name',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Age',
|
||||||
|
dataIndex: 'age',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Address',
|
||||||
|
dataIndex: 'address',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const ViewReviewdata = [
|
||||||
|
{
|
||||||
|
key: '1',
|
||||||
|
name: 'John Brown',
|
||||||
|
age: 32,
|
||||||
|
address: 'New York No. 1 Lake Park',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: '2',
|
||||||
|
name: 'Jim Green',
|
||||||
|
age: 42,
|
||||||
|
address: 'London No. 1 Lake Park',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: '3',
|
||||||
|
name: 'Joe Black',
|
||||||
|
age: 32,
|
||||||
|
address: 'Sidney No. 1 Lake Park',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: '4',
|
||||||
|
name: 'Ben Kang',
|
||||||
|
age: 15,
|
||||||
|
address: 'Sidney No. 1 Lake Park',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="-page">
|
||||||
|
<el-drawer v-model="props.ViewReviewShow" title="查看评审" size="65%">
|
||||||
|
<div style="display: flex;flex-direction: column;">
|
||||||
|
<div style="font-size: 16px;"> 评审名称:<span>第三场二次认证</span></div>
|
||||||
|
<div style="font-size: 16px;margin: 20px 0;"> 评审时间:<span>2024.05.30 14:00</span></div>
|
||||||
|
<div style="font-size: 16px;">评审结果:</div>
|
||||||
|
<div>
|
||||||
|
<a-table
|
||||||
|
|
||||||
|
:row-selection="rowSelection"
|
||||||
|
:pagination="false"
|
||||||
|
:row-class-name="(_record, index) => (index % 2 === 1 ? 'table-striped' : null)"
|
||||||
|
:columns="ViewReviewcolumns"
|
||||||
|
:data-source="ViewReviewdata"
|
||||||
|
class="ant-table-striped"
|
||||||
|
size="middle"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div style="align-self: center;">
|
||||||
|
<div style="border-radius: 8px; color: #fff;font-weight: 900;font-size: 16px; display: flex; justify-content: center;align-items: center; width: 176px; height: 55px; margin-top: 36px;background: #3da8f0;">结束评审并通知结果</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</el-drawer>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
|
||||||
|
|
||||||
|
</style>
|
||||||
740
src/views/gratefulteacher/tablemodel.vue
Normal file
@@ -0,0 +1,740 @@
|
|||||||
|
<template>
|
||||||
|
<div class="CommonStudent">
|
||||||
|
<a-drawer
|
||||||
|
:visible="visiable"
|
||||||
|
class="drawerStyle ProjCheckship"
|
||||||
|
placement="right"
|
||||||
|
width="50%"
|
||||||
|
>
|
||||||
|
<div class="drawerMain" id="ProjCheckship" style="">
|
||||||
|
<div class="header" style="margin-bottom: 10px;">
|
||||||
|
<div class="headerTitle">权限名单</div>
|
||||||
|
<img
|
||||||
|
style="width: 29px; height: 29px; cursor: pointer"
|
||||||
|
src="../../assets/images/basicinfo/close.png"
|
||||||
|
@click="closeDrawer"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="TableStudent">
|
||||||
|
<a-row
|
||||||
|
type="flex"
|
||||||
|
gutter="12"
|
||||||
|
style="padding-left: 20px; margin-right: 0px"
|
||||||
|
>
|
||||||
|
<a-col>
|
||||||
|
<a-form-item title="姓名:">
|
||||||
|
<a-input
|
||||||
|
class="cus-input"
|
||||||
|
v-model:value="searchName"
|
||||||
|
placeholder="请输入姓名"
|
||||||
|
/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col>
|
||||||
|
<a-button
|
||||||
|
class="cus-btn"
|
||||||
|
style="background: #4ea6ff; color: #fff; width: 100px"
|
||||||
|
@click="search"
|
||||||
|
:loading="stuAsyncLoading"
|
||||||
|
>
|
||||||
|
<template #icon
|
||||||
|
><img
|
||||||
|
style="margin-right: 10px"
|
||||||
|
src="../../assets/images/courseManage/search0.png"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
搜索
|
||||||
|
</a-button>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="2">
|
||||||
|
<a-button
|
||||||
|
class="cus-btn"
|
||||||
|
style="width: 100px;background: #4ea6ff;color: #fff;"
|
||||||
|
@click="reset"
|
||||||
|
>
|
||||||
|
<template #icon
|
||||||
|
><img
|
||||||
|
style="margin-right: 10px"
|
||||||
|
src="../../assets/images/leveladd/reset0.png"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
重置
|
||||||
|
</a-button>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
<div style="margin-top: 20px">
|
||||||
|
<a-table
|
||||||
|
:columns="columns"
|
||||||
|
:data-source="datalist"
|
||||||
|
:pagination="stuPagination"
|
||||||
|
:loading="loadings"
|
||||||
|
row-key="id"
|
||||||
|
>
|
||||||
|
<template #action="{ record }">
|
||||||
|
<a-space :size="2">
|
||||||
|
<slot name="extension" v-bind:data="{ record }"></slot>
|
||||||
|
<CommonStudent @finash="handleFinash" v-if="record.permissionType == 2"
|
||||||
|
:type="7" :ref="listDatas" :typeLists="false" :permissionType="0" :examineId="id" :id="record.id" title="归属权"
|
||||||
|
>转移归属权</CommonStudent
|
||||||
|
>
|
||||||
|
<a-button
|
||||||
|
v-else
|
||||||
|
@click="del(record)"
|
||||||
|
type="link"
|
||||||
|
|
||||||
|
>删除</a-button
|
||||||
|
>
|
||||||
|
</a-space>
|
||||||
|
</template>
|
||||||
|
</a-table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="btn_footer">
|
||||||
|
<button class="btn2" @click="closeDrawer" style="cursor: pointer;border: none; margin-right: 15px;height: 38px; width: 100px;background: #4ea6ff; line-height: 38px;text-align: center;border-radius: 8px;color: #ffffff;">取消</button>
|
||||||
|
<button class="btn2" @click="closeDrawer" style=" cursor: pointer;border: none;height: 38px; width: 100px;background: #4ea6ff; line-height: 38px;text-align: center;border-radius: 8px;color: #ffffff;">确定</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-drawer>
|
||||||
|
<a-button @click="openDrawer" type="link"><slot></slot></a-button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 删除弹窗 -->
|
||||||
|
<a-modal
|
||||||
|
v-model:visible="deleteModalVisible"
|
||||||
|
:footer="null"
|
||||||
|
wrapClassName="deleteModal1"
|
||||||
|
centered="true"
|
||||||
|
>
|
||||||
|
<div class="delete">
|
||||||
|
<div class="del_header"></div>
|
||||||
|
<div class="del_main">
|
||||||
|
<div class="header">
|
||||||
|
<div class="icon"></div>
|
||||||
|
<span>提示</span>
|
||||||
|
<div class="close_exit" @click="closeSameModal"></div>
|
||||||
|
</div>
|
||||||
|
<div class="body">
|
||||||
|
<span>确定删除?</span>
|
||||||
|
<!-- <span style="margin-top: 20px">数据删除后不可恢复!</span> -->
|
||||||
|
</div>
|
||||||
|
<div style="width:100%;display:flex;justify-content:center;align-items:center">
|
||||||
|
<div style=" cursor: pointer;border: none;height: 38px; width: 100px;background: #4ea6ff; line-height: 38px;text-align: center;border-radius: 8px;color: #ffffff;" @click="closeSameModal">
|
||||||
|
<div >取消</div>
|
||||||
|
</div>
|
||||||
|
<div style="margin-left: 10px; cursor: pointer;border: none;height: 38px; width: 100px;background: #4ea6ff; line-height: 38px;text-align: center;border-radius: 8px;color: #ffffff;" @click="sureSameModal">
|
||||||
|
<div>确定</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-modal>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import {
|
||||||
|
computed,
|
||||||
|
defineProps,
|
||||||
|
defineExpose,
|
||||||
|
ref,
|
||||||
|
watch,
|
||||||
|
onMounted,
|
||||||
|
} from "vue";
|
||||||
|
import CommonStudent from "./CommonTeacher";
|
||||||
|
import { usePage } from "@/api/request";
|
||||||
|
import { STUDENT_LIST } from "@/api/apis";
|
||||||
|
import { delStudentList } from "@/api/index1";
|
||||||
|
import {useAsyncStu} from "@/utils/useCommon";
|
||||||
|
import {removePermission,transferPermission,deletedPermission} from '@/api/examineApi.js'
|
||||||
|
import { message } from "ant-design-vue";
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
type: Number,
|
||||||
|
id: String,
|
||||||
|
stage: {
|
||||||
|
type: Array,
|
||||||
|
default: () => [],
|
||||||
|
},
|
||||||
|
types: {
|
||||||
|
type: Array,
|
||||||
|
default: () => [],
|
||||||
|
},
|
||||||
|
searchTrue:{
|
||||||
|
type: String,
|
||||||
|
default:false
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const handleFinash = (val) => {
|
||||||
|
console.log(val,'val')
|
||||||
|
if(val){
|
||||||
|
getData()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const listDatas = ref(null)
|
||||||
|
const datalist = ref([])
|
||||||
|
const getData = async ()=>{
|
||||||
|
loadings.value = true
|
||||||
|
await removePermission({
|
||||||
|
"examineId": props.id,
|
||||||
|
pageNo: searchParams.value.pageNo,
|
||||||
|
pageSize: searchParams.value.pageSize,
|
||||||
|
}).then(res=>{
|
||||||
|
console.log(res,'权限列表');
|
||||||
|
datalist.value = res.data.records
|
||||||
|
total.value = res.data.total
|
||||||
|
loadings.value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
onMounted(()=>{
|
||||||
|
getData()
|
||||||
|
})
|
||||||
|
const visiable = ref(false);
|
||||||
|
const total = ref(0)
|
||||||
|
const initParams = {
|
||||||
|
studentName: "",
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
type: props.type || "",
|
||||||
|
types: props.types,
|
||||||
|
pid: props.id || "",
|
||||||
|
};
|
||||||
|
|
||||||
|
const searchParams = ref(initParams);
|
||||||
|
const searchName = ref("");
|
||||||
|
|
||||||
|
const columns = ref([
|
||||||
|
{
|
||||||
|
title: "姓名",
|
||||||
|
dataIndex: "name",
|
||||||
|
key: "name",
|
||||||
|
width: 30,
|
||||||
|
align: "center",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "工号",
|
||||||
|
dataIndex: "userNo",
|
||||||
|
key: "userNo",
|
||||||
|
width: 50,
|
||||||
|
align: "center",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "部门",
|
||||||
|
dataIndex: "departName",
|
||||||
|
key: "departName",
|
||||||
|
width: 80,
|
||||||
|
align: "center",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "权限",
|
||||||
|
dataIndex: "permissionType",
|
||||||
|
key: "permissionType",
|
||||||
|
width: 30,
|
||||||
|
align: "center",
|
||||||
|
customRender: ({ record: { permissionType } }) =>
|
||||||
|
({
|
||||||
|
0: "查看权",
|
||||||
|
1: "管理权",
|
||||||
|
2: "归属权",
|
||||||
|
7: "查看权",
|
||||||
|
8: "管理权",
|
||||||
|
9: "归属权",
|
||||||
|
10: "查看权",
|
||||||
|
11: "管理权",
|
||||||
|
12: "归属权",
|
||||||
|
}[permissionType]),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "操作",
|
||||||
|
dataIndex: "operation",
|
||||||
|
key: "operation",
|
||||||
|
width: 50,
|
||||||
|
align: "center",
|
||||||
|
slots: { customRender: "action" },
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
// const {
|
||||||
|
// data: studentList,
|
||||||
|
// fetch: searchStu,
|
||||||
|
// total,
|
||||||
|
// loading,
|
||||||
|
// } = usePage(STUDENT_LIST, searchParams);
|
||||||
|
// const { loading: stuAsyncLoading } = useAsyncStu(props.id, props.types.join(","), searchStu);
|
||||||
|
|
||||||
|
|
||||||
|
const stuPagination = computed(() => ({
|
||||||
|
total: total.value,
|
||||||
|
showSizeChanger: false,
|
||||||
|
current: searchParams.value.pageNo,
|
||||||
|
pageSize: searchParams.value.pageSize,
|
||||||
|
onChange: changePagination,
|
||||||
|
}));
|
||||||
|
|
||||||
|
const openDrawer = () => {
|
||||||
|
visiable.value = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
const changePagination = (page) => {
|
||||||
|
console.log(page,'page')
|
||||||
|
searchParams.value.pageNo = page;
|
||||||
|
getData()
|
||||||
|
};
|
||||||
|
const loadings = ref(false)
|
||||||
|
const search = async()=>{
|
||||||
|
loadings.value = true
|
||||||
|
searchParams.value.pageNo = 1;
|
||||||
|
await removePermission({
|
||||||
|
"examineId": props.id,
|
||||||
|
"name" : searchName.value,
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10
|
||||||
|
}).then(res => {
|
||||||
|
loadings.value = false
|
||||||
|
datalist.value = res.data.records
|
||||||
|
total.value = res.data.total
|
||||||
|
})
|
||||||
|
}
|
||||||
|
// function search() {
|
||||||
|
// searchParams.value.studentName = searchName.value;
|
||||||
|
// searchParams.value.pageNo = 1;
|
||||||
|
// searchStu()
|
||||||
|
// }
|
||||||
|
|
||||||
|
const deleteModalVisible = ref(false);
|
||||||
|
const deleteId = ref(null);
|
||||||
|
|
||||||
|
const del = (record)=>{
|
||||||
|
deleteModalVisible.value = true;
|
||||||
|
records.value = record;
|
||||||
|
}
|
||||||
|
const records=ref(null)
|
||||||
|
//确定删除
|
||||||
|
const sureSameModal = async () => {
|
||||||
|
deletedPermission({id:records.value.id}).then(res=>{
|
||||||
|
message.success('删除成功')
|
||||||
|
getData()
|
||||||
|
})
|
||||||
|
deleteModalVisible.value = false;
|
||||||
|
};
|
||||||
|
//取消
|
||||||
|
const closeSameModal = () => {
|
||||||
|
deleteModalVisible.value = false;
|
||||||
|
deleteId.value = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
const closeDrawer = () => {
|
||||||
|
visiable.value = false;
|
||||||
|
};
|
||||||
|
const reset = ()=>{
|
||||||
|
getData()
|
||||||
|
searchName.value=''
|
||||||
|
}
|
||||||
|
// function reset() {
|
||||||
|
// searchParams.value = initParams;
|
||||||
|
// searchName.value = "";
|
||||||
|
// searchParams.value.pageNo = 1;
|
||||||
|
// searchStu()
|
||||||
|
// }
|
||||||
|
|
||||||
|
watch(visiable, (val) => {
|
||||||
|
if(val){
|
||||||
|
getData()
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
// searchStu,
|
||||||
|
// loading,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<style lang="scss">
|
||||||
|
.cus-btn {
|
||||||
|
width: 100%;
|
||||||
|
height: 40px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin-right: 16px;
|
||||||
|
border: 1px solid #4ea6ff;
|
||||||
|
border-radius: 8px;
|
||||||
|
background: #4ea6ff;
|
||||||
|
cursor: pointer;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.white {
|
||||||
|
background: #fff;
|
||||||
|
color: #4ea6ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cus-input {
|
||||||
|
height: 40px;
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cus-select {
|
||||||
|
height: 40px;
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CommonStudent {
|
||||||
|
.ant-btn-primary {
|
||||||
|
background-color: #4ea6ff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cus-select {
|
||||||
|
height: 40px;
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tableBox .ant-table-row .ant-table-cell {
|
||||||
|
height: 48px;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #4f5156;
|
||||||
|
line-height: 29px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tableBox .ant-table-thead tr th {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-tabs-tabpane {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-tabs {
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
.right1 {
|
||||||
|
border-left: 1px solid #f2f6fe;
|
||||||
|
margin-left: 20px;
|
||||||
|
|
||||||
|
.onerow {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-right: 40px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
.onleft {
|
||||||
|
display: flex;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
.already {
|
||||||
|
color: rgba(51, 51, 51, 1);
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 500;
|
||||||
|
margin-left: 32px;
|
||||||
|
white-space: nowrap;
|
||||||
|
// margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.count {
|
||||||
|
color: #4ea6ff;
|
||||||
|
font-size: 16px;
|
||||||
|
margin: 0 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.peo {
|
||||||
|
color: rgba(51, 51, 51, 1);
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.clbox {
|
||||||
|
margin-right: 50px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
cursor: pointer;
|
||||||
|
width: 104px;
|
||||||
|
height: 32px;
|
||||||
|
border-radius: 4px;
|
||||||
|
background: #4ea6ff;
|
||||||
|
|
||||||
|
.colose {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
// border-radius: 8px;
|
||||||
|
// background: #ffffff;
|
||||||
|
// position: relative;
|
||||||
|
background-image: url(../../assets/images/basicinfo/ch.png);
|
||||||
|
background-size: 100%;
|
||||||
|
margin-right: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.allclear {
|
||||||
|
color: rgba(255, 255, 255, 1);
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.selecteds {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
margin-left: 32px;
|
||||||
|
|
||||||
|
.person {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 20px;
|
||||||
|
border-top: 1px solid #f2f6fe;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chose {
|
||||||
|
width: 64px;
|
||||||
|
height: 24px;
|
||||||
|
margin-top: 25px;
|
||||||
|
margin-right: 25px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 2px;
|
||||||
|
border: 1px solid rgba(56, 139, 225, 1);
|
||||||
|
color: rgba(56, 139, 225, 1);
|
||||||
|
font-size: 12px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.ch {
|
||||||
|
position: absolute;
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
background-image: url(../../assets/images/basicinfo/ch.png);
|
||||||
|
right: -8px;
|
||||||
|
top: -8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.ifsw {
|
||||||
|
display: flex;
|
||||||
|
align-items: end;
|
||||||
|
justify-content: center;
|
||||||
|
color: #4ea6ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sw {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: justify;
|
||||||
|
color: #4ea6ff;
|
||||||
|
margin-top: 23px;
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dept {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 30px;
|
||||||
|
border-top: 1px solid #f2f6fe;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chose1 {
|
||||||
|
//width: 90px;
|
||||||
|
height: 24px;
|
||||||
|
margin-top: 25px;
|
||||||
|
margin-right: 25px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 2px;
|
||||||
|
border: 1px solid rgba(56, 139, 225, 1);
|
||||||
|
color: rgba(56, 139, 225, 1);
|
||||||
|
font-size: 12px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.span {
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ch1 {
|
||||||
|
position: absolute;
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
background-image: url(../../assets/images/basicinfo/ch.png);
|
||||||
|
right: -8px;
|
||||||
|
top: -8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.group {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 30px;
|
||||||
|
border-top: 1px solid #f2f6fe;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chose2 {
|
||||||
|
//width: 120px;
|
||||||
|
height: 24px;
|
||||||
|
margin-top: 25px;
|
||||||
|
margin-right: 25px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 2px;
|
||||||
|
border: 1px solid rgba(56, 139, 225, 1);
|
||||||
|
color: rgba(56, 139, 225, 1);
|
||||||
|
font-size: 12px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.span {
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ch2 {
|
||||||
|
position: absolute;
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
background-image: url(../../assets/images/basicinfo/ch.png);
|
||||||
|
right: -8px;
|
||||||
|
top: -8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.btn_footer{
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.deleteModal1 {
|
||||||
|
.ant-modal {
|
||||||
|
width: 424px !important;
|
||||||
|
height: 258px !important;
|
||||||
|
|
||||||
|
.ant-modal-content {
|
||||||
|
width: 424px !important;
|
||||||
|
height: 258px !important;
|
||||||
|
|
||||||
|
.ant-modal-body {
|
||||||
|
width: 424px !important;
|
||||||
|
height: 258px !important;
|
||||||
|
padding: 0 !important;
|
||||||
|
|
||||||
|
.delete {
|
||||||
|
z-index: 999;
|
||||||
|
width: 424px;
|
||||||
|
height: 258px;
|
||||||
|
background: #ffffff;
|
||||||
|
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.21);
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
|
// position: absolute;
|
||||||
|
// left: 50%;
|
||||||
|
// top: 10%;
|
||||||
|
// transform: translate(-50%, -50%);
|
||||||
|
.del_header {
|
||||||
|
position: absolute;
|
||||||
|
width: calc(100%);
|
||||||
|
height: 68px;
|
||||||
|
background: linear-gradient(
|
||||||
|
rgba(78, 166, 255, 0.2) 0%,
|
||||||
|
rgba(78, 166, 255, 0) 100%
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
.del_main {
|
||||||
|
width: 100%;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding-top: 20px;
|
||||||
|
padding-left: 26px;
|
||||||
|
font-size: 16px;
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
margin-right: 10px;
|
||||||
|
background-image: url(@/assets/images/taskpage/gan.png);
|
||||||
|
background-size: 100% 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.close_exit {
|
||||||
|
position: absolute;
|
||||||
|
right: 42px;
|
||||||
|
cursor: pointer;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
background-image: url(@/assets/images/coursewareManage/close.png);
|
||||||
|
background-size: 100% 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.body {
|
||||||
|
width: 100%;
|
||||||
|
margin: 34px auto 56px auto;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
flex-direction: column;
|
||||||
|
// background-color: red;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.back {
|
||||||
|
position: absolute;
|
||||||
|
top: 30px;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #666666;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.del_btnbox1 {
|
||||||
|
display: flex;
|
||||||
|
margin: 30px auto;
|
||||||
|
justify-content: center;
|
||||||
|
|
||||||
|
.del_btn2 {
|
||||||
|
width: 100px;
|
||||||
|
height: 40px;
|
||||||
|
background: rgba(64, 158, 255, 0);
|
||||||
|
border-radius: 8px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
|
||||||
|
flex-shrink: 0;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
.btnText {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn11 {
|
||||||
|
border: 1px solid rgba(64, 158, 255, 1);
|
||||||
|
color: #4ea6ff;
|
||||||
|
margin-right: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn21 {
|
||||||
|
background-color: #4ea6ff;
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.ant-modal-close-x {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
958
src/views/gratefulteacher/teaAdd.vue
Normal file
@@ -0,0 +1,958 @@
|
|||||||
|
<!-- eslint-disable vue/no-parsing-error -->
|
||||||
|
<!-- eslint-disable vue/require-v-for-key -->
|
||||||
|
<template>
|
||||||
|
<div class="CommonStudent">
|
||||||
|
<a-drawer :visible="visiable" class="drawerStyle ProjCheckship CommonStudent" placement="right" width="60%">
|
||||||
|
<div class="drawerMain" id="ProjCheckship" style="">
|
||||||
|
<div class="header">
|
||||||
|
<div class="headerTitle">
|
||||||
|
添加讲师
|
||||||
|
</div>
|
||||||
|
<img style="width: 29px; height: 29px; cursor: pointer" src="../../assets/images/basicinfo/close.png"
|
||||||
|
@click="closeDrawer"/>
|
||||||
|
</div>
|
||||||
|
<div style="display: flex; overflow-x: auto; overflow-y: auto">
|
||||||
|
<div class="tabs" style="min-width: 800px">
|
||||||
|
<a-tabs v-model:activeKey="activeKey">
|
||||||
|
<a-tab-pane v-if="infoType" :key="4" tab="项目内学员">
|
||||||
|
<div :style="{ height: screenHeight - 235 + 'px' }">
|
||||||
|
<div>
|
||||||
|
<a-form-item label="姓名:">
|
||||||
|
<a-input v-model:value="projectParams.studentName"
|
||||||
|
style="width: 260px; height: 40px; border-radius: 8px"
|
||||||
|
placeholder="请输入姓名"/>
|
||||||
|
<a-button type="primary" @click="getProjectStu" style="margin-left: 20px; border-radius: 4px">
|
||||||
|
<template #icon>
|
||||||
|
<SearchOutlined/>
|
||||||
|
</template>
|
||||||
|
搜索
|
||||||
|
</a-button>
|
||||||
|
<a-button type="primary" @click="resetProjectStu" style="margin-left: 20px; border-radius: 4px">重置
|
||||||
|
</a-button>
|
||||||
|
</a-form-item>
|
||||||
|
</div>
|
||||||
|
<div class="tableBox tabb">
|
||||||
|
<BaseTable ref="projectStuTableRef" :columns="projectStuColumns" :url="STUDENT_LIST"
|
||||||
|
v-model:params="projectParams" v-model:selectedRows="projectSelectRows"
|
||||||
|
type="checkbox"></BaseTable>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane :key="1" tab="快速选人">
|
||||||
|
<div :style="{ height: screenHeight - 235 + 'px' }">
|
||||||
|
<div class="tab1">
|
||||||
|
<a-form-item label="姓名">
|
||||||
|
<a-input v-model:value="nameSearch.keyword" style="width: 270px; height: 40px; border-radius: 8px"
|
||||||
|
placeholder="请输入姓名"/>
|
||||||
|
<a-button type="primary" @click="onSearchStu" style="margin-left: 20px; border-radius: 4px">
|
||||||
|
<template #icon>
|
||||||
|
<SearchOutlined/>
|
||||||
|
</template>
|
||||||
|
搜索
|
||||||
|
</a-button>
|
||||||
|
<a-button type="primary" @click="resetStu" style="margin-left: 20px; border-radius: 4px">重置
|
||||||
|
</a-button>
|
||||||
|
</a-form-item>
|
||||||
|
</div>
|
||||||
|
<div class="chooseLeft" style="display: grid; grid-template-columns: 250px auto">
|
||||||
|
<div :style="{
|
||||||
|
height: screenHeight - 180 + 'px',
|
||||||
|
overflowY: 'auto',
|
||||||
|
}" style="border: 1px solid #f0f0f0">
|
||||||
|
<div class="tree" style="margin: 10px 4px 220px 10px">
|
||||||
|
<a-tree allow-clear tree-default-expand-all :tree-data="treeData" :loading="orgLoading"
|
||||||
|
:load-data="onLoadData" v-model:selectedKeys="stuTreeSelectKeys"
|
||||||
|
v-model:expandedKeys="stuTreeExpandedKeys" :fieldNames="{
|
||||||
|
children: 'treeChildList',
|
||||||
|
key: 'id',
|
||||||
|
title: 'name',
|
||||||
|
value: 'name',
|
||||||
|
}" @select="stuStuOrgSelect">
|
||||||
|
</a-tree>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="tableBox tabb" style="
|
||||||
|
margin: 0px 4px 120px 10px;
|
||||||
|
border: 1px solid #f0f0f0;
|
||||||
|
">
|
||||||
|
<BaseTable ref="stuTableRef" :columns="stuColumns" :url="USER_LIST_PAGE" pageKey="pageNo"
|
||||||
|
v-model:params="nameSearch" :request="useNewRowsPageNoInit"
|
||||||
|
v-model:selectedRows="stuSelectRows" type="checkbox"></BaseTable>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane v-if="!selectStu&&false" :key="2" tab="添加组织">
|
||||||
|
<div :style="{ height: screenHeight - 235 + 'px' }">
|
||||||
|
<div class="tab2">
|
||||||
|
<a-form-item label="组织:">
|
||||||
|
<a-input v-model:value="searchOrgName.keyword"
|
||||||
|
style="width: 230px; height: 40px; border-radius: 8px" placeholder="请输入组织"
|
||||||
|
@click="orgValue"/>
|
||||||
|
<a-button type="primary" @click="searchOrg" style="margin-left: 20px; border-radius: 4px">
|
||||||
|
<template #icon>
|
||||||
|
<SearchOutlined/>
|
||||||
|
</template>
|
||||||
|
搜索
|
||||||
|
</a-button>
|
||||||
|
<a-button type="primary" @click="resetOrg" style="margin-left: 20px; border-radius: 4px">重置
|
||||||
|
</a-button>
|
||||||
|
</a-form-item>
|
||||||
|
</div>
|
||||||
|
<div class="boeTree">
|
||||||
|
<a-tree v-model:selectedKeys="selectedOrgKeys"
|
||||||
|
:tree-data="searchOrgName.keyword ? orgData : treeOrgData" @select="onOrgSelectChange"
|
||||||
|
:loading="orgOrgLoading" :load-data="onLoadOrgData" :fieldNames="{
|
||||||
|
children: 'treeChildList',
|
||||||
|
key: 'id',
|
||||||
|
title: 'name',
|
||||||
|
value: 'name',
|
||||||
|
}" row-key="id" :row-selection="orgRowSelection" multiple>
|
||||||
|
</a-tree>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane v-if="!selectStu" :key="3" tab="受众关联">
|
||||||
|
<div :style="{ height: screenHeight - 235 + 'px' }">
|
||||||
|
<div>
|
||||||
|
<a-form-item label="受众名称:">
|
||||||
|
<a-input v-model:value="audienceName.keyword"
|
||||||
|
style="width: 260px; height: 40px; border-radius: 8px"
|
||||||
|
placeholder="请输入受众名称"/>
|
||||||
|
<a-button type="primary" @click="searchAudi" style="margin-left: 20px; border-radius: 4px">
|
||||||
|
<template #icon>
|
||||||
|
<SearchOutlined/>
|
||||||
|
</template>
|
||||||
|
搜索
|
||||||
|
</a-button>
|
||||||
|
<a-button type="primary" @click="resetAudienceInfo" style="margin-left: 20px; border-radius: 4px">
|
||||||
|
重置
|
||||||
|
</a-button>
|
||||||
|
</a-form-item>
|
||||||
|
</div>
|
||||||
|
<div class="tableBox tabb">
|
||||||
|
<BaseTable ref="auditTableRef" :columns="audiColums" :url="AUDIENCE_LIST" page-key="pageNo"
|
||||||
|
v-model:params="audienceName" :request="useTotalPage"
|
||||||
|
v-model:selectedRows="auditSelectRows" v-model:selectedRowKeys="auditSelectRowKeys"
|
||||||
|
type="checkbox"></BaseTable>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-tab-pane>
|
||||||
|
</a-tabs>
|
||||||
|
</div>
|
||||||
|
<div class="right1" style="min-width: 200px">
|
||||||
|
<div class="onerow">
|
||||||
|
<div class="onleft">
|
||||||
|
<div class="already">已选</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div :style="{ 'max-height': screenHeight - 235 + 'px' }" style="overflow-y: auto">
|
||||||
|
<div class="selecteds" v-if="infoType">
|
||||||
|
<div class="person">项目内学员</div>
|
||||||
|
<div v-for="(item, i) in projectSelectRows" :key="i">
|
||||||
|
<div v-if="i < 11">
|
||||||
|
<div class="chose">
|
||||||
|
{{ item.studentName }}
|
||||||
|
<div class="ch" @click="auditTableRef.remove(i)"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<div v-if="person">
|
||||||
|
<div class="chose">
|
||||||
|
{{ item.studentName }}
|
||||||
|
<div class="ch" @click="auditTableRef.remove(i)"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="!member && projectSelectRows?.length > 10" class="ifsw">
|
||||||
|
<div @click="member = !member" class="“sw”">查看更多></div>
|
||||||
|
</div>
|
||||||
|
<div v-if="member && projectSelectRows?.length > 10" class="ifsw">
|
||||||
|
<div @click="member = !member" class="sw">收起<</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="selecteds">
|
||||||
|
<div class="person">快速选人</div>
|
||||||
|
<div v-for="(item, i) in stuSelectRows" :key="i">
|
||||||
|
<div v-if="i < 11">
|
||||||
|
<div class="chose">
|
||||||
|
{{ item.realName }}
|
||||||
|
<div class="ch" @click="stuTableRef.remove(i)"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<div v-if="person">
|
||||||
|
<div class="chose">
|
||||||
|
{{ item.realName }}
|
||||||
|
<div class="ch" @click="stuTableRef.remove(i)"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="!person && stuSelectRows.length > 10" class="ifsw">
|
||||||
|
<div @click="person = !person" class="“sw”">查看更多></div>
|
||||||
|
</div>
|
||||||
|
<div v-if="person && stuSelectRows.length > 10" class="ifsw">
|
||||||
|
<div @click="person = !person" class="sw">收起<</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="!selectStu&&false" class="selecteds">
|
||||||
|
<div class="dept">添加组织</div>
|
||||||
|
<div v-for="(item, i) in deptList" :key="i">
|
||||||
|
<div v-if="i < 11">
|
||||||
|
<div class="chose1">
|
||||||
|
<div class="span">{{ item.name }}</div>
|
||||||
|
<div class="ch1" @click="orgDel(i)" style="cursor: pointer;"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<div v-if="dept">
|
||||||
|
<div class="chose1">
|
||||||
|
<div class="span">{{ item.name }}</div>
|
||||||
|
<div class="ch1" @click="orgDel(i)"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="!dept && deptList.length > 10" class="ifsw">
|
||||||
|
<div @click="dept = !dept" class="“sw”">查看更多></div>
|
||||||
|
</div>
|
||||||
|
<div v-if="dept && deptList.length > 10" class="ifsw">
|
||||||
|
<div @click="dept = !dept" class="sw">收起<</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!--受众-->
|
||||||
|
<div v-if="!selectStu" class="selecteds">
|
||||||
|
<div class="group">受众关联</div>
|
||||||
|
<div v-for="(item, i) in auditSelectRows" :key="i">
|
||||||
|
<div v-if="i < 11">
|
||||||
|
<div class="chose2">
|
||||||
|
<div class="span">{{ item.audienceName }}</div>
|
||||||
|
<div class="ch2" @click="auditTableRef.remove(i)"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<div v-if="group">
|
||||||
|
<div class="chose2">
|
||||||
|
<div class="span">{{ item.audienceName }}</div>
|
||||||
|
<div class="ch2" @click="auditTableRef.remove(i)"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div v-if="!group && auditSelectRows.length > 10" class="ifsw">
|
||||||
|
<div @click="group = !group" class="“sw”">查看更多></div>
|
||||||
|
</div>
|
||||||
|
<div v-if="group && auditSelectRows.length > 10" class="ifsw">
|
||||||
|
<div @click="group = !group" class="sw">收起<</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div style="display: flex;justify-content: center;" class="btnn" >
|
||||||
|
<button class="btn2" style="width: 100px; height:38px;background:
|
||||||
|
#4ea6ff;border: none;margin-right: 15px; border-radius: 8px;color:aliceblue" @click="closeDrawer">取消</button>
|
||||||
|
<button class="btn2" style="width: 100px;
|
||||||
|
height:38px;background: #4ea6ff;border: none; border-radius: 8px ;color:aliceblue" @click="submitAuth">确定</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-drawer>
|
||||||
|
<a-button @click="openDrawer" type="link">
|
||||||
|
<slot></slot>
|
||||||
|
</a-button>
|
||||||
|
</div>
|
||||||
|
<a-modal :style="{ padding: 0, position:'relative', right: '-20%' }" :closable="true" :visible="stageVisible"
|
||||||
|
:footer="null" centered="true" @ok="handleStageOk" wrapClassName="changeModal">
|
||||||
|
<div class="con">
|
||||||
|
<div class="header">
|
||||||
|
<div class="inhe">
|
||||||
|
<div class="tz">{{ type === 1 ? "选择阶段" : "添加学员到关卡" }}</div>
|
||||||
|
<div class="mg" @click="closeChangeModal"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mid">
|
||||||
|
<div class="inher">
|
||||||
|
<div class="select">
|
||||||
|
<a-select style="width: 400px" :placeholder="type === 1 ? '选择阶段' : '选择关卡'" v-model:value="stageId"
|
||||||
|
className="cus-select">
|
||||||
|
<a-select-option v-for="(item, i) in stageIds" :key="i" :value="item.id">{{ item.name || "默认" }}
|
||||||
|
</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</div>
|
||||||
|
<span style="color: #999999; margin-left: 10px"><minus-circle-outlined/>已在其他关卡的学员,不会被添加到该关卡</span>
|
||||||
|
<div class="btn" style="margin-top: 50px">
|
||||||
|
<button class="sameb btn1" @click="closeChangeModal" style="cursor: pointer">
|
||||||
|
取消
|
||||||
|
</button>
|
||||||
|
<button class="sameb btn2" @click="handleDialogOk" style="cursor: pointer">
|
||||||
|
确定
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-modal>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import {message} from "ant-design-vue";
|
||||||
|
import {computed, defineEmits, defineProps, ref, watch,onMounted} from "vue";
|
||||||
|
import {useNewRowsPageNoInit, request, useRequest, useTotalPage} from "@/api/request";
|
||||||
|
import {
|
||||||
|
saveStu,
|
||||||
|
} from "@/api/index1";
|
||||||
|
import dialog from "@/utils/dialog";
|
||||||
|
import BaseTable from "@/components/common/BaseTable";
|
||||||
|
import {AUDIENCE_LIST, ORG_CHILD_LIST, ORG_LIST, STUDENT_LIST, USER_LIST_PAGE} from "@/api/apis";
|
||||||
|
import {addTutor,getOnlineLearningList}from '@/api/examineApi.js'
|
||||||
|
import {boeRequest} from "@/api/request";
|
||||||
|
const emit = defineEmits({});
|
||||||
|
const props = defineProps({
|
||||||
|
|
||||||
|
type: Number,
|
||||||
|
infoType: Number,
|
||||||
|
infoId: Number,
|
||||||
|
id: String,
|
||||||
|
|
||||||
|
title: {
|
||||||
|
type: String,
|
||||||
|
default: "",
|
||||||
|
},
|
||||||
|
clear: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
selectStu: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
selectOne: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
stage: {
|
||||||
|
type: Array,
|
||||||
|
default: () => [],
|
||||||
|
},
|
||||||
|
isGroup: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
projectId: {
|
||||||
|
type: Number,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
groupId: {
|
||||||
|
type: Number,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
groupName: {
|
||||||
|
type: String,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
groupMemberCount: {
|
||||||
|
type: Number,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
groupMemberNumber: {
|
||||||
|
type: Number,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
activeKey1: {
|
||||||
|
type: String,
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
onMounted(()=>{
|
||||||
|
onlineLearningList()
|
||||||
|
})
|
||||||
|
const courseList = ref([])
|
||||||
|
const onlineLearningList = () =>{
|
||||||
|
boeRequest('/activityApi/examine/getOnlineLearningList post').then(res=>{
|
||||||
|
courseList.value = res.data.filter(item=>item.status == 0).map(item => item.courseId)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const projectSelectKeys = ref([]);
|
||||||
|
const projectSelectRows = ref([]);
|
||||||
|
const stuSelectRows = ref([]);
|
||||||
|
const auditSelectRows = ref([]);
|
||||||
|
const auditSelectRowKeys = ref([]);
|
||||||
|
const deptList = ref([]);
|
||||||
|
const member = ref(false);
|
||||||
|
const dept = ref(false);
|
||||||
|
const projectStuTableRef = ref();
|
||||||
|
const stuTableRef = ref();
|
||||||
|
const projectParams = ref({ pid: props.infoId, type: props.infoType, studentName: "" });
|
||||||
|
|
||||||
|
const getProjectStu = () => projectStuTableRef.value.fetch();
|
||||||
|
const resetProjectStu = () => {
|
||||||
|
projectParams.value.studentName = "";
|
||||||
|
projectStuTableRef.value.reset();
|
||||||
|
};
|
||||||
|
const teaunm = ref([])
|
||||||
|
watch(stuSelectRows,(val)=>{
|
||||||
|
console.log(val,'val')
|
||||||
|
if(val.length == 0){
|
||||||
|
teaunm.value = []
|
||||||
|
return
|
||||||
|
}
|
||||||
|
teaunm.value = val.map((res,index)=>{
|
||||||
|
return {
|
||||||
|
teacherName:res.realName,
|
||||||
|
teacherNo:res.userNo
|
||||||
|
}
|
||||||
|
})
|
||||||
|
console.log(teaunm.value);
|
||||||
|
},{deep:true})
|
||||||
|
const person = ref(false);
|
||||||
|
const group = ref(false);
|
||||||
|
const visiable = ref(false);
|
||||||
|
const activeKey = ref(props.infoType ? 4 : 1);
|
||||||
|
const stageVisible = ref(false);
|
||||||
|
const stageId = ref();
|
||||||
|
|
||||||
|
const nameSearch = ref({
|
||||||
|
keyword: "",
|
||||||
|
departId: '',
|
||||||
|
});
|
||||||
|
const stuTreeSelectKeys = ref([]);
|
||||||
|
const stuTreeExpandedKeys = ref([]);
|
||||||
|
const audienceName = ref({
|
||||||
|
keyword: "",
|
||||||
|
});
|
||||||
|
const searchOrgName = ref({
|
||||||
|
keyword: "",
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
});
|
||||||
|
const stageIds = computed(() => props.stage);
|
||||||
|
|
||||||
|
const { data: orgData, fetchData: searchOrg } = useRequest(
|
||||||
|
ORG_LIST,
|
||||||
|
searchOrgName.value,
|
||||||
|
);
|
||||||
|
const { data: treeData, loading: orgLoading } = useRequest(
|
||||||
|
ORG_LIST,
|
||||||
|
{ keyword: "" },
|
||||||
|
);
|
||||||
|
const { data: treeOrgData, loading: orgOrgLoading } = useRequest(
|
||||||
|
ORG_LIST,
|
||||||
|
{ keyword: "" },
|
||||||
|
);
|
||||||
|
|
||||||
|
const projectStuColumns = ref([
|
||||||
|
{
|
||||||
|
title: "姓名",
|
||||||
|
dataIndex: "studentName",
|
||||||
|
key: "studentName",
|
||||||
|
width: 80,
|
||||||
|
align: "center",
|
||||||
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "工号",
|
||||||
|
dataIndex: "studentUserNo",
|
||||||
|
key: "studentUserNo",
|
||||||
|
width: 80,
|
||||||
|
align: "center",
|
||||||
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "归属组织",
|
||||||
|
dataIndex: "studentOrgName",
|
||||||
|
key: "studentOrgName",
|
||||||
|
width: 80,
|
||||||
|
align: "center",
|
||||||
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "部门",
|
||||||
|
dataIndex: "studentDepartName",
|
||||||
|
key: "studentDepartName",
|
||||||
|
width: 80,
|
||||||
|
align: "center",
|
||||||
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
const stuColumns = ref([
|
||||||
|
{
|
||||||
|
title: "姓名",
|
||||||
|
dataIndex: "realName",
|
||||||
|
key: "realName",
|
||||||
|
width: 80,
|
||||||
|
align: "center",
|
||||||
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "工号",
|
||||||
|
dataIndex: "userNo",
|
||||||
|
key: "userNo",
|
||||||
|
width: 80,
|
||||||
|
align: "center",
|
||||||
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "归属组织",
|
||||||
|
dataIndex: "orgName",
|
||||||
|
key: "orgName",
|
||||||
|
width: 80,
|
||||||
|
align: "center",
|
||||||
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "部门",
|
||||||
|
dataIndex: "departName",
|
||||||
|
key: "departName",
|
||||||
|
width: 80,
|
||||||
|
align: "center",
|
||||||
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
const audiColums = ref([
|
||||||
|
{
|
||||||
|
title: "受众名称",
|
||||||
|
dataIndex: "audienceName",
|
||||||
|
key: "audienceName",
|
||||||
|
width: 30,
|
||||||
|
align: "left",
|
||||||
|
className: "h",
|
||||||
|
ellipsis: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "人数",
|
||||||
|
dataIndex: "totalMember",
|
||||||
|
key: "totalMember",
|
||||||
|
width: 30,
|
||||||
|
align: "center",
|
||||||
|
className: "h",
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
const orgSelectKeys = ref([]);
|
||||||
|
const auditTableRef = ref();
|
||||||
|
const screenHeight = ref(document.body.clientHeight);
|
||||||
|
|
||||||
|
const orgRowSelection = computed(() => ({
|
||||||
|
columnWidth: 20,
|
||||||
|
selectedRowKeys: orgSelectKeys.value,
|
||||||
|
onChange: onOrgSelectChange,
|
||||||
|
preserveSelectedRowKeys: true,
|
||||||
|
}));
|
||||||
|
|
||||||
|
const closeDrawer = () => {
|
||||||
|
deleteDepSelect();
|
||||||
|
visiable.value = false;
|
||||||
|
nameSearch.value.keyword = "";
|
||||||
|
selectedOrgKeys.value = [];
|
||||||
|
};
|
||||||
|
|
||||||
|
function searchAudi() {
|
||||||
|
auditTableRef.value.reset(audienceName.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onLoadData(treeNode) {
|
||||||
|
return request(ORG_CHILD_LIST, { keyword: "", orgId: treeNode.id }).then(
|
||||||
|
(r) => {
|
||||||
|
treeNode.dataRef.treeChildList = r.data;
|
||||||
|
treeData.value = [...treeData.value];
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onLoadOrgData(treeNode) {
|
||||||
|
return request(ORG_CHILD_LIST, { keyword: "", orgId: treeNode.id }).then(
|
||||||
|
(r) => {
|
||||||
|
treeNode.dataRef.treeChildList = r.data;
|
||||||
|
treeOrgData.value = [...treeOrgData.value];
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const closeChangeModal = () => {
|
||||||
|
stageVisible.value = false;
|
||||||
|
};
|
||||||
|
const openDrawer = () => {
|
||||||
|
visiable.value = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
function onSearchStu() {
|
||||||
|
stuTableRef.value.reset(nameSearch.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function stuStuOrgSelect(e) {
|
||||||
|
nameSearch.value.departId = e.join("");
|
||||||
|
stuTableRef.value.fetch();
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectedOrgKeys = ref([]);
|
||||||
|
|
||||||
|
watch(selectedOrgKeys, () => {
|
||||||
|
console.log("selectedKeys", selectedOrgKeys);
|
||||||
|
});
|
||||||
|
|
||||||
|
function orgDel(i) {
|
||||||
|
orgSelectKeys.value = orgSelectKeys.value.filter(e => e !== deptList.value[i].id);
|
||||||
|
selectedOrgKeys.value.splice(i, 1);
|
||||||
|
deptList.value.splice(i, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onOrgSelectChange(e, l) {
|
||||||
|
orgRowSelection.value = e;
|
||||||
|
deptList.value = l.selectedNodes;
|
||||||
|
}
|
||||||
|
|
||||||
|
const resetStu = () => {
|
||||||
|
nameSearch.value.keyword = "";
|
||||||
|
stuTableRef.value.reset({ keyword: "", departId: '' });
|
||||||
|
};
|
||||||
|
//清空选择部门信息
|
||||||
|
const deleteDepSelect = () => {
|
||||||
|
stuSelectRows.value = [];
|
||||||
|
selectedOrgKeys.value = [];
|
||||||
|
projectSelectKeys.value = [];
|
||||||
|
};
|
||||||
|
//重置组织
|
||||||
|
const resetOrg = () => {
|
||||||
|
searchOrgName.value = { keyword: "" };
|
||||||
|
};
|
||||||
|
//重置受众
|
||||||
|
const resetAudienceInfo = () => {
|
||||||
|
audienceName.value.keyword = "";
|
||||||
|
auditTableRef.value.reset({ keyword: "" });
|
||||||
|
};
|
||||||
|
|
||||||
|
//确定添加授权
|
||||||
|
const submitAuth = () => {
|
||||||
|
if (props.type === 2) {
|
||||||
|
stageVisible.value = true;
|
||||||
|
} else {
|
||||||
|
handleDialogOk();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function handleDialogOk() {
|
||||||
|
if (auditSelectRowKeys.value.length || deptList.value.length) {
|
||||||
|
dialog({ content: "您选择了组织或受众,此添加为异步添加,请稍后手动刷新学员!", ok: handleStageOk });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
handleStageOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
import { useRoute, useRouter } from 'vue-router'
|
||||||
|
|
||||||
|
const route = useRoute()
|
||||||
|
|
||||||
|
function handleStageOk() {
|
||||||
|
if (props.type === 1 && props.groupId && (props.groupMemberCount < (props.groupMemberNumber * 1 + projectSelectRows.value.length + stuSelectRows.value.length))) {
|
||||||
|
return message.warning("添加小组学员超过最大值");
|
||||||
|
}
|
||||||
|
stageVisible.value = false;
|
||||||
|
visiable.value = false;
|
||||||
|
emit("finash", false);
|
||||||
|
nameSearch.value.keyword = "";
|
||||||
|
if(stuSelectRows.value.length!=0||selectedOrgKeys.value.length!=0||auditSelectRows.value.length!=0){
|
||||||
|
addTutor({
|
||||||
|
examineId:route.query.id.toString(),
|
||||||
|
teachers: teaunm.value,
|
||||||
|
deptIds: deptList.value?.map((e) => e.id),
|
||||||
|
groupIds: auditSelectRows.value?.map((e) => e.id),
|
||||||
|
departIds: selectedOrgKeys.value,
|
||||||
|
}).then(() => {
|
||||||
|
deleteDepSelect();
|
||||||
|
emit("finash", true);
|
||||||
|
message.info('添加成功');
|
||||||
|
|
||||||
|
});
|
||||||
|
console.log(courseList.value,'value')
|
||||||
|
if(courseList.value.length!=0){
|
||||||
|
courseList.value.map(item=>{
|
||||||
|
saveStu({
|
||||||
|
targetId: item,
|
||||||
|
type: props.type,
|
||||||
|
clear: props.clear,
|
||||||
|
deptIds: deptList.value?.map((e) => e.id),
|
||||||
|
stageId: stageId.value,
|
||||||
|
groupIds: auditSelectRows.value?.map((e) => e.id),
|
||||||
|
studentList: stuSelectRows.value,
|
||||||
|
projectList: projectSelectRows.value,
|
||||||
|
groupName: props.groupName,
|
||||||
|
groupId: props.groupId,
|
||||||
|
}).then(() => {
|
||||||
|
deleteDepSelect();
|
||||||
|
// emit("finash", true);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 搜索受众值发生变化
|
||||||
|
function orgValue(value) {
|
||||||
|
console.log("", value.target.value);
|
||||||
|
searchOrgName.value.keyword = value.target.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(visiable, () => {
|
||||||
|
orgSelectKeys.value = [];
|
||||||
|
deptList.value = [];
|
||||||
|
audienceName.value.keyword = "";
|
||||||
|
nameSearch.value.departId = '';
|
||||||
|
stuTreeExpandedKeys.value = [];
|
||||||
|
stuTreeSelectKeys.value = [];
|
||||||
|
activeKey.value = props.isGroup ? 4 : 1;
|
||||||
|
|
||||||
|
projectParams.value.studentName = "";
|
||||||
|
nameSearch.value.keyword = "";
|
||||||
|
searchOrgName.value.keyword = "";
|
||||||
|
audienceName.value.keyword = "";
|
||||||
|
|
||||||
|
if (!visiable.value) {
|
||||||
|
auditTableRef.value && auditTableRef.value.clear();
|
||||||
|
auditTableRef.value && auditTableRef.value.reset({ keyword: "" });
|
||||||
|
stuTableRef.value && stuTableRef.value.clear();
|
||||||
|
stuTableRef.value && stuTableRef.value.reset({ keyword: "", departId: '' });
|
||||||
|
projectStuTableRef.value && projectStuTableRef.value.clear();
|
||||||
|
projectStuTableRef.value && projectStuTableRef.value.reset({ pid: props.infoId, type: props.infoType, studentName: "" });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<style lang="scss">
|
||||||
|
.CommonStudent > .ant-drawer-content-wrapper {
|
||||||
|
min-width: 1200px !important;
|
||||||
|
width: 1200px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.CommonStudent {
|
||||||
|
.ant-btn-primary {
|
||||||
|
background-color: #4ea6ff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cus-select {
|
||||||
|
height: 40px;
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tableBox .ant-table-row .ant-table-cell {
|
||||||
|
height: 48px;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 400;
|
||||||
|
color: #4f5156;
|
||||||
|
line-height: 29px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tableBox .ant-table-thead tr th {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-tabs-tabpane {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-tabs {
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
.right1 {
|
||||||
|
border-left: 1px solid #f2f6fe;
|
||||||
|
margin-left: 20px;
|
||||||
|
|
||||||
|
.onerow {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-right: 40px;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
.onleft {
|
||||||
|
display: flex;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
.already {
|
||||||
|
color: rgba(51, 51, 51, 1);
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 500;
|
||||||
|
margin-left: 32px;
|
||||||
|
white-space: nowrap;
|
||||||
|
// margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.count {
|
||||||
|
color: #4ea6ff;
|
||||||
|
font-size: 16px;
|
||||||
|
margin: 0 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.peo {
|
||||||
|
color: rgba(51, 51, 51, 1);
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.clbox {
|
||||||
|
margin-right: 50px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
cursor: pointer;
|
||||||
|
width: 104px;
|
||||||
|
height: 32px;
|
||||||
|
border-radius: 4px;
|
||||||
|
background: #4ea6ff;
|
||||||
|
|
||||||
|
.colose {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
// border-radius: 8px;
|
||||||
|
// background: #ffffff;
|
||||||
|
// position: relative;
|
||||||
|
background-image: url(../../assets/images/basicinfo/ch.png);
|
||||||
|
background-size: 100%;
|
||||||
|
margin-right: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.allclear {
|
||||||
|
color: rgba(255, 255, 255, 1);
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.selecteds {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
margin-left: 32px;
|
||||||
|
|
||||||
|
.person {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 20px;
|
||||||
|
border-top: 1px solid #f2f6fe;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chose {
|
||||||
|
width: 64px;
|
||||||
|
height: 24px;
|
||||||
|
margin-top: 25px;
|
||||||
|
margin-right: 25px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 2px;
|
||||||
|
border: 1px solid rgba(56, 139, 225, 1);
|
||||||
|
color: rgba(56, 139, 225, 1);
|
||||||
|
font-size: 12px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.ch {
|
||||||
|
position: absolute;
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
background-image: url(../../assets/images/basicinfo/ch.png);
|
||||||
|
right: -8px;
|
||||||
|
top: -8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.ifsw {
|
||||||
|
display: flex;
|
||||||
|
align-items: end;
|
||||||
|
justify-content: center;
|
||||||
|
color: #4ea6ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sw {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
text-align: justify;
|
||||||
|
color: #4ea6ff;
|
||||||
|
margin-top: 23px;
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dept {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 30px;
|
||||||
|
border-top: 1px solid #f2f6fe;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chose1 {
|
||||||
|
//width: 90px;
|
||||||
|
height: 24px;
|
||||||
|
margin-top: 25px;
|
||||||
|
margin-right: 25px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 2px;
|
||||||
|
border: 1px solid rgba(56, 139, 225, 1);
|
||||||
|
color: rgba(56, 139, 225, 1);
|
||||||
|
font-size: 12px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.span {
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ch1 {
|
||||||
|
position: absolute;
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
background-image: url(../../assets/images/basicinfo/ch.png);
|
||||||
|
right: -8px;
|
||||||
|
top: -8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.group {
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 30px;
|
||||||
|
border-top: 1px solid #f2f6fe;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chose2 {
|
||||||
|
//width: 120px;
|
||||||
|
height: 24px;
|
||||||
|
margin-top: 25px;
|
||||||
|
margin-right: 25px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 2px;
|
||||||
|
border: 1px solid rgba(56, 139, 225, 1);
|
||||||
|
color: rgba(56, 139, 225, 1);
|
||||||
|
font-size: 12px;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.span {
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ch2 {
|
||||||
|
position: absolute;
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
background-image: url(../../assets/images/basicinfo/ch.png);
|
||||||
|
right: -8px;
|
||||||
|
top: -8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||