Files
fe-manage/src/views/growthpath/PathManage.vue
Pengxiansen 495dd852e2 提交
2025-02-26 11:41:06 +08:00

2267 lines
65 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div class="path-manage">
<a-spin :spinning="spinning">
<div class="addhead">
<div class="imgfor">
<div class="fort" style="color: #333333; font-size: 16px">
{{
`${basicData?.stdPositionName || ""}${
basicData?.qualsLevelDesr || ""
}`
}}
</div>
<div class="fort">创建时间{{ basicData?.createTime }}</div>
</div>
<div class="right">
<template v-if="basicData.isPublished && checkMenu('growthRevoke')">
<div class="pubIcon" @click="resize()">
<img class="img2" src="../../assets/images/leveladd/pub.png" />
<!-- 已发布的显示 -->
<div
class="pub"
style="width: 28px"
:style="{
color: '#ffb64e',
}"
>
撤回
</div>
</div>
<div class="line"></div>
</template>
<template v-if="!basicData.isPublished && checkMenu('growthRelease')">
<div class="pubIcon" @click="releaseLearnPath()">
<img class="img2" src="../../assets/images/growthpath/push.png" />
<!-- 已发布的显示 -->
<div
class="pub"
style="width: 28px"
:style="{
color: '#31AF0D',
}"
>
发布
</div>
</div>
<div class="line"></div>
</template>
<div style="display: flex" @click="goBack">
<img class="img2" src="../../assets/images/leveladd/back.png" />
<div class="return">返回</div>
</div>
</div>
</div>
<div class="split"></div>
<div class="bom clearfix">
<a-tabs
class="tab"
v-model:activeKey="activeKey"
size="large"
@change="changeTabs"
:tabBarStyle="{ marginLeft: '26px' }"
>
<a-tab-pane key="1" tab="概览" style="position: relative">
<!-- 概览无数据 -->
<div v-if="!basicData.publishedTaskNum" style="display: flex">
<div class="secondadd" v-if="checkMenu('growthTaskAdd')">
<div style="width: 368px; height: 22px" class="addtaskmain">
快速创建专业力必修任务详情
</div>
<div class="addtask_main">
<img
class="btn"
@click="totasks"
src="../../assets/images/growthpath/add.png"
alt=""
/>
<img
@click="activeKey = '3'"
class="btn"
src="../../assets/images/growthpath/addStudent.png"
alt=""
/>
</div>
</div>
<div v-else style="width: 100%; margin-top: 30px">
<a-empty />
</div>
</div>
<!-- 概览有数据 -->
<div v-else>
<div class="onerow" style="margin-top: 26px">
<div class="taskmain">任务概览</div>
</div>
<div class="second">
<div class="nubbox">
<div class="nub1">{{ overviewData?.studentNum || 0 }}</div>
<div class="nub2">总人数</div>
</div>
<div class="nubbox">
<div class="nub1" style="color: #ff90ae">
{{ overviewData?.learnNum || 0 }}
</div>
<div class="nub2">未完成人数</div>
</div>
<div class="nubbox">
<div class="nub1" style="color: #409eff">
{{ overviewData?.completedNum || 0 }}
</div>
<div class="nub2">完成人数</div>
</div>
<div class="nubbox">
<div class="nub1" style="color: #564aff">
{{ ((overviewData?.completedRate || 0) * 100).toFixed(2) }}%
</div>
<div class="nub2">总完成率</div>
</div>
</div>
<div class="onerow">
<div class="taskmain">任务信息</div>
</div>
<div class="stagelast">
<!-- 圆形统计 -->
<div class="stagepro" v-for="item of overviewData2">
<template v-if="TASK_TYPE[item.taskType]">
<a-progress
type="dashboard"
gapDegree="0"
:percent="fixDoublePer(item.completedRate || 0)"
:width="140"
/>
<div class="protext">
{{ TASK_TYPE[item.taskType].name }}课程完成率
</div>
</template>
</div>
</div>
<div class="onerow">
<div class="taskmain">完成率统计</div>
</div>
<!-- 条形统计 -->
<div class="proright">
<div class="proright1">
<div class="textpro">
任务总完成率
<!-- <span style="margin-left: 16px; color: #409eff">{{
overviewData3?.totalTaskCompletionNum
}}</span> -->
</div>
<div style="margin-top: 12px; display: flex">
<a-progress
:showInfo="true"
:percent="
fixDoublePer(
overviewData3?.totalTaskCompletionRate || 0
)
"
style="width: 369px"
/>
</div>
</div>
<div class="proright1">
<div class="textpro">
必修任务完成率
<!-- <span style="margin-left: 16px; color: #409eff">{{
overviewData3?.compulsoryTaskCompletionNum
}}</span> -->
</div>
<div style="margin-top: 12px; display: flex">
<a-progress
:showInfo="true"
:percent="
fixDoublePer(
overviewData3?.compulsoryTaskCompletionRate || 0
)
"
style="width: 369px"
/>
</div>
</div>
<div class="proright1">
<div class="textpro">
选修任务完成率
<!-- <span style="margin-left: 16px; color: #409eff">{{
overviewData3?.electiveTaskCompletionNum
}}</span> -->
</div>
<div style="margin-top: 12px; display: flex">
<a-progress
:showInfo="true"
:percent="
fixDoublePer(
overviewData3?.electiveTaskCompletionRate || 0
)
"
style="width: 369px"
/>
</div>
</div>
</div>
</div>
<!-- 概览有数据 -->
</a-tab-pane>
<a-tab-pane key="2" tab="任务管理" style="position: relative">
<!-- 路径管理 -->
<div style="flex: 1">
<div class="onerow" style="margin: 0 0 0 26px">
<div style="display: flex; justify-content: center">
<div class="taskmain">任务大纲</div>
</div>
<router-link
:to="{
path: '/editingtasks',
query: {
growId: routerId,
pre: preId,
name: basicData?.name,
},
}"
class="editright"
v-if="checkMenu('growthTaskEdit') && listTaskData.length"
>
<span class="editextb">编辑任务</span>
</router-link>
</div>
<div class="tabs">
<a-radio-group
button-style="solid"
v-model:value="courseType"
@change="tabsChange"
>
<a-radio-button value="1">必修</a-radio-button>
<a-radio-button value="2">选修</a-radio-button>
</a-radio-group>
<template v-if="checkMenu('growthSetLearningOrder')">
<div class="switch">
<a-switch
@change="sortSwitchChange"
v-model:checked="sortSwitch"
/>
<div style="margin-left: 5px">是否按顺序学习</div>
</div>
</template>
</div>
<!-- 无数据显示快速创建 -->
<div v-if="!listTaskData.length" style="margin-top: 20px">
<!-- <router-link
v-if="checkGrowthPer(preId)"
:to="{
path: '/editingtasks',
query: { growId: routerId, pre: preId },
}"
> -->
<div
@click="addTask('/editingtasks')"
class="taskbox"
v-if="checkMenu('growthTaskEdit')"
style="background: linear-gradient(180deg, #fef3dd, #fffaf0)"
>
<div class="leftt">
<img src="../../assets/images/taskpage/left1.png" />
</div>
<div class="photo">
<img src="../../assets/images/taskpage/picture1.png" />
</div>
<div class="rightt">
<img src="../../assets/images/taskpage/right1.png" />
</div>
<div class="centerbox" style="color: rgba(255, 182, 78, 1)">
添加任务
</div>
<div class="centermain">快速创建专业力必修任务</div>
</div>
<!-- </router-link> -->
<div v-else style="width: 100%; margin-top: 30px">
<a-empty />
</div>
</div>
<!-- 无数据显示快速创建 -->
<!-- 有数据-->
<div class="taskSyllabus">
<Draggable
v-model="listTaskData"
chosenClass="chosen"
ghostClass="ghost"
forceFallback="true"
group="task"
animation="500"
@change="draggableOnEnd"
>
<template #item="{ element, index }">
<div class="course">
<div
style="
text-align: center;
margin-left: 46px;
position: relative;
"
>
<div class="racona">
<a-tooltip>
<template #title>可拖动排序</template>
<img
style="width: 17px; height: 14px"
src="../../assets/images/leveladd/z1.png"
/>
</a-tooltip>
<img
style="width: 31px; height: 28px; margin: 0 12px"
:src="TASK_TYPE[element.taskType]?.img"
/>
<div style="margin-top: 2px; margin-left: 8px">
{{ TASK_TYPE[element.taskType]?.name || "" }}
</div>
</div>
</div>
<div class="first">
<div class="icontext" :title="element.taskName">
{{ element.taskName }}
</div>
</div>
<div class="progress">
<div class="progresstext">
{{ element.completeNum || 0 }}/{{
element.totalNum || 0
}}
</div>
<div style="display: flex">
<a-progress
:showInfo="false"
:percent="parseInt(element.progress * 100) || 0"
strokeColor="#FFC067"
trailColor="rgba(253, 209, 98, 0.2)"
/>
<span class="progresstext" style="margin-left: 10px"
>{{ parseInt(element.progress * 100) || 0 }}%</span
>
</div>
</div>
<div
class="first"
v-if="checkMenu('growthPreviousLevelTask')"
>
<template v-if="element.superiorTaskName">
<div style="margin-right: 8px">
{{ element.superiorTaskName }}
</div>
<a-tooltip>
<template #title> 解绑锁定的上级任务</template>
<CloseCircleOutlined
@click="selectSuperiorTask(element)"
/>
</a-tooltip>
</template>
<template v-else>
<div @click="handlerSuperiors(element)">
<a-button type="link">
选择需解锁的上级任务
</a-button>
</div>
</template>
</div>
<div
class="operations"
v-if="
checkMenu('growthEvaluateQRCode') ||
checkMenu('growthSignQRCode') ||
checkMenu('growthFaceTeaching') ||
checkMenu('growthFaceStudent') ||
checkMenu('growthQRCode') ||
checkMenu('growthTaskManage')
"
>
<template
v-if="
element.assessmentIds.length > 1 &&
element.taskType == 2
"
>
<div
class="operations_dropdown"
v-if="checkMenu('growthEvaluateQRCode')"
>
<a-dropdown
:getPopupContainer="
(triggerNode) => triggerNode.parentNode
"
:trigger="['click']"
v-model:visible="visibleEwmpg[element.id]"
>
<a
class="ant-dropdown-link"
@click="qrcodeAssement(element)"
>
评估二维码
<DownOutlined />
</a>
<template #overlay>
<div
style="
height: 200px;
width: 180px;
overflow: auto;
"
>
<a-menu @click="handleMenuClickpg">
<template
v-for="(item, index) in qrCodeItemspg"
:key="index"
>
<a-menu-item>
<div>
<p>{{ item.name }}</p>
</div>
</a-menu-item>
</template>
</a-menu>
</div>
</template>
</a-dropdown>
</div>
</template>
<template
v-if="
element.offcourseIds.length > 1 &&
element.taskType == 2
"
>
<div
class="operations_dropdown"
v-if="checkMenu('growthSignQRCode')"
>
<a-dropdown
:getPopupContainer="
(triggerNode) => triggerNode.parentNode
"
:trigger="['click']"
v-model:visible="visibleEwm[element.id]"
>
<a
class="ant-dropdown-link"
@click="qrcodeVisible(element)"
>
签到二维码
<DownOutlined />
</a>
<template #overlay>
<div style="height: 200px; overflow: auto">
<a-menu @click="handleMenuClick">
<template
v-for="(item, index) in qrCodeItems"
:key="index"
>
<a-menu-item>
<div>
<p>{{ item.name }}</p>
</div>
</a-menu-item>
</template>
</a-menu>
</div>
</template>
</a-dropdown>
</div>
</template>
<template
v-if="
(element.taskType == 6 || element.taskType == 9) &&
checkMenu('growthWorkAttendance')
"
>
<div
class="operation"
@click="handlerWorkAttendance(element)"
>
考勤
</div>
</template>
<template
v-if="
element.assessmentIds.length == 1 &&
element.taskType == 2
"
>
<div
class="operations_dropdown"
v-if="checkMenu('growthEvaluateQRCode')"
>
<a
class="ant-dropdown-link"
@click="qrcodeAssement(element)"
>
评估二维码
</a>
</div>
</template>
<template
v-if="
element.offcourseIds.length == 1 &&
element.taskType == 2
"
>
<div
class="operations_dropdown"
v-if="checkMenu('growthSignQRCode')"
>
<a
class="ant-dropdown-link"
@click="qrcodeVisible(element)"
>
签到二维码
</a>
</div>
</template>
<template v-if="element.taskType == 2">
<div
v-if="checkMenu('growthFaceTeaching')"
class="operation"
@click="openCourse(element, index)"
>
开课
</div>
<div
v-if="checkMenu('growthFaceStudent')"
class="operation"
@click="showFS(element, index)"
>
学员
</div>
</template>
<template
v-if="
element.taskType != 3 &&
element.taskType != 2 &&
checkMenu('growthQRCode')
"
>
<div
class="operation"
style="cursor: pointer"
@click="showCodeModel(element)"
>
二维码
</div>
</template>
<div
class="operation"
v-if="checkMenu('growthTaskManage')"
style="cursor: pointer; margin-right: 35px"
@click="
element.taskType == 2
? faceTeachModel(element)
: showOnline(element)
"
>
管理
</div>
</div>
</div>
</template>
</Draggable>
</div>
<!-- 有数据-->
<div style="display: flex; height: 20px"></div>
</div>
</a-tab-pane>
<a-tab-pane key="3" tab="学员管理" force-render>
<StudentManage
ref="stuRef"
:type="14"
title="添加学员"
:id="routerId"
:growId="routerId"
:visable="tabFlag"
:permissions="preId"
>
<template #extension="{ data: { record } }">
<a-button type="link" @click="showStudent(record)"
>查看</a-button
>
</template>
</StudentManage>
</a-tab-pane>
</a-tabs>
</div>
<!-- 面授管理抽屉 开始 -->
<GrowthFaceTaskManage
:permissions="preId"
:type="4"
v-model:visible="faceTeachModelVisible"
:datasource="faceData"
/>
<!-- 面授管理抽屉 结束-->
<!-- 面授学员抽屉 -->
<GrowthFaceStu
:permissions="permissions"
v-model:FSvisible="FSvisible"
:datasource="facestudent"
:type="4"
:courseName="name"
/>
<!-- 查看学员 传入查看学员的id-->
<seeStu
v-model:Seevisible="Seevisible"
v-model:studentId="studentId"
v-model:growId="growId"
/>
<!-- 在线、案例等管理抽屉 -->
<GrowthOnlineManage
:permissions="preId"
v-model:Tvisible="onlineVisible"
:title="showTimeText"
:datasource="commonData"
/>
</a-spin>
</div>
<!-- 二维码弹窗 -->
<two-dimensional-code
v-model:codevisible="codevisible"
:codeInfo="codeInfo"
index="0"
type="课程二维码"
/>
<!-- 考勤 -->
<GrowthActiveAttendance
v-model:workAttendanceVisible="workAttendanceVisible"
:datasource="workAttendanceData"
/>
<!-- 二维码弹窗 -->
<!-- 面授课开课弹框 -->
<GrowthOpenCourse ref="coursePlanRef" :type="4" @refresh="getListTask" />
<a-modal
v-model:visible="setSuperiorsVisible"
:footer="null"
closable="false"
style="margin-top: 350px"
@cancel="setSuperiorsVisible = false"
>
<div
class="selectonlineface"
:style="{ display: setSuperiorsVisible ? 'block' : 'none' }"
>
<div class="bg_headers"></div>
<div class="bg_main">
<div class="bg_main_header">
<div class="bg_main_header_icon"></div>
<div>绑定上级任务</div>
<div
class="bg_main_header_close"
@click="setSuperiorsVisible = false"
></div>
</div>
<div class="bg_body">
<div
v-for="(item, key) in listTaskData"
style="
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12px;
background: rgb(247, 251, 253);
height: 40px;
padding: 5px 10px 5px 5px;
border-radius: 5px;
"
>
<div
style="
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
width: 220px;
"
>
{{ item.taskName }}
</div>
<div
@click="selectSuperiorTask(setSuperiorsActive, item)"
style="
width: 60px;
height: 30px;
text-align: center;
line-height: 30px;
background: #0078fc;
border-radius: 5px;
color: #fff;
cursor: pointer;
"
:style="{
filter:
setSuperiorsActive.id == item.id
? 'grayscale(1)'
: 'grayscale(0)',
}"
>
绑定
</div>
</div>
</div>
</div>
</div>
</a-modal>
</template>
<script lang="jsx">
import { ref, reactive, toRefs, onMounted, createVNode, watch } from "vue";
import { message, Modal } from "ant-design-vue";
import StudentManage from "@/components/growthpath/StudentManage";
import { useRoute, useRouter } from "vue-router";
import { getCookieForName } from "@/api/method";
import seeStu from "@/components/growthpath/StudentSeeStu";
import GrowthOnlineManage from "@/components/growthpath/GrowthOnlineManage";
import CommonStudent from "@/components/student/CommonStudent";
import GrowthOpenCourse from "@/components/growthpath/GrowthOpenCourse.vue";
import qrCode from "@/utils/qrCode";
import { fixDoublePer, checkGrowthPer } from "@/utils/utils";
import dialog from "@/utils/gowthDialog";
import { TASK_TYPE } from "@/utils/constGrown";
import Draggable from "vuedraggable";
import TwoDimensionalCode from "@/components/TwoDimensionalCode.vue";
import GrowthFaceStu from "@/components/growthpath/GrowthFaceStu";
import { DownOutlined, CloseCircleOutlined } from "@ant-design/icons-vue";
import GrowthFaceTaskManage from "../../components/growthpath/GrowthFaceTaskManage";
import { courseData } from "@/api/index1";
import { checkMenu } from "@/utils/utils";
import GrowthActiveAttendance from "@/components/growthpath/GrowthActiveAttendance";
import {
getOverview,
getBasicInfo,
taskOutline,
withdrawal,
getPublishInfo,
allocationList,
manangementOverview,
published,
toSortTask,
saveSuperiorTask,
delSuperiorTask,
openOrCloseSortSwitch,
taskInformation,
taskCompletionRate,
} from "@/api/growthpath";
export default {
name: "pathManage",
components: {
StudentManage,
seeStu,
GrowthOnlineManage,
CommonStudent,
TwoDimensionalCode,
Draggable,
GrowthFaceTaskManage,
GrowthOpenCourse,
DownOutlined,
GrowthActiveAttendance,
CloseCircleOutlined,
GrowthFaceStu,
},
setup() {
const router = useRouter();
const route = useRoute();
const stuRef = ref();
const headers = { token: getCookieForName("token") };
const state = reactive({
homeworkModelVisible: false,
activeKey: "1",
sortSwitch: false,
FSvisible: false,
facestudent: false,
commonData: null,
showTimeText: null,
onlineVisible: false,
setSuperiorsVisible: false,
total: 0,
// 考勤
workAttendanceVisible: false,
workAttendanceData: {},
pageSize: 99999,
pageNum: 1,
spinning: false,
tabFlag: true,
homeworkData: {},
TMvisible: false,
TMvisibleExternal: false,
showTestText: "",
examData: null,
targetId: null,
routerId: route.query.id,
preId: route.query.pre,
Seevisible: false,
studentId: "",
codevisible: false, //二维码是否显示
codeInfo: {
url: "",
}, //二维码内容
growId: "",
basicData: {},
listTaskData: [],
overviewData: {},
overviewData2: {},
overviewData3: {},
TASK_TYPE: TASK_TYPE,
// 课程类型 1必修 2选修
courseType: "1",
// 面授管理
faceTeachModelVisible: false,
faceTeachModelVisibleTitle: "",
faceData: {},
});
watch();
// () => state.listTaskData,
// (old, val) => {
// if (old.length == val.length) {
// const listIds = old.map((item) => item.id).join(",");
// listIds && toSortTask(listIds);
// }
// },
// { deep: true }
// 新增选修任务
const addTask = (url) => {
router.push({
path: url,
query: { growId: state.routerId, pre: state.preId },
});
};
// 返回
const goBack = () => {
router.go(-1);
};
// 列表拖动结束
const draggableOnEnd = () => {
// 开启加载弹窗getListTask请求完成后会关闭弹框
state.spinning = true;
const listIds = state.listTaskData.map((item) => item.id).join(",");
toSortTask(listIds, state.courseType).then((res) => {
getListTask();
});
};
// 撤回
const resize = () => {
dialog({
content: "确定撤回?",
contentTwo: "撤回后学员进度保留,发布后可继续学习",
ok: () => {
state.spinning = true;
withdrawal(route.query.id)
.then((res) => {
if (res.data.code == 200) {
message.success("撤回成功");
getOverviewList();
}
})
.catch((err) => {
message.error(err.data.msg);
})
.finally(() => {
state.spinning = false;
});
},
});
};
// 考勤
const handlerWorkAttendance = (data) => {
state.workAttendanceVisible = true;
state.workAttendanceData = data;
};
// 开启绑定上级任务的弹窗
const setSuperiorsActive = ref(null);
const handlerSuperiors = (element) => {
// 保存需要操作的数据
setSuperiorsActive.value = element;
state.setSuperiorsVisible = true;
};
const qrCodeItems = ref([]);
const visibleEwm = ref({});
const qrcodeVisible = async (item) => {
if (qrCodeItems.value.length != 0) {
qrCodeItems.value = [];
}
visibleEwm.value[item.id] = !visibleEwm.value[item.id];
const planParams = {
type: 4,
offcourseId: item.taskId,
};
await courseData(planParams).then((res) => {
qrCodeItems.value = res.data.data.map((dataItem) => ({
...dataItem,
courseName: item.taskName,
}));
if (qrCodeItems.value.length == 1) {
qrCode({
title: "【签到】二维码",
courseName: state.basicData.growthName,
name: qrCodeItems.value[0].name + "课程签到",
createName:
qrCodeItems.value[0].offteachers
.map((teacher) => teacher.teacherName)
.join(", ") || qrCodeItems.value[0].teacher,
url: `${location.protocol}//${location.host}${
process.env.VUE_APP_BASE_API
}/admin/student/studentSign?taskId=${
qrCodeItems.value[0].id
}&taskType=${2}&type=${3}&openCourseId=${qrCodeItems.value[0].id}`,
});
}
if (qrCodeItems.value.length == 0) {
message.info("暂无签到二维码");
}
});
};
function handleMenuClick({ key }) {
const name = qrCodeItems.value[key].name;
const teacher = qrCodeItems.value[key].teacher;
const id = qrCodeItems.value[key].id;
const offteachers = qrCodeItems.value[key].offteachers
.map((teacher) => teacher.teacherName)
.join(", ");
qrCode({
title: "【签到】二维码",
courseName: state.basicData.growthName,
name: name + "课程签到",
createName: offteachers || teacher,
url: `${location.protocol}//${location.host}${
process.env.VUE_APP_BASE_API
}/admin/student/studentSign?taskId=${id}&taskType=${2}&type=${3}&openCourseId=${id}`,
});
}
const qrCodeItemspg = ref([]);
const visibleEwmpg = ref({});
const qrcodeAssement = async (item) => {
if (qrCodeItemspg.value.length != 0) {
qrCodeItemspg.value = [];
}
visibleEwmpg.value[item.id] = !visibleEwmpg.value[item.id];
const planParams = {
type: 4,
offcourseId: item.taskId,
};
await courseData(planParams).then((res) => {
const qrCodeItemspgItem = res.data.data.map((dataItem) => ({
...dataItem,
courseName: item.taskName,
}));
qrCodeItemspg.value = qrCodeItemspgItem.filter(
(item) => item.assessmentId !== null
);
if (qrCodeItemspg.value.length == 1) {
const courseName = state.basicData.growthName;
qrCode({
title: "【评估】二维码",
courseName,
name: qrCodeItemspg.value[0].name + "课程评估",
createName:
qrCodeItemspg.value[0].offteachers
.map((teacher) => teacher.teacherName)
.join(", ") || qrCodeItemspg.value[0].teacher,
url: `${location.protocol}//${location.host}/student-h5/investigatpage?id=${qrCodeItemspg.value[0].id}&type=3&infoId=${qrCodeItemspg.value[0].id}&courseId=${qrCodeItemspg.value[0].assessmentId}&chapterOrStageId=0&level=${courseName}`,
});
}
if (qrCodeItemspg.value.length == 0) {
message.info("暂无评估二维码");
}
});
};
function handleMenuClickpg({ key }) {
const name = qrCodeItemspg.value[key].name;
const offteachers = qrCodeItemspg.value[key].offteachers
.map((teacher) => teacher.teacherName)
.join(", ");
const teacher = qrCodeItemspg.value[key].teacher;
const id = qrCodeItemspg.value[key].id;
const assessmentId = qrCodeItemspg.value[key].assessmentId;
const courseName = state.basicData.growthName;
qrCode({
title: "【评估】二维码",
courseName,
name: name + "课程评估",
createName: offteachers || teacher,
url: `${location.protocol}//${location.host}/student-h5/investigatpage?id=${id}&type=3&infoId=${id}&courseId=${assessmentId}&chapterOrStageId=0&level=${courseName}`,
});
}
// 保存/删除上级任务
const selectSuperiorTask = (element, row) => {
console.log(element, row);
if (row) {
if (element.id === row.id) {
message.warning("不可绑定");
return;
}
state.spinning = true;
// 关闭弹窗
state.setSuperiorsVisible = false;
// 保存需解锁的上级任务
saveSuperiorTask({
id: element.id,
superiorTaskId: row.id,
})
.then((res) => {
message.success("操作成功");
element.superiorTaskName = row.taskName;
getListTask();
})
.finally(() => {
state.spinning = false;
});
} else {
state.spinning = true;
// 删除需解锁的上级任务
delSuperiorTask(element.id)
.then((res) => {
message.success("操作成功");
element.superiorTaskName = null;
getListTask();
})
.finally(() => {
state.spinning = false;
});
}
};
// 必修选修切换
const tabsChange = () => {
console.log(state.sortSwitch, state.courseType);
state.courseType === "1"
? (state.sortSwitch = state.basicData.sortSwitch)
: (state.sortSwitch = state.basicData.eleSortSwitch);
getListTask();
};
const releaseLearnPath = () => {
dialog({
content: "确定发布当前任务?",
ok: () => {
state.spinning = true;
published({
growId: route.query.id,
})
.then((res) => {
if (res.data.code == 200) {
message.success("发布成功");
getOverviewList();
}
})
.catch((err) => {
message.error(err.data.msg);
})
.finally(() => {
state.spinning = false;
});
},
});
};
const changeTabs = (e) => {
if (e == 3) {
// 学员
state.tabFlag = true;
} else if (e == 1) {
// 概览
state.tabFlag = false;
getOverviewList();
} else {
// 任务
state.tabFlag = false;
getListTask();
}
};
const showStudent = (record) => {
state.Seevisible = true;
state.studentId = record.sid;
state.growId = state.routerId;
};
const showCodeModel = (item) => {
console.log("二维码任务信息", item);
let codeUrl = "";
// 在线课 停用 -- 暂时没有在线课停用标记
if (item.taskType == 1) {
// if (item.taskStatus == 1 || item.taskStatus == 2)
// return message.error("该任务无法学习,请联系管理员进行替换。");
codeUrl =
window.location.protocol +
process.env.VUE_APP_ONLINE_CLASS_URL +
item.taskId;
}
if (item.taskType == 3) return message.error("请在pc端完成");
if (item.taskType == 4) {
let date1 = new Date(item.endTime).getTime();
let date2 = new Date().getTime();
if (date1 < date2) return message.warning("当前作业已结束");
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/homeworkpage?courseId=" +
item.info.id +
"&type=4&id=" +
item.id +
"&chapterOrStageId=" +
0 +
"&infoId=" +
route.query.id;
}
// 考试 停用
if (item.taskType == 5) {
// if (item.taskStatus == 1 || item.taskStatus == 2)
// return message.error("该任务无法学习,请联系管理员进行替换。");
// 此处判断外部考试跳转
if (item.info.examType == 2) {
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/externalexam?type=4&courseId=" +
item.info.id +
"&id=" +
item.id +
"&chapterOrStageId=0" +
"&infoId=" +
route.query.id;
} else {
codeUrl =
window.location.protocol +
process.env.VUE_APP_EXAM_DETAIL_URL +
item.info.examinationPaperId;
}
}
// 直播结束时间
if (item.taskType == 6) {
let date1 = new Date(item.info.liveEndTime).getTime();
let date2 = new Date().getTime();
if (date1 < date2) return message.warning("当前直播已结束");
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/liveboradcast?courseId=" +
item.info.id +
"&type=4&id=" +
item.id +
"&chapterOrStageId=0" +
"&infoId=" +
route.query.id;
}
// 外链
if (item.taskType == 7) {
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/outerchain?courseId=" +
item.info.id +
"&type=4&id=" +
item.id +
"&chapterOrStageId=0" +
"&infoId=" +
route.query.id;
}
//讨论
if (item.taskType == 8) {
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/discusspage?courseId=" +
item.info.id +
"&type=4&id=" +
item.id +
"&chapterOrStageId=0" +
"&infoId=" +
route.query.id;
}
//活动
if (item.taskType == 9) {
let date1 = new Date(item.info.activityEndTime).getTime();
let date2 = new Date().getTime();
if (date1 < date2) return message.warning("当前活动已结束");
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/activitiespage?courseId=" +
item.info.id +
"&type=4&id=" +
item.id +
"&chapterOrStageId=0" +
"&infoId=" +
route.query.id;
}
//测评
if (item.taskType == 10) {
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/evaluation?courseId=" +
item.info.id +
"&type=4&targetId=" +
item.info.evaluationTypeId +
"&id=" +
item.id +
"&chapterOrStageId=0" +
"&infoId=" +
route.query.id;
}
// 评估 停用
if (item.taskType == 11) {
// if (item.taskStatus == 1 || item.taskStatus == 2)
// return message.error("该任务无法学习,请联系管理员进行替换。");
console.log("item", item);
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/investigatpage?courseId=" +
item.taskId +
"&type=4&id=" +
item.id +
"&chapterOrStageId=0" +
"&infoId=" +
route.query.id;
}
// 投票
if (item.taskType == 12) {
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/ballotpage?courseId=" +
item.info.id +
"&btype=2&id=" +
item.id +
"&chapterOrStageId=0" +
"&type=4&infoId=" +
route.query.id;
}
// 项目
if (item.taskType == 13) {
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/projectdetails?type=2&projectId=" +
item.taskId +
"&id=" +
item.id +
"&chapterOrStageId=0" +
"&type=4&infoId=" +
route.query.id;
}
state.codevisible = true;
let obj = {
title: "[" + state.TASK_TYPE[item.taskType].name + "]二维码",
name: item.name,
url: codeUrl,
};
state.codeInfo = obj;
};
//面授学员的弹窗
const showFS = (item) => {
state.FSvisible = true;
state.facestudent = item;
console.log("facestudent", state.facestudent);
};
// 作业点击管理弹框
const homeworkModel = (data) => {
console.log(data);
state.homeworkData = data;
state.homeworkModelVisible = true;
// 作业弹框名称 RouterHomeworkManage
};
// 面授课点击管理弹框
const faceTeachModel = (data) => {
console.log(data);
state.faceTeachModelVisible = true;
state.faceTeachModelVisibleTitle = data.taskName;
state.faceData = data;
// 面授课弹框名称 RouterFaceTeachManage
};
const showOnline = (item) => {
console.log(item, "item");
item.targetId = route.query.id;
state.showTimeText = item.name;
state.commonData = item;
state.onlineVisible = true;
};
//考试管理的抽屉
const showTest = (data) => {
if (data.examType == 2) {
// 外部考试抽屉显示
state.TMvisibleExternal = true;
state.examData = data;
state.showTestText = data.name;
state.targetId = route.query.id;
} else {
// 系统考试抽屉显示
state.TMvisible = true;
state.examData = data;
state.showTestText = data.name;
state.targetId = route.query.id;
}
};
onMounted(() => {
if (route.query.routerEdit === "true") {
state.activeKey = "2";
}
getOverviewList();
getListTask();
});
//任务列表
const getListTask = () => {
state.spinning = true;
taskOutline({
growthId: route.query.id,
type: state.courseType,
pageSize: state.pageSize,
pageNum: state.pageNum,
})
.then((res) => {
if (res.data.code == 200) {
state.listTaskData = res.data.data.records;
// state.total = res.data.data.total;
// state.pageSize = res.data.data.pageSize;
// state.pageNum = res.data.data.pageNum;
}
state.spinning = false;
})
.catch((err) => {
spinning.value = false;
});
};
const getOverviewList = () => {
//基本信息
getBasicInfo({
growId: state.routerId,
}).then((res) => {
if (res.data.code === 200) {
state.basicData = res.data.data;
state.basicData.createTime = state.basicData.createTime.split("T")[0];
state.sortSwitch = state.basicData.sortSwitch;
}
});
//概览
manangementOverview({
growId: state.routerId,
}).then((res) => {
if (res.data.code == 200) {
state.overviewData = res.data.data;
} else {
message.error(res.msg);
}
});
//概览统计图数据
taskInformation(state.routerId).then((res) => {
if (res.data.code == 200) {
state.overviewData2 = res.data.data;
} else {
message.error(res.msg);
}
});
taskCompletionRate(state.routerId).then((res) => {
if (res.data.code == 200) {
state.overviewData3 = res.data.data;
} else {
message.error(res.msg);
}
});
};
const totasks = () => {
router.push({
path: "/editingtasks",
query: {
growId: state.routerId,
pre: state.preId,
},
});
};
// 开课按钮
const coursePlanRef = ref();
const openCourse = (ele) => {
coursePlanRef.value.openDrawer(ele);
};
// 是否自动学习开关
const sortSwitchChange = (val) => {
dialog({
content: `
${
val
? "开启后系统将根据排序自动生成学习顺序,"
: "关闭后系统将自动重置当前学习顺序,"
}
请确认是否${val ? "开启" : "关闭"}
`,
ok: () => {
// 开启加载弹窗getListTask请求完成后会关闭弹框
state.spinning = true;
openOrCloseSortSwitch(state.routerId, state.courseType).then(
(res) => {
message.success("操作成功");
getListTask();
state.courseType == "1"
? (state.basicData.sortSwitch = state.sortSwitch)
: (state.basicData.eleSortSwitch = state.sortSwitch);
}
);
},
close: () => {
state.sortSwitch = !state.sortSwitch;
},
});
};
return {
...toRefs(state),
stuRef,
headers,
checkMenu,
coursePlanRef,
changeTabs,
resize,
releaseLearnPath,
sortSwitchChange,
tabsChange,
showStudent,
showTest,
showOnline,
homeworkModel,
showCodeModel,
getOverviewList,
totasks,
getListTask,
fixDoublePer,
checkGrowthPer,
openCourse,
faceTeachModel,
selectSuperiorTask,
addTask,
qrcodeAssement,
handleMenuClickpg,
draggableOnEnd,
goBack,
handleMenuClick,
qrcodeVisible,
handlerSuperiors,
handlerWorkAttendance,
showFS,
qrCodeItems,
visibleEwm,
qrCodeItemspg,
visibleEwmpg,
setSuperiorsActive,
};
},
};
</script>
<style lang="scss" scoped>
.clearfix:before,
.clearfix:after {
content: " ";
display: block;
clear: both;
}
.tabs {
margin: 10px 63px 10px 26px;
display: flex;
align-items: center;
}
.switch {
display: flex;
align-items: center;
margin-left: 20px;
}
.selectonlineface {
z-index: 999;
width: 679px;
background: #ffffff;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.21);
position: absolute;
left: 50%;
top: -100%;
transform: translate(-50%, -50%);
.bg_headers {
position: absolute;
width: 100%;
height: 40px;
background: linear-gradient(
180deg,
rgba(103, 64, 255, 0.2) 0%,
rgba(166, 168, 255, 0) 100%
);
}
.bg_main {
width: 100%;
position: relative;
.bg_main_header {
display: flex;
align-items: center;
padding-top: 20px;
padding-left: 26px;
font-size: 16px;
.bg_main_header_icon {
width: 16px;
height: 16px;
margin-right: 10px;
background-image: url(@/assets/images/evaluation/uploads.png);
background-size: 100% 100%;
}
.bg_main_header_close {
position: absolute;
right: 42px;
cursor: pointer;
width: 20px;
height: 20px;
background-image: url(@/assets/images/coursewareManage/close.png);
background-size: 100% 100%;
}
}
.bg_body {
width: 80%;
margin: 20px auto;
height: 600px;
overflow-y: auto;
}
}
}
.path-manage {
width: 100%;
height: 100%;
.racona {
display: flex;
align-items: center;
}
.addhead {
width: 100%;
height: 130px;
// background-color: lightgreen;
display: flex;
align-items: center;
position: relative;
.imgfor {
margin-left: 22px;
padding: 25px 0;
.fort {
font-size: 14px;
// width: 288px;
height: 22px;
margin-bottom: 9px;
background-color: rgba(255, 255, 255, 0);
box-sizing: border-box;
color: #555555;
text-align: left;
line-height: normal;
}
}
@media screen and (max-width: 1030px) {
.imgfor {
margin-left: 20px;
}
}
.right {
// width: 500px;
height: 100%;
// background-color: red;
position: absolute;
right: 0;
display: flex;
align-items: center;
.img1 {
width: 24px;
height: 24px;
margin-right: 50px;
}
.line {
height: 65%;
width: 1px;
background-color: #e8effa;
margin-right: 12px;
}
.pubIcon {
display: flex;
align-items: center;
margin-right: 12px;
cursor: pointer;
.img2 {
width: 42px;
height: 42px;
margin-right: 8px;
}
.pub {
color: #02a7f0;
font-size: 14px;
margin-top: 2px;
margin-right: 9px;
cursor: pointer;
}
}
.img2 {
width: 42px;
height: 42px;
margin-right: 8px;
}
.return {
color: #4ea6ff;
font-size: 14px;
margin-top: 10px;
margin-right: 60px;
}
.more {
position: relative;
margin-right: 30px;
height: 30px;
display: flex;
align-items: center;
.moreArrow {
width: 13px;
height: 7px;
display: inline-block;
background-image: url("../../assets/images/navtop/down.png");
background-size: 100%;
margin: 2px;
margin-left: 15px;
}
.moreItems {
width: 110px;
// height: 80px;
padding-bottom: 12px;
display: none;
background: #ffffff;
box-shadow: 2px 3px 9px 3px rgba(0, 0, 0, 0.05);
// border-radius: 3px;
border: 0px solid #dcdcdc;
position: absolute;
left: -48px;
top: 30px;
z-index: 100;
cursor: pointer;
.sammo {
text-align: center;
margin-top: 12px;
cursor: pointer;
}
.sammo:hover {
color: #4ea6ff;
}
}
.moreItems:hover {
display: block;
}
}
@media screen and (max-width: 1240px) {
.line {
margin-right: 10px;
}
.img1 {
margin-right: 15px;
}
.img2 {
margin-right: 10px;
}
.return {
margin-right: 10px;
}
.pub {
margin-right: 10px;
}
.more {
margin-right: 10px;
}
}
.more:hover .moreArrow {
background-image: url("../../assets/images/navtop/up.png");
}
.more:hover .moreItems {
display: block;
}
}
}
.split {
width: 100%;
height: 20px;
background-color: #edf0f5;
}
.bom {
.tab {
margin-top: 10px;
// margin-left: 10px;
}
.onerow {
//width: 100%;
display: flex;
// height: 40px;
position: relative;
// margin-top: 15px;
margin-left: 38px;
//margin-right: 38px;
.taskmain {
height: 24px;
font-size: 18px;
background-color: rgba(255, 255, 255, 0);
box-sizing: border-box;
font-weight: 650;
color: #333333;
text-align: left;
line-height: normal;
}
.btn {
position: absolute;
top: 0;
right: 168px;
background-color: #4ea6ff;
width: 130px;
height: 40px;
border-radius: 8px;
border: 1px solid #4ea6ff;
color: #ffffff;
cursor: pointer;
}
.editright {
position: absolute;
right: 51px;
top: 0;
width: 80px;
height: 32px;
border-radius: 5px;
background-color: #578afc;
color: #ffffff;
text-align: center;
line-height: normal;
background: #4ea6ff;
display: flex;
justify-content: center;
align-items: center;
.editextb {
color: #fff;
font-size: 13px;
}
}
}
.secondadd {
.addtaskmain {
width: 368px;
height: 22px;
margin: 16px 0 32px 26px;
font-size: 18px;
background-color: rgba(255, 255, 255, 0);
box-sizing: border-box;
font-weight: 650;
color: #333333;
text-align: left;
line-height: normal;
}
.addtask_main {
margin-left: 26px;
display: flex;
justify-content: left;
.btn {
cursor: pointer;
width: 412px;
margin-right: 32px;
}
}
}
.second {
display: flex;
justify-content: left;
flex-wrap: wrap;
margin-top: 39px;
margin-left: 33px;
margin-bottom: 47px;
.nubbox {
width: 253px;
height: 116px;
background: #f0f6fc;
border-radius: 8px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
margin-right: 15px;
margin-top: 20px;
.nub1 {
height: 40px;
font-weight: 600;
font-size: 28px;
color: #ffb54a;
line-height: 40px;
}
.nub2 {
height: 20px;
font-weight: 400;
font-size: 14px;
color: #666660;
line-height: 20px;
}
}
.taskbox {
width: 412px;
height: 160px;
border-radius: 10px;
position: relative;
margin-left: 68px;
margin-bottom: 40px;
cursor: pointer;
.leftt {
position: absolute;
top: 18px;
left: 0;
}
.photo {
position: absolute;
top: 42px;
left: 37px;
}
.rightt {
position: absolute;
top: 69px;
right: 26px;
}
.centerbox {
position: absolute;
top: 52px;
left: 145px;
font-size: 20px;
font-weight: 700;
//line-height: 36px;
}
.centermain {
color: rgba(135, 139, 146, 1);
font-size: 14px;
position: absolute;
left: 144px;
bottom: 49px;
}
}
}
.stagelast {
display: flex;
flex-wrap: wrap;
// justify-content: center;
margin-left: 74px;
margin-bottom: 55px;
.stagepro {
display: flex;
flex-direction: column;
align-items: center;
margin-top: 55px;
margin-right: 120px;
.ant-progress-circle-path {
stroke: #4ea6ff;
}
.ant-progress-text {
color: #4ea6ff;
font-weight: 700;
}
.protext {
color: #6d7584;
font-size: 14px;
margin-top: 25px;
}
}
}
.proright {
// width: 600px;
margin: 35px 50px;
.ant-progress-bg {
height: 24px !important;
background: #4ea6ff;
}
.ant-progress-inner {
height: 24px;
}
.proright1 {
// display: flex;
justify-content: right;
.textpro {
color: #6d7584;
font-size: 14px;
margin-right: 20px;
}
.ant-progress-text {
color: #4ea6ff;
font-size: 14px;
font-weight: 700;
}
}
}
.onerow {
//width: 100%;
display: flex;
// height: 40px;
position: relative;
// margin-top: 15px;
margin-left: 26px;
//margin-right: 38px;
.taskmain {
height: 24px;
font-size: 18px;
background-color: rgba(255, 255, 255, 0);
box-sizing: border-box;
font-weight: 650;
color: #333333;
text-align: left;
line-height: normal;
}
.btn {
position: absolute;
top: 0;
right: 168px;
background-color: #4ea6ff;
width: 130px;
height: 40px;
border-radius: 8px;
border: 1px solid #4ea6ff;
color: #ffffff;
cursor: pointer;
}
}
.reuse {
display: flex;
justify-content: space-between;
margin-bottom: 50px;
// height: 300px;
.reuse_btn {
width: 102px;
height: 42px;
text-align: center;
line-height: 34px;
border-radius: 6px;
color: #ffffff;
font-size: 16px;
background: #4ea6ff;
margin-right: 38px;
margin-top: 15px;
cursor: pointer;
}
}
.taskbox {
width: 412px;
height: 160px;
border-radius: 10px;
position: relative;
margin-left: 26px;
margin-bottom: 10px;
margin-top: 10px;
cursor: pointer;
.leftt {
position: absolute;
top: 18px;
left: 0;
}
.photo {
position: absolute;
top: 42px;
left: 37px;
}
.rightt {
position: absolute;
top: 69px;
right: 26px;
}
.centerbox {
position: absolute;
top: 52px;
left: 145px;
font-size: 20px;
font-weight: 700;
//line-height: 36px;
}
.centermain {
color: rgba(135, 139, 146, 1);
font-size: 14px;
position: absolute;
left: 144px;
bottom: 49px;
}
}
.taskboxadd {
width: 436px;
height: 173px;
border-radius: 10px;
position: relative;
margin-left: 26px;
background: linear-gradient(-180deg, #facd91 0%, #ffffff 100%);
margin-bottom: 10px;
margin-top: 44px;
cursor: pointer;
.leftt {
position: absolute;
top: 18px;
left: 0;
}
.photo {
position: absolute;
top: 19px;
left: 21px;
.photoimg {
width: 165px;
height: 135px;
}
}
.rightt {
position: absolute;
top: 69px;
right: 26px;
}
.centerbox {
position: absolute;
top: 56px;
left: 210px;
font-size: 22px;
width: 88px;
height: 30px;
background-color: rgba(255, 255, 255, 0);
box-sizing: border-box;
font-weight: 500;
color: #f59a23;
text-align: left;
line-height: normal;
//line-height: 36px;
}
.centermain {
width: 128px;
height: 22px;
background-color: rgba(255, 255, 255, 0);
box-sizing: border-box;
font-weight: 500;
color: #7f7f7f;
text-align: left;
line-height: normal;
font-size: 16px;
position: absolute;
left: 210px;
bottom: 56px;
}
}
.taskSyllabus {
// flex: 1;
overflow-x: auto;
min-height: 400px;
.ant-collapse {
border: 0px;
background-color: rgba(255, 255, 255, 0);
min-width: 1040px;
}
.ant-collapse-content > .ant-collapse-content-box {
padding-top: 0px;
padding-bottom: 0px;
}
.ant-collapse > .ant-collapse-item {
border: 0px;
}
.ant-collapse-header {
display: flex;
height: 49px;
background-color: #eff4fc;
align-items: center;
margin-top: 20px;
margin-left: 38px;
margin-right: 40px;
font-size: 16px;
font-weight: 400;
color: #4ea6ff;
line-height: 36px;
.ant-collapse-arrow {
margin-left: 15px !important;
}
}
.ant-collapse-content {
border-top: 0px;
}
}
.course {
//width: 100%;
flex-shrink: 0;
margin-right: 24px;
display: flex;
flex-wrap: nowrap;
align-items: center;
padding: 25px 0px;
margin-left: 22px;
//margin: 0 12px;
border: 1px solid #f2f6fc;
border-top: 0px;
.first {
//position: relative;
display: flex;
flex-grow: 1;
align-items: center;
justify-content: center;
width: 120px;
.iconame {
//position: absolute;
color: #4f5156;
font-size: 16px;
margin-left: 4px;
}
.icontext {
font-size: 14px;
margin-left: 30px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 240px;
height: 19px;
background-color: rgba(255, 255, 255, 0);
box-sizing: border-box;
color: #333333;
text-align: left;
line-height: normal;
}
}
.progress {
width: 70px;
margin-left: 10px;
margin-right: 50px;
flex-grow: 1;
.img_daoc {
cursor: pointer;
width: 16px;
height: 18px;
background-image: url(@/assets/images/coursewareManage/export.png);
background-size: 100% 100%;
// background-color: #4ea6ff;
margin-left: 7px;
}
.progresstext {
color: #ffc067;
font-size: 14px;
}
}
.operations {
display: flex;
width: 280px;
justify-content: flex-end;
flex-wrap: wrap;
.operation {
color: #4ea6ff;
font-size: 14px;
padding: 10px;
width: 63px;
text-align: center;
cursor: pointer;
}
.operations_dropdown {
padding: 10px;
text-align: center;
position: relative;
min-width: 90px;
}
}
}
}
.tableBox {
padding-bottom: 20px;
margin: 20px 38px 30px;
::v-deep .ant-select {
min-height: 32px;
.ant-select-selector {
min-height: 32px;
}
.ant-select-selection-item {
line-height: 32px;
}
}
::v-deep .ant-pagination-options .ant-select-arrow {
display: block;
}
::v-deep .ant-select-dropdown {
display: inline-block;
}
::v-deep .ant-select-selection-item {
margin-left: 3px;
}
::v-deep .ant-pagination-options-size-changer.ant-select {
width: 92px;
}
.pa {
width: 100%;
display: flex;
justify-content: center;
}
}
}
</style>