feat: 关卡下学员获取,删除,进度图详情

This commit is contained in:
王熙东
2022-11-15 10:04:51 +08:00
parent d362f3db09
commit 3fa240bb5b
3 changed files with 144 additions and 179 deletions

View File

@@ -72,7 +72,8 @@ export const getRouterDetail = (routerId) => http.get('/admin/router/detail', {
export const addStudent = (obj) => http.post('/admin/router/addStudent', obj); export const addStudent = (obj) => http.post('/admin/router/addStudent', obj);
//删除学员 //删除学员
export const delStudent = (obj) => http.post('/admin/router/deleteStudent', obj); export const delStudent = (obj) => http.post('/admin/router/deleteStudent', obj);
// 获取学员路径图进度明细
export const stuProgress = (obj) => http.post('/admin/router/studentProcess', obj);
//项目基础信息----------------------------------- //项目基础信息-----------------------------------

View File

@@ -21,14 +21,14 @@
<img src="../../assets/images/studentimg/character.png" /> <img src="../../assets/images/studentimg/character.png" />
</div> </div>
<div class="stumation"> <div class="stumation">
<div class="stuname">王明</div> <div class="stuname">{{pro.userInfoBo.userName}}</div>
<div class="stugangw">产研部门 - 产品经理</div> <div class="stugangw">{{pro.userInfoBo.deptName+'-'+pro.userInfoBo.jobName}}</div>
</div> </div>
<div class="sortbox"> <div class="sortbox">
<div class="sortname">进度排名</div> <div class="sortname">进度排名</div>
<div class="sortnub"> <div class="sortnub">
<span class="nub1">2</span> <span class="nub1">{{pro.currentChapterCnt}}</span>
<span class="total">/10</span> <span class="total">/{{pro.totalChapterCnt}}</span>
</div> </div>
</div> </div>
<a-divider <a-divider
@@ -42,8 +42,8 @@
<div class="sortbox" style="margin-left: 34px"> <div class="sortbox" style="margin-left: 34px">
<div class="sortname">完成必修</div> <div class="sortname">完成必修</div>
<div class="sortnub"> <div class="sortnub">
<span class="nub1">3</span> <span class="nub1">{{pro.currentReqCnt}}</span>
<span class="total">/10</span> <span class="total">/{{pro.totalReqCnt}}</span>
</div> </div>
</div> </div>
<a-divider <a-divider
@@ -57,7 +57,7 @@
<div class="sortbox" style="margin-left: 34px"> <div class="sortbox" style="margin-left: 34px">
<div class="sortname">已修证书</div> <div class="sortname">已修证书</div>
<div class="sortnub"> <div class="sortnub">
<span class="nub1">1</span> <span class="nub1">{{pro.certCnt}}</span>
</div> </div>
</div> </div>
</div> </div>
@@ -68,8 +68,10 @@
<div><img src="../../assets/images/studentimg/chak.png" /></div> <div><img src="../../assets/images/studentimg/chak.png" /></div>
</div> </div>
</div> </div>
<div class="mainbox"> <div v-for="(item,index) in pro.chapterProcessList" class="mainbox"
<div class="rowtitle" @click="changeDown"> style="margin-top: 15px; height: 56px"
:key="item.chapterId">
<div class="rowtitle" @click="changeDown">
<div class="titleimg"> <div class="titleimg">
<img <img
:src=" :src="
@@ -79,84 +81,26 @@
" "
/> />
</div> </div>
<div class="titletext">阶段1 腾飞班阶段1</div> <div class="titletext">关卡{{index}} {{item.chapterName}}</div>
</div> </div>
<div :style="{ display: showDown ? 'block' : 'none' }"> <div :style="{ display: showDown ? 'block' : 'none' }">
<div class="rowclass"> <div v-for="_item in item.taskProcessList" :key="_item.routerTaskId" class="rowclass">
<div class="leftclass"> <div class="leftclass">
<div><img src="../../assets/images/leveladd/zai.png" /></div> <div><img src="../../assets/images/leveladd/zai.png" /></div>
<div class="text1">在线</div> <div class="text1">{{checkType(_item.type)}}</div>
<div class="text2">如何成为一个产品经理</div> <div class="text2">{{_item.name}}</div>
</div> </div>
<div class="alreadyclass"> <div class="alreadyclass">
<div class="alimg"> <div class="alimg">
<img src="../../assets/images/studentimg/complete.png" /> <img src="../../assets/images/studentimg/complete.png" />
</div> </div>
<div class="altext">已完成</div> <div class="altext">{{checkStatus(_item.status)}}</div>
</div>
</div>
<div class="rowclass">
<div class="leftclass">
<div><img src="../../assets/images/leveladd/zhi.png" /></div>
<div class="text1">直播</div>
<div class="text2">管理者播课</div>
</div>
<div class="alreadyclass">
<div class="alimg">
<img src="../../assets/images/studentimg/complete.png" />
</div>
<div class="altext">已完成</div>
</div>
</div>
<div class="rowclass">
<div class="leftclass">
<div><img src="../../assets/images/leveladd/mian.png" /></div>
<div class="text1">面授</div>
<div class="text2">管理面授课</div>
</div>
<div class="alreadyclass">
<div class="alimg">
<img src="../../assets/images/studentimg/notice.png" />
</div>
<div class="altext">未完成</div>
</div>
</div>
<div class="rowclass">
<div class="leftclass">
<div><img src="../../assets/images/leveladd/huo.png" /></div>
<div class="text1">活动</div>
<div class="text2">管理者活动</div>
</div>
<div class="alreadyclass">
<div class="alimg">
<img src="../../assets/images/studentimg/notice.png" />
</div>
<div class="altext">未完成</div>
</div>
</div>
<div class="rowclass">
<div class="leftclass">
<div><img src="../../assets/images/leveladd/zuo.png" /></div>
<div class="text1">作业</div>
<div class="text2">管理者作业</div>
</div>
<div class="alreadyclass">
<div class="alimg">
<img src="../../assets/images/studentimg/notice.png" />
</div>
<div class="altext">未完成</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="mainbox" style="margin-top: 15px; height: 56px">
<div class="rowtitle">
<div class="titleimg">
<img src="../../assets/images/studentimg/close.png" />
</div>
<div class="titletext">阶段2 腾飞班阶段2</div>
</div>
</div>
</div> </div>
<div class="btnn"> <div class="btnn">
<button class="btn2">关闭</button> <button class="btn2">关闭</button>
@@ -169,6 +113,8 @@
<script> <script>
import { reactive, toRefs } from "vue"; import { reactive, toRefs } from "vue";
import CheckStuMess from "./CheckStuMess.vue"; import CheckStuMess from "./CheckStuMess.vue";
import {stuProgress} from "@/api/index1";
import {message} from "ant-design-vue";
export default { export default {
name: "CheckStu", name: "CheckStu",
components: { CheckStuMess }, components: { CheckStuMess },
@@ -177,11 +123,16 @@ export default {
type: Boolean, type: Boolean,
default: false, default: false,
}, },
studentId: {
type: Number,
default: null,
}
}, },
setup(props, ctx) { setup(props, ctx) {
const state = reactive({ const state = reactive({
StuMessvisible: false, StuMessvisible: false,
showDown: false, showDown: false,
pro:null,
}); });
const closeDrawer = () => { const closeDrawer = () => {
ctx.emit("update:CheckStuvisible", false); ctx.emit("update:CheckStuvisible", false);
@@ -191,11 +142,56 @@ export default {
state.StuMessvisible = true; state.StuMessvisible = true;
}; };
const afterVisibleChange = (bool) => { const afterVisibleChange = (bool) => {
if(props.CheckStuvisible) {
getStuProgress()
}
console.log("state", bool); console.log("state", bool);
}; };
const changeDown = () => { const changeDown = () => {
state.showDown = !state.showDown; state.showDown = !state.showDown;
}; };
const getStuProgress = () => {
let obj = {
routerId:100,
studentId:props.studentId
}
stuProgress(obj).then(res => {
message.success("操作成功")
state.pro = res.data.data
console.log(res)
}).catch(err => {
message.error("操作失败"+err)
console.log(err)
})
}
const checkType = (type) => {
let typeRules = [
"",
"在线",
"面授",
"案例",
"作业",
"考试",
"直播",
"外链",
"讨论",
"活动",
"测评",
"评估",
"投票",
];
return typeRules[type];
}
const checkStatus = (status) => {
if(status < 0) return "未开始"
let statusRules = [
"进行中","已完成"
]
return statusRules[status]
}
return { return {
...toRefs(state), ...toRefs(state),
@@ -203,7 +199,10 @@ export default {
closeDrawer, closeDrawer,
showProMess, showProMess,
changeDown, changeDown,
checkType,
checkStatus,
// change, // change,
}; };
}, },
}; };

View File

@@ -69,7 +69,7 @@
<div class="centerbox" style="color: rgba(255, 182, 78, 1)"> <div class="centerbox" style="color: rgba(255, 182, 78, 1)">
添加任务 添加任务
</div> </div>
<div class="centermain">快速添加任务/阶段</div> <div class="centermain">快速添加任务/关卡</div>
</div> </div>
<div <div
class="taskbox" class="taskbox"
@@ -113,7 +113,7 @@
<!-- 概览无数据 --> <!-- 概览无数据 -->
<!-- 概览有数据 --> <!-- 概览有数据 -->
<div :style="{ display: nodata ? 'none' : 'block' }"> <div :style="{ display: nodata ? 'none' : 'block' }">
<div class="onerow"><div class="taskmain">项目概览</div></div> <div class="onerow"><div class="taskmain">关卡概览</div></div>
<div class="second" style="margin-top: 0"> <div class="second" style="margin-top: 0">
<div class="nubbox"> <div class="nubbox">
<span class="nub1">{{routerInfoOverview.totalStudentCnt}}</span> <span class="nub1">{{routerInfoOverview.totalStudentCnt}}</span>
@@ -149,7 +149,7 @@
<div class="nub2">总完成率</div> <div class="nub2">总完成率</div>
</div> </div>
</div> </div>
<div class="onerow"><div class="taskmain">阶段信息</div></div> <div class="onerow"><div class="taskmain">关卡信息</div></div>
<div class="stagemess"> <div class="stagemess">
<div v-for="item in stageList" <div v-for="item in stageList"
:class= "{ 'stage1': item.stageId == choosedStageId, 'stage2': item.stageId != choosedStageId }" :class= "{ 'stage1': item.stageId == choosedStageId, 'stage2': item.stageId != choosedStageId }"
@@ -160,8 +160,8 @@
<div class="stage2">阶段2</div> --> <div class="stage2">阶段2</div> -->
</div> </div>
<div class="stagesecond"> <div class="stagesecond">
<div class="staname">阶段名称</div> <div class="staname">关卡名称</div>
<div class="stamess">管理者进阶-腾飞班1第一阶段</div> <div class="stamess">管理者进阶-腾飞班1第一关卡</div>
</div> </div>
<div class="stagelast"> <div class="stagelast">
<div class="stagepro"> <div class="stagepro">
@@ -546,6 +546,7 @@
:current="currentPage" :current="currentPage"
:total="tableDataTotal" :total="tableDataTotal"
class="pagination" class="pagination"
style="display:none"
/> />
</div> </div>
</div> </div>
@@ -847,7 +848,10 @@
<!-- 导入学员抽屉 --> <!-- 导入学员抽屉 -->
<imp-stu v-model:AddImpStuvisible="AddImpStuvisible" /> <imp-stu v-model:AddImpStuvisible="AddImpStuvisible" />
<!-- 学员管理查看抽屉 --> <!-- 学员管理查看抽屉 -->
<check-stu v-model:CheckStuvisible="CheckStuvisible" /> <check-stu
v-model:CheckStuvisible="CheckStuvisible"
v-model:studentId="studentId"
/>
<!-- 面授学员抽屉 --> <!-- 面授学员抽屉 -->
<face-stu v-model:FSvisible="FSvisible" /> <face-stu v-model:FSvisible="FSvisible" />
<!-- 活动考勤抽屉 --> <!-- 活动考勤抽屉 -->
@@ -871,8 +875,9 @@
</div> </div>
</template> </template>
<script> <script>
import { ref, reactive, toRefs,onMounted } from "vue"; import { ref, reactive, toRefs,onMounted, createVNode } from "vue";
import { message } from "ant-design-vue"; import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import { message, Modal } from "ant-design-vue";
import PathAddStu from "../../components/drawers/pathStuAdd"; import PathAddStu from "../../components/drawers/pathStuAdd";
import ImpStu from "../../components/drawers/AddLevelImportStu"; import ImpStu from "../../components/drawers/AddLevelImportStu";
import CheckStu from "../../components/drawers/CheckStu"; import CheckStu from "../../components/drawers/CheckStu";
@@ -921,6 +926,7 @@ export default {
twobtnn: false, twobtnn: false,
inputbox: false, inputbox: false,
Wvisible: false, //作业管理 Wvisible: false, //作业管理
studentId:null,
// 共享文档列表 // 共享文档列表
docList:[ docList:[
{ {
@@ -1012,80 +1018,7 @@ export default {
// test: 1, // test: 1,
// }, // },
], ],
tableData: [ tableData: [],
{
key: 1,
name: "张三",
com: "产研部",
gang: "产品经理",
cur: "关卡2",
jin: "2/10",
time: "2022-07-15 14:00",
},
{
key: 2,
name: "张三",
com: "产研部",
gang: "产品经理",
cur: "关卡2",
jin: "2/10",
time: "2022-07-15 14:00",
},
{
key: 3,
name: "张三",
com: "产研部",
gang: "产品经理",
cur: "关卡2",
jin: "2/10",
time: "2022-07-15 14:00",
},
{
key: 4,
name: "张三",
com: "产研部",
gang: "产品经理",
cur: "关卡1",
jin: "2/10",
time: "2022-07-15 14:00",
},
{
key: 5,
name: "张三",
com: "产研部",
gang: "产品经理",
cur: "关卡1",
jin: "2/10",
time: "2022-07-15 14:00",
},
{
key: 6,
name: "张三",
com: "产研部",
gang: "产品经理",
cur: "关卡2",
jin: "2/10",
time: "2022-07-15 14:00",
},
{
key: 7,
name: "张三",
com: "产研部",
gang: "产品经理",
cur: "关卡2",
jin: "2/10",
time: "2022-07-15 14:00",
},
{
key: 8,
name: "张三",
com: "产研部",
gang: "产品经理",
cur: "关卡2",
jin: "2/10",
time: "2022-07-15 14:00",
},
],
}); });
const levelList = reactive({ const levelList = reactive({
@@ -1108,11 +1041,11 @@ export default {
stageList: [ // 阶段列表 stageList: [ // 阶段列表
{ {
stageId:1, stageId:1,
stage:"阶段一" stage:"关卡一"
}, },
{ {
stageId:2, stageId:2,
stage:"阶段二" stage:"关卡二"
} }
] ]
}) })
@@ -1200,7 +1133,7 @@ export default {
<div class="opacation"> <div class="opacation">
<span <span
onClick={() => { onClick={() => {
showCheckStu(); showCheckStu(text.record.studentId);
}} }}
style="color:#4EA6FF;margin-right:25px;cursor:pointer" style="color:#4EA6FF;margin-right:25px;cursor:pointer"
> >
@@ -1216,7 +1149,7 @@ export default {
调整 调整
</span> </span>
<span style="color:#4EA6FF;cursor:pointer" <span style="color:#4EA6FF;cursor:pointer"
onClick={() => {myDelStudent}} onClick={() => {delConfirm(text.record.studentId)}}
>删除</span> >删除</span>
</div> </div>
</div> </div>
@@ -1248,8 +1181,9 @@ export default {
const showImpStu = () => { const showImpStu = () => {
state.AddImpStuvisible = true; state.AddImpStuvisible = true;
}; };
const showCheckStu = () => { const showCheckStu = (id) => {
state.CheckStuvisible = true; state.CheckStuvisible = true;
state.studentId = id;
}; };
const showbtn = () => { const showbtn = () => {
state.twobtn = false; state.twobtn = false;
@@ -1329,32 +1263,44 @@ export default {
const getStudent = () => { const getStudent = () => {
let obj = { let obj = {
name: "", name: "",
pageNo: 0, pageNo: 1,
pageSize: 0, pageSize: 10,
routerId: state.routerId, routerId: 100,
}; };
api api
.getStudent(obj) .getStudent(obj)
.then((res) => { .then((res) => {
console.log("获取学员列表", res); console.log("获取学员列表", res);
let data = res.data.data.rows || null;
state.tableData = []
if(data.length){
for(let i in data) {
let _time = new Date(data[i].beginStudyTime*1000);
state.tableData.push({
key:i+1,
com:data[i].userInfoBo.deptName,
name:data[i].userInfoBo.userName,
gang:data[i].userInfoBo.jobName,
cur:data[i].currentChapterName || '0',
jin:data[i].completeChapterCnt+'/'+ data[i].totalChapterCnt,
time:_time.toLocaleDateString(),
studentId:data[i].studentId,
})
// state.tableData[i].key = i+1;
// state.tableData[i].com = data[i].userInfoBo.deptName;
// state.tableData[i].name = data[i].userInfoBo.userName
// state.tableData[i].gang = data[i].userInfoBo.jobName
// state.tableData[i].cur = data[i].currentChapterName || '0'
// state.tableData[i].jin = data[i].completeChapterCnt+'/'+ data[i].totalChapterCnt
// state.tableData[i].time = _time.toLocaleDateString()
}
}
}) })
.catch((err) => { .catch((err) => {
console.log("获取学员列表失败", err); console.log("获取学员列表失败", err);
}); });
}; };
const myDelStudent = () => {
let obj = {
"routerId": 0,
"studentIds": []
};
api.methods(obj).then(res => {
message.success("删除成功")
console.log(res)
}).catch(err => {
message.error("删除失败"+err)
console.log(err)
})
}
const checkType = (type) => { const checkType = (type) => {
let typeRules = [ let typeRules = [
"", "",
@@ -1436,6 +1382,25 @@ export default {
} }
}; };
const delConfirm = (id) => {
Modal.confirm({
title: '是否确认删除',
icon: createVNode(ExclamationCircleOutlined),
content: '',
okText: '确认',
cancelText: '取消',
onOk(){
api.delStudent({routerId:100,studentIds:[id]}).then(res => {
message.success("删除成功")
console.log(res)
}).catch(err => {
message.error("删除失败"+err)
console.log(err)
})
}
});
}
return { return {
...toRefs(state), ...toRefs(state),
...toRefs(levelList), ...toRefs(levelList),
@@ -1465,7 +1430,7 @@ export default {
changeTabs, changeTabs,
checkType, checkType,
handleChange, handleChange,
myDelStudent, delConfirm,
}; };
}, },
}; };