Files
fe-manage/src/views/projectcenter/TaskPage.vue

8836 lines
259 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.
<!-- eslint-disable vue/valid-v-model -->
<!-- eslint-disable vue/no-parsing-error -->
<!-- 任务页面 -->
<template>
<div class="taskpage">
<div class="addhead" style="flex-shrink: 0">
<div class="leftimg">
<img class="img" :src="picUrl" />
</div>
<div class="imgfor">
<div class="forz">{{ name }}</div>
<div class="fort">项目经理{{ manager }}</div>
<div class="fort">起止时间{{ startTime }}{{ endTime }}</div>
</div>
<div class="right">
<!-- 2022-12-10注释 后面放开 -->
<img
class="img1"
src="../../assets/images/leveladd/ma.png"
@click="showCodeModel2()"
v-if="action == 3"
/>
<div class="line" v-if="action == 3"></div>
<!-- 显示发布图标 -->
<img
v-if="action == 2 && checkPer(permissions, createId)"
class="img2"
src="../../assets/images/leveladd/pub.png"
/>
<!-- 显示撤回发布图标 -->
<img
v-if="action == 3 && checkPer(permissions, createId)"
class="img2"
src="../../assets/images/project/finish.png"
/>
<!-- 显示审核图标 -->
<img
v-if="
(action == 0 || action == -2) && checkPer(permissions, createId)
"
class="img2"
src="../../assets/images/project/reviewsubmit.png"
/>
<!-- 显示撤回审核图标 -->
<img
v-if="action == 1 && checkPer(permissions, createId)"
class="img2"
src="../../assets/images/project/reviewrecall.png"
/>
<!-- <div class="pub">发布</div> -->
<!-- 显示提交审核 -->
<div
class="pub"
style="width: 56px; color: #a497ff"
v-if="
(action == 0 || action == -2) && checkPer(permissions, createId)
"
@click="submitExamine"
>
{{ act }}
</div>
<!-- 显示撤回审核 -->
<div
class="pub"
style="width: 56px; color: #a497ff"
v-if="action == 1 && checkPer(permissions, createId)"
@click="showRecallReviewModal"
>
{{ act }}
</div>
<!-- 显示发布 -->
<div
class="pub"
style="width: 28px"
v-if="action == 2 && checkPer(permissions, createId)"
@click="showProjectPub"
>
{{ act }}
</div>
<!-- 显示撤回发布 -->
<div
class="pub"
style="width: 56px; color: #57c887"
v-if="action == 3 && checkPer(permissions, createId)"
@click="showBackModal"
>
{{ act }}
</div>
<!-- 项目提交审核弹窗 -->
<a-modal
v-model:visible="reviewModal"
:footer="null"
:closable="false"
wrapClassName="CopyModal"
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="closeReviewModal"></div>
</div>
<div class="body">
<span>您确定要提交审核吗</span>
<div class="back"></div>
</div>
<div class="del_btnbox">
<div
class="del_btn btn2"
@click="closeReviewModal"
style="margin-right: 32px"
>
<div class="btnText">取消</div>
</div>
<div class="del_btn btn2" @click="submitReviewProject">
<div class="btnText">确定</div>
</div>
</div>
</div>
</div>
</a-modal>
<!-- 已结束的显示 -->
<!-- <div class="pub" style="width: 28px" v-if="action == -1">
{{ act }}
</div>
<div class="line"></div>
<img
style="margin-right: 15px"
class="img2"
src="../../assets/images/leveladd/more.png"
/>-->
<!-- <div class="more">
<span style="color: #7096e3; cursor: pointer">更多</span>
<div class="moreArrow"></div>
<div class="moreItems">
<div class="sammo">撤回</div>
<div class="sammo">复制</div>
</div>
</div> -->
<!-- 草稿/未发布的显示
<div class="more" v-if="action == 0">
<span style="color: #7096e3; cursor: pointer">更多</span>
<div class="moreArrow"></div>
<div class="moreItems">
<div class="sammo">复制</div>
<div class="sammo" @click="showStartModal">存为模板</div>
</div>
</div>-->
<!-- 已发布的显示
<div class="more" v-if="action == 1">
<span style="color: #7096e3; cursor: pointer">更多</span>
<div class="moreArrow"></div>
<div class="moreItems">
<div class="sammo" @click="showStopModal">结束</div>
<div class="sammo">复制</div>
<div class="sammo" @click="showStartModal">存为模板</div>
</div>
</div>-->
<!-- 已结束的显示
<div class="more" v-if="action == -1">
<span style="color: #7096e3; cursor: pointer">更多</span>
<div class="moreArrow"></div>
<div class="moreItems">-->
<!-- <div class="sammo">结束</div>
<div class="sammo">复制</div>
<div class="sammo" @click="showStartModal">存为模板</div>
</div>
</div> -->
<div class="line"></div>
<router-link to="/projectmanage">
<div style="display: flex">
<img class="img2" src="../../assets/images/leveladd/back.png" />
<div class="return">返回</div>
</div>
</router-link>
</div>
</div>
<div class="split" style="flex-shrink: 0"></div>
<div class="content">
<a-tabs
class="tab"
v-model:activeKey="activeKey"
size="large"
:tabBarStyle="{ marginLeft: '10px', marginTop: '5px' }"
@change="tabsChange"
>
<a-tab-pane v-if="!isNewEmployee" key="1" tab="概览">
<div class="split"></div>
<!-- 概览(无数据) -->
<div v-if="!hasTask">
<div class="onerow">
<div class="taskmain">快速创建项目详情</div>
</div>
<div v-if="checkPer(permissions, createId)" class="second">
<!-- @click="totask" -->
<div
class="taskbox"
@click="
() => {
routered.push({
path: `/taskadd`,
query: { projectId: projectId },
});
}
"
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>
<div
class="taskbox"
@click="tostudent"
style="background: linear-gradient(180deg, #ddeaff, #f0f8fe)"
>
<div class="leftt">
<img src="../../assets/images/taskpage/left2.png" />
</div>
<div class="photo">
<img src="../../assets/images/taskpage/picture2.png" />
</div>
<div class="rightt">
<img src="../../assets/images/taskpage/right2.png" />
</div>
<div class="centerbox" style="color: rgba(78, 166, 255, 1)">
添加学员
</div>
<div class="centermain">快速添加学员</div>
</div>
<!-- 2022-12-2注释 后面放开 -->
<!-- <div
class="taskbox"
@click="showModal"
style="background: linear-gradient(180deg, #e5f6ec, #eef9f3)"
>
<div class="leftt">
<img src="../../assets/images/taskpage/left3.png" />
</div>
<div class="photo">
<img src="../../assets/images/taskpage/picture3.png" />
</div>
<div class="rightt">
<img src="../../assets/images/taskpage/right3.png" />
</div>
<div class="centerbox" style="color: rgba(93, 201, 136, 1)">
发布
</div>
<div class="centermain">快速发布项目</div>
</div> -->
</div>
</div>
<!-- 概览(有数据) -->
<div v-if="hasTask">
<div class="onerow">
<div class="taskmain">项目概览</div>
<a-popover title="项目信息">
<template #content>
<div class="setc_name"><span>项目名称:</span></div>
<div class="setc_main">
<span style="color: #999999">{{ name }}</span>
</div>
<div class="setc_name"><span>项目说明:</span></div>
<div class="setc_main" style="width: 400px">
<div
style="
width: 400px;
color: #999999;
word-wrap: break-word;
text-overflow: ellipsis;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 6;
-webkit-box-orient: vertical;
"
:title="remark"
>
{{ remark }}
</div>
</div>
</template>
<div
style="
display: flex;
justify-content: flex-start;
margin-left: 10px;
padding: 6px;
"
>
<div
class="script"
style="border: 1px solid #40a9ff; padding: 2px"
>
<span style="font-size: 16px; color: #40a9ff"
>项目说明</span
>
</div>
</div>
</a-popover>
</div>
<div class="second" style="margin-top: 0">
<div class="nubbox">
<span class="nub1">{{
projectInfoOverview.totalStudentCnt || 0
}}</span>
<div class="nub2">总人数</div>
</div>
<div class="nubbox">
<span class="nub1" style="color: #ff90ae">{{
projectInfoOverview.studyStudentCnt || 0
}}</span>
<div class="nub2">学习人数</div>
</div>
<div class="nubbox">
<span class="nub1" style="color: #a497ff">{{
projectInfoOverview.completeStudentCnt || 0
}}</span>
<div class="nub2">完成人数</div>
</div>
<div class="nubbox">
<div>
<span class="nub1" style="color: #5dc988">{{
projectInfoOverview.onlineCourseCnt || 0
}}</span>
<!-- <span style="color: #5dc988; font-size: 14px">%</span> -->
</div>
<div class="nub2">在线课程数</div>
</div>
<div class="nubbox">
<div>
<span class="nub1" style="color: #ff90ae">{{
projectInfoOverview.offLineCourseCnt || 0
}}</span>
<!-- <span style="color: #ff90ae; font-size: 14px">%</span> -->
</div>
<div class="nub2">面授课程数</div>
</div>
<div class="nubbox">
<div>
<span class="nub1" style="color: #a497ff">{{
((projectInfoOverview.completeRatio || 0) * 100).toFixed(2)
}}</span
><span style="color: #a497ff; font-size: 14px">%</span>
</div>
<div class="nub2">总完成率</div>
</div>
</div>
<div class="onerow">
<div class="taskmain">阶段信息</div>
</div>
<!-- <div class="stagemess">
<div class="stage1">阶段1</div>
<div class="stage2">阶段2</div>
</div> -->
<div class="stagemess">
<div
v-for="(item, index) in stageList"
:class="{
stage1: index === choosedStageIndex,
stage2: index !== choosedStageIndex,
}"
:key="item.stageId"
@click="stageChange(item, index)"
>
<div v-if="item.id === '0'">无阶段</div>
<div v-else>{{ "阶段" + (index + 1) }}</div>
</div>
<!-- <div class="stage1">阶段1</div>
<div class="stage2">阶段2</div> -->
</div>
<div class="stagesecond" v-if="choosedStageName">
<div class="staname">阶段名称:</div>
<div class="stamess">{{ choosedStageName }}</div>
</div>
<div class="stagelast">
<div class="stagepro">
<a-progress
type="dashboard"
gapDegree="0"
:percent="
fixDoublePer(
stageOverviewList[choosedStageIndex]
?.completeCourseRatio || 0
)
"
:width="140"
/>
<div class="protext">课程完成率</div>
</div>
<div class="stagepro">
<a-progress
type="dashboard"
gapDegree="0"
:percent="
fixDoublePer(
stageOverviewList[choosedStageIndex]?.completeExamRatio ||
0
)
"
:width="140"
/>
<div class="protext">考试通过率</div>
</div>
<div class="stagepro" style="margin-right: 0">
<a-progress
type="dashboard"
gapDegree="0"
:percent="
fixDoublePer(
stageOverviewList[choosedStageIndex]?.completeRatio || 0
)
"
:width="140"
/>
<div class="protext">作业完成率</div>
</div>
<div class="proright">
<div class="pronub" style="margin-left: 142px">
{{
stageOverviewList[choosedStageIndex]?.completeTaskCnt || 0
}}
</div>
<div class="proright1">
<span class="textpro">阶段任务总数</span>
<a-progress
:percent="
fixDoublePer(
stageOverviewList[choosedStageIndex]?.completeTaskCnt /
(stageOverviewList[choosedStageIndex]?.totalTaskCnt ||
0)
)
"
style="width: 369px"
/>
</div>
<div class="pronub" style="margin-left: 142px">
{{
stageOverviewList[choosedStageIndex]?.completeReqCnt || 0
}}
</div>
<div class="proright1">
<span class="textpro">必修任务</span>
<a-progress
:percent="
fixDoublePer(
stageOverviewList[choosedStageIndex]?.completeReqCnt /
(stageOverviewList[choosedStageIndex]?.totalReqCnt ||
0)
)
"
style="width: 369px"
/>
</div>
<div class="pronub" style="margin-left: 142px">
{{
stageOverviewList[choosedStageIndex]?.completeOptCnt || 0
}}
</div>
<div class="proright1">
<span class="textpro">选修任务</span>
<a-progress
:percent="
fixDoublePer(
stageOverviewList[choosedStageIndex]?.completeOptCnt /
(stageOverviewList[choosedStageIndex]?.totalOptCnt ||
0)
)
"
style="width: 369px"
/>
</div>
</div>
</div>
</div>
<!-- 概览(有数据) -->
</a-tab-pane>
<a-tab-pane key="2" tab="任务" force-render>
<div style="flex: 1">
<div class="split"></div>
<div class="onerow">
<div class="taskmain">任务大纲</div>
<ImpoterGroupLeader
title="批量面授报名"
:data="{ targetId: projectId, type: 1 }"
:url="`/admin/offcourse/importCourse`"
:template-url="templateUrl"
>
<button class="btn">批量面授报名</button>
</ImpoterGroupLeader>
<router-link
v-if="checkPer(permissions, createId)"
:to="{ path: `/taskadd`, query: { projectId: projectId } }"
>
<button class="edit">
<img
class="editimg"
src="../../assets/images/projectadd/edit1.png"
/>
<span class="editext">编辑</span>
</button>
</router-link>
</div>
<!-- <div class="taskSyllabus">
<a-collapse v-model:activeKey="taskSyllabusActive" accordion>
<template #expandIcon="{ isActive }">
<img
class="editimg"
src="../../assets/images/projectadd/edit.png"
/>
<span class="editext">编辑</span>
</router-link>
</div> -->
<div
class="taskSyllabus"
v-if="
taskSyllabus &&
taskSyllabus.length &&
(taskSyllabus.length > 1 || taskSyllabus[0].name)
"
>
<a-collapse v-model:activeKey="taskSyllabusActive" accordion>
<template #expandIcon="{ isActive }">
<img
:style="{
width: isActive ? 9.1 : 8.1,
height: isActive ? 8.1 : 9.1,
'margin-right': isActive ? '12px' : '13px',
}"
:src="
isActive
? require('../../assets/images/projectadd/open.png')
: require('../../assets/images/projectadd/close.png')
"
/>
<div></div>
</template>
<template v-for="(value, index) in taskSyllabus">
<a-collapse-panel
:key="index"
v-if="value.name"
:header="value.name"
>
<div
class="course"
v-for="(item, key) in value.taskList"
:key="key"
>
<div class="first">
<div class="icon">
<div
style="
width: 31px;
height: 28px;
display: flex;
align-items: center;
justify-content: center;
"
>
<img
:src="
item.type == 1
? require('../../assets/images/leveladd/zai.png')
: item.type == 2
? require('../../assets/images/leveladd/mian.png')
: item.type == 3
? require('../../assets/images/leveladd/an.png')
: item.type == 4
? require('../../assets/images/leveladd/zuo.png')
: item.type == 5
? require('../../assets/images/leveladd/kao.png')
: item.type == 6
? require('../../assets/images/leveladd/zhi.png')
: item.type == 7
? require('../../assets/images/leveladd/wai.png')
: item.type == 8
? require('../../assets/images/leveladd/tao.png')
: item.type == 9
? require('../../assets/images/leveladd/huo.png')
: item.type == 10
? require('../../assets/images/leveladd/ce.png')
: item.type == 11
? require('../../assets/images/leveladd/pinggu.png')
: item.type == 12
? require('../../assets/images/leveladd/tou.png')
: item.type == 13
? require('../../assets/images/leveladd/tou.png')
: require('../../assets/images/leveladd/xiangmu.png')
"
/>
</div>
</div>
<div>
<div class="iconame">
「{{ checkType(item.type) }}」
</div>
<div class="icontext">{{ item.name }}</div>
</div>
</div>
<div class="type">
<div
:class="item.flag == true ? 'typename1' : 'typename'"
>
<span v-if="item.flag">必修</span>
<span v-else>选修</span>
</div>
</div>
<div class="time">
<div class="timetext">开始时间</div>
<div class="timetext">
{{
item.type == 2
? item.createTime !== null
? item.createTime
: "-"
: item.startTime !== null
? item.startTime
: "-"
}}
</div>
</div>
<div
class="progress"
v-if="item.averageScore"
style="
display: flex;
flex-grow: 0;
margin: 0;
min-width: 66px;
"
>
<!-- <div class="progresstext">
{{ item.finishStuCnt || 0 }}/{{
item.totalStuCnt || 0
}}人
</div> -->
<!-- <div style="display: flex">
<a-progress
:showInfo="false"
:percent="
parseInt(
(item.finishStuCnt / item.totalStuCnt) * 100
)
"
strokeColor="#FFC067"
trailColor="rgba(253, 209, 98, 0.2)"
/>
<span class="progresstext" style="margin-left: 10px"
>{{
parseInt(
(item.finishStuCnt / item.totalStuCnt) * 100
) || 0
}}%</span
>
</div> -->
<div>{{ item.averageScore }}分</div>
<div class="img_daoc" @click="exportScore(item)"></div>
</div>
<div
class="progress"
v-if="!item.averageScore"
style="
display: flex;
flex-grow: 0;
margin: 0;
min-width: 60px;
"
></div>
<div class="operations">
<div class="operations_dropdown">
<a-dropdown
:getPopupContainer="
(triggerNode) => triggerNode.parentNode
"
v-if="
item.assessmentIds.filter((id) => id !== null)
.length > 1 && item.type == 2
"
:trigger="['click']"
v-model:visible="visibleEwmpg[item.id]"
>
<a
class="ant-dropdown-link"
@click="qrcodeAssement(item)"
>
评估二维码
<DownOutlined />
</a>
<template #overlay>
<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>
</template>
</a-dropdown>
<div
v-if="
item.assessmentIds.filter((id) => id !== null)
.length == 1 && item.type == 2
"
>
<a
class="ant-dropdown-link"
@click="qrcodeAssement(item)"
>
评估二维码
<DownOutlined />
</a>
</div>
</div>
<div
class="operations_dropdown"
v-if="item.assessmentIds.length != 1"
>
<a-dropdown
:getPopupContainer="
(triggerNode) => triggerNode.parentNode
"
v-if="item.type == 2"
:trigger="['click']"
v-model:visible="visibleEwm[item.id]"
>
<a
class="ant-dropdown-link"
@click="qrcodeVisible(item)"
>
签到二维码
<DownOutlined />
</a>
<template #overlay v-if="qrCodeItems.length > 0">
<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>
</template>
</a-dropdown>
</div>
<div
class="operations_dropdown"
v-if="
item.type == 2 && item.assessmentIds.length == 1
"
>
<a
class="ant-dropdown-link"
@click="qrcodeVisible(item)"
>
签到二维码
<DownOutlined />
</a>
</div>
<div
class="operation"
style="cursor: pointer"
@click="openCourse(item, key, index)"
v-if="item.type == 2"
>
开课
</div>
<div
class="operation"
style="cursor: pointer"
@click="showFS(item)"
v-if="item.type == 2"
>
学员
</div>
<div
class="operation"
style="cursor: pointer"
@click="showAA(item.type, item.name, item)"
v-if="item.type == 6 || item.type == 9"
>
考勤
</div>
<div
class="operation"
v-if="
item.type != 2 && item.type != 6 && item.type != 9
"
></div>
<div
class="operation"
style="cursor: pointer"
@click="showCodeModel(item)"
v-if="item.type !== 2"
>
二维码
</div>
<div
class="operation"
style="cursor: pointer; margin-right: 10px"
@click="
item.type == '1' ||
item.type == '3' ||
item.type == '6' ||
item.type == '7' ||
item.type == '8' ||
item.type == '9' ||
item.type == '11'
? showOnline(
item.name,
item.projectTaskId,
item.type,
item,
value.name
)
: item.type == '2'
? showFace(item.name, item.projectTaskId, item)
: item.type == '4'
? showWork(item.name, item.projectTaskId, item)
: item.type == '5'
? showTest(item.name, item.projectTaskId, item)
: item.type == '10'
? showEval(
item.name,
item.projectTaskId,
item.type,
item
)
: item.type == '12'
? showVote(item.name, item.projectTaskId, item)
: item.type == '13'
? showWork(item.name, item.projectTaskId)
: null
"
>
管理
</div>
</div>
</div>
</a-collapse-panel>
</template>
</a-collapse>
<!-- 无数据创建任务 v-if="taskSyllabus.length == 0"-->
<router-link
:to="{ path: `/taskadd`, query: { projectId: projectId } }"
class="taskbox"
style="
background: linear-gradient(180deg, #ddeaff, #f0f8fe);
display: block;
"
v-if="taskSyllabus.length == 0"
>
<div class="leftt">
<img src="../../assets/images/taskpage/left2.png" />
</div>
<div class="photo">
<img src="../../assets/images/taskpage/picture8.png" />
</div>
<div class="rightt">
<img src="../../assets/images/taskpage/right2.png" />
</div>
<div class="centerbox" style="color: rgba(78, 166, 255, 1)">
创建任务
</div>
<div class="centermain">点击创建项目任务</div>
</router-link>
<!-- 无数据创建任务 -->
</div>
<div v-else-if="checkPer(permissions, createId)">
<div
class="taskbox"
@click="
() => {
routered.push({
path: `/taskadd`,
query: { projectId: projectId },
});
}
"
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>
</div>
<div style="display: flex; height: 20px"></div>
</div>
</a-tab-pane>
<a-tab-pane key="3" tab="学员">
<div class="split"></div>
<div class="content3">
<a-tabs v-model:activeKey="activeKey1">
<a-tab-pane key="8" tab="学员管理">
<TableStudent
:permissions="permissions"
:type="1"
:id="projectId"
:activeKey1="activeKey1"
:columns="stuColumns"
:stage="stage"
:visable="tabFlag"
:groupList="groupList"
:remarksTrue="remarksTrue"
:isNewEmployee="isNewEmployee"
>
<template #extension="{ data: { record } }">
<a-button @click="showStudent(record)" type="link"
>查看
</a-button>
<!-- 查看报名记录 -->
<a-button
v-if="isNewEmployee"
@click="showSignUpRecord(record)"
type="link"
>报名记录</a-button
>
<!-- 成绩单下载 -->
<a-button
v-if="isNewEmployee"
@click="downloadReport(record)"
:disabled="
record.approvalResults != 3 ||
record.finishTaskNum / record.totalTaskNum != 100
"
type="link"
>成绩单下载
</a-button>
<a-button
@click="settingTopFlag(record)"
v-if="checkPer(permissions, createId) && !isNewEmployee"
type="link"
>{{ record.topFlag ? "取消优秀" : "优秀学员" }}
</a-button>
<a-button
type="link"
v-if="checkPer(permissions, createId) && !isNewEmployee"
:disabled="record.isLeader === '1'"
@click="showChangeGroupModal(record)"
>换组
</a-button>
<a-button
type="link"
v-if="!isNewEmployee"
@click="modifyRemarks(record)"
>修改备注
</a-button>
</template>
</TableStudent>
</a-tab-pane>
<a-tab-pane
v-if="!isNewEmployee"
key="9"
tab="小组管理"
force-render
>
<div class="group">
<div class="groupleft">
<div class="groupname">小组名称:</div>
<a-input
v-model:value="valuestugn"
placeholder="请输入小组名称"
/>
</div>
<div class="groupright">
<div class="btn1" @click="searchGroup">
<img src="../../assets/images/courseManage/search0.png" />
<span class="btn1text">搜索</span>
</div>
<div class="btn2" @click="resetGroupName">
<img src="../../assets/images/courseManage/reset0.png" />
<span class="btn2text">重置</span>
</div>
</div>
</div>
<div class="second2" v-if="checkPer(permissions, createId)">
<div class="btn1" @click="showModal2()">
<img src="../../assets/images/courseManage/add0.png" />
<span class="btn1text">创建小组</span>
</div>
<div class="btn1" @click="showSubset">
<img src="../../assets/images/courseManage/reset4.png" />
<span class="btn1text">随机分组</span>
</div>
<div class="btn1" @click="exportGroup">
<span class="btn1text">导出小组</span>
</div>
<ImpoterGroupLeader
title="导入小组长"
@change="handleChangeGroupLeader"
:data="{ targetId: projectId, type: 1 }"
:url="`/admin/studentGroup/importGroup`"
>
<div class="btn1">
<span class="btn1text">导入小组长</span>
</div>
</ImpoterGroupLeader>
</div>
<!-- 小组列表 -->
<div class="groupmain">
<div
class="groupbox"
v-for="item in groupPageList"
:key="item.projectGroupId"
>
<div style="width: 90%">
<div class="grouptitle">
<div class="goodgruop" :title="item.groupName">
{{ item.groupName }}
</div>
<div class="more">
<span
style="color: rgba(0, 0, 0, 0.45); cursor: pointer"
>. . .</span
>
<div
class="moreItems"
v-if="checkPer(permissions, createId)"
>
<div class="sammo" @click="showModal2(item, true)">
编辑
</div>
<div class="sammo" @click="deleteGroupBtn(item.id)">
删除
</div>
</div>
</div>
</div>
<div class="leader">组长:{{ item.leaderName }}</div>
<div class="grocenter">
<div class="leader1">进度</div>
<a-progress
:percent="Math.round((item.completeRatio || 0) * 100)"
/>
</div>
<div
class="grofooter"
@click="
showMemberList(
item.id,
item.groupName,
item.groupMemberCount
)
"
>
<div class="ftext">组员名单 ></div>
<!-- <div class="peoples">
<div class="people1">
<img
src="../../assets/images/taskpage/people1.png"
/>
</div>
<div class="people2">
<img
src="../../assets/images/taskpage/people2.png"
/>
</div>
<div class="people3">
<img
src="../../assets/images/taskpage/people3.png"
/>
</div>
<div class="people4">
<img
src="../../assets/images/taskpage/people4.png"
/>
</div>
</div> -->
</div>
</div>
</div>
</div>
<!-- 小组列表分页 -->
<div
style="
width: 100%;
display: flex;
justify-content: center;
align-items: center;
margin-top: 12px;
"
>
<a-pagination
:showSizeChanger="false"
showQuickJumper="true"
hideOnSinglePage="true"
:pageSize="stupageSize"
:current="currentPageStu"
:total="groupTotal"
class="pagination"
@change="changePagination"
/>
</div>
</a-tab-pane>
</a-tabs>
</div>
</a-tab-pane>
<a-tab-pane v-if="!isNewEmployee" key="4" tab="公告">
<div class="split"></div>
<a-tabs v-model:activeKey="activeKeyNotice">
<a-tab-pane key="11" tab="公告">
<NoticePub
:permissions="permissions"
v-model:projectId="projectId"
></NoticePub>
</a-tab-pane>
<a-tab-pane key="12" tab="历史公告" force-render>
<NoticeHis
v-model:projectId="projectId"
:show="activeKeyNotice"
></NoticeHis>
</a-tab-pane>
</a-tabs>
</a-tab-pane>
<a-tab-pane key="5" tab="项目积分" v-if="rankFlag">
<ProjectScore
v-if="activeKey == '5'"
:permissions="permissions"
:projectId="projectId"
></ProjectScore>
</a-tab-pane>
<a-tab-pane v-if="!isNewEmployee" key="6" tab="排行榜">
<div class="split"></div>
<div class="content6">
<div class="title">排行榜</div>
<div class="line"></div>
<div class="search">
<div class="left">
<div class="time">
<div class="text">选择时间:</div>
<a-range-picker
v-model:value="valueDate"
style="border-radius: 8px; height: 40px; margin-left: 5px"
:placeholder="[' 开始时间', ' 结束时间']"
@change="rankTimeChange"
/>
</div>
</div>
<div class="right">
<div
class="btn btn1"
@click="rankSearch"
style="cursor: pointer"
>
<div class="img1"></div>
<div class="te">搜索</div>
</div>
<div
class="btn btn1"
@click="rankReset"
style="cursor: pointer"
>
<div class="img2"></div>
<div class="te">重置</div>
</div>
</div>
</div>
<div class="main">
<div class="rank">
<div class="rankhead">
<div class="inhead">
<div class="left">进度排行 Top10</div>
<div class="icon"></div>
<div class="right">
<a-select
v-model:value="valuestu1"
@change="jdSelectChange"
style="width: 80px; margin-right: 16px"
:options="rankjindu"
>
</a-select>
<a-select
v-model:value="valuestu2"
@change="jdSelectChange1"
style="width: 112px"
:options="rankjieduan"
></a-select>
</div>
</div>
</div>
<div class="tab">
<a-table
:columns="jindutablecolumns"
:data-source="jindutabledata"
:loading="processRankLoading"
expandRowByClick="true"
:scroll="{ y: 330 }"
@expand="expandTable"
:pagination="false"
/>
</div>
</div>
<div class="rank">
<div class="rankhead">
<div class="inhead">
<div class="left">积分排行 Top10</div>
<div class="right">
<a-select
v-model:value="valuestu3"
style="width: 80px"
@change="jfSelectChange"
:options="rankxuefen"
></a-select>
</div>
</div>
</div>
<div class="tab">
<a-table
:columns="xuefentablecolumns"
:data-source="xuefentabledata"
:loading="scoreRankLoading"
expandRowByClick="true"
:scroll="{ y: 330 }"
@expand="expandTable"
:pagination="false"
/>
</div>
</div>
<div class="rank">
<div class="rankhead">
<div class="inhead">
<div class="left">学时排行 Top10</div>
<div class="right">
<a-select
v-model:value="valuestu4"
@change="xsSelectChange"
style="width: 80px"
:options="rankxueshi"
></a-select>
</div>
</div>
</div>
<div class="tab">
<a-table
:columns="xueshitablecolumns"
:data-source="xueshitabledata"
:loading="studytimeRankLoading"
expandRowByClick="true"
:scroll="{ y: 330 }"
@expand="expandTable"
:pagination="false"
/>
</div>
</div>
</div>
</div>
</a-tab-pane>
<a-tab-pane v-if="!isNewEmployee" key="7" tab="证书">
<div class="split"></div>
<div v-if="!ischeckCertificate">
<!-- 没有证书显示的页面 -->
<div
v-if="3 > 7"
style="
display: flex;
justify-content: center;
align-items: center;
height: 600px;
flex-direction: column;
"
>
<div class="certificate" @click="addCertificate">
<img
style="width: 68px; height: 79px"
src="../../assets/images/taskpage/nocertificate2.png"
/>
<div style="font-size: 20px; color: #409eff; margin-top: 16px">
无证书
</div>
<div style="font-size: 14px; color: #878b92">
请点击新建证书
</div>
</div>
</div>
<!-- 有证书显示的页面 -->
<div v-else class="certificate1">
<div
class="addcertificate1"
@click="addCertificate"
v-if="checkPer(permissions, createId)"
>
<div class="addcertext">+添加证书</div>
</div>
<div
class="certificatelist"
v-for="(item, index) in certificatelist"
:key="index"
>
<div class="certificatelistMain">
<img
style="cursor: pointer; width: 140px; height: 200px"
:src="item.url"
alt=""
srcset=""
/>
<div class="cergetrules">
<div class="cergetrulesText">获取规则</div>
<div class="cergetrulesMain">
{{
item.finishType === 1
? "完成项目"
: item.finishType === 2
? "完成阶段"
: item.finishType === 3
? "完成任务"
: item.finishType === 4
? "考试合格"
: item.finishType === 5
? "获得积分"
: "-"
}}
</div>
<a-popover class="certificateMorebox">
<template #content>
<div
class="certificateMore"
style="
font-size: 12px;
font-weight: 400;
color: #333333;
"
>
<div
class="certificateMore1"
style="line-height: 22px; cursor: pointer"
@click="checkCertificate(item)"
>
查看
</div>
<div
v-if="checkPer(permissions, createId)"
class="certificateMore2"
style="line-height: 22px; cursor: pointer"
@click="editCertificate(item)"
>
编辑
</div>
<div
v-if="checkPer(permissions, createId)"
class="certificateMore3"
style="line-height: 22px; cursor: pointer"
@click="deleteCertificate(item)"
>
删除
</div>
</div>
</template>
<div>
更多
<img
style="width: 11px; height: 8px; margin-left: 2px"
src="../../assets/images/project/triangle.png"
/>
</div>
</a-popover>
<!-- <div class="certificateMorebox">
更多
</div> -->
</div>
</div>
<div class="certificateName">{{ item.name }}</div>
</div>
</div>
</div>
<!-- 查看证书显示的页面 -->
<TableCertificateStudent
:permissions="permissions"
:createId="createId"
:projectId="projectId"
:ACertificateCheckId="ACertificateCheckId"
v-if="ischeckCertificate"
v-model:ischeckCertificate="ischeckCertificate"
>
</TableCertificateStudent>
</a-tab-pane>
<a-tab-pane v-if="!isNewEmployee" key="8" tab="设置">
<div class="split"></div>
<a-tabs v-model:activeKey="activeSetKey">
<a-tab-pane key="12" tab="基本信息">
<div class="content7">
<!-- <div class="set_tit">
<span>基本信息</span>
</div> -->
<!-- <div class="line"></div> -->
<div class="set_body">
<!-- <div class="edit" @click="showEditProj">
<div class="img"></div>
<div class="ed">编辑</div>
</div> -->
<div
class="edit"
v-if="status != 3 && checkPer(permissions, createId)"
@click="toEdit"
>
<div class="img"></div>
<div class="ed">编辑</div>
</div>
<div class="set_content">
<div class="setc_name"><span>项目名称:</span></div>
<div class="setc_main">
<span style="color: #999999">{{ name }}</span>
</div>
</div>
<div class="set_content">
<div class="setc_name"><span>封面图:</span></div>
<div class="setc_main">
<img
style="width: 151px; height: 84px"
:src="picUrl"
alt=""
/>
</div>
</div>
<div class="set_content">
<div class="setc_name"><span>项目时间:</span></div>
<div class="setc_main">
<span style="color: #999999"
>{{ startTime }} {{ endTime }}</span
>
</div>
</div>
<div class="set_content">
<div class="setc_name"><span>项目经理:</span></div>
<div class="setc_main">
<span style="color: #999999">{{ manager }}</span>
</div>
</div>
<div class="set_content">
<div class="setc_name"><span>资源归属:</span></div>
<div class="setc_main">
<span style="color: #999999">{{ sourceBelong }}</span>
</div>
</div>
<div class="set_content">
<div class="setc_name"><span>项目级别:</span></div>
<div class="setc_main">
<span style="color: #999999">
<ProjectLevel
v-model:value="level"
:tag="true"
></ProjectLevel>
</span>
</div>
</div>
<div class="set_content">
<div class="setc_name"><span>培训体系:</span></div>
<div class="setc_main">
<span style="color: #999999">
<TrainClass
v-model:value="systemId"
:tag="true"
></TrainClass>
</span>
</div>
</div>
<div class="set_content">
<div class="setc_name"><span>同步学习记录:</span></div>
<div class="setc_main">
<a-radio v-model:checked="checkedSty" :disabled="true"
><span style="color: #333333"
>同步课程学习记录(如学员在课程库中拥有课程的学习记录,自动免修该课程)</span
></a-radio
>
</div>
</div>
<div class="set_content">
<div class="setc_name"><span>是否BOEU实施</span></div>
<div class="setc_main">
<a-radio v-model:checked="checkedBOEU" :disabled="true"
><span style="color: #333333">BOEU实施</span></a-radio
>
</div>
</div>
<div class="set_content">
<div class="setc_name"><span>积分排行榜</span></div>
<div class="setc_main">
<a-radio v-model:checked="rankFlag" :disabled="true"
><span style="color: #333333"
>是否显示积分</span
></a-radio
>
</div>
</div>
<div class="set_content" v-if="remark">
<div class="setc_name"><span>项目说明:</span></div>
<div class="setc_main">
<span style="color: #999999">{{ remark }}</span>
</div>
</div>
<div class="set_content" v-if="passInfo">
<div class="setc_name"><span>审核意见:</span></div>
<div class="setc_main">
<span style="color: #333333">{{ passInfo }}</span>
</div>
</div>
</div>
</div>
</a-tab-pane>
<a-tab-pane key="13" tab="共享文档">
<div class="sametab">
<div class="Gcon">
<div class="pad"></div>
<div class="Gin">
<div class="headone">
<div class="box"></div>
<div
class="onetitle"
v-if="checkPer(permissions, createId)"
>
上传共享文档
</div>
<div
class="oneedi"
v-if="checkPer(permissions, createId)"
>
<a-switch
size="small"
v-model:checked="docChecked"
@change="checkedClose"
></a-switch>
</div>
</div>
<div class="btnbox" style="margin: 20px">
<a-upload
v-if="
docChecked == true && checkPer(permissions, createId)
"
v-model:file-list="fileList"
name="file"
:headers="headers"
:action="uploadAction"
@change="handleChange"
>
<span
class="xkbtn"
style="cursor: pointer; font-size: 17px"
>上传</span
>
<img
src="@/assets/images/basicinfo/cloud.png"
style="
cursor: pointer;
width: 24px;
height: 24px;
margin-left: 8px;
margin-bottom: 3px;
"
alt=""
/>
</a-upload>
<div
v-if="
docChecked == true && checkPer(permissions, createId)
"
class="btnbox"
style="margin: 20px"
>
<span style="color: #999999">
支持pdf.ppt.pptx.doc.docx.xls.xlsx.jpeg.png.gif.zip
</span>
</div>
<div
v-for="item in fileList"
:key="item.uid"
style="
width: 500px;
display: flex;
margin-bottom: 30px;
justify-content: space-between;
align-items: center;
"
class="docListStyle"
>
<!-- <img
src="@/assets/images/basicinfo/download.png"
style="
cursor: pointer;
width: 40px;
height: 40px;
margin-right: 40px;
"
alt=""
/> -->
<img
v-if="
item.name.indexOf('jpg') !== -1 ||
item.name.indexOf('jpeg') !== -1 ||
item.name.indexOf('png') !== -1
"
style="width: 27px; height: 32px; margin-right: 40px"
src="@/assets/images/coursewareManage/pngpic.png"
/>
<div v-else>
<img
v-if="item.name.indexOf('doc') !== -1"
style="
width: 27px;
height: 32px;
margin-right: 40px;
"
src="@/assets/images/coursewareManage/docpic.png"
/>
<div v-else>
<img
v-if="item.name.indexOf('xls') !== -1"
style="
width: 27px;
height: 32px;
margin-right: 40px;
"
src="@/assets/images/coursewareManage/xlspic.png"
/>
<div v-else>
<img
v-if="item.name.indexOf('ppt') !== -1"
style="
width: 27px;
height: 32px;
margin-right: 40px;
"
src="@/assets/images/coursewareManage/pptpic.png"
/>
<div v-else>
<img
v-if="item.name.indexOf('pdf') !== -1"
style="
width: 27px;
height: 32px;
margin-right: 40px;
"
src="@/assets/images/coursewareManage/pdfpic.png"
/>
<div v-else>
<img
v-if="item.name.indexOf('zip') !== -1"
style="
width: 27px;
height: 32px;
margin-right: 40px;
"
src="@/assets/images/coursewareManage/zippic.png"
/>
<img
v-else
style="
width: 27px;
height: 32px;
margin-right: 40px;
"
src="@/assets/images/coursewareManage/docpic.png"
/>
</div>
</div>
</div>
</div>
</div>
<span
style="
font: oblique bold 16px Sans-serif;
width: 300px;
display: block;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
"
:title="item.name"
>{{ item.name }}</span
>
<a
href="javascript:void(0);"
v-if="checkPer(permissions, createId)"
@click="
downloadFile(
item.response ? item.response.data : ''
)
"
style="margin-left: 5px"
>下载</a
>
<span
v-if="checkPer(permissions, createId)"
style="color: #4ea6ff; float: right; cursor: pointer"
@click="deFile(item.uid)"
>删除</span
>
</div>
</div>
</div>
</div>
</div>
</a-tab-pane>
</a-tabs>
</a-tab-pane>
</a-tabs>
</div>
<!-- 时间管理抽屉 -->
<time-manage
:permissions="permissions"
:createId="createId"
v-model:Tvisible="visible"
:projectTaskId="projectTaskId"
:title="showTimeText"
:itemsType="itemstype"
/>
<!-- 在线、案例等管理抽屉 -->
<ProjectOnlineManage
:permissions="permissions"
:createId="createId"
v-model:Tvisible="onlineVisible"
:projectTaskId="projectTaskId"
:title="showTimeText"
:itemsType="itemstype"
:datasource="commonData"
:levelName="commonLevelName"
/>
<!-- 面授管理抽屉 -->
<ProjectFaceTaskManage
:permissions="permissions"
:createId="createId"
:type="1"
v-model:visible="FaceVisivle"
:datasource="projectTaskInfo"
/>
<!-- 作业管理抽屉 -->
<ProjectHomeWorkManage
:permissions="permissions"
:createId="createId"
v-model:Wvisible="Wvisible"
:projectTaskId="projectTaskId"
:title="showWorkText"
:projectTaskInfo="projectTaskInfo"
/>
<!-- 系统考试管理抽屉 -->
<ProjectExamManage
:permissions="permissions"
:createId="createId"
v-model:TMvisible="TMvisible"
:title="showTestText"
:projectTaskId="projectTaskId"
:datasource="examData"
/>
<!-- 外部考试管理抽屉 -->
<ProjectExternalExamManage
:permissions="permissions"
:createId="createId"
v-model:TMvisibleExternal="TMvisibleExternal"
:title="showTestText"
:projectTaskId="projectTaskId"
:datasource="examData"
/>
<!-- 投票管理抽屉 -->
<ProjectVoteManage
:permissions="permissions"
:createId="createId"
v-model:ProjectVoteModelVisible="projectVoteModelVisible"
:title="voteModelVisibleTitle"
:levelName="voteLevelName"
:datasource="voteData"
/>
<!-- 测评抽屉 -->
<ProjectEvalManage
:permissions="permissions"
:createId="createId"
v-model:Evalvisible="Evalvisible"
:title="showTestText"
:projectTaskId="projectTaskId"
:itemsType="evaltype"
:datasource="evalData"
/>
<!-- 添加证书抽屉 -->
<AddCertificate
:permissions="permissions"
:createId="createId"
v-model:ACertificate="ACertificate"
v-model:projectId="projectId"
v-model:ACertificateEdit="ACertificateEdit"
:getCertificate="getCertificate"
:ACertificateEditId="ACertificateEditId"
/>
<!-- 创建证书抽屉 -->
<CreateCertificate v-model:CCertificate="CCertificate" />
<!-- 预览 -->
<a-modal
:title="null"
width="60%"
:footer="null"
v-model:visible="modal1Visible"
style="display: flex; justify-content: center; align-items: center"
@ok="setModal1Visible(false)"
>
<img
:width="screenWidth * 0.55"
src="https://picb6.photophoto.cn/32/552/32552236_1.jpg"
alt=""
srcset=""
/>
</a-modal>
<!-- 学员(小组管理)创建小组抽屉 -->
<subset-manage
v-model:Svisible="subsetVisivle"
:projectId="projectId"
v-model:getGroup="getGroup"
/>
<!-- 学员管理-添加学员抽屉 -->
<!-- <stu-add v-model:Stuvisible="Stuvisible" /> -->
<!-- 添加学员抽屉 -->
<proj-check-ship
:permissions="permissions"
:createId="createId"
v-model:ProjCheckvisible="Stuvisible"
:selectProjectId="projectId"
v-model:addAuthList="addAuthList"
:authClassify="authClassify"
classify="project"
:type="2"
/>
<!-- 学员管理-导入学员抽屉 -->
<import-stu v-model:Importvisible="Importvisible" />
<!-- 查看学员 传入查看学员的id-->
<see-stu
v-model:Seevisible="Seevisible"
v-model:checkStuId="checkStuId"
v-model:projectId="projectId"
v-model:certificateNum="certificateNum"
/>
<!-- 学员换组 -->
<change-group
v-model:Changevisible="Changevisible"
v-model:projectId="projectId"
v-model:ChangeGroupStuId="ChangeGroupStuId"
v-model:ChangeGroupStuName="ChangeGroupStuName"
v-model:ChangeGroupId="ChangeGroupId"
@changeD="changeGrouped"
/>
<!-- 组员名单抽屉 -->
<member-list
v-model:Lvisible="Lvisible"
v-model:chooseGroupId="chooseGroupId"
v-model:chooseGroupName="chooseGroupName"
v-model:groupMemberCount="groupMemberCount"
v-model:projectId="projectId"
:permissions="permissions"
:createId="createId"
/>
<!-- 面授学员抽屉 -->
<RouterFaceStu
:permissions="permissions"
:createId="createId"
v-model:FSvisible="FSvisible"
:datasource="facestudent"
:type="1"
:courseName="name"
/>
<!-- 活动直播考勤抽屉 -->
<active-attendance
:permissions="permissions"
:createId="createId"
v-model:AAvisible="AAvisible"
:datasource="liveData"
:title="showKaoqinText"
types="1"
classify="2"
/>
<!-- 概览(无数据)-项目发布弹窗 -->
<div>
<a-modal
v-model:visible="pubproject"
:title="null"
@ok="closeModal"
:footer="null"
:closable="false"
:centered="true"
wrapClassName="pubproject"
width="679px"
height="437px"
>
<div
class="modalHeader"
style="
width: 100%;
height: 68px;
display: flex;
align-items: center;
justify-content: space-between;
"
>
<div class="headerLeft" style="margin-left: 32px">
<span style="width: 15px; height: 15px"
><img src="../../assets/images/taskpage/pub.png"
/></span>
<span
class="headerLeftText"
style="font-size: 16px; margin-left: 10px"
>项目发布</span
>
</div>
<div style="cursor: pointer; margin-right: 32px" @click="closeModal">
<img
style="width: 22px; height: 22px"
src="../../assets/images/basicinfo/close22.png"
/>
</div>
</div>
<div class="modalMain">
<div class="projectname">管理者进阶-腾飞班1</div>
<div class="projecttime">
<span class="timeti">项目时间:</span
><span class="timeme">2022/08/01-2022/08/30</span>
</div>
<div class="projectbox">
<div class="promessage">
<div class="messageme">项目信息</div>
<div class="messagege">当前项目共0个阶段0个任务</div>
</div>
<div class="stumessage">
<div class="messageme1">学员信息</div>
<div class="messagege1">项目共0名学员</div>
</div>
</div>
<div class="send">
<a-switch v-model:checked="checked" size="small" />
<span class="sendtext">发送项目通知</span>
</div>
<div class="ckb">
<a-checkbox v-model:checked="checked1"
><span class="sendpeo">发给老师</span></a-checkbox
>
<a-checkbox v-model:checked="checked2"
><span class="sendpeo">发给学员</span></a-checkbox
>
</div>
<div class="pubtn">
<a-button class="pubtn2" @click="closeModal">取消</a-button>
<a-button class="pubtn2" @click="closeModal">发布</a-button>
</div>
</div>
</a-modal>
</div>
<!-- 概览(无数据)-项目发布弹窗 -->
<!-- 学员-创建小组弹窗 -->
<div>
<a-modal
v-model:visible="stugroup"
:title="null"
@ok="closeModal2"
:footer="null"
:closable="false"
:centered="true"
wrapClassName="doublepro"
width="624px"
height="332px"
>
<div
class="modalHeader"
style="
width: 100%;
height: 68px;
display: flex;
align-items: center;
justify-content: space-between;
"
>
<div class="headerLeft" style="margin-left: 32px">
<span class="headerLeftText" style="font-size: 16px">{{
!groupInfo?.id ? "创建小组" : "编辑小组"
}}</span>
</div>
<div style="cursor: pointer; margin-right: 32px" @click="closeModal2">
<img
style="width: 22px; height: 22px"
src="../../assets/images/basicinfo/close22.png"
/>
</div>
</div>
<div class="modalMain">
<div class="name">
<div class="star" style="margin-top: -4px">
<img
style="width: 10px; height: 10px"
src="../../assets/images/basicinfo/asterisk.png"
/>
</div>
<div class="inname">小组名称:</div>
<div class="in">
<a-input
v-model:value="groupInfo.groupName"
placeholder="请输入小组名称"
style="border-radius: 8px; height: 40px"
:maxlength="100"
show-count
/>
</div>
</div>
<div class="name">
<div class="star" style="margin-top: -4px">
<img
style="width: 10px; height: 10px"
src="../../assets/images/basicinfo/asterisk.png"
/>
</div>
<div class="inname">组员人数:</div>
<div class="in">
<a-input-number
:min="0"
:max="999999"
:precision="0"
style="width: 395px; height: 40px; border-radius: 8px"
v-model:value="groupInfo.groupMemberCount"
></a-input-number>
</div>
</div>
<div class="name">
<div class="star" style="margin-top: -4px">
<img
style="width: 10px; height: 10px; margin-left: 15px"
src="../../assets/images/basicinfo/asterisk.png"
/>
</div>
<div class="inname">小组长:</div>
<div class="in">
<ProjectManager
v-model:value="groupInfo.leaderId"
v-model:name="groupInfo.leaderName"
></ProjectManager>
</div>
</div>
<div class="pubtn">
<a-button
class="pubtn2"
@click="closeModal2"
style="margin-right: 32px"
>取消</a-button
>
<a-button class="pubtn2" :loading="buttonLoading" @click="createG"
>确定</a-button
>
</div>
</div>
</a-modal>
</div>
<!-- 学员-创建小组弹窗 -->
<!-- 取消学员弹窗 -->
<div>
<a-modal
v-model:visible="canclestu"
:footer="null"
:closable="close"
wrapClassName="canclestu"
centered="true"
@cancel="cancelyou"
>
<div class="delete">
<div class="del_header"></div>
<div class="del_main">
<div class="header">
<div class="icon1"></div>
<span>提示</span>
</div>
<div class="body">
<span>您是否授予此学员优秀学员称号?</span>
</div>
<div class="del_btnbox">
<div
class="del_btn btn2"
@click="cancelyou"
style="margin-right: 32px"
>
<div class="btnText">取消</div>
</div>
<div class="del_btn btn2" @click="closeModal1">
<div class="btnText">确定</div>
</div>
</div>
</div>
</div>
</a-modal>
</div>
<!-- 取消学员弹窗 -->
<!-- 优秀学员弹窗 -->
<div>
<a-modal
v-model:visible="canclestu1"
:footer="null"
:closable="close"
wrapClassName="canclestu1"
centered="true"
>
<div class="delete">
<div class="del_header"></div>
<div class="del_main">
<div class="header">
<div class="icon1"></div>
<span>提示</span>
</div>
<div class="body">
<span>您是否取消此学员优学员称号?</span>
</div>
<div class="del_btnbox">
<div
class="del_btn btn2"
@click="cancelcanyou"
style="margin-right: 32px"
>
<div class="btnText">取消</div>
</div>
<div class="del_btn btn2" @click="closeModal3">
<div class="btnText">确定</div>
</div>
</div>
</div>
</div>
</a-modal>
</div>
<!-- 取消学员弹窗 -->
<!-- 删除学员弹窗 -->
<div>
<a-modal
v-model:visible="deleteOneStu"
:footer="null"
:closable="close"
wrapClassName="canclestu1"
centered="true"
>
<div class="delete">
<div class="del_header"></div>
<div class="del_main">
<div class="header">
<div class="icon1"></div>
<span>提示</span>
</div>
<div class="body">
<span>您确定要删除此学员吗</span>
</div>
<div class="del_btnbox">
<div
class="del_btn btn2"
@click="closeDeleteOne"
style="margin-right: 32px"
>
<div class="btnText">取消</div>
</div>
<div class="del_btn btn2" @click="closeDeleteOneConfirm">
<div class="btnText">确定</div>
</div>
</div>
</div>
</div>
</a-modal>
</div>
<!-- 删除学员弹窗 -->
<!-- 删除弹窗 -->
<div>
<a-modal
v-model:visible="delete_hs"
:footer="null"
:closable="closableQR"
wrapClassName="DelModal"
style="margin-top: 400px"
@cancel="delete_exit"
>
<div class="delete" :style="{ display: delete_hs ? 'block' : 'none' }">
<div class="del_header"></div>
<div class="del_main">
<div class="header">
<div class="del-icon"></div>
<span>提示</span>
<div class="close_exit" @click="delete_exit"></div>
</div>
<div class="body">
<span>您确定要删除此课程吗</span>
</div>
<div class="del_btnbox">
<div class="del_btn btn2" style="margin-right: 32px">
<div class="btnText" @click="delete_exit">取消</div>
</div>
<div class="del_btn btn2">
<div class="btnText" @click="delete_exit">确定</div>
</div>
</div>
</div>
</div>
</a-modal>
</div>
<!-- 删除弹窗 -->
<!-- 批量删除弹窗 -->
<div>
<a-modal
v-model:visible="allDelete"
:footer="null"
:closable="close"
wrapClassName="canclestu1"
centered="true"
>
<div class="delete">
<div class="del_header"></div>
<div class="del_main">
<div class="header">
<div class="icon1"></div>
<span>提示</span>
</div>
<div class="body">
<span>您确定批量删除吗?</span>
</div>
<div class="del_btnbox">
<div
class="del_btn btn2"
@click="closeCancelDelete"
style="margin-right: 32px"
>
<div class="btnText">取消</div>
</div>
<div class="del_btn btn2" @click="closeAllDelete">
<div class="btnText">确定</div>
</div>
</div>
</div>
</div>
</a-modal>
</div>
<!-- 编辑项目弹窗 -->
<proj-set v-model:editHs="editHs" v-model:projectId="projectId" />
<!-- 发布弹窗 -->
<a-modal
v-model:visible="projectPub"
:title="null"
:footer="null"
:closable="false"
wrapClassName="projectPub"
width="679px"
height="437px"
>
<div
class="modalHeader"
style="
width: 100%;
height: 68px;
display: flex;
align-items: center;
justify-content: space-between;
"
>
<div class="headerLeft" style="margin-left: 32px">
<span style="width: 15px; height: 15px"
><img src="../../assets/images/taskpage/pub.png"
/></span>
<span
class="headerLeftText"
style="font-size: 16px; margin-left: 10px"
>项目发布</span
>
</div>
<div
style="cursor: pointer; margin-right: 32px"
@click="closeProjectPub"
>
<img
style="width: 22px; height: 22px"
src="../../assets/images/basicinfo/close22.png"
/>
</div>
</div>
<div class="modalMain">
<div class="projectname">{{ releaseProjectName }}</div>
<div class="projecttime" v-if="startTime">
<span class="timeti">项目时间:</span
><span class="timeme">{{ startTime }}~{{ endTime }}</span>
</div>
<div class="projectbox">
<div class="promessage">
<div class="messageme">项目信息</div>
<div class="messagege">
当前项目共{{ projectStages }}个阶段,{{ projectTasks }}个任务
</div>
</div>
<div class="stumessage">
<div class="messageme1">学员信息</div>
<div class="messagege1">项目共{{ projectStudentsNum }}名学员</div>
</div>
</div>
<!-- <div class="send">
<a-switch v-model:checked="checked" size="small" />
<span class="sendtext">发送路径通知</span>
</div>
<div class="ckb">
<a-checkbox v-model:checked="checkedTeacher"
><span class="sendpeo">发给老师</span></a-checkbox
>
<a-checkbox v-model:checked="checkStu"
><span class="sendpeo">发给学员</span></a-checkbox
>
</div> -->
<div class="pubtn">
<a-button class="pubtn2" @click="closeProjectPub">取消</a-button>
<a-button class="pubtn2" @click="releaseProject">发布</a-button>
</div>
</div>
<!-- 加载动画 -->
<div
class="aeLoading"
:style="{ display: projectPubLoading ? 'flex' : 'none' }"
>
<a-spin :spinning="projectPubLoading" />
</div>
</a-modal>
<!-- 撤回弹窗 -->
<a-modal
v-model:visible="backModal"
:footer="null"
:closable="closeBack"
wrapClassName="CopyModal"
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="closeBackModal"></div>
</div>
<div class="body">
<span>是否撤回项目</span>
<div class="back">(项目撤回后学员进度保留,发布后可继续学习)</div>
</div>
<div class="del_btnbox">
<div
class="del_btn btn2"
@click="closeBackModal"
style="margin-right: 32px"
>
<div class="btnText">取消</div>
</div>
<div class="del_btn btn2" @click="recallProject">
<div class="btnText">确定</div>
</div>
</div>
</div>
</div>
</a-modal>
<!-- 项目撤回审核弹窗 -->
<a-modal
v-model:visible="recallReviewModal"
:footer="null"
:closable="false"
wrapClassName="CopyModal"
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="closeRecallReviewModal"></div>
</div>
<div class="body">
<span>您确定要撤回审核吗</span>
<div class="back"></div>
</div>
<div class="del_btnbox">
<div
class="del_btn btn2"
@click="closeRecallReviewModal"
style="margin-right: 32px"
>
<div class="btnText">取消</div>
</div>
<div class="del_btn btn2" @click="recallReviewProject">
<div class="btnText">确定</div>
</div>
</div>
</div>
</div>
</a-modal>
<!-- 结束项目弹窗 -->
<a-modal
v-model:visible="stopModal"
:footer="null"
:closable="closeStop"
wrapClassName="CopyModal"
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="closeStopModal"></div>
</div>
<div class="body">
<span>是否结束项目</span>
<div class="back">
(项目结束后学员将无法继续学习,此操作不可逆)
</div>
</div>
<div class="del_btnbox">
<div
class="del_btn btn2"
@click="closeStopModal"
style="margin-right: 32px"
>
<div class="btnText">取消</div>
</div>
<div class="del_btn btn2" @click="finishProject">
<div class="btnText">确定</div>
</div>
</div>
</div>
</div>
</a-modal>
<!-- 存为模版弹窗 -->
<a-modal
v-model:visible="startModal"
:footer="null"
:closable="closeStart"
wrapClassName="CopyModal"
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="closeStartModal"></div>
</div>
<div class="body">
<span>您确定要存为模版吗</span>
</div>
<div class="del_btnbox">
<div
class="del_btn btn2"
@click="closeStartModal"
style="margin-right: 32px"
>
<div class="btnText">取消</div>
</div>
<div class="del_btn btn2" @click="templateProject">
<div class="btnText">确定</div>
</div>
</div>
</div>
</div>
</a-modal>
<!-- 二维码弹窗 -->
<two-dimensional-code
v-model:codevisible="codevisible"
:codeInfo="codeInfo"
index="0"
type="课程二维码"
/>
<!-- 二维码弹窗 -->
<!-- 换组弹窗 -->
<ChangeGroupModal
v-model:changegroupV="changegroupV"
:groupList="groupList"
:checkgroupStuId="checkgroupStuId"
/>
<!-- 换组弹窗 -->
<!-- 面授课开课弹框 -->
<AddOpenCourse
@call-parent-method="getTaskListAll"
ref="coursePlanRef"
:type="1"
/>
<!-- 修改备注弹窗 -->
<a-modal
v-model:visible="showRemarks"
:footer="null"
closable="false"
style="margin-top: 400px"
@cancel="of_remarks"
>
<div
class="selectonlineface"
:style="{ display: showRemarks ? 'block' : 'none' }"
>
<div class="bg_headers"></div>
<div class="bg_main">
<div class="bg_main_header">
<div>修改备注</div>
<div class="bg_main_header_close" @click="of_remarks"></div>
</div>
<div class="bg_body">
<div class="bg_body_bt" style="align-items: flex-start">
<!-- <div class="bg_body_bttext" style="margin-top: 5px;">修改备注</div> -->
<div class="bg_body_input">
<a-input v-model:value="remarks" placeholder="请输入" />
</div>
</div>
<div class="bg_footer">
<div class="btn btn6" @click="of_remarks">
<div class="btnText">取消</div>
</div>
<a-button class="btn btn6" @click="RemarksUpdata">
确定
</a-button>
</div>
</div>
</div>
</div>
</a-modal>
<!-- 查看报名记录 -->
<a-modal
v-model:visible="showSignUpRecordModal"
title="报名记录"
:footer="null"
width="700px"
>
<div style="padding: 20px">
<a-table
:columns="signupRecordColumns"
:data-source="signupRecordList"
:pagination="true"
:loading="signupRecordLoading"
row-key="id"
bordered
>
<template #status="{ text, record }">
<span
:style="{
color:
record.enrollStatusCode === 3
? '#52c41a'
: record.enrollStatusCode === 2
? '#1890ff'
: '#ff4d4f',
}"
>{{ text }}</span
>
</template>
</a-table>
</div>
</a-modal>
</div>
</template>
<script lang="jsx">
import AddOpenCourse from "@/components/drawers/AddOpenCourse.vue";
import { reactive, toRefs, onMounted, watch, computed,ref } from "vue";
import { useRoute } from "vue-router";
import { useRouter } from "vue-router";
import TimeManage from "../../components/drawers/TimeManage";
import ProjectFaceTaskManage from "../../components/drawers/project/ProjectFaceTaskManage";
import ProjectOnlineManage from "../../components/drawers/project/ProjectOnlineManage";
import ProjectHomeWorkManage from "../../components/drawers/project/ProjectHomeWorkManage";
import ProjectExamManage from "../../components/drawers/project/ProjectExamManage";
import ProjectExternalExamManage from "../../components/drawers/project/ProjectExternalExamManage";
import ProjectEvalManage from "../../components/drawers/project/ProjectEvalManage";
import AddCertificate from "../../components/drawers/project/AddCertificate";
import CreateCertificate from "../../components/drawers/project/CreateCertificate";
import ProjectVoteManage from "../../components/drawers/project/ProjectVoteManage";
import SubsetManage from "../../components/drawers/SubsetManage";
import MemberList from "../../components/drawers/MemberList";
import ActiveAttendance from "../../components/drawers/ActiveAttendance";
import ProjCheckShip from "../../components/drawers/ProjCheckPower";
import ImportStu from "../../components/drawers/ImportStu";
import RouterFaceStu from "../../components/drawers/router/RouterFaceStu";
import SeeStu from "../../components/drawers/SeeStu";
import ChangeGroup from "../../components/drawers/ChangeGroup";
import NoticePub from "../../components/drawers/NoticePub";
import NoticeHis from "../../components/drawers/NoticeHis";
import { storage } from "../../api/storage";
import * as api from "../../api/index1";
import * as apis from "../../api/index";
import * as apiproj from "../../api/index";
import * as student from "../../api/student";
import {
getProjStu,
deleteStu,
getGroupList,
deleteGroup,
editGroup,
updateStudent,
} from "../../api/indexProjStu";
import { message, Modal } from "ant-design-vue";
import * as apitl from "../../api/index";
import { getTask } from "../../api/indexTaskadd";
import { editProjDoc } from "../../api/indexTaskadd";
import {getCookieForName, toDate} from "../../api/method";
import projSet from "../../components/Modals/projSet";
import { overview,downloadTranscript } from "../../api/indexProjStu";
import TwoDimensionalCode from "../../components/TwoDimensionalCode.vue";
import ProjectScore from "../../components/drawers/ProjectScore";
import { useStore } from "vuex";
import ProjectLevel from "@/components/project/ProjectLevel";
import TrainClass from "@/components/project/TrainClass";
import ProjectManager from "@/components/project/ProjectManagerNew";
import TableStudent from "@/components/student/TableStudent";
import TableCertificateStudent from "@/components/student/TableCertificateStudent";
import { getStuPage,courseData } from "@/api/index1";
import ChangeGroupModal from "@/components/student/ChangeGroupModal.vue";
import { checkPer,fixDoublePer } from "@/utils/utils";
import ImpoterGroupLeader from "@/components/drawers/project/ImpoterGroupLeader.vue";
import qrCode from "@/utils/qrCode";
import {request, boeRequest} from "@/api/request";
import { PROJECT_RELEASE} from "@/api/apis";
export default {
name: "taskPage",
components: {
ProjectLevel,
TrainClass,
RouterFaceStu,
TimeManage,
ProjectFaceTaskManage,
ProjectOnlineManage,
ProjectHomeWorkManage,
ProjectExamManage,
ProjectExternalExamManage,
ProjectEvalManage,
SubsetManage,
MemberList,
ActiveAttendance,
// StuAdd,
ProjCheckShip,
ImportStu,
SeeStu,
ChangeGroup,
NoticePub,
ProjectScore,
projSet,
NoticeHis,
TwoDimensionalCode,
ProjectManager,
TableStudent,
TableCertificateStudent,
AddCertificate,
CreateCertificate,
ProjectVoteManage,
ChangeGroupModal,
ImpoterGroupLeader,
AddOpenCourse
},
setup() {
const exportScore = (item) => {
window.open(`${process.env.VUE_APP_BASE_API}/admin/assessment/manage/export?type=${1}&pid=${item.id}&courseId=${item.courseId}`)
};
const coursePlanRef = ref();
const openCourse = async (item,key,index) => {
await apitl.getDraftTask({projectId: item.projectId}).then((res)=>{
coursePlanRef.value.openDrawer(res.data.data.stageList[index].taskDraftDtoList.find(fin=>fin.projectTaskId === item.id));
})
}
// 报名记录弹窗与列配置
const showSignUpRecordModal = ref(false);
const signupRecordLoading = ref(false);
const signupRecordColumns = [
// { title: "姓名", dataIndex: "name", align: "center" },
// { title: "工号", dataIndex: "workNo", align: "center" },
{
title: "状态",
dataIndex: "status",
align: "center",
slots: { customRender: "status" },
},
{ title: "时间", dataIndex: "applierAtStr", align: "center" },
{ title: "描述", dataIndex: "desc", align: "left" },
];
const signupRecordList = ref([]);
// 状态码映射
const getStatusText = (code) => {
const statusMap = {
1: "报名失败",
2: "审核中",
3: "审核通过",
4: "审核不通过"
};
return statusMap[code] || "未知";
};
const showSignUpRecord = async (record) => {
if (!state.projectId || !record.studentId) {
message.warning("缺少必要参数");
return;
}
showSignUpRecordModal.value = true;
signupRecordLoading.value = true;
signupRecordList.value = [];
try {
const params = {
pid: state.projectId,
stuId: record.studentId
};
const res = await api.getElnBoeEnrollListByStudent(params);
if (res.data.code === 200 && res.data.success && res.data.data) {
// 将接口返回的数据映射到表格列
signupRecordList.value = res.data.data.map((item, index) => ({
id: index + 1,
status: getStatusText(item.enrollStatusCode),
enrollStatusCode: item.enrollStatusCode,
applierAtStr: item.applierAtStr || "",
desc: item.enrollMark || ""
}));
// signupRecordList.value = [
// {
// "pid": "1139",
// "stuId": "965342027497607168",
// "applierAt": "1762944292267",
// "applierAtStr": "2025-11-12 18:44:52", //报名时间
// "status": '报名失败', //状态1报名失败、2审核中、3审核通过、4审核不通过
// "desc": "报名失败的错误描述" //描述
// }
// ]
} else {
message.error(res.msg || "获取报名记录失败");
signupRecordList.value = [];
}
} catch (error) {
console.error("获取报名记录失败:", error);
message.error("获取报名记录失败,请稍后重试");
signupRecordList.value = [];
} finally {
signupRecordLoading.value = false;
}
};
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: 1,
offcourseId: item.courseId,
taskId: item.id,
};
await courseData(planParams).then((res)=>{
qrCodeItems.value = res.data.data.map((dataItem) => ({
...dataItem,
courseName: item.name,
}));
if(qrCodeItems.value.length==1){
qrCode({
title: "【签到】二维码",
courseName: state.name,
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.name,
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: 1,
offcourseId: item.courseId,
taskId: item.id,
};
await courseData(planParams).then((res)=>{
const qrCodeItemspgItem = res.data.data.map((dataItem) => ({
...dataItem,
courseName: item.name,
}));
qrCodeItemspg.value = qrCodeItemspgItem.filter(item => item.assessmentId !== null);
if(qrCodeItemspg.value.length==1){
const courseName = state.name
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}`,
});
}
})
}
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.name
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 store = useStore();
const route = useRoute();
const headers = { token: getCookieForName("token") };
const state = reactive({
electiveCourseCount:0,
isNewEmployee: false,
createId: "",
permissions: "",
screenHeight: document.body.clientHeight,
screenWidth: document.body.clientWidth,
editRecord: {},
choosedStageIndex: 0,
hasTask: false,
tabFlag: true,
buttonLoading: false,
stage: [],
stuColumns: [
{
title: "岗位",
dataIndex: "studentJobName",
key: "studentJobName",
width: 80,
align: "center",
className: "h",
ellipsis: true,
},
{
title: "证书数量",
dataIndex: "certCount",
key: "certCount",
width: 80,
align: "center",
className: "h",
ellipsis: true,
},
{
title: "学习状态",
dataIndex: "status",
key: "status",
width: 80,
align: "center",
className: "h",
ellipsis: true,
customRender: ({ record }) => (
<div>
{record.totalTaskNum == 0 ? (
<div>未开始</div>
) : record.finishTaskNum == 0 ? (
<div>未开始</div>
) : record.finishTaskNum == record.totalTaskNum ? (
<div>已完成</div>
) : (
<div>进行中</div>
)}
</div>
),
},
{
title: "最近学习时间",
dataIndex: "lastLearnTime",
key: "lastLearnTime",
width: 120,
align: "center",
className: "h",
ellipsis: true,
},
{
title: "备注",
dataIndex: "batch",
key: "batch",
width: 120,
align: "center",
className: "h",
ellipsis: true,
},
],
loading: false,
projectId: route.query.projectId,
isbj: storage.get("isbj") ? JSON.parse(storage.get("isbj")) : null,
// pN: storage.get("pN") ? JSON.parse(storage.get("pN")) : null,
pN: storage.get("pN"),
goodstuList: [
{
id: 1,
value: "全部",
label: "全部",
},
{
id: 2,
value: "普通学员",
label: "普通学员",
},
{
id: 3,
value: "优秀学员",
label: "优秀学员",
},
],
bum: [
// {
// id: 1,
// value: "",
// label: "",
// },
],
changeGoods: [], //更改是否优秀的id数组
choosedStageId: 1, // 选择的阶段id
choosedStageName: "", //阶段名称
activeSetKey: "12", //12-基础信息 13-共享文档
docChecked: true,
//学员信息列表
tabledata: [
// {
// key: 1,
// name: "sss",
// bum: "c",
// gangw: "ss",
// group: "sss",
// progress: "sss",
// diploma: "0",
// stutime: "20202",
// putin: "shs",
// excellent: true,
// studentId: 22,
// },
],
//小组信息列表
groupList: [],
isBatch: false, // 批量
// stuName: "", //搜索的学员姓名
// stuGroup: "", //搜索的学员小组名称
// stuBum: "", //搜索的学员小组部门
// stuGood: "", //搜索的学员是否优秀
total: 0, //学员列表数据总条数
stupageSize: 10,
currentPageStu: 1, //当前页
choosed: 0, //勾选的学员总数
selectedRowKeys: [], //选择的学员
selectedRows: [], //选择的学员的id值
chooseDeleteOne: [], //删除的单个学员id
// projectId:"", //项目任务id
projectTaskId: "", //项目任务任务id
//进度排行学员
rankjindu: [
{ value: 0, label: "学员" },
{ value: 1, label: "小组" },
],
valuestu1: 0,
//进度排行阶段
rankjieduan: [],
valuestu2: 0,
//积分排行
rankxuefen: [
{ value: 0, label: "学员" },
{ value: 1, label: "小组" },
],
valuestu3: 0,
//学时排行
rankxueshi: [
{ value: 0, label: "学员" },
{ value: 1, label: "小组" },
],
valuestu4: 0,
visible: false, //时间管理
onlineVisible: false, //在线管理
FaceVisivle: false, //面授管理
subsetVisivle: false, //随机小组
Lvisible: false, //组员名单
FSvisible: false, //面授学员
AAvisible: false, //活动考勤
Wvisible: false, //作业管理
projectVoteModelVisible: false, // 投票管理
TMvisible: false, //系统考试管理
TMvisibleExternal: false, // 外部考试管理
Evalvisible: false, //测评管理
ACertificate: false, //证书添加
ACertificateEdit: false, //是否是编辑证书
ACertificateEditId: null, //编辑证书的id
CCertificate: false, //证书创建
ischeckCertificate: false, //是否显示查看证书
ACertificateCheckId: null, //查看证书学员的id
Stuvisible: false, //添加学员
Importvisible: false, //导入学员
Seevisible: false, //查看学员
certificateNum: 0,
Changevisible: false, //学员换组
editHs: false, //编辑弹窗
delete_hs: false, //删除弹窗
closeCopy: false, //面授二维码关闭图标
zhibModal: false, //直播二维码弹窗
huodModal: false, //活动二维码弹窗
allDelete: false, //批量删除弹窗
pubproject: false,
stugroup: false,
isEdit: false,
canclestu: false,
canclestu1: false,
deleteOneStu: false, //删除单个学员弹窗
checked: false,
checked1: true,
checked2: false,
checkedSty: false, //同步学习记录
rankFlag:false,
checkedBOEU: false, //是否BOEU实施
radioV1: "",
radioV2: "",
activeKey: "1", //1:概览 2.任务...
activeKey1: "8", //8:学员管理 9小组管理
activeKey2: "3",
activeKeyNotice: "11",
inputValue: 5,
inputValue2: 5,
inputValue3: 5,
valueaddm: "", //创建小组输入小组长
valueaddg: "", //创建小组输入名称
groupInfo: { leaderName: "", leaderId: "" }, //创建小组
groupMemberCountContrast: null,
groupPageList: [], //小组列表
groupTotal: 0,
groupNumber: 0, //组员人数
valuestun: "", //学员管理姓名
valuegood: "",
valuestub: "", //学员管理部门
valuestug: "", //学员小组管理名称
valuestugroup: "", //学员管理小组名称
projectGroupId: null, //是编辑小组id
stuMemberClassify: null, //1新建小组 2编辑小组
stuGroupId: null, //选择的小组长id
stuGroupName: null, //选择的小组长名字
valueDate: "", //排行榜输入日期
noticeChecked: true,
noticeContent: "",
TaskFaceImpStuvisible: false, //批量面授报名
valuestugn: "", //小组管理的输入的小组名称
checkStuId: null, //要查看的学员id
chooseGroupId: null, //选择的小组id
chooseGroupName: null, //选择的小组名称
groupMemberCount: null, //选择的小组人数限制
groupMemberNUmber: null, //选择的小组人数合计
morFaceT: false, //批量面授报名按钮
faceArr: [], //任务大纲列表所有name
action: null,
act: null,
projectPub: false, //发布弹窗
projectPubLoading: false, //发布loading
projectStudentsNum: 0, //发布弹窗-学员人数
projectStages: 0, //发布弹窗-阶段数
projectTasks: 0, //任务数
releaseProjectId: null, //发布的项目id
releaseProjectName: null, //发布的项目名称
releaseProjectTime: null, //发布的项目时间
backModal: false, //撤回弹窗
recallReviewModal: false, //撤回审核
closeBack: false,
stopModal: false,
closeStop: false,
startModal: false,
closeStart: false,
ChangeGroupStuId: null, //要换组的学生id
ChangeGroupStuName: null, //要换组的学生name
ChangeGroupId: null, //要换组的学生的小组id
fileList: [], //文件列表
//进度排行表
jindutabledata: [],
jindutablecolumns: [
{
title: "排名",
dataIndex: "index",
key: "index",
width: 50,
align: "center",
className: "h",
customRender: (text) => {
if (text.record.index == "1") {
return (
<img
style={{ width: 24, height: 24 }}
src={require("../../assets/images/taskpage/one.png")}
/>
);
} else if (text.record.index == "2") {
return (
<img
style={{ width: 24, height: 24 }}
src={require("../../assets/images/taskpage/two.png")}
/>
);
} else if (text.record.index == "3") {
return (
<img
style={{ width: 24, height: 24 }}
src={require("../../assets/images/taskpage/three.png")}
/>
);
} else {
return <div>{text.record.index}</div>;
}
},
},
{
title: "名称",
dataIndex: "name",
key: "name",
width: 50,
align: "center",
className: "h",
},
{
title: "进度",
dataIndex: "rateStr",
key: "rateStr",
width: 50,
align: "center",
className: "h",
},
],
scoreRankLoading: true,
processRankLoading: true,
//学分排行表
xuefentabledata: [],
xuefentablecolumns: [
{
title: "排名",
dataIndex: "index",
key: "index",
width: 50,
align: "center",
className: "h",
customRender: (text) => {
if (text.record.index == "1") {
return (
<img
style={{ width: 24, height: 24 }}
src={require("../../assets/images/taskpage/one.png")}
/>
);
} else if (text.record.index == "2") {
return (
<img
style={{ width: 24, height: 24 }}
src={require("../../assets/images/taskpage/two.png")}
/>
);
} else if (text.record.index == "3") {
return (
<img
style={{ width: 24, height: 24 }}
src={require("../../assets/images/taskpage/three.png")}
/>
);
} else {
return <div>{text.record.index}</div>;
}
},
},
{
title: "名称",
dataIndex: "name",
key: "name",
width: 50,
align: "center",
className: "h",
},
{
title: "积分",
dataIndex: "pointsCountStr",
key: "pointsCountStr",
width: 50,
align: "center",
className: "h",
},
],
//学时排行表
studytimeRankLoading: true,
xueshitabledata: [],
xueshitablecolumns: [
{
title: "排名",
dataIndex: "index",
key: "index",
width: 50,
align: "center",
className: "h",
customRender: (text) => {
if (text.record.index == "1") {
return (
<img
style={{ width: 24, height: 24 }}
src={require("../../assets/images/taskpage/one.png")}
/>
);
} else if (text.record.index == "2") {
return (
<img
style={{ width: 24, height: 24 }}
src={require("../../assets/images/taskpage/two.png")}
/>
);
} else if (text.record.index == "3") {
return (
<img
style={{ width: 24, height: 24 }}
src={require("../../assets/images/taskpage/three.png")}
/>
);
} else {
return <div>{text.record.index}</div>;
}
},
},
{
title: "名称",
dataIndex: "name",
key: "name",
width: 50,
align: "center",
className: "h",
},
{
title: "时长",
dataIndex: "timeStr",
key: "timeStr",
width: 50,
align: "center",
className: "h",
},
],
//任务大纲列表
taskSyllabus: [],
taskSyllabusActive: 0,
//在线管理等页面传递参数title
showTimeText: "",
//考试、测评页面传递参数title
showTestText: "",
//面授传递title
showFaceText: "",
projectTaskInfo: null, //任务信息
//直播、面授传递title
showWorkText: "",
//直播、活动页面传递参数
showkaoqinText: "直播",
liveData: "",
//所有抽屉的传过去的type
itemstype: null,
//排行榜时间
rankStartTime: null,
rankEndTime: null,
valueName: "", //排行榜输入姓名
//设置
name: null, //项目名称 未改
startTime: null, //开始时间 已改
tstartTime: null, //开始事件 未改
endTime: null, //结束时间 已改
tendTime: null, //结束时间 未改
manager: null, //项目经理 未改
sourceBelong: null, //资源归属 已改
tsourceBelong: null, //资源归属 未改
remark: null, //项目说明 未改
level: null, //项目级别 已改
tlevel: null, //项目级别 未改
systemId: null, //培训分类
tsystemId: null, //培训分类 未改
picUrl: null, //未改
parentId: null, //未改
courseSyncFlag: null, //未改
boeFlag: null, //未改
managerId: null, //未改
notice: null, //未改
status: null, //未改
type: null, //未改
category: null, //未改
noticeFlag: null, //未改
templateId: null, //未改
attach: null,
authClassify: 3,
addAuthList: [],
switchopen: true,
isPass: false, // 是否审核未通过
passInfo: null, // 审核未通过原因说明
reviewModal: false,
codevisible: false, //二维码是否显示
codeInfo: null, //二维码标题
examData: "",
commonData: "",
commonLevelName: "",
evaltype: "",
evalData: "",
voteData: "",
voteModelVisibleTitle: "",
voteLevelName: "",
facestudent: {},
modal1Visible: false, // 证书预览
changegroupV: false, //换组弹窗
remarks: '',
remarksId: '',
remarksTrue: false,
showRemarks: false, //修改备注
checkgroupStuId: null, //换组id
ImpoterGroupLeaderV: false, //导入小组长抽屉
certificatelist: [],
fileUrl: process.env.VUE_APP_FILE_PATH,
uploadAction: process.env.VUE_APP_BASE_API + "/file/uploadunlimit",
templateUrl:process.env.VUE_APP_FILE_PATH+process.env.VUE_APP_FACE_STUDENT_TEMPLATE
});
// 排行榜 - start
// 积分排行榜 Top10
// 项目积分切换查询 -- 学员 小组
const jfSelectChange = (e) => {
console.log(e);
scoreRank();
};
const jdSelectChange = (e) => {
console.log(e);
completionRank();
};
const jdSelectChange1 = (e) => {
console.log(e);
completionRank();
};
const xsSelectChange = (e) => {
console.log(e);
studytimeRank();
};
//项目积分榜单
const scoreRank = (period, type) => {
state.scoreRankLoading = true;
state.datascore = [];
state.datascoreg = [];
console.log("projectId----->", state.projectId, period, type);
console.log("我是查询榜单传递的数据", {
projectId: state.projectId, // 项目id
name: "", // 名字,没有则传空字符串
startTime: state.rankStartTime ? state.rankStartTime : 0, // 数据查询的起始时间 10位时间戳
endTime: state.rankEndTime ? state.rankEndTime : 0,
size: 10, // 前多少名
type: Number(state.valuestu3), // 查询类型 0 学员积分榜 1 小组积分榜
});
let obj = {
projectId: state.projectId, // 项目id
name: "", // 名字,没有则传空字符串
startTime: state.rankStartTime ? state.rankStartTime : 0, // 数据查询的起始时间 10位时间戳
endTime: state.rankEndTime ? state.rankEndTime : 0,
size: 10, // 前多少名
type: Number(state.valuestu3), // 查询类型 0 学员积分榜 1 小组积分榜
};
api
.scoreRank(obj)
.then((res) => {
console.log("获取项目积分-榜单", res);
if (res.data.code == 200) {
state.datascore = res.data.data;
state.datascoreg = res.data.data;
state.xuefentabledata = res.data.data;
state.scoreRankLoading = false;
} else {
state.datascore = [];
state.datascoreg = [];
state.xuefentabledata = [];
state.scoreRankLoading = false;
}
})
.catch((err) => {
console.log("获取项目积分-榜单失败", err);
message.destroy();
message.error("榜单获取失败");
state.datascore = [];
state.datascoreg = [];
state.xuefentabledata = [];
state.scoreRankLoading = false;
});
};
// 项目进度榜单
const completionRank = () => {
state.processRankLoading = true;
let obj = {
projectId: state.projectId, // 项目id
startTime: state.rankStartTime ? state.rankStartTime : 0, // 数据查询的起始时间 10位时间戳
endTime: state.rankEndTime ? state.rankEndTime : 0,
stageId: state.valuestu2, // 阶段ID
type: Number(state.valuestu1), // 查询类型 0 学员积分榜 1 小组积分榜
};
console.log("我是获取得项目进度排行榜--》", obj);
api
.completionRank(obj)
.then((res) => {
console.log("项目进度榜单获取", res);
if (res.data.data.datas) {
state.jindutabledata = res.data.data.datas;
state.processRankLoading = false;
} else {
state.jindutabledata = [];
state.processRankLoading = false;
}
})
.catch((err) => {
console.log(err);
state.jindutabledata = [];
state.processRankLoading = false;
});
};
// 项目学时榜单
const studytimeRank = () => {
state.studytimeRankLoading = true;
let obj = {
projectId: state.projectId, // 项目id
startTime: state.rankStartTime ? state.rankStartTime : 0, // 数据查询的起始时间 10位时间戳
endTime: state.rankEndTime ? state.rankEndTime : 0,
type: Number(state.valuestu4), // 查询类型 0 学员积分榜 1 小组积分榜
};
console.log("我是获取得项目学时排行榜--》", obj);
api
.studytimeRank(obj)
.then((res) => {
console.log("项目学时榜单获取", res);
if (res.data.data) {
state.xueshitabledata = res.data.data;
state.studytimeRankLoading = false;
} else {
state.xueshitabledata = [];
state.studytimeRankLoading = false;
}
})
.catch((err) => {
console.log(err);
state.xueshitabledata = [];
state.studytimeRankLoading = false;
});
};
// 排行榜 - end
const levelList = reactive({
projectInfoOverview: {
// 整体数据概览
totalStudentCnt: 0,
studyStudentCnt: 0,
completeStudentCnt: 0,
onlineCourseCnt: 0,
offLineCourseCnt: 0,
completeRatio: 0,
},
stageOverviewList: [
{
// 阶段数据概览
completeCourseRatio: 0,
completeExamRatio: 0,
completeRatio: 0,
totalTaskCnt: 0,
totalReqCnt: 0,
totalOptCnt: 0,
},
],
stageList: [
// 阶段列表
],
});
// 输入接入 -- start --
const router = useRoute();
const routered = useRouter();
console.log("route:", router.query.id);
// 输入接入 -- start --
// 资源归属 sourceBelongId 后续给接口
state.bum = computed(() => {
console.log("基础信息 store.state.orgtreeList", store.state.orgtreeList);
return store.state.orgtreeList ? store.state.orgtreeList : [];
});
//任务大纲渲染
const getTaskListAll = () =>{
// request(PROJECT_RELEASE, {projectId: route.query.projectId})
getTaskList();
getTaskInfo();
getGroup();
getOverview();
reget();
}
const getTaskList = () => {
let objtl = {
projectId: state.projectId,
};
apitl.getProjectDetail(objtl).then((res) => {
console.log("阶段列表", res);
for (let i = 0; i < res.data.data.stageList.length; i++) {
for (let k = 0; k < res.data.data.stageList[i].taskList.length; k++) {
if (res.data.data.stageList[i].taskList[k].name == "面授") {
state.morFaceT = true;
break;
}
}
}
levelList.stageList = res.data.data.stageList;
state.valuestu2 = 0;
if (
levelList.stageList.length === 1 &&
levelList.stageList[0].id === "0"
) {
// 无解段任务
state.rankjieduan = [{ value: 0, label: "全部" }];
} else {
// 有阶段任务
console.log("有阶段任务", levelList.stageList);
let arrStage = [{ value: 0, label: "全部" }];
for (let i = 0; i < levelList.stageList.length; i++) {
if (levelList.stageList[i].id !== "0") {
let obj = {
value: levelList.stageList[i].id,
label: levelList.stageList[i].name,
};
arrStage.push(obj);
}
}
state.rankjieduan = arrStage;
state.choosedStageName = levelList.stageList[0].name;
}
//暂时传个固定的id用 到时候看数据里面是否有在更换
// state.projectTaskId = res.data.data.stageList[0].taskList[0].projectTaskId
let leng = res.data.data.stageList.length;
if (leng > 0) {
let taskarr = res.data.data.stageList;
console.log("11-22-33", taskarr);
if (taskarr.length == 1) {
if (taskarr[0].id == "0") {
taskarr[0].name = "无阶段任务";
}
}
state.taskSyllabus = taskarr;
}
});
};
//学员学员管理渲染
// const getTableDate = () => {
// let datas = state.tabledata;
// datas.map((value) => {
// {
// //单层项目
// value.operations = (
// <div class="operation">
// <div class="nSelect">
// <div class="nselect">
// <div
// class="jc"
// onClick={() => {
// // state.QR_hs = true;
// // state.ftsQR_hs = true;
// state.canclestu = true;
// }}
// >
// 优秀学员
// </div>
// <div
// class="jc"
// onClick={() => {
// state.Seevisible = true;
// }}
// >
// 查看
// </div>
// <div class="tableSelect">
// <a-select
// style="width: 50px;margin-top:2px;margin-left:25px"
// value="更多"
// // options={state.projectNameList}
// dropdownClassName="tabledropdown"
// >
// <a-select-option
// value="换组"
// label="换组"
// style="padding-left:35px"
// >
// <div
// onClick={() => {
// // state.copy_hs = true;
// }}
// >
// 复制
// </div>
// </a-select-option>
// <a-select-option
// value="删除"
// label="删除"
// style="padding-left:35px"
// >
// <div
// onClick={() => {
// state.delete_hs = true;
// }}
// >
// 删除
// </div>
// </a-select-option>
// </a-select>
// </div>
// </div>
// </div>
// </div>
// );
// }
// });
// state.tableData = datas;
// };
// getTableDate();
const totask = () => {
// state.activeKey = "2";
routered.push({
path: `/taskadd`,
query: { projectId: state.projectId },
});
};
const tostudent = () => {
state.activeKey = "3";
state.activeKey1 = "8";
};
const showModal = () => {
state.pubproject = true;
};
const closeModal = () => {
state.pubproject = false;
};
const showModal1 = () => {
state.canclestu = true;
};
//点击确定授予优秀学员后
const closeModal1 = () => {
state.editRecord.topFlag = 1;
updateStudent(state.editRecord);
state.canclestu = false;
message.success("优秀学员称号授予成功");
};
//点击取消授予优秀学员后
const cancelyou = () => {
state.changeGoods = [];
state.canclestu = false;
};
const showModal3 = () => {
state.canclestu1 = true;
};
//点击确定取消优秀学员称号
const closeModal3 = () => {
state.editRecord.topFlag = 0;
updateStudent(state.editRecord);
state.canclestu1 = false;
message.success("优秀学员称号取消成功");
};
//点击取消取消授予优秀学员后
const cancelcanyou = () => {
state.changeGoods = [];
state.canclestu1 = false;
};
//显示学员换组弹窗
const showChangeGroupModal = (record) => {
console.log("单个");
state.changegroupV = true;
console.log("点击换组", record.id);
state.checkgroupStuId = [];
state.checkgroupStuId.push(record.id);
};
//修改备注
const modifyRemarks = (record) => {
state.remarks = record.batch
state.remarksId = record.id
state.showRemarks = true;
}
const of_remarks = () => {
state.remarksTrue = false;
state.showRemarks = false;
}
const RemarksUpdata = () => {
apitl.editStudent({
id: state.remarksId,
batch: state.remarks
}).then(res=>{
console.log(res,'res')
state.remarksTrue = true;
})
of_remarks()
}
const showModal2 = (item, isEdit) => {
state.isEdit = isEdit;
state.stugroup = true;
state.groupInfo = item || {};
if (isEdit) {
state.groupMemberCountContrast = item.groupMemberCount;
}
};
const closeModal2 = () => {
state.stugroup = false;
state.buttonLoading = false;
state.groupInfo = {};
state.groupMemberCountContrast = null;
getGroup();
};
//点击确定创建小组
const createG = () => {
if (!state.groupInfo.groupName) {
return message.warning("请输入小组名称");
}
if (!state.groupInfo.leaderId) {
return message.warning("请选择小组长");
}
if (!state.groupInfo.leaderName) {
return message.warning("请选择小组长");
}
if (!state.groupInfo.groupMemberCount) {
return message.warning("请输入组员数量");
}
createGroup();
};
const showFaceIn = () => {
state.TaskFaceImpStuvisible = true;
};
//在线、案例、外链、讨论、评估、直播、活动管理页面
const showOnline = (name, id, type, datasource, levelname) => {
console.log("点击管理并传了id", datasource);
state.commonLevelName = levelname;
state.commonData = datasource;
state.onlineVisible = true;
state.showTimeText = name;
state.projectTaskId = id;
state.itemstype = Number(type);
};
//面授管理的抽屉
const showFace = (name, id, item) => {
// console.log("点击管理");
state.FaceVisivle = true;
state.showFaceText = name;
state.projectTaskId = id;
state.projectTaskInfo = item;
console.log("projectTaskInfo", item);
};
const showSubset = () => {
// 随机分组
state.subsetVisivle = true;
};
//面授学员的弹窗
const showFS = (item) => {
state.FSvisible = true;
state.facestudent = item;
console.log("facestudent", state.facestudent);
};
//面授学员的弹窗
const showMemberList = (id, name, groupMemberCount) => {
state.Lvisible = true;
console.log("ssdsdsdsd", id);
state.chooseGroupId = id;
state.chooseGroupName = name;
state.groupMemberCount = groupMemberCount;
};
//活动考勤的抽屉
{
/* const showAA = (title) => {
state.AAvisible = true;
state.showkaoqinText = title;
}; */
}
//考勤的抽屉
const showAA = (course, a, data) => {
state.AAvisible = true;
state.liveData = data;
state.showKaoqinText = "直播";
console.log(state.showKaoqinText, 1111, data);
};
//作业管理的抽屉
const showWork = (name, id, item) => {
state.Wvisible = true;
state.showWorkText = name;
state.projectTaskId = id;
state.projectTaskInfo = item;
};
{
/* 直播管理的抽屉 */
}
const showVote = (name, id, data) => {
console.log(name, id, data);
state.projectVoteModelVisible = true;
state.voteData = data;
state.voteModelVisibleTitle = name;
state.voteLevelName = "无阶段任务";
};
//考试管理的抽屉
const showTest = (name, id, data) => {
if (data.examType == 2) {
// 外部考试抽屉显示
state.TMvisibleExternal = true;
state.examData = data;
state.showTestText = name;
state.projectTaskId = id;
} else {
// 系统考试抽屉显示
state.TMvisible = true;
state.examData = data;
state.showTestText = name;
state.projectTaskId = id;
}
};
//测评抽屉
const showEval = (name, id, type, datasource) => {
console.log("点击测评");
state.evaltype = type;
state.evalData = datasource;
state.Evalvisible = true;
state.showTestText = name;
state.projectTaskId = datasource.id;
};
const showStuAdd = () => {
state.Stuvisible = true;
};
const showSeeStu = () => {
state.Seevisible = true;
};
const showImportStu = () => {
state.Importvisible = true;
};
const showChangeGroup = () => {
state.Changevisible = true;
};
const edit_hShow = () => {
state.edit_hs = true;
};
const edit_exit = () => {
state.edit_hs = false;
state.radioV1 = "";
state.radioV2 = "";
};
const cloradio1 = (value) => {
if (value != "") {
state.radioV1 = "";
}
};
const cloradio2 = (value) => {
if (value != "") {
state.radioV2 = "";
}
};
const showzhibModal = () => {
state.zhibModal = true;
};
const showhuodModal = () => {
state.huodModal = true;
};
const closezhibModal = () => {
state.zhibModal = false;
};
const closehuodModal = () => {
state.huodModal = false;
};
const showEditProj = () => {
state.editHs = true;
};
//显示二维码弹窗
const showCodeModal = () => {
state.codevisible = true;
state.codeInfo = {
title: "课程二维码",
name: "管理者进阶面授课程",
url: "https://www.baidu.com/https://www.baidu.com/https://www.baidu.com/https://www.baidu.com/https://www.baidu.com/",
};
};
// 提交审核
const submitExamine = () => {
let num = 0;
state.taskSyllabus.map(item => {
item.taskList.map(i => {
if(!i.flag){
num+=1;
}
})
})
if(num<state.electiveCourseCount&&state.isNewEmployee){
message.warning("选修课课程数小于设置的“选修课数量’值,请修改后重新提交");
return;
}
state.reviewModal = true;
};
const submitReviewProject = () => {
let obj = {
projectId: state.projectId,
type: 3,
};
console.log("提交审核obj", obj);
apis
.handleProject(obj)
.then((res) => {
console.log("提交成功", res);
message.destroy();
message.success("提交成功");
state.reviewModal = false;
getTaskInfo();
// getTask();
reget();
})
.catch((err) => {
console.log("提交失败", err);
});
};
//关闭提交审核弹窗
const closeReviewModal = () => {
state.reviewModal = false;
};
//学员管理列表操作
// const studentData = () => {
// let arr = state.tabledata;
// console.log(arr, "学员管理");
// arr.map((value) => {
// value.operation = (
// <div
// style={{
// display: "flex",
// alignItems: "center",
// justifyContent: "center",
// }}
// >
// <div
// class="studentopea1"
// onClick={() => {
// if (value.excellent === false) {
// state.canclestu = true;
// console.log("youxiu", value.studentId);
// state.changeGoods.push(value.studentId);
// } else if (value.excellent === true) {
// state.canclestu1 = true;
// console.log("youxiu", value.studentId);
// state.changeGoods.push(value.studentId);
// }
// }}
// >
// {value.excellent ? "取消优秀" : "优秀学员"}
// </div>
// <div
// class="studentopea2"
// onClick={() => {
// state.Seevisible = true;
// console.log(value.studentId, "点击了查看");
// state.checkStuId = value.studentId;
// }}
// >
// 查看
// </div>
// <div class="studentSelect">
// <a-select
// style="width: 50px"
// value="更多"
// // options={state.projectNameList}
// dropdownClassName="tabledropdown"
// >
// <a-select-option value="换组" label="换组">
// <div
// style="cursor:pointer"
// onClick={() => {
// state.Changevisible = true;
// console.log(value, "xixixixix");
// state.ChangeGroupStuId = value.studentId;
// state.ChangeGroupStuName = value.name;
// state.ChangeGroupId = value.groupId;
// }}
// >
// 换组
// </div>
// </a-select-option>
// <a-select-option value="删除" label="删除">
// <div
// style="cursor:pointer"
// onClick={() => {
// console.log("点击了111", value.studentId);
// showDeleteOne(value.studentId);
// }}
// >
// 删除
// </div>
// </a-select-option>
// </a-select>
// </div>
// </div>
// );
// });
// state.tabledata = arr;
// };
// studentData();
// const studentData = () => {
// let arr = state.tabledata;
// console.log(arr, "学员管理");
// arr.map((value) => {
// value.operation = (
// );
// });
// state.tabledata = arr;
// };
// studentData();
const studentColumns = () => {
const tablecolumns = [
{
title: "姓名",
dataIndex: "name",
key: "name",
width: "20%",
align: "left",
className: "h",
// scopedSlots: { customRender: "action" }, //引入的插槽
customRender: (text) => {
console.log(text.excellent);
return (
<div>
{text.record.excellent ? (
<div
style={{
display: "flex",
alignItems: "center",
}}
>
<span class="stydentName">{text.value}</span>
<div class="studentExcellent">
<img
class="studentExcellentImg"
src={require("../../assets/images/taskpage/excellent.png")}
/>
<span class="studentExcellentT">优秀</span>
</div>
</div>
) : (
<div>
<span>{text.value}</span>
</div>
)}
</div>
);
},
},
{
title: "部门",
dataIndex: "bum",
key: "bum",
width: "10%",
align: "center",
className: "h",
ellipsis: true,
},
{
title: "进度",
dataIndex: "progress",
key: "progress",
width: "10%",
align: "center",
className: "h",
ellipsis: true,
},
{
title: "最近学习时间",
dataIndex: "stutime",
key: "stutime",
width: "20%",
align: "center",
className: "h",
ellipsis: true,
},
{
title: "加入方式",
dataIndex: "putin",
key: "putin",
width: "10%",
align: "center",
className: "h",
ellipsis: true,
},
{
title: "操作",
dataIndex: "operation",
key: "operation",
width: "20%",
align: "center",
className: "h",
scopedSlots: { customRender: "action" }, //引入的插槽
customRender: (text) => {
// console.log(text);
return (
<div
style={{
display: "flex",
alignItems: "center",
justifyContent: "center",
}}
>
<div
class="studentopea1"
onClick={() => {
if (text.record.excellent === false) {
state.canclestu = true;
console.log("youxiu", text.record.studentId);
state.changeGoods.push(text.record.studentId);
} else if (text.record.excellent === true) {
state.canclestu1 = true;
console.log("youxiu", text.record.studentId);
state.changeGoods.push(text.record.studentId);
}
}}
>
{text.record.excellent ? "取消优秀" : "优秀学员"}
</div>
{
<div
class="studentopea2"
onClick={() => {
state.Seevisible = true;
console.log(text.record.studentId, "点击了查看");
state.checkStuId = text.record.studentId;
}}
>
查看
</div>
}
<div class="studentSelect">
<a-select
style="width: 50px"
value="更多"
// options={state.projectNameList}
dropdownClassName="tabledropdown"
>
<a-select-option value="换组" label="换组">
<div
onClick={() => {
state.Changevisible = true;
state.ChangeGroupStuId = text.record.studentId;
state.ChangeGroupStuName = text.record.name;
state.ChangeGroupId = text.record.groupId;
}}
>
换组
</div>
</a-select-option>
<a-select-option value="删除" label="删除">
<div
onClick={() => {
{
/* console.log("点击了111", text); */
}
showDeleteOne(text.record.studentId);
}}
>
删除
</div>
</a-select-option>
</a-select>
</div>
</div>
);
},
},
];
return tablecolumns;
};
const delete_exit = () => {
state.delete_hs = false;
};
//tabs切换
const tabsChange = (e) => {
//排行榜
if (e == 6) {
//获取进度榜
// getbillboard(1, 1);
//获取学分榜
// getbillboard(2, 1);
//获取学时榜
// getbillboard(3, 1);
// 获取积分排行榜
scoreRank();
// 获取项目进度排行榜
completionRank();
// 获取学时排行榜
studytimeRank();
} else if (e == 3) {
state.tabFlag = true;
} else {
rankReset();
state.tabFlag = false;
}
if (e != 7) {
state.ischeckCertificate = false;
}
console.log("切换了", state.tabFlag);
};
// start -------排行榜---------------排行榜------------排行榜------------------排行榜---------
//选择搜索时间
const rankTimeChange = (e, date) => {
let startTime = date[0] + " 00:00:00";
let endTime = date[1] + " 23:59:59";
state.rankStartTime = new Date(startTime).getTime() / 1000;
state.rankEndTime = new Date(endTime).getTime() / 1000;
console.log("e", state.rankStartTime, state.rankEndTime);
};
//获取排行榜 category:榜单类别参数 type:人员类别参数
const getbillboard = (category, type) => {
let obj = {
beginTime: state.rankStartTime,
category: category,
endTime: state.rankEndTime,
name: state.valueName,
projectId: state.projectId,
stageId: 0,
type: type,
};
api
.billboard(obj)
.then((res) => {
console.log("获取成功", res);
})
.catch((err) => {
console.log("获取失败", err);
});
};
//搜索
const rankSearch = () => {
//获取进度榜
// getbillboard(1, 1);
//获取学分榜
// getbillboard(2, 1);
//获取学时榜
// getbillboard(3, 1);
// 获取积分排行
scoreRank();
// 获取项目进度排行榜
completionRank();
// 获取学时排行榜
studytimeRank();
};
//重置
const rankReset = () => {
state.rankStartTime = null;
state.rankEndTime = null;
state.valueDate = null;
state.valueName = null;
// 获取积分排行
scoreRank();
// 获取项目进度排行榜
completionRank();
// 获取学时排行榜
studytimeRank();
};
// end -----排行榜----------------排行榜----------------------排行榜-----------排行榜----------
//start---------学员------
//删除单个学员
const showDeleteOne = (id) => {
state.deleteOneStu = true;
state.chooseDeleteOne.push(id);
};
//点击取消删除单个学员
const closeDeleteOne = () => {
state.deleteOneStu = false;
state.chooseDeleteOne = [];
};
//点击确认删除单个学员
const closeDeleteOneConfirm = () => {
state.deleteOneStu = false;
state.loading = true;
deleteStu({
projectId: state.projectId,
studentIds: state.chooseDeleteOne,
})
.then((res) => {
console.log(res, "单个删除成功");
message.success("删除成功");
getStu();
})
.catch((err) => {
console.log(err, "单个删除失败");
message.warning("删除失败");
});
state.chooseDeleteOne = [];
};
//批量删除学员弹窗
const showAllDelete = () => {
if (state.selectedRows.length == 0) {
message.destroy();
return message.warning("请选择要删除的学员");
} else {
state.allDelete = true;
}
};
//点击取消的批量删除弹窗
const closeCancelDelete = () => {
state.allDelete = false;
};
//点击确定的批量删除弹窗
const closeAllDelete = () => {
state.loading = true;
deleteStu({
projectId: state.projectId,
studentIds: state.selectedRows,
})
.then((res) => {
console.log(res, "删除成功");
message.success("删除成功");
state.selectedRows = [];
getStu();
})
.catch((err) => {
console.log(err, "删除失败");
message.warning("删除失败");
});
state.allDelete = false;
};
const handleChangeGood = (value) => {
console.log(value, state.valuegood, 11111);
};
const handleChangeBum = (value) => {
console.log(value, 22222);
};
//把数据放到state里
const getTableDataList = (tableData) => {
let data = tableData;
let array = [];
data.map((value) => {
let obj = {
key: value.studentId,
projectId: value.projectId, //项目id
groupId: value.groupId, //小组id
group: value.groupName, //小组名
studentId: value.studentId, //学生id
currentStageId: value.currentStageId, //当前关卡id
name: value.name, //用户名
bum: value.userInfoBo.deptName, //部门
gangw: value.userInfoBo.jobName, //岗位
completeStageCnt: value.completeStageCnt, //当前完成阶段数
totalStageCnt: value.totalStageCnt, //总阶段数
excellent: value.topFlag == 1, //是否优秀学员
progress: value.completeStageCnt + "/" + value.totalStageCnt,
putin:
value.source == 0
? "报名加入"
: value.source == 1
? "指定添加"
: value.source == 2
? "组织添加"
: value.source == 3
? "受众添加"
: "-", //加入方式
stutime: toDate(value.beginStudyTime, "Y-M-D"), //开始学习时间
};
array.push(obj);
console.log("stutime", obj.stutime);
});
state.tabledata = array;
};
//把小组列表信息放到state里
const setGroupList = (tableData) => {
console.log("tableDatatableDatatableData", tableData);
let data = tableData;
let array = [];
data.map((value) => {
let obj = {
projectId: value.projectId, //项目id
projectGroupId: value.id, //小组id
groupName: value.groupName, //小组名称
leaderId: value.leaderId, //组长id
leaderName: value.leaderName, //组长名称
groupMemberCount: value.groupMemberCount, //组员人数 == 1 ? "指定添加" : "随机分组",
source: value.source,
completeTaskCnt: value.completeTaskCnt, //完成任务数
totalTaskCnt: value.totalTaskCnt, //累计任务数
completeRatio: value.completeRatio ? value.completeRatio : 0, //完成比例
};
array.push(obj);
});
state.groupList = array;
console.log("编辑小组", state.groupList);
};
//学员搜索
const searchStu = () => {
let obj = {
deptIds: [], //部门
groupName: state.valuestugroup,
name: state.valuestun,
pageNo: state.currentPageStu,
pageSize: 10,
projectId: state.projectId,
topFlag:
state.valuegood == "优秀学员"
? 1
: state.valuegood == "普通学员"
? 0
: state.valuegood == "全部"
? ""
: "",
};
//重新获取列表
getStu(obj);
};
//勾选学员
const onSelectChange = (selectedRowKeys, selectedRows) => {
console.log("selectedRowKeys changed: ", selectedRowKeys);
state.selectedRowKeys = selectedRowKeys;
state.choosed = state.selectedRowKeys.length;
console.log("ssss", selectedRows);
state.selectedRows = [];
console.log("before", state.selectedRows);
// let arr = [];
//遍历 插入到state.selectedRows里
selectedRows.map((item) => {
console.log(item.studentId);
state.selectedRows.push(item.studentId);
// arr.push(item.studentId);
// console.log("asdfasdf", arr);
});
// state.selectedRows = arr;
console.log("after", state.selectedRows);
// console.log(state.selectedRows[0]);
// console.log("dddd",selectedRows.)
//判断是否为数组
// console.log("wwwwww", Object.prototype.toString.call(state.selectedRows));
};
//清空所选的学员
const clearChooseStu = () => {
Modal.confirm({
title: "确定清空所有学员吗?",
onOk: async () => {
state.tabledata = [];
student.studentDelAll({ id: state.projectId, type: 1 });
},
bodyStyle: "margin-top:70%",
});
};
//学员重置
const resetCancel = () => {
(state.valuestun = null),
(state.valuestugroup = null),
(state.valuestub = null),
(state.valuegood = null);
getStu();
};
//获取学员列表
const getStu = (obj) => {
state.loading = true;
let objf = obj || {
deptIds: [], //部门
groupId: 0,
groupName: "",
name: "",
pageNo: state.currentPageStu,
pageSize: 10,
projectId: state.projectId,
topFlag: "",
};
getProjStu(objf)
.then((res) => {
console.log("获取学员列表", res.data);
state.total = res.data.data.total;
let arr = res.data.data.rows;
getTableDataList(arr);
//
state.loading = false;
})
.catch((err) => {
console.log("获取学员列表失败", err);
});
};
//获取项目信息
const getTaskInfo = () => {
getTask({
projectId: state.projectId,
}).then((res) => {
if(res.data.data.projectInfo.szxygProjectFlag == "1"){
state.isNewEmployee = true;
state.activeKey = '2';
}
if (
res.data.data.projectAuditLogDtoList &&
res.data.data.projectAuditLogDtoList.length
) {
let dataset = res.data.data.projectAuditLogDtoList;
state.passInfo = dataset[dataset.length - 1].description;
}
state.stage = res.data.data.stageList.map((e) => ({
id: e.stageId,
name: e.name,
}));
let info = res.data.data.projectInfo;
console.log(121, info);
state.electiveCourseCount = info.electiveCourseCount;
state.permissions = info.permissions;
state.createId = info.createId;
let start = info.beginTime;
let end = info.endTime;
state.tstartTime = info.beginTime;
state.tendTime = info.endTime;
state.tsourceBelong =
(info.sourceBelongFullName || "") + info.sourceBelongName;
state.parentId = info.parentId;
state.name = info.name;
state.startTime = start;
state.endTime = end;
state.manager = info.manager;
state.remark = info.remark;
state.level = info.level;
state.tlevel = info.level;
state.systemId = info.systemId;
state.tsystemId = info.systemId;
state.checkedSty = info.courseSyncFlag == 1;
state.rankFlag = info.rankFlag == 1;
state.courseSyncFlag = info.courseSyncFlag;
state.checkedBOEU = info.boeFlag == 1;
state.boeFlag = info.boeFlag;
state.picUrl = info.picUrl;
state.managerId = info.managerId;
state.notice = info.notice;
state.status = info.status;
state.type = info.type;
state.category = info.category;
state.noticeFlag = info.noticeFlag;
state.switchopen = info.attachSwitch == 1;
state.docChecked = info.attachSwitch === 1;
state.hasTask = !!res.data.data?.stageList.some(
({ taskList }) => taskList.length
);
console.log(111111111111);
console.log(state.hasTask);
// state.attach = info.attach;
// state.templateId = info.templateId;
state.sourceBelong =
(info.sourceBelongFullName || "") + info.sourceBelongName;
// state.fileList=info.attach.split(",")
state.fileList = info.attach ? JSON.parse(info.attach) : [];
});
};
//获取小组列表
const getGroup = (obj) => {
let objf = obj || {
name: "",
pageNo: state.currentPageStu,
pageSize: 10,
projectId: state.projectId,
};
getGroupList(objf).then((res) => {
state.groupPageList = res.data.data.rows;
state.groupTotal = res.data.data.total;
let objf2 = obj || {
name: "",
pageNo: 1,
pageSize: 1000,
projectId: state.projectId,
};
getGroupList(objf2).then((res2) => {
// state.groupPageList = res.data.data.rows;
// state.groupTotal = res.data.data.total;
setGroupList(res2.data.data.rows);
});
});
};
//分页
const changePagination = (page) => {
state.currentPageStu = page;
getGroup();
};
//删除小组
const deleteGroupBtn = (projectGroupId) => {
deleteGroup({ projectGroupId }).then(() => {
message.success("删除小组成功");
getGroup();
});
};
//创建小组
const createGroup = async () => {
console.log("state.groupPageList" + state.groupPageList);
const id = state.groupInfo.id;
const d = state.groupPageList
.filter((item) => item.id !== id)
.filter((item) => item.leaderId === state.groupInfo.leaderId);
if (state.isEdit) {
if (d.length > 0 && d[0].id !== id) {
return message.warn(d[0].leaderName + "已是小组长,请重新选择");
}
// 小组人数只能由小改大,不能由大改小
if (state.groupMemberCountContrast > state.groupInfo.groupMemberCount) {
return message.warn("当前不支持修改组员人数小于原组员数量。");
}
} else {
if (d.length > 0) {
return message.warn(d[0].leaderName + "已是小组长,请重新选择");
}
}
state.isEdit = false;
state.buttonLoading = true;
await editGroup({ ...state.groupInfo, projectId: state.projectId });
message.success(id ? "小组编辑成功" : "小组创建成功");
getGroup();
console.log("state.groupPageList:");
getStu();
closeModal2();
state.buttonLoading = false;
};
//搜索小组重置
const resetGroupName = () => {
state.valuestugn = null;
getGroup();
};
//小组搜索
const searchGroup = () => {
let obj = {
name: state.valuestugn,
pageNo: 1,
pageSize: 10,
projectId: state.projectId,
};
getGroup(obj);
};
//分页
const changePaginationStu = (page) => {
state.currentPageStu = page;
getStu();
};
const changeGrouped = (data) => {
console.log(data);
getStu();
};
//导入小组长
const importGroupLeader = () => {
state.ImpoterGroupLeaderV = true;
};
//导出小组
const exportGroup = () => {
window.open(
`${process.env.VUE_APP_BASE_API}/admin/studentGroup/exportGroup/${state.projectId}`
);
};
//end---------学员------
//start---------项目概览
// 获取项目概览
const getOverview = () => {
overview({ projectId: state.projectId })
.then((res) => {
Object.keys(res.data.data.projectInfoOverview).forEach((item) => {
levelList.projectInfoOverview[item] =
res.data.data.projectInfoOverview[item] || 0;
});
Object.keys(res.data.data.stageOverviewList).forEach((item) => {
levelList.stageOverviewList[item] =
res.data.data.stageOverviewList[item] || 0;
});
// res.data.data.routerInfoOverview.forEach((r) => {
// console.log(r)
// })
// state.addLoading = false;
console.log("项目概览--" + res);
})
.catch((err) => {
// state.addLoading = false;
// message.error("概览获取失败");
console.log("获取失败" + err);
});
};
//end---------项目概览
// 设置上传图片开关
const checkedClose = (data, a) => {
console.log(data, a);
state.docChecked = data;
state.switchopen = data;
// 更新开关状态
editProjDoc({
attachSwitch: state.switchopen ? 1 : -1,
boeFlag: state.boeFlag,
category: state.category,
courseSyncFlag: state.courseSyncFlag,
level: state.tlevel,
manager: state.manager,
managerId: state.managerId,
name: state.name,
notice: state.notice,
noticeFlag: state.noticeFlag,
parentId: state.parentId,
picUrl: state.picUrl,
projectId: Number(state.projectId),
remark: state.remark,
sourceBelongId: Number(state.tsourceBelong),
status: state.status,
systemId: state.tsystemId,
templateId: state.templateId || 0,
type: state.type,
})
.then((res) => {
console.log("上传成功", res);
})
.catch((err) => {
console.log("上传失败了", err);
});
};
const handleChange = ({ file, fileList }) => {
let list = [];
if (file.status !== "uploading") {
console.log("上传的list", fileList);
console.log(file);
list = state.fileList;
console.log("list", list);
let str = JSON.stringify(list);
console.log("str", str);
//要编辑项目
console.log("编辑的项目信息", {
attach: str,
// beginTime: state.tstartTime.slice(0, 10),
boeFlag: state.boeFlag,
category: state.category,
courseSyncFlag: state.courseSyncFlag,
// endTime: state.tendTime.slice(0, 10),
level: state.tlevel,
manager: state.manager,
managerId: state.managerId,
name: state.name,
notice: state.notice,
noticeFlag: state.noticeFlag,
parentId: state.parentId,
picUrl: state.picUrl,
projectId: Number(state.projectId),
id: Number(state.projectId),
remark: state.remark,
sourceBelongId: Number(state.tsourceBelong),
status: state.status,
systemId: state.tsystemId,
templateId: state.templateId || 0,
type: state.type,
});
editProjDoc({
attachSwitch: state.switchopen ? 1 : -1,
attach: str,
boeFlag: state.boeFlag,
category: state.category,
courseSyncFlag: state.courseSyncFlag,
level: state.tlevel,
manager: state.manager,
managerId: state.managerId,
name: state.name,
notice: state.notice,
noticeFlag: state.noticeFlag,
parentId: state.parentId,
picUrl: state.picUrl,
projectId: Number(state.projectId),
id: Number(state.projectId),
remark: state.remark,
sourceBelongId: Number(state.tsourceBelong),
status: state.status,
systemId: state.tsystemId,
templateId: state.templateId || 0,
type: state.type,
})
.then((res) => {
console.log("上传成功", res);
})
.catch((err) => {
console.log("上传失败了", err);
});
}
if (file.status === "done") {
message.success(`${file.name} 文件上传成功`);
} else if (file.status === "error") {
message.error(`${file.name} 文件上传失败.`);
}
};
//设置里的编辑按钮
const toEdit = () => {
if (state.parentId == "0") {
routered.push({
path: "/projectadd",
query: {
projectId: state.projectId,
name: state.name,
},
});
} else {
if (state.isbj !== null) {
routered.push({
path: "/classadd",
query: {
projectId: state.projectId,
// name: state.paraentName,
name: state.pN,
edit: 0,
},
});
} else {
routered.push({
path: "/sonproject",
query: {
projectId: state.projectId,
name: state.name,
edit: 0,
},
});
}
}
};
const reget = () => {
console.log("state.projectId", state.projectId);
getTask({
projectId: state.projectId,
useTask: "N",
}).then((res) => {
console.log("获取项目状态", res);
state.action = res.data.data.projectInfo.status;
state.act =
state.action == 2
? "发布"
: state.action == 0
? "提交审核"
: state.action == 1
? "撤回审核"
: state.action == 3
? "撤回发布"
: state.action == -1
? ""
: "-";
});
};
//打开发布弹窗
const showProjectPub = () => {
state.projectPub = true;
state.projectPubLoading = true;
state.releaseProjectId = state.projectId;
state.releaseProjectName = state.name;
// state.releaseProjectTime = state.startTime;
// console.log("object", object);
apiproj.getProjectCount(state.projectId).then((res) => {
console.log("获取关卡、任务、学员统计数据", res.data);
// state.projectStudentsNum = res.data.students;
// state.projectStages = res.data.stages;
// state.projectTasks = res.data.tasks;
state.projectStages = res.data.data.stages;
state.projectTasks = res.data.data.tasks;
});
//获取学员总数
let obj = {
pageNo: 0,
pageSize: 10,
pid: state.projectId,
type: 1,
};
getStuPage(obj)
.then((res) => {
if (res.data.code === 200) {
// console.log("res", res.data);
state.projectStudentsNum = res.data.data.total
? res.data.data.total
: 0;
state.projectPubLoading = false;
}
})
.catch((err) => {
console.log("获取学员人数失败", err);
});
//获取阶段及任务总数
};
//关闭发布弹窗
const closeProjectPub = () => {
state.projectPub = false;
};
//确认发布项目
const releaseProject = () => {
console.log("点击发布");
let obj = {
projectId: state.releaseProjectId,
type: 4,
};
apiproj
.handleProject(obj)
.then((res) => {
console.log("发布成功", res);
message.destroy();
message.success("发布成功");
state.projectPub = false;
reget();
})
.catch((err) => {
console.log("发布失败", err);
});
};
//打开撤回弹窗
const showBackModal = () => {
state.backModal = true;
};
//关闭撤回弹窗
const closeBackModal = () => {
state.backModal = false;
};
const recallProject = () => {
let obj = {
projectId: state.projectId,
type: -4,
};
apiproj
.handleProject(obj)
.then((res) => {
console.log("撤回成功", res);
message.destroy();
message.success("撤回成功");
state.backModal = false;
reget();
})
.catch((err) => {
console.log("撤回失败", err);
});
};
//打开撤回审核弹窗
const showRecallReviewModal = () => {
state.recallReviewModal = true;
};
//确认撤回审核
const recallReviewProject = () => {
let obj = {
projectId: state.projectId,
type: -3,
};
console.log("撤回成功obj", obj);
apiproj
.handleProject(obj)
.then((res) => {
console.log("撤回成功", res);
message.destroy();
message.success("撤回成功");
state.recallReviewModal = false;
reget();
})
.catch((err) => {
console.log("撤回成功", err);
});
};
//关闭提交审核弹窗
const closeRecallReviewModal = () => {
state.recallReviewModal = false;
};
//关闭结束弹窗
const closeStopModal = () => {
state.stopModal = false;
};
//确认结束
const finishProject = () => {
let obj = {
projectId: state.projectId,
type: -1,
};
apiproj
.handleProject(obj)
.then((res) => {
console.log("结束成功", res);
message.destroy();
message.success("已结束");
state.stopModal = false;
reget();
})
.catch((err) => {
console.log("结束失败", err);
});
};
//打开结束弹窗
const showStopModal = () => {
state.stopModal = true;
};
//打开存为模版弹窗
const showStartModal = () => {
state.startModal = true;
};
//关闭存为模版弹窗
const closeStartModal = () => {
state.startModal = false;
};
//确认存为模版
const templateProject = () => {
let obj = {
projectId: state.projectId,
type: 1,
};
apiproj
.handleProject(obj)
.then((res) => {
console.log("模版保存成功", res);
message.destroy();
message.success("模版保存成功");
state.startModal = false;
reget();
})
.catch((err) => {
console.log("模版保存失败", err);
});
};
//删除文件
const deFile = (id) => {
console.log(id);
let index = state.fileList.findIndex((item) => {
item.uid == id;
});
state.fileList.splice(index, 1);
let str = JSON.stringify(state.fileList);
editProjDoc({
attach: str,
beginTime: state.tstartTime.slice(0, 10),
// beginTime:1668643200,
boeFlag: state.boeFlag,
category: state.category,
courseSyncFlag: state.courseSyncFlag,
endTime: state.tendTime.slice(0, 10),
// endTime: 1668816000,
level: state.tlevel,
manager: state.manager,
managerId: state.managerId,
name: state.name,
notice: state.notice,
noticeFlag: state.noticeFlag,
parentId: state.parentId,
picUrl: state.picUrl,
projectId: state.projectId,
remark: state.remark,
sourceBelongId: Number(state.tsourceBelong),
status: state.status,
systemId: state.tsystemId,
templateId: state.templateId || 0,
type: state.type,
})
.then((res) => {
console.log("上传成功", res);
message.destroy();
return message.success("删除成功");
})
.catch((err) => {
console.log("上传失败了", err);
message.warning("删除失败");
});
};
//添加学员
watch(
() => state.addAuthList,
(res) => {
console.log("res", res, state.addAuthList);
let obj = {
deptList: res[1],
groupList: res[2],
projectId: state.projectId,
studentList: res[0],
projectGroupId: 0,
};
console.log("obj", obj);
state.loading = true;
api
.addStudentProject(obj)
.then((res) => {
console.log("添加学员成功", res);
message.success("添加学员成功");
getStu();
})
.catch((err) => {
console.log("添加学员失败", err);
});
}
);
onMounted(() => {
// 是否是从编辑跳转过来的
if(route.query.routerEdit==="true"){
state.activeKey = "2";
}
// getStu();
getTaskList();
getTaskInfo();
getGroup();
getOverview();
reget();
// let a = state.attach.split(",")
// state.fileList = a
});
const checkType = (type) => {
let typeRules = [
"",
"在线",
"面授",
"案例",
"作业",
"考试",
"直播",
"外链",
"讨论",
"活动",
"测评",
"评估",
"投票",
"项目",
];
return typeRules[type];
};
// 判断当前任务已结束及时间意义上的结束 提示用户
function judgeTaskIsEnd(type, endTimes, status) {
// type 任务类型 endTime 结束时间 status 任务状态 (状态 0 未完成 1 已完成 2 未开始 3 已结束)
console.log(type, endTimes, status);
let isEnd = false;
let nowTime = new Date().getTime();
let endTime = new Date().getTime(endTimes);
switch (type) {
case 1:
status == -1
? (isEnd = true)
: nowTime > endTime
? (isEnd = true)
: (isEnd = false);
break;
case 3:
status == -1
? (isEnd = true)
: nowTime > endTime
? (isEnd = true)
: (isEnd = false);
break;
case 5:
status == -1
? (isEnd = true)
: nowTime > endTime
? (isEnd = true)
: (isEnd = false);
break;
case 7:
status == -1
? (isEnd = true)
: nowTime > endTime
? (isEnd = true)
: (isEnd = false);
break;
case 10:
status == -1
? (isEnd = true)
: nowTime > endTime
? (isEnd = true)
: (isEnd = false);
break;
}
return isEnd;
}
//显示二维码弹窗
const showCodeModel = (item) => {
if (judgeTaskIsEnd(item.type, state.endTime, state.status)) {
message.error("当前任务已结束");
return;
}
console.log("item", item);
let codeUrl = "";
// 在线课 停用 -- 暂时没有在线课停用标记
if (item.type == 1) {
// if (item.taskStatus == 1 || item.taskStatus == 2)
// return message.error("该任务无法学习,请联系管理员进行替换。");
codeUrl =
window.location.protocol +
process.env.VUE_APP_ONLINE_CLASS_URL +
item.courseId;
}
if (item.type == 2) {
codeUrl = `${window.location.protocol + process.env.VUE_APP_H5}/FaceTeachCourseList?courseId=${item.courseId}&type=1&taskId=${item.id}`;
}
if (item.type == 3) return message.error("请在pc端完成");
if (item.type == 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.courseId +
"&type=1&id=" +
item.id +
"&chapterOrStageId=" +
item.stageId +
"&infoId=" +
state.projectId;
}
// 考试 停用
if (item.type == 5) {
// if (item.taskStatus == 1 || item.taskStatus == 2)
// return message.error("该任务无法学习,请联系管理员进行替换。");
// 此处判断外部考试跳转
if (item.startTime == null || item.endTime == null) {
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/externalexam?type=1&courseId=" +
item.courseId +
"&id=" +
item.id +
"&chapterOrStageId=" +
item.stageId +
"&infoId=" +
state.projectId;
} else {
codeUrl =
window.location.protocol +
process.env.VUE_APP_EXAM_DETAIL_URL +
item.targetId;
}
}
// 直播结束时间
if (item.type == 6) {
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 +
"/liveboradcast?courseId=" +
item.courseId +
"&type=1&id=" +
item.id +
"&chapterOrStageId=" +
item.stageId +
"&infoId=" +
state.projectId;
}
// 外链
if (item.type == 7) {
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/outerchain?courseId=" +
item.courseId +
"&type=1&id=" +
item.id +
"&chapterOrStageId=" +
item.stageId +
"&infoId=" +
state.projectId;
}
//讨论
if (item.type == 8) {
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/discusspage?courseId=" +
item.courseId +
"&type=1&id=" +
item.id +
"&chapterOrStageId=" +
item.stageId +
"&infoId=" +
state.projectId;
}
//活动
if (item.type == 9) {
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 +
"/activitiespage?courseId=" +
item.courseId +
"&type=1&id=" +
item.id +
"&chapterOrStageId=" +
item.stageId +
"&infoId=" +
state.projectId;
}
//活动
if (item.type == 10) {
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/evaluation?courseId=" +
item.courseId +
"&type=1&evaType=" +
item.evaType +
"&targetId=" +
item.targetId +
"&id=" +
item.id +
"&chapterOrStageId=" +
item.stageId +
"&infoId=" +
state.projectId;
}
// 评估 停用
if (item.type == 11) {
// if (item.taskStatus == 1 || item.taskStatus == 2)
// return message.error("该任务无法学习,请联系管理员进行替换。");
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/investigatpage?courseId=" +
item.courseId +
"&type=1&id=" +
item.id +
"&chapterOrStageId=" +
item.stageId +
"&infoId=" +
state.projectId;
}
// 投票
if (item.type == 12) {
// console.log('item',item)
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/ballotpage?courseId=" +
item.courseId +
"&type=1&btype=2&id=" +
item.id +
"&chapterOrStageId=" +
item.stageId +
"&infoId=" +
state.projectId;
}
state.codevisible = true;
let obj = {
title: "[" + checkType(item.type) + "]二维码",
name: item.name,
url: codeUrl,
};
state.codeInfo = obj;
};
//显示二维码弹窗
const showCodeModel2 = () => {
state.codevisible = true;
let obj = {
title: "[项目]二维码",
name: state.name,
url:
window.location.protocol +
process.env.VUE_APP_H5 +
"/projectdetails?type=1&projectId=" +
state.projectId,
};
state.codeInfo = obj;
};
function settingTopFlag(record) {
record.topFlag ? (state.canclestu1 = true) : (state.canclestu = true);
state.editRecord = record;
}
function showStudent(record) {
state.certificateNum = record.certCount;
state.Seevisible = true;
state.checkStuId = record.studentId;
}
function downloadReport(record) {
api.downloadTranscript({projectId:state.projectId,studentId:record.studentId}).then(async (res) => {
const pdfBlob = new Blob([res.data], { type: 'application/pdf' });
// 2. 生成前端临时预览 URL
const pdfUrl = URL.createObjectURL(pdfBlob);
window.open(pdfUrl);
})
}
// 共享文档文件下载
const downloadFile = (url) => {
console.log(url);
window.open(
window.location.protocol +
process.env.VUE_APP_BOE_API_URL +
process.env.VUE_APP_FILE_PATH +
url
);
};
function stageChange(item, index) {
state.choosedStageName = item.name;
state.choosedStageId = item.stageId;
state.choosedStageIndex = index;
}
{
/* 证书 */
}
//获取证书列表
const getCertificate = () => {
let obj = {
pid: state.projectId,
};
api
.certificate(obj)
.then((res) => {
console.log("获取证书列表", res);
if (res.data.code === 200) {
state.certificatelist = res.data.data.records;
}
})
.catch((err) => {
console.log("获取证书列表失败", err);
});
};
getCertificate();
//查看证书
const checkCertificate = (item) => {
console.log("点击查看证书");
state.ischeckCertificate = true;
state.ACertificateCheckId = item.id;
};
const addCertificate = () => {
console.log("点击添加证书");
state.ACertificate = true;
state.ACertificateEdit = false;
state.ACertificateEditId = null;
};
const editCertificate = (item) => {
console.log("点击编辑证书", item);
state.ACertificate = true;
state.ACertificateEdit = true;
state.ACertificateEditId = item.id;
};
//点击删除证书
const deleteCertificate = (item) => {
console.log("要删除的证书", item);
let obj = {
id: item.id,
};
api
.certificatedel(obj)
.then((res) => {
console.log("删除证书结果", res);
if (res.data.code === 200) {
message.success("删除成功");
getCertificate();
}
})
.catch((err) => {
console.log("删除证书失败", err);
});
};
function previewPic() {
state.modal1Visible = true;
}
// 导入小组长成功回调
function handleChangeGroupLeader(e) {
if(e=="end"){
message.destroy();
message.success("导入小组长成功");
getGroup();
}
}
return {
...toRefs(state),
...toRefs(levelList),
headers,
stageChange,
showStudent,
downloadReport,
settingTopFlag,
totask,
tostudent,
showModal,
closeModal,
showModal1,
closeModal1,
showModal2,
closeModal2,
showModal3,
closeModal3,
showDeleteOne,
closeDeleteOne,
showOnline,
showFace,
showSubset,
showMemberList,
showFS,
showAA,
showWork,
showVote,
showTest,
showEval,
showStuAdd,
showImportStu,
showSeeStu,
showChangeGroup,
showFaceIn,
edit_hShow,
edit_exit,
cloradio1,
cloradio2,
studentColumns,
delete_exit,
showzhibModal,
showhuodModal,
closehuodModal,
closezhibModal,
showCodeModal,
tabsChange,
getTaskList,
getTaskListAll,
rankTimeChange,
getbillboard,
rankSearch,
rankReset,
handleChangeGood,
getStu,
getTableDataList,
searchStu,
handleChangeBum,
resetCancel,
showAllDelete,
closeAllDelete,
onSelectChange,
closeCancelDelete,
clearChooseStu,
closeDeleteOneConfirm,
showEditProj,
getTaskInfo,
getGroup,
getGroupList,
setGroupList,
deleteGroupBtn,
createGroup,
createG,
resetGroupName,
searchGroup,
cancelyou,
cancelcanyou,
showChangeGroupModal,
modifyRemarks,
of_remarks,
RemarksUpdata,
changePaginationStu,
handleChange,
toEdit,
reget,
showProjectPub,
closeProjectPub,
releaseProject,
showBackModal,
closeBackModal,
recallProject,
closeStopModal,
finishProject,
showStopModal,
showStartModal,
closeStartModal,
templateProject,
changeGrouped,
importGroupLeader,
exportGroup,
deFile,
toDate,
routered,
checkedClose,
submitExamine,
closeReviewModal,
showRecallReviewModal,
recallReviewProject,
closeRecallReviewModal,
submitReviewProject,
showCodeModel,
showCodeModel2,
checkType,
downloadFile,
checkPer,
fixDoublePer,
addCertificate,
editCertificate,
deleteCertificate,
previewPic,
getCertificate,
checkCertificate,
scoreRank,
jfSelectChange,
completionRank,
jdSelectChange,
jdSelectChange1,
studytimeRank,
xsSelectChange,
changePagination,
handleChangeGroupLeader,
qrcodeVisible,
qrcodeAssement,
handleMenuClick,
qrCodeItems,
visibleEwm,
qrCodeItemspg,
visibleEwmpg,
handleMenuClickpg,
coursePlanRef,
openCourse,
exportScore,
// 报名记录相关
showSignUpRecordModal,
signupRecordColumns,
signupRecordList,
showSignUpRecord,
signupRecordLoading,
};
},
};
</script>
<style lang="scss">
.clearfix:before,
.clearfix:after {
content: " ";
display: table;
clear: both;
}
.ant-upload.ant-upload-select-picture-card {
width: 170px;
height: 200px;
}
.pubproject {
.ant-modal {
.ant-modal-body {
.modalHeader {
background: linear-gradient(
rgba(78, 166, 255, 0.2) 0%,
rgba(78, 166, 255, 0) 100%
);
}
padding: 0;
.modalHeader {
background: linear-gradient(
0deg,
rgba(78, 166, 255, 0) 0%,
rgba(78, 166, 255, 0.2) 100%
);
}
.modalMain {
.projectname {
color: rgba(79, 81, 86, 1);
font-size: 14px;
line-height: 36px;
margin-left: 62px;
font-weight: 500;
}
.projecttime {
margin-left: 221px;
.timeti {
color: rgba(153, 155, 163, 1);
font-size: 14px;
line-height: 36px;
}
.timeme {
color: rgba(79, 81, 86, 1);
font-size: 14px;
line-height: 36px;
}
}
.projectbox {
margin-top: 26px;
display: flex;
justify-content: center;
.promessage {
width: 280px;
height: 110px;
background: linear-gradient(
180deg,
rgba(254, 243, 221, 1),
rgba(255, 250, 240, 1)
);
border-radius: 10px;
margin-right: 7px;
.messageme {
color: rgba(255, 182, 78, 1);
font-size: 14px;
line-height: 36px;
margin-top: 17px;
margin-left: 30px;
}
.messagege {
color: rgba(153, 155, 163, 1);
font-size: 14px;
margin-left: 30px;
}
}
.stumessage {
width: 280px;
height: 110px;
background: linear-gradient(
180deg,
rgba(221, 234, 255, 1),
rgba(240, 248, 254, 1)
);
border-radius: 10px;
.messageme1 {
color: rgba(78, 166, 255, 1);
font-size: 14px;
line-height: 36px;
margin-top: 17px;
margin-left: 30px;
}
.messagege1 {
color: rgba(153, 155, 163, 1);
font-size: 14px;
margin-left: 30px;
}
}
}
.send {
margin-top: 30px;
margin-left: 61px;
.sendtext {
margin-left: 11px;
color: rgba(109, 117, 132, 1);
font-size: 14px;
}
}
.ckb {
margin-top: 20px;
margin-left: 62px;
.sendpeo {
color: rgba(109, 117, 132, 1);
font-size: 14px;
}
.ant-checkbox-inner {
border-radius: 4px;
}
}
.pubtn {
display: flex;
justify-content: center;
margin-top: 25px;
//margin-bottom: 29px;
.pubtn1 {
width: 100px;
height: 40px;
margin-right: 16px;
margin-bottom: 29px;
border: 1px solid #4ea6ff;
border-radius: 4px;
color: rgba(78, 166, 255, 1);
font-size: 14px;
//line-height: 36px;
align-items: center;
background: rgba(255, 255, 255, 1);
}
.pubtn2 {
width: 100px;
height: 40px;
margin-bottom: 29px;
border: 1px solid #4ea6ff;
border-radius: 4px;
color: #ffffff;
font-size: 14px;
align-items: center;
//line-height: 36px;
background: #4ea6ff;
}
}
}
}
}
}
.xkbtn11 {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 8px;
color: #fff;
margin-top: 24px;
}
.canclestu {
.ant-modal {
width: 424px !important;
height: 258px !important;
.ant-modal-content {
width: 424px !important;
height: 258px !important;
.ant-modal-close {
margin-right: 18px;
margin-top: 5px;
}
.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;
.icon1 {
width: 16px;
height: 16px;
margin-right: 10px;
background-image: url(@/assets/images/coursewareManage/QR.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_btnbox {
display: flex;
margin: 30px auto;
justify-content: center;
.del_btn {
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;
}
}
.btn1 {
border: 1px solid rgba(64, 158, 255, 1);
color: #4ea6ff;
margin-right: 14px;
}
.btn2 {
background-color: #4ea6ff;
color: #ffffff;
}
}
}
}
}
}
}
}
.CopyModal {
.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/coursewareManage/QR.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_btnbox {
display: flex;
margin: 30px auto;
justify-content: center;
.del_btn {
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;
}
}
.btn1 {
border: 1px solid rgba(64, 158, 255, 1);
color: #4ea6ff;
margin-right: 14px;
}
.btn2 {
background-color: #4ea6ff;
color: #ffffff;
}
}
}
}
}
}
}
}
.canclestu1 {
.ant-modal {
width: 424px !important;
height: 258px !important;
.ant-modal-content {
width: 424px !important;
height: 258px !important;
.ant-modal-close {
margin-right: 18px;
margin-top: 5px;
}
.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;
.icon1 {
width: 16px;
height: 16px;
margin-right: 10px;
background-image: url(@/assets/images/coursewareManage/notice.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_btnbox {
display: flex;
margin: 30px auto;
justify-content: center;
.del_btn {
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;
}
}
.btn1 {
border: 1px solid rgba(64, 158, 255, 1);
color: #4ea6ff;
margin-right: 14px;
}
.btn2 {
background-color: #4ea6ff;
color: #ffffff;
}
}
}
}
}
}
}
}
.doublepro {
.ant-modal {
.ant-modal-body {
.modalHeader {
background: linear-gradient(
0deg,
rgba(78, 166, 255, 0) 0%,
rgba(78, 166, 255, 0.2) 100%
);
}
padding: 0;
.modalMain {
display: flex;
flex-direction: column;
align-items: center;
.name {
width: 78%;
// background-color: lightcoral;
display: flex;
justify-content: right;
margin-top: 32px;
align-items: center;
height: 40px;
// border: 1px solid black;
.inname {
color: #000000;
font-size: 14px;
margin-left: 7px;
}
.in {
margin-left: 14px;
width: 81%;
.ant-input {
border-radius: 5px;
// height: 120%;
width: 100%;
height: 30px;
}
.ant-select {
border-radius: 5px;
// height: 120%;
width: 100%;
height: 40px;
.ant-select-selector {
border-radius: 8px;
// height: 120%;
width: 100%;
height: 40px;
}
}
}
}
.pubtn {
display: flex;
justify-content: center;
margin-top: 25px;
//margin-bottom: 29px;
.pubtn1 {
width: 100px;
height: 40px;
margin-right: 16px;
margin-bottom: 29px;
border: 1px solid #4ea6ff;
border-radius: 4px;
color: rgba(78, 166, 255, 1);
font-size: 14px;
//line-height: 36px;
align-items: center;
background: rgba(255, 255, 255, 1);
}
.pubtn2 {
width: 100px;
height: 40px;
margin-bottom: 29px;
border: 1px solid #4ea6ff;
border-radius: 4px;
color: #ffffff;
font-size: 14px;
align-items: center;
//line-height: 36px;
background: #4ea6ff;
}
}
}
}
}
}
.projectPub {
.ant-modal {
.ant-modal-body {
padding: 0;
.modalHeader {
background: linear-gradient(
rgba(78, 166, 255, 0.2) 0%,
rgba(78, 166, 255, 0) 100%
);
}
.modalMain {
.projectname {
color: rgba(79, 81, 86, 1);
font-size: 14px;
line-height: 36px;
// margin-left: 62px;
font-weight: 500;
text-align: center;
}
.projecttime {
margin-left: 221px;
.timeti {
color: rgba(153, 155, 163, 1);
font-size: 14px;
line-height: 36px;
}
.timeme {
color: rgba(79, 81, 86, 1);
font-size: 14px;
line-height: 36px;
}
}
.projectbox {
margin-top: 26px;
display: flex;
justify-content: center;
.promessage {
width: 280px;
height: 110px;
background: linear-gradient(
180deg,
rgba(254, 243, 221, 1),
rgba(255, 250, 240, 1)
);
border-radius: 10px;
margin-right: 7px;
.messageme {
color: rgba(255, 182, 78, 1);
font-size: 14px;
line-height: 36px;
margin-top: 17px;
margin-left: 30px;
}
.messagege {
color: rgba(153, 155, 163, 1);
font-size: 14px;
margin-left: 30px;
}
}
.stumessage {
width: 280px;
height: 110px;
background: linear-gradient(
180deg,
rgba(221, 234, 255, 1),
rgba(240, 248, 254, 1)
);
border-radius: 10px;
.messageme1 {
color: rgba(78, 166, 255, 1);
font-size: 14px;
line-height: 36px;
margin-top: 17px;
margin-left: 30px;
}
.messagege1 {
color: rgba(153, 155, 163, 1);
font-size: 14px;
margin-left: 30px;
}
}
}
.send {
margin-top: 30px;
margin-left: 61px;
.sendtext {
margin-left: 11px;
color: rgba(109, 117, 132, 1);
font-size: 14px;
}
}
.ckb {
margin-top: 20px;
margin-left: 62px;
.sendpeo {
color: rgba(109, 117, 132, 1);
font-size: 14px;
}
.ant-checkbox-inner {
border-radius: 4px;
}
}
.pubtn {
display: flex;
justify-content: center;
margin-top: 25px;
//margin-bottom: 29px;
.pubtn1 {
width: 100px;
height: 40px;
margin-right: 16px;
margin-bottom: 29px;
border: 1px solid #4ea6ff;
border-radius: 4px;
color: rgba(78, 166, 255, 1);
font-size: 14px;
//line-height: 36px;
align-items: center;
background: rgba(255, 255, 255, 1);
}
.pubtn2 {
width: 100px;
height: 40px;
margin-bottom: 29px;
border: 1px solid #4ea6ff;
border-radius: 4px;
color: #ffffff;
font-size: 14px;
align-items: center;
//line-height: 36px;
background: #4ea6ff;
}
}
}
}
}
}
.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(
rgba(78, 166, 255, 0.2) 0%,
rgba(78, 166, 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_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: 3px auto;
.bg_body_bt {
display: flex;
align-items: center;
justify-content: end;
margin: 14px auto;
.bg_body_bttext {
width: 110px;
display: flex;
justify-content: end;
margin-right: 20px;
}
}
.bg_body_input {
flex: 1;
position: relative;
.ant-upload-picture-card-wrapper {
width: 200px;
margin-right: 18px;
}
}
.bg_footer {
width: 100%;
margin-left: 174px;
margin-top: 25px;
margin-bottom: 20px;
display: flex;
.btn {
width: 100px;
height: 40px;
background: rgba(64, 158, 255, 0);
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 14px;
flex-shrink: 0;
cursor: pointer;
.btnText {
font-size: 14px;
font-weight: 400;
line-height: 40px;
}
}
.btn6 {
background-color: #4ea6ff;
color: #ffffff;
}
}
}
.headers {
margin-left: 38px;
margin-right: 38px;
margin-top: 30px;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
.btn {
display: flex;
}
}
}
}
.taskpage {
width: 100%;
display: flex;
flex-direction: column;
//position: relative;
.addhead {
width: 100%;
height: 130px;
// background-color: lightgreen;
display: flex;
justify-content: space-between;
align-items: center;
position: relative;
.leftimg {
width: 151px;
height: 100px;
border: 10px solid #e7f2ff;
border-radius: 8px;
margin-left: 20px;
.img {
width: 100%;
height: 100%;
}
}
.imgfor {
margin-left: 32px;
display: flex;
flex: 1;
flex-direction: column;
.forz {
color: #363636;
font-weight: 600;
font-size: 16px;
}
.fort {
display: flex;
flex-wrap: wrap;
color: #878b92;
font-size: 14px;
margin-top: 2px;
}
}
@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: 28px;
}
.img2 {
width: 42px;
height: 42px;
margin-right: 10px;
}
.pub {
color: #ffb64e;
font-size: 14px;
margin-top: 5px;
margin-right: 30px;
cursor: pointer;
}
.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;
}
}
}
.tableBox {
margin: 20px 38px 30px;
.ant-table-thead > tr > th {
font-size: 14px;
font-weight: 400;
color: #999ba3;
line-height: 36px;
padding: 5px 16px;
background-color: #eff4fc;
}
}
.split {
width: 100%;
height: 20px;
background-color: #edf0f5;
}
.content {
//margin: 0 37px;
.ant-tabs-top > .ant-tabs-nav::before,
.ant-tabs-bottom > .ant-tabs-nav::before,
.ant-tabs-top > div > .ant-tabs-nav::before,
.ant-tabs-bottom > div > .ant-tabs-nav::before {
border-bottom: 0px;
}
.ant-tabs-nav-wrap {
margin-left: 30px;
margin-top: 10px;
}
.onerow {
//width: 100%;
display: flex;
height: 40px;
position: relative;
margin-top: 15px;
margin-left: 38px;
//margin-right: 38px;
.taskmain {
font-size: 18px;
padding-top: 7px;
color: #000000;
}
.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;
}
.edit {
position: absolute;
right: 38px;
top: 0;
color: #fff;
background: #4ea6ff;
width: 100px;
height: 40px;
border: 1px solid #4ea6ff;
border-radius: 8px;
cursor: pointer;
.editimg {
width: 15px;
height: 15px;
margin-top: -2px;
margin-right: 5px;
}
.editext {
line-height: 40px;
}
}
// .edit:hover {
// color: #ffffff;
// background-color: #4ea6ff;
// cursor: pointer;
// .editimg {
// background-image: url("../../assets/images/projectadd/edit1.png");
// }
// }
}
.second {
display: flex;
justify-content: left;
flex-wrap: wrap;
margin-top: 40px;
margin-left: 20px;
.nubbox {
width: 253px;
height: 116px;
margin-top: 20px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background: #fafbfc;
border-radius: 10px;
margin-left: 15px;
.nub1 {
color: #ffb54a;
font-size: 30px;
font-weight: 700;
}
.nub2 {
color: #6d7584;
font-size: 14px;
}
}
.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;
}
}
}
.stagemess {
display: flex;
margin-left: 38px;
.stage1 {
width: 100px;
height: 33px;
text-align: center;
line-height: 34px;
border-radius: 6px;
color: #ffffff;
font-size: 16px;
background: #4ea6ff;
margin-right: 10px;
margin-top: 19px;
cursor: pointer;
}
.stage2 {
width: 100px;
height: 33px;
text-align: center;
line-height: 34px;
border-radius: 6px;
border: 1px solid #ebeef3;
color: #000000;
font-size: 16px;
background: #ffffff;
margin-right: 10px;
margin-top: 19px;
cursor: pointer;
}
}
.stagesecond {
display: flex;
margin-left: 39px;
margin-top: 29px;
.staname {
color: #999ba3;
font-size: 14px;
}
.stamess {
color: #4f5156;
font-size: 14px;
}
}
.stagelast {
display: flex;
flex-wrap: wrap;
justify-content: center;
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: 500px;
margin-top: 55px;
margin-left: 50px;
.ant-progress-bg {
height: 24px !important;
background: #4ea6ff;
}
.ant-progress-inner {
height: 24px;
}
.pronub {
color: #4ea6ff;
font-size: 14px;
margin: 5px 0;
}
.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;
}
}
}
}
.taskSyllabus {
// flex: 1;
overflow-x: auto;
.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;
}
}
.taskbox {
width: 412px;
height: 160px;
border-radius: 10px;
position: relative;
margin-left: 68px;
margin-bottom: 40px;
margin-top: 32px;
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;
}
}
.stage {
display: flex;
height: 49px;
background-color: #eff4fc;
align-items: center;
margin-top: 20px;
margin-left: 38px;
margin-right: 38px;
.stageimg {
margin-left: 31px;
}
.stagename {
color: #4ea6ff;
font-size: 16px;
padding-left: 9px;
line-height: 36px;
}
}
.course {
//width: 100%;
flex-shrink: 0;
margin-right: 24px;
display: flex;
// flex-wrap: wrap;
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;
//height: 71px;
margin-left: 12px;
margin-right: 50px;
width: 120px;
.iconame {
//position: absolute;
color: #4f5156;
font-size: 16px;
margin-left: 4px;
}
.icontext {
//positipn: absolute;
color: #999ba3;
font-size: 14px;
margin-left: 12px;
width: 120px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.type {
//height: 71px;
display: flex;
// flex-grow: 1;
align-items: center;
margin-right: 50px;
.typename {
width: 63px;
height: 23px;
color: #5dc988;
font-size: 14px;
background-color: #f2f6fc;
border-radius: 4px;
text-align: center;
}
.typename1 {
width: 63px;
height: 23px;
color: #f0f4fe;
font-size: 14px;
background-color: #5dc988;
border-radius: 4px;
text-align: center;
}
}
.time {
//height: 71px;
flex-grow: 1;
margin-right: 14px;
width: 100px;
.timetext {
font-size: 14px;
color: #999ba3;
}
}
.progress {
width: 60px;
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: 420px;
flex-grow: 1;
.operations_dropdown {
padding: 10px;
text-align: center;
position: relative;
margin-left: auto;
margin-right: 10px;
min-width: 90px;
}
.operation {
color: #4ea6ff;
font-size: 14px;
padding: 10px;
margin-left: auto;
width: 63px;
text-align: center;
}
}
}
}
.content3 {
margin-top: 20px;
.ant-tabs-tab-btn {
font-size: 18px;
font-weight: 700;
}
.group {
display: flex;
.groupleft {
display: flex;
flex-wrap: wrap;
align-items: center;
margin-left: 32px;
.groupname {
height: 22px;
width: 70px;
color: #000000;
font-size: 14px;
}
.ant-input {
border-radius: 8px;
width: 264px;
height: 40px;
}
.ant-select-selector {
border-radius: 8px;
width: 264px;
height: 40px;
padding-top: 5px;
}
}
.groupright {
display: flex;
margin-left: 48px;
.btn1 {
width: 100px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 16px;
border: 1px solid #4ea6ff;
border-radius: 8px;
background: #4ea6ff;
cursor: pointer;
.btn1text {
color: #ffffff;
margin-left: 5px;
font-size: 14px;
}
}
.btn2 {
width: 100px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 32px;
border: 1px solid #4ea6ff;
border-radius: 8px;
cursor: pointer;
background: #4ea6ff;
.btn2text {
color: #fff;
margin-left: 5px;
font-size: 14px;
}
}
}
}
.second2 {
display: flex;
margin: 30px 0 0 32px;
.btn1 {
width: 130px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 16px;
border: 1px solid #4ea6ff;
border-radius: 8px;
background: #4ea6ff;
cursor: pointer;
.btn1text {
color: #ffffff;
margin-left: 5px;
font-size: 14px;
}
}
.btn2 {
width: 130px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 16px;
border: 1px solid #4ea6ff;
border-radius: 8px;
cursor: pointer;
background: #ffffff;
.btn2text {
color: #4ea6ff;
margin-left: 5px;
font-size: 14px;
}
}
}
.talk {
margin-top: 24px;
margin-left: 32px;
margin-right: 32px;
margin-bottom: 11px;
position: relative;
//width: 90%;
height: 40px;
background: #f5faff;
border: 1px solid #4ea6ff;
// opacity: 0.22;
display: flex;
align-items: center;
.im {
width: 14px;
height: 15px;
margin-left: 17px;
}
.xu {
height: 100%;
line-height: 40px;
margin-left: 13px;
.yi {
color: #4f5156;
font-size: 14px;
}
.zon {
color: #999ba3;
font-size: 14px;
margin-left: 34px;
}
.th {
color: #4ea6ff;
}
}
.clear {
cursor: pointer;
font-size: 14px;
color: #387df7;
line-height: 24px;
position: absolute;
right: 20px;
}
}
.tab {
.ant-table-thead > tr > th {
background-color: rgba(239, 244, 252, 1);
color: rgba(0, 0, 0, 0.85);
}
.ant-table-tbody > tr > td {
border-bottom: 1px solid #f0f6fc;
color: rgba(0, 0, 0, 0.65);
}
th.h {
background-color: #eff4fc !important;
}
.ant-table-tbody
> tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected)
> td {
background: rgba(250, 250, 250, 1);
}
.nostu {
width: 100%;
.nostuimg {
margin: 75px auto;
width: 412px;
height: 212px;
background-image: url(@/assets/images/taskpage/nostu.png);
background-size: 100% 100%;
}
}
.pa {
// left: 0;
margin-top: 15px;
width: 100%;
// height: 20px;
// background-color: red;
display: flex;
justify-content: right;
// position: absolute;
// bottom: 20px;
}
.operation {
display: flex;
justify-content: center;
align-items: center;
color: #4ea6ff;
.nselect {
justify-content: center;
align-items: center;
display: flex;
.jc {
margin-left: 20px;
cursor: pointer;
white-space: nowrap;
}
}
.tableSelect {
// margin-right: 10px;
margin-left: -5px;
display: flex;
align-items: center;
justify-content: right;
white-space: nowrap;
}
}
.studentName {
font-size: 14px;
font-weight: 400;
color: rgba(0, 0, 0, 0.65);
line-height: 22px;
}
.studentExcellent {
width: 64px;
height: 24px;
border-radius: 2px;
border: 1px solid #ffb64e;
background-color: rgba(255, 182, 78, 0.1);
margin-left: 24px;
display: flex;
align-items: center;
.studentExcellentImg {
width: 16px;
height: 16px;
margin-left: 7px;
}
.studentExcellentT {
font-size: 12px;
font-weight: 400;
color: #ffb64e;
line-height: 17px;
margin-left: 3px;
}
}
.studentopea1 {
font-size: 14px;
font-weight: 400;
color: #387df7;
line-height: 22px;
padding-right: 8px;
border-right: 1px solid #e9e9e9;
cursor: pointer;
}
.studentopea2 {
font-size: 14px;
font-weight: 400;
color: #387df7;
line-height: 22px;
padding-right: 8px;
padding-left: 8px;
border-right: 1px solid #e9e9e9;
cursor: pointer;
}
.studentSelect {
margin-left: 8px;
display: inline-block;
.ant-select:not(.ant-select-customize-input)
.ant-select-selector
.ant-select-selection-search-input {
background-color: rgba(255, 255, 255, 0);
border: none;
}
.ant-select:not(.ant-select-customize-input) .ant-select-selector {
background-color: rgba(255, 255, 255, 0);
border: none;
}
.ant-select-single:not(.ant-select-customize-input)
.ant-select-selector {
padding: 0;
}
.ant-select-focused:not(.ant-select-disabled).ant-select:not(
.ant-select-customize-input
)
.ant-select-selector {
box-shadow: none;
}
.ant-select-arrow {
right: 0px;
color: rgba(56, 125, 247, 1);
font-size: 14px;
line-height: 36px;
// top: 17px;
top: 15px;
}
.ant-select-selection-item {
font-size: 14px;
font-weight: 400;
color: rgba(56, 125, 247, 1);
line-height: 33px;
}
.ant-select-single.ant-select-open .ant-select-selection-item {
color: rgba(56, 125, 247, 1);
}
}
}
.groupmain {
display: flex;
flex-wrap: wrap;
margin-left: 32px;
.groupbox {
width: 264px;
height: 181px;
display: flex;
justify-content: center;
border: 1px solid #e9e9e9;
box-shadow: 1px 1px 18px 1px rgba(0, 0, 0, 0.05);
margin-top: 16px;
margin-right: 20px;
.grouptitle {
display: flex;
justify-content: space-between;
margin-top: 5px;
border-bottom: 1px solid rgba(232, 232, 232, 1);
.goodgruop {
color: rgba(0, 0, 0, 0.85);
font-size: 16px;
line-height: 36px;
font-weight: 600;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
}
.more {
position: relative;
//margin-right: 30px;
height: 30px;
display: flex;
align-items: center;
.moreItems {
width: 76px;
height: 80px;
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;
}
}
.leader {
color: rgba(0, 0, 0, 1);
font-size: 14px;
margin-top: 16px;
//margin-left: 24px;
}
.grocenter {
display: flex;
margin-top: 14px;
.leader1 {
color: rgba(0, 0, 0, 1);
font-size: 14px;
width: 51px;
}
.ant-progress-outer {
width: 170px;
}
}
.grofooter {
display: flex;
justify-content: space-between;
cursor: pointer;
margin-top: 30px;
.ftext {
color: rgba(56, 139, 225, 1);
font-size: 14px;
}
.peoples {
display: flex;
position: relative;
.people1 {
position: absolute;
right: 22px;
}
.people2 {
position: absolute;
right: 31px;
}
.people3 {
position: absolute;
right: 40px;
}
.people4 {
position: absolute;
right: 49px;
}
}
}
}
}
.projectscore {
.pjc_body {
margin-left: 34px;
margin-right: 34px;
.pjcb_header {
display: flex;
justify-content: space-between;
align-items: center;
margin: 24px auto;
.edit_btn {
width: 100px;
// padding: 0px 26px 0px 26px;
height: 38px;
background: rgb(64, 158, 255);
border-radius: 8px;
border: 1px solid rgba(64, 158, 255, 1);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
cursor: pointer;
.edit {
width: 15px;
height: 15px;
background-image: url(@/assets/images/coursewareManage/export1.png);
background-size: 100% 100%;
}
.btnText {
font-size: 14px;
font-weight: 400;
color: rgb(255, 255, 255);
line-height: 36px;
margin-left: 5px;
}
}
}
.pjcb_content {
border: 1px solid #4ea6ff;
padding: 32px;
.pjcb_content :last-child {
margin-bottom: 0px;
}
.content {
margin-bottom: 24px;
}
}
}
}
}
.content6 {
margin-top: 20px;
width: 100%;
height: 100%;
// background-color: #bfa;
.title {
font-size: 18px;
font-weight: 500;
color: #333333;
margin-left: 34px;
}
.line {
width: 100%;
height: 1px;
margin-top: 10px;
background: #e8e8e8;
}
.search {
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
margin: 30px 34px 0 34px;
.left {
display: flex;
align-items: center;
flex-wrap: wrap;
margin-right: 10px;
.text {
font-size: 14px;
font-weight: 400;
color: rgba(0, 0, 0, 0.85);
white-space: nowrap;
}
.name {
display: flex;
align-items: center;
margin-bottom: 10px;
margin-right: 56px;
}
.time {
display: flex;
align-items: center;
// margin-left: 56px;
margin-bottom: 10px;
}
}
.right {
display: flex;
.btn {
display: flex;
width: 100px;
height: 40px;
border-radius: 8px;
justify-content: center;
align-items: center;
margin-bottom: 10px;
.img1 {
width: 15px;
height: 17px;
background-image: url(../../assets/images/coursewareManage/search0.png);
background-size: 100%;
margin-right: 5px;
}
.img2 {
width: 16px;
height: 18px;
background-image: url(../../assets/images/coursewareManage/reset0.png);
background-size: 100%;
margin-right: 5px;
}
}
.btn1 {
background: #4ea6ff;
color: #fff;
margin-right: 16px;
}
.btn2 {
border: 1px solid #4ea6ff;
background: #ffffff;
color: #4ea6ff;
}
}
}
.main {
margin-top: 10px;
display: flex;
flex-wrap: wrap;
margin-left: 34px;
margin-bottom: 20px;
.rank {
width: 422px;
height: 506px;
margin-right: 80px;
background: #ffffff;
border-radius: 2px;
border: 1px solid rgba(125, 125, 125, 0.39);
margin-bottom: 20px;
.rankhead {
height: 75px;
width: 100%;
border-bottom: 1px solid #e9e9e9;
// background-color: #bfa;
display: flex;
justify-content: center;
align-items: center;
.ant-select-selector {
color: #4ea6ff !important;
}
.inhead {
width: 374px;
// background-color: lightblue;
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 10px;
position: relative;
.icon {
position: absolute;
width: 14px;
height: 14px;
background-image: url(../../assets/images/leveladd/info.png);
background-size: 100%;
left: 120px;
}
.left {
font-size: 16px;
font-weight: 500;
color: rgba(0, 0, 0, 0.85);
}
.right {
.ant-select {
.ant-select-selector {
border-radius: 4px !important;
border: 1px solid #4ea6ff;
}
}
}
}
}
.tab {
// margin-top: 20px;
// margin-left: 24px;
border-radius: 4px 4px 0px 0px;
border: 1px solid #e9e9e9;
margin: 20px 24px 0 24px;
th.h {
background-color: #eff4fc !important;
}
.ant-table-tbody
> tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected)
> td {
background: #f6f9fd;
}
}
}
}
}
//设置的基本信息
.content7 {
margin-top: 20px;
.set_tit {
margin-left: 34px;
font-size: 18px;
font-weight: 500;
color: #232425;
}
.line {
width: 100%;
height: 1px;
background-color: #e8e8e8;
margin-top: 10px;
}
.set_body {
margin-left: 34px;
margin-right: 34px;
position: relative;
.edit {
position: absolute;
width: 100px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
right: 0;
cursor: pointer;
.img {
width: 18px;
height: 18px;
background-image: url(../../assets/images/basicinfo/edit.png);
background-size: 100%;
margin-right: 7px;
}
.ed {
font-size: 14px;
font-weight: 400;
color: #ffffff;
}
}
.set_content {
margin: 32px auto;
display: flex;
// justify-content: end;
.setc_name {
width: 150px;
display: flex;
justify-content: end;
}
.setc_main {
flex: 1;
margin-left: 12px;
}
}
}
}
//设置的共享文档
.sametab {
// margin-left: 30px;
// margin-right: 30px;
margin-top: 30px;
width: 100%;
// background-color: green;
.Gcon {
display: flex;
.pad {
height: 100%;
width: 40px;
}
.Gin {
// background-color: #bfa;
margin-top: 30px;
.headone {
// background-color: red;
display: flex;
text-align: center;
.box {
width: 4px;
height: 20px;
background-color: #4ea6ff;
border-radius: 2px;
}
.onetitle {
margin-left: 15px;
color: #333333;
font-size: 14px;
}
.oneedi {
margin-left: 15px;
color: #4ea6ff;
cursor: pointer;
}
.twobtn {
display: flex;
.btnone {
width: 42px;
height: 24px;
border: 1px solid rgba(64, 158, 255, 1);
border-radius: 4px;
color: rgba(64, 158, 255, 1);
margin-left: 20px;
cursor: pointer;
}
.btntwo {
width: 42px;
height: 24px;
border: 1px solid rgba(64, 158, 255, 1);
border-radius: 4px;
color: #ffffff;
margin-left: 20px;
background: #4ea6ff;
cursor: pointer;
}
}
}
.btnbox {
.ant-upload-list {
display: none !important;
}
}
.onemain {
margin-top: 20px;
margin-left: 55px;
color: #6f6f6f;
font-size: 14px;
.checkcon {
position: relative;
.in {
position: absolute;
// margin-top: 10px;
left: 0;
top: 3px;
}
.yulan {
// color: yellow;
margin-left: 22px;
// display: inline-block;
}
.yulan2 {
margin-left: 22px;
}
.ant-input-number {
height: 24px;
width: 24px;
margin: 10px;
border-radius: 4px;
border: 1px solid #6d7584;
.ant-input-number-input {
width: 100%;
height: 100%;
font-size: 14px;
padding: 0;
color: #4ea6ff;
text-align: center;
}
}
}
}
.twomain {
margin-left: 20px;
margin-top: 20px;
.ant-switch-checked {
background-color: #5dc988;
}
.info {
margin-left: 10px;
color: #6f6f6f;
font-size: 14px;
// margin-top: 10px;
}
.infor {
margin-left: 38px;
margin-top: 10px;
color: #c7cbd2;
font-size: 14px;
}
.chooseshow {
// background-color: red;
margin-left: 38px;
margin-top: 12px;
.fane {
color: #6f6f6f;
font-size: 14px;
}
}
.choo {
display: none;
}
.btm {
margin-left: 38px;
margin-top: 20px;
.bmo {
color: #6f6f6f;
font-size: 14px;
}
.bmt {
color: #c7cbd2;
font-size: 14px;
margin-top: 3px;
}
.chosecon {
display: flex;
margin-top: 6px;
margin-bottom: 20px;
.chose {
position: relative;
.inl {
position: absolute;
top: 2px;
}
.sh {
margin-left: 23px;
color: #6f6f6f;
}
}
}
}
}
}
}
.Lhead {
display: flex;
.btns {
display: flex;
margin-left: 20px;
// flex-wrap: wrap;
.btn {
padding: 0px 26px 0px 26px;
height: 38px;
background: rgba(64, 158, 255, 0);
border-radius: 8px;
border: 1px solid rgba(64, 158, 255, 1);
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: rgba(64, 158, 255, 1);
line-height: 36px;
margin-left: 5px;
}
}
.btn1 {
.search {
width: 15px;
height: 17px;
background-image: url("../../assets/images/courseManage/search1.png");
}
}
.btn2 {
.search {
width: 16px;
height: 18px;
background-image: url("../../assets/images/courseManage/reset1.png");
}
}
.btn3 {
margin-right: 0px;
.search {
width: 17px;
height: 18px;
background-image: url("../../assets/images/courseManage/add1.png");
}
}
.btn1:hover {
background: rgba(64, 158, 255, 1);
.search {
background-image: url("../../assets/images/courseManage/search0.png");
}
.btnText {
color: #ffffff;
}
}
.btn2:hover {
background: rgba(64, 158, 255, 1);
.search {
background-image: url("../../assets/images/courseManage/reset0.png");
}
.btnText {
color: #ffffff;
}
}
.btn3:hover {
background: rgba(64, 158, 255, 1);
.search {
background-image: url("../../assets/images/courseManage/add0.png");
}
.btnText {
color: #ffffff;
}
}
}
}
.Lbom {
position: relative;
margin-bottom: 20px;
.item {
width: 100%;
height: 200px;
// background-color: green;
margin-top: 40px;
border-radius: 8px;
border: 1px solid #f0f4fe;
.itemhead {
height: 50px;
width: 100%;
background-color: #f0f4fe;
display: flex;
align-items: center;
position: relative;
.lev {
margin-left: 27px;
margin-right: 16px;
line-height: 100%;
color: #4ea6ff;
font-size: 16px;
}
.lin {
width: 1px;
height: 35%;
background-color: #c7cbd2;
}
.nam {
margin-left: 16px;
color: #4f5156;
line-height: 100%;
font-size: 16px;
}
.count {
position: absolute;
line-height: 100%;
color: #4f5156;
font-size: 14px;
right: 40px;
span:nth-child(2) {
color: #63ca8c;
}
}
}
.itembomm {
display: flex;
align-items: center;
height: 150px;
.it {
// margin-left: 110px;
// margin-right: 110px;
width: 13%;
text-align: center;
.on {
font-size: 30px;
}
.ittext {
color: #4f5156;
margin-top: 16px;
margin-left: -5px;
}
}
.linee {
background-color: #ecf2fb;
width: 1px;
height: 55%;
}
.itright {
position: absolute;
right: 45px;
display: flex;
.te {
color: #4ea6ff;
font-size: 14px;
cursor: pointer;
}
.more {
position: relative;
height: 30px;
display: flex;
.moreArrow {
width: 13px;
height: 7px;
display: inline-block;
background-image: url("../../assets/images/navtop/down.png");
background-size: 100%;
margin: 2px;
margin-left: 7px;
margin-top: 6px;
}
.moreItems {
width: 80px;
height: 70px;
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: 0px;
top: 20px;
z-index: 100;
.roleItem {
font-size: 14px;
font-weight: 400;
color: rgba(79, 81, 86, 1);
line-height: 36px;
display: flex;
justify-content: center;
cursor: pointer;
}
.roleItem:hover {
color: #4ea6ff;
}
}
}
.more:hover .moreArrow {
background-image: url("../../assets/images/navtop/up.png");
}
.more:hover .moreItems {
display: block;
}
}
}
.show {
color: blue;
}
.noshow {
display: none;
}
}
.create {
margin-top: 40px;
.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;
}
}
}
}
}
.certificate {
width: 412px;
height: 212px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background-image: url(../../assets/images/taskpage/nocertificate.png);
background-size: 100% 100%;
}
.certificate1 {
padding: 36px;
display: flex;
min-height: 400px;
flex-wrap: wrap;
.addcertificate1 {
width: 210px;
height: 256px;
border: 1px solid rgba(64, 158, 255, 1);
display: flex;
justify-content: center;
align-items: center;
color: #4ea6ff;
cursor: pointer;
margin-left: 16px;
margin-right: 16px;
background-color: rgba(64, 158, 255, 0.06);
margin-bottom: 20px;
.addcertext {
font-size: 16px;
font-weight: 500;
color: #388be1;
line-height: 22px;
}
}
.certificatelist {
display: flex;
align-items: center;
flex-direction: column;
margin-left: 16px;
margin-right: 16px;
margin-bottom: 20px;
.certificatelistMain {
width: 210px;
height: 256px;
border: 1px solid rgba(64, 158, 255, 1);
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
.cergetrules {
width: 210px;
display: flex;
height: 26px;
align-items: center;
margin-top: 8px;
.cergetrulesText {
font-size: 12px;
font-weight: 400;
color: #000000;
line-height: 22px;
margin-left: 12px;
font-size: 12px;
}
.cergetrulesMain {
font-size: 12px;
color: #999;
width: 62px;
margin-left: 6px;
// overflow: hidden;
// white-space: nowrap;
// text-overflow: ellipsis;
background: rgba(64, 158, 255, 0.1);
border-radius: 11px;
opacity: 0.49;
border: 1px solid #409eff;
text-align: center;
}
.certificateMorebox {
font-size: 12px;
font-weight: 600;
color: #409eff;
line-height: 22px;
cursor: pointer;
position: relative;
margin-left: 31px;
}
.certificateMore {
position: absolute;
width: 45px;
height: 60px;
background: #fff;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
border: 1px solid #b1b3b8;
// .certificateMore1:hover {
// color: ;
// }
}
}
}
.certificateName {
width: 210px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
font-size: 16px;
font-weight: 500;
color: rgba(0, 0, 0, 0.85);
line-height: 22px;
margin-top: 8px;
display: flex;
justify-content: center;
}
}
}
}
.DelModal {
.ant-modal {
.ant-modal-content {
width: 424px !important;
.ant-modal-body {
.delete {
z-index: 9999;
width: 424px;
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: 40px;
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;
.del-icon {
width: 16px;
height: 16px;
margin-right: 10px;
background-image: url(@/assets/images/coursewareManage/notice.png);
background-size: 100% 100%;
}
.icon {
width: 16px;
height: 16px;
margin-right: 10px;
background-image: url(@/assets/images/coursewareManage/QR.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;
}
.del_btnbox {
display: flex;
margin: 30px auto;
justify-content: center;
.del_btn {
width: 100px;
height: 40px;
background: rgba(64, 158, 255, 0);
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 14px;
flex-shrink: 0;
cursor: pointer;
.btnText {
font-size: 14px;
font-weight: 400;
line-height: 40px;
}
}
.btn1 {
border: 1px solid rgba(64, 158, 255, 1);
color: #4ea6ff;
}
.btn2 {
background-color: #4ea6ff;
color: #ffffff;
}
}
}
}
}
}
}
}
</style>