mirror of
https://codeup.aliyun.com/67762337eccfc218f6110e0e/vue/fe-manage.git
synced 2025-12-24 18:22:55 +08:00
Merge branch 'develop' of http://gitlab.dongwu-inc.com:10080/BOE/fe-manage into develop
This commit is contained in:
12
src/App.vue
12
src/App.vue
@@ -44,7 +44,7 @@ export default defineComponent({
|
||||
const store = useStore();
|
||||
const isLogin = ref(false);
|
||||
// console.log("router", router.getRoutes(), route);
|
||||
console.log("版本2.0.7------------");
|
||||
console.log("版本2.0.9------------");
|
||||
const routes = computed(() => {
|
||||
return router.getRoutes().filter((e) => e.meta?.isLink);
|
||||
});
|
||||
@@ -67,6 +67,7 @@ export default defineComponent({
|
||||
initDict("pathmapPic");
|
||||
initDict("projectClass");
|
||||
initDict("projectPic");
|
||||
initDict("sysType");
|
||||
getMemberInfo();
|
||||
getOrgTree();
|
||||
}
|
||||
@@ -128,14 +129,7 @@ export default defineComponent({
|
||||
store.commit("SET_DICT", { key, data: list });
|
||||
}
|
||||
|
||||
const getDictList = (param) =>
|
||||
api1
|
||||
.getDict({
|
||||
pageNo: 1,
|
||||
pageSize: 20,
|
||||
setCode: param,
|
||||
})
|
||||
.then((res) => res.data.data.rows);
|
||||
const getDictList = (param) => api1.getDictTree({setCode: param,}).then((res) => res.data.data);
|
||||
//获取组织树
|
||||
const getOrgTree = () => {
|
||||
api.getOrgTreeInfo().then((res) => {
|
||||
|
||||
@@ -78,8 +78,9 @@ export const delStudent = (obj) =>
|
||||
http.post("/admin/router/deleteStudent", obj);
|
||||
|
||||
// 获取学员路径图进度明细
|
||||
export const stuProgress = (obj) =>
|
||||
http.post("/admin/router/studentProcess", obj);
|
||||
export const stuProgress = (params) => http.get('/admin/router/studentProcess', {params});
|
||||
// export const stuProgress = (obj) =>http.post("/admin/router/studentProcess", obj);
|
||||
|
||||
//编辑学习路径基本信息
|
||||
export const editLearnInfo = (obj) => http.post('/admin/router/editInfo', obj)
|
||||
|
||||
@@ -102,6 +103,7 @@ export const billboard = (obj) => http.post("/admin/project/billboard", obj);
|
||||
//公共信息---------------------------------------------------
|
||||
// 获取字典信息
|
||||
export const getDict = (obj) => http.post('/dict/getList', obj)
|
||||
export const getDictTree = (params) => http.get('/dict/getTree', {params})
|
||||
//获取组织树一级列表
|
||||
export const getOrgTree = (obj) => http.post('/admin/router/orgList', obj)
|
||||
//根据id获取组织树一级元素下所有子元素
|
||||
@@ -163,7 +165,9 @@ export const AssessmentManagementMessage = (obj) => http.get(`/admin/student/get
|
||||
export const exportTaskStudent = (obj) => http.post('/admin/student/exportTaskStudent', obj)
|
||||
//导出任务作业
|
||||
export const exportHomeWork = (obj) => http.get('/admin/student/exportHomeWork', { params: obj })
|
||||
//签到
|
||||
//导出任务作业模板
|
||||
export const exportHomeWorkTemplate = (obj) => http.get('/admin/student/exportHomeWorkTemplate', { params: obj })
|
||||
//签到
|
||||
export const attendanceSign = (obj) => http.post('/stu/task/attendance/sign', obj)
|
||||
//请假
|
||||
export const attendanceLeave = (obj) => http.post('/stu/task/attendance/leave', obj)
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
</div>
|
||||
<div class="cancel" style="margin-left: 15px"></div>
|
||||
</div>
|
||||
<div v-if="errNum !== 0" class="defeat">
|
||||
<div v-if="downloadErrUrl !== ''" class="defeat">
|
||||
<div class="detext" @click="downloadEeeorData">
|
||||
下载失败数据
|
||||
</div>
|
||||
@@ -124,11 +124,11 @@
|
||||
</div>
|
||||
<div
|
||||
v-if="showBottomBar"
|
||||
:class="errNum == 0 ? 'succebox' : 'defeatbox'"
|
||||
:class="downloadErrUrl == '' ? 'succebox' : 'defeatbox'"
|
||||
>
|
||||
<div class="lefimg"></div>
|
||||
<div class="tacl">
|
||||
{{ succNum }}条数据导入成功,{{ errNum }}条数据导入失败
|
||||
{{ succNum }}条数据导入成功,{{ downloadErrUrl == ''? 0 :errNum }}条数据导入失败
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -15,14 +15,15 @@
|
||||
@click="closeDrawer"
|
||||
/>
|
||||
</div>
|
||||
<div class="main">
|
||||
<a-spin v-if="loading" :spinning="loading"/>
|
||||
<div v-if="!loading" class="main">
|
||||
<div class="stuinfor">
|
||||
<div class="portrait">
|
||||
<img src="../../assets/images/studentimg/character.png" />
|
||||
</div>
|
||||
<div class="stumation">
|
||||
<div class="stuname">{{pro.userInfoBo.userName}}</div>
|
||||
<div class="stugangw">{{pro.userInfoBo.deptName+'-'+pro.userInfoBo.jobName}}</div>
|
||||
<div class="stugangw">{{pro.userInfoBo.deptName?pro.userInfoBo.deptName:"" + '-' + pro.userInfoBo.jobName?pro.userInfoBo.jobName:""}}</div>
|
||||
</div>
|
||||
<div class="sortbox">
|
||||
<div class="sortname">进度排名</div>
|
||||
@@ -46,7 +47,7 @@
|
||||
<span class="total">/{{pro.totalReqCnt}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<a-divider
|
||||
<!-- <a-divider
|
||||
type="vertical"
|
||||
style="
|
||||
height: 49px;
|
||||
@@ -59,16 +60,16 @@
|
||||
<div class="sortnub">
|
||||
<span class="nub1">{{pro.certCnt}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
</div>
|
||||
<div class="secondrow">
|
||||
<div class="rowleft">产品经理管理 - 腾飞班1</div>
|
||||
<div class="rowbox" @click="showProMess">
|
||||
<div class="rowleft">{{ pro.name }}</div>
|
||||
<!-- <div class="rowbox" @click="showProMess">
|
||||
<div class="shuom">说明</div>
|
||||
<div><img src="../../assets/images/studentimg/chak.png" /></div>
|
||||
</div>
|
||||
</div> -->
|
||||
</div>
|
||||
<div v-for="(item,index) in pro.chapterProcessList" class="mainbox"
|
||||
<!-- <div v-for="(item) in pro.chapterProcessList" class="mainbox"
|
||||
style="margin-top: 15px; height: 56px"
|
||||
:key="item.chapterId">
|
||||
<div class="rowtitle" @click="changeDown">
|
||||
@@ -81,7 +82,7 @@
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
<div class="titletext">关卡{{index}} {{item.chapterName}}</div>
|
||||
<div class="titletext">{{item.chapterName}}</div>
|
||||
</div>
|
||||
|
||||
<div :style="{ display: showDown ? 'block' : 'none' }">
|
||||
@@ -99,11 +100,105 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<div class="mainbox">
|
||||
<a-collapse v-model:activeKey="stageListActive">
|
||||
<template #expandIcon="{ isActive }">
|
||||
<img
|
||||
style="margin-right: 20px"
|
||||
:src="
|
||||
isActive
|
||||
? require('../../assets/images/studentimg/open.png')
|
||||
: require('../../assets/images/studentimg/close.png')
|
||||
"
|
||||
/>
|
||||
<div></div>
|
||||
</template>
|
||||
<a-collapse-panel
|
||||
v-for="value in pro.chapterProcessList"
|
||||
:key="value.chapterId"
|
||||
:header="value.chapterName"
|
||||
|
||||
>
|
||||
<template #extra >
|
||||
<div @click.stop="">
|
||||
<div class="rowbox">
|
||||
<a-popover title="关卡说明">
|
||||
<template #content>
|
||||
<p>{{value.remark}}</p>
|
||||
</template>
|
||||
<div class="shuom">说明</div>
|
||||
</a-popover>
|
||||
<div><img src="../../assets/images/studentimg/chak.png" /></div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<div
|
||||
class="rowclass"
|
||||
v-for="(item, key) in value.taskProcessList"
|
||||
:key="key"
|
||||
>
|
||||
|
||||
<div class="leftclass">
|
||||
<div>
|
||||
<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/diao.png')
|
||||
: item.type === 12
|
||||
? require('../../assets/images/leveladd/tou.png')
|
||||
: item.type === 13
|
||||
? require('../../assets/images/leveladd/diao.png')
|
||||
: null
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
<div class="text1">{{ checkType(item.type) }}</div>
|
||||
<div class="text2">{{ item.name }}</div>
|
||||
</div>
|
||||
<div class="alreadyclass">
|
||||
<div class="alimg">
|
||||
<img
|
||||
:src="
|
||||
item.status === 1
|
||||
? require('../../assets/images/studentimg/complete.png')
|
||||
: require('../../assets/images/studentimg/notice.png')
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
<div class="altext">{{ item.status ==0?"进行中":item.status ==1?"已完成":"未开始" }}</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</a-collapse-panel>
|
||||
</a-collapse>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="btnn">
|
||||
<button class="btn2">关闭</button>
|
||||
<button class="btn2" @click="closeDrawer">关闭</button>
|
||||
</div>
|
||||
</div>
|
||||
</a-drawer>
|
||||
@@ -114,7 +209,7 @@
|
||||
import { reactive, toRefs } from "vue";
|
||||
import CheckStuMess from "./CheckStuMess.vue";
|
||||
import {stuProgress} from "@/api/index1";
|
||||
import {message} from "ant-design-vue";
|
||||
// import {message} from "ant-design-vue";
|
||||
export default {
|
||||
name: "CheckStu",
|
||||
components: { CheckStuMess },
|
||||
@@ -126,13 +221,19 @@ export default {
|
||||
studentId: {
|
||||
type: Number,
|
||||
default: null,
|
||||
}
|
||||
},
|
||||
routerId: {
|
||||
type: Number,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
setup(props, ctx) {
|
||||
const state = reactive({
|
||||
StuMessvisible: false,
|
||||
showDown: false,
|
||||
pro:null,
|
||||
loading:true,
|
||||
stageListActive: 0,
|
||||
});
|
||||
const closeDrawer = () => {
|
||||
ctx.emit("update:CheckStuvisible", false);
|
||||
@@ -151,21 +252,24 @@ export default {
|
||||
state.showDown = !state.showDown;
|
||||
};
|
||||
const getStuProgress = () => {
|
||||
state.loading = true
|
||||
let obj = {
|
||||
routerId:100,
|
||||
routerId:props.routerId,
|
||||
studentId:props.studentId
|
||||
}
|
||||
stuProgress(obj).then(res => {
|
||||
message.success("操作成功")
|
||||
console.log("查询当前学员进度信息success",res)
|
||||
state.pro = res.data.data
|
||||
state.loading = false
|
||||
console.log(res)
|
||||
}).catch(err => {
|
||||
message.error("操作失败"+err)
|
||||
console.log("查询当前学员进度信息err",err)
|
||||
state.loading = false
|
||||
console.log(err)
|
||||
})
|
||||
}
|
||||
|
||||
const checkType = (type) => {
|
||||
const checkType = (type) => {
|
||||
let typeRules = [
|
||||
"",
|
||||
"在线",
|
||||
@@ -317,28 +421,115 @@ export default {
|
||||
}
|
||||
}
|
||||
}
|
||||
// .mainbox {
|
||||
// // height: 463px;
|
||||
// margin-right: 37px;
|
||||
// margin-top: 32px;
|
||||
// border: 1px solid rgba(221, 238, 255, 1);
|
||||
// border-radius: 6px;
|
||||
// .rowtitle {
|
||||
// height: 56px;
|
||||
// background: rgba(240, 246, 252, 1);
|
||||
// display: flex;
|
||||
// align-items: center;
|
||||
// .titleimg {
|
||||
// width: 20px;
|
||||
// height: 20px;
|
||||
// margin-left: 23px;
|
||||
// }
|
||||
// .titletext {
|
||||
// color: rgba(51, 51, 51, 1);
|
||||
// font-size: 16px;
|
||||
// font-weight: 500;
|
||||
// margin-left: 16px;
|
||||
// }
|
||||
// }
|
||||
// .rowclass {
|
||||
// height: 81px;
|
||||
// border-bottom: 1px solid rgba(221, 238, 255, 1);
|
||||
// display: flex;
|
||||
// justify-content: space-between;
|
||||
// align-items: center;
|
||||
// .leftclass {
|
||||
// display: flex;
|
||||
// margin-left: 25px;
|
||||
// align-items: center;
|
||||
// .text1 {
|
||||
// color: #000000;
|
||||
// font-size: 14px;
|
||||
// font-weight: 500;
|
||||
// margin-left: 25px;
|
||||
// }
|
||||
// .text2 {
|
||||
// color: rgba(51, 51, 51, 0.8);
|
||||
// font-size: 14px;
|
||||
// margin-left: 65px;
|
||||
// }
|
||||
// }
|
||||
// .alreadyclass {
|
||||
// display: flex;
|
||||
// margin-right: 57px;
|
||||
// .alimg {
|
||||
// height: 16px;
|
||||
// width: 16px;
|
||||
// }
|
||||
// .altext {
|
||||
// color: rgba(56, 125, 247, 1);
|
||||
// font-size: 14px;
|
||||
// margin-left: 16px;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
.mainbox {
|
||||
// height: 463px;
|
||||
margin-right: 37px;
|
||||
margin-top: 32px;
|
||||
border: 1px solid rgba(221, 238, 255, 1);
|
||||
border-radius: 6px;
|
||||
.rowtitle {
|
||||
height: 56px;
|
||||
background: rgba(240, 246, 252, 1);
|
||||
//border: 1px solid rgba(221, 238, 255, 1);
|
||||
//border-radius: 6px;
|
||||
.rowbox {
|
||||
width: 64px;
|
||||
height: 24px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin-left: 24px;
|
||||
border: 1px solid rgba(64, 158, 255, 1);
|
||||
background: rgba(64, 158, 255, 0.1);
|
||||
margin-right: 480px;
|
||||
cursor: pointer;
|
||||
.shuom {
|
||||
color: rgba(64, 158, 255, 1);
|
||||
font-size: 14px;
|
||||
line-height: 20px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
.ant-collapse {
|
||||
background-color: #ffffff;
|
||||
border: 0;
|
||||
}
|
||||
.ant-collapse-content > .ant-collapse-content-box {
|
||||
padding: 0;
|
||||
border: 0;
|
||||
}
|
||||
.ant-collapse > .ant-collapse-item {
|
||||
border: 1px solid rgba(221, 238, 255, 1);
|
||||
border-radius: 6px;
|
||||
margin-bottom: 15px;
|
||||
border-bottom: 0px;
|
||||
}
|
||||
.ant-collapse-content {
|
||||
border-top: 0;
|
||||
}
|
||||
.ant-collapse-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.titleimg {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
margin-left: 23px;
|
||||
}
|
||||
.titletext {
|
||||
color: rgba(51, 51, 51, 1);
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
margin-left: 16px;
|
||||
}
|
||||
height: 56px;
|
||||
background-color: rgba(240, 246, 252, 1);
|
||||
font-size: 16px;
|
||||
color: rgba(51, 51, 51, 1);
|
||||
font-weight: 500;
|
||||
}
|
||||
.rowclass {
|
||||
height: 81px;
|
||||
|
||||
@@ -209,6 +209,10 @@ export default {
|
||||
type: Number,
|
||||
default: null,
|
||||
},
|
||||
pid: {
|
||||
type: Number,
|
||||
default: null,
|
||||
},
|
||||
searchTaskList: {
|
||||
type: Function,
|
||||
default: null,
|
||||
@@ -352,10 +356,7 @@ export default {
|
||||
}
|
||||
};
|
||||
function downTemplate() {
|
||||
window.open(
|
||||
process.env.VUE_APP_FILE_PATH +
|
||||
process.env.VUE_APP_UP_LOAD_HOMEWORK_TEMPLATE
|
||||
);
|
||||
window.open(`${process.env.VUE_APP_BASE_API}/admin/student/exportHomeWorkTemplate?taskId=${props.id || ''}&type=${props.type || ''}&pid=${props.pid || ''}&thirdType=3`);
|
||||
}
|
||||
|
||||
return {
|
||||
|
||||
@@ -8,7 +8,15 @@
|
||||
</div>
|
||||
<div class="noticeContent">
|
||||
<div v-for="item in notice" :key="item.id" class="item">
|
||||
<div class="itemcontent">{{ item.content }}</div>
|
||||
<!-- <div class="itemcontent">{{ item.content }}</div> -->
|
||||
<a-textarea
|
||||
class="itemcontent"
|
||||
disabled="true"
|
||||
v-model:value="item.content"
|
||||
:maxlength="150"
|
||||
placeholder="公告信息最多输入150个字"
|
||||
style="margin-top: -10px; height: 120px;background-color: #fff;"
|
||||
/>
|
||||
<div class="itemtime">{{ item.pubtime }}</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -136,7 +144,7 @@ export default {
|
||||
justify-content: space-between;
|
||||
margin-bottom: 66px;
|
||||
.itemcontent {
|
||||
width: 500px;
|
||||
width: 700px;
|
||||
word-break: break-all;
|
||||
word-wrap: break-word;
|
||||
// overflow: hidden;
|
||||
@@ -146,6 +154,7 @@ export default {
|
||||
font-weight: 400;
|
||||
color: #666666;
|
||||
line-height: 22px;
|
||||
resize: none;
|
||||
}
|
||||
.itemtime {
|
||||
font-size: 14px;
|
||||
|
||||
@@ -14,24 +14,38 @@
|
||||
<p>当前公告内容:</p>
|
||||
<!-- 预览 -->
|
||||
<template v-if="!editOn">
|
||||
<div class="txt-content">
|
||||
<!-- <div class="txt-content">
|
||||
{{ noticeContent1 ? noticeContent1 : "暂无公告" }}
|
||||
</div>
|
||||
</div> -->
|
||||
<a-textarea
|
||||
disabled="true"
|
||||
v-model:value="noticeContent1"
|
||||
:maxlength="150"
|
||||
placeholder="公告信息最多输入150个字"
|
||||
style="margin-top: -10px; height: 160px; resize: none;background-color: #fff;color:#666;"
|
||||
/>
|
||||
<div class="btn-content">
|
||||
<a-button type="primary" @click="handleEdit">编辑</a-button>
|
||||
</div>
|
||||
</template>
|
||||
<!-- 编辑 -->
|
||||
<template v-if="editOn">
|
||||
<div class="txt-content">
|
||||
<!-- <div class="txt-content">
|
||||
{{ noticeContent1 ? noticeContent1 : "暂无公告" }}
|
||||
</div>
|
||||
</div> -->
|
||||
<a-textarea
|
||||
disabled="true"
|
||||
v-model:value="noticeContent1"
|
||||
:maxlength="150"
|
||||
placeholder="公告信息最多输入150个字"
|
||||
style="margin-top: -10px; height:160px; resize: none;background-color: #fff;color:#666;"
|
||||
/>
|
||||
<p>编辑新公告:</p>
|
||||
<a-textarea
|
||||
v-model:value="noticeContent"
|
||||
:maxlength="150"
|
||||
placeholder="公告信息最多输入150个字"
|
||||
style="margin-top: -10px; height: 120px"
|
||||
style="margin-top: -10px; height: 160px"
|
||||
/>
|
||||
<div class="btn-content">
|
||||
<a-button class="cancel" @click="handleCancel">取消</a-button>
|
||||
@@ -62,7 +76,7 @@ export default {
|
||||
const state = reactive({
|
||||
noticeChecked: false,
|
||||
projectInfo: {},
|
||||
noticeContent1: "",
|
||||
noticeContent1: "暂无公告",
|
||||
noticeContent: "",
|
||||
editOn: false,
|
||||
});
|
||||
|
||||
@@ -246,8 +246,8 @@ export default {
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
title: "学员关卡",
|
||||
/** {
|
||||
title: "学员阶段",
|
||||
dataIndex: "currentStageName",
|
||||
key: "currentStageName",
|
||||
width: 60,
|
||||
@@ -261,7 +261,7 @@ export default {
|
||||
</div>
|
||||
);
|
||||
},
|
||||
},
|
||||
},*/
|
||||
{
|
||||
title: "提交时间",
|
||||
dataIndex: "endStudyTime",
|
||||
|
||||
@@ -632,7 +632,7 @@ export default {
|
||||
customRender: (text) => {
|
||||
return (
|
||||
<div class="racona">
|
||||
<span>{text.record.signStatus ? "正常" : "异常"}</span>
|
||||
<span>{ text.record.signStatus == null && new Date().getTime() > new Date(state.endTime).getTime() ? "异常" : text.record.signStatus ? "正常" : text.record.leaveStatus ? "异常" : text.record.signStatus == null ? "-" : "异常" }</span>
|
||||
</div>
|
||||
);
|
||||
},
|
||||
|
||||
@@ -169,6 +169,7 @@
|
||||
v-model:eScorevisible="Evisible"
|
||||
:type="1"
|
||||
:id="projectTaskInfo?.projectTaskId"
|
||||
:pid="projectTaskInfo?.projectId"
|
||||
v-model:searchTaskList="searchTaskList"
|
||||
/>
|
||||
<!-- 查看作业抽屉 -->
|
||||
|
||||
@@ -135,6 +135,7 @@
|
||||
v-model:eScorevisible="Evisible"
|
||||
:type="1"
|
||||
:id="projectTaskInfo?.projectTaskId"
|
||||
:pid="projectTaskInfo?.projectId"
|
||||
v-model:searchTaskList="searchTaskList"
|
||||
/>
|
||||
<!-- 查看作业抽屉 -->
|
||||
|
||||
@@ -261,7 +261,7 @@ export default {
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
/** {
|
||||
title: "学员关卡",
|
||||
dataIndex: "currentStageName",
|
||||
key: "currentStageName",
|
||||
@@ -276,7 +276,7 @@ export default {
|
||||
</div>
|
||||
);
|
||||
},
|
||||
},
|
||||
},*/
|
||||
{
|
||||
title: "完成时间",
|
||||
dataIndex: "lastStudyTime",
|
||||
|
||||
@@ -575,7 +575,7 @@ export default {
|
||||
customRender: (text) => {
|
||||
return (
|
||||
<div class="racona">
|
||||
<span>{text.record.signStatus ? "正常" : "异常"}</span>
|
||||
<span>{text.record.signStatus == null && new Date().getTime() > new Date(state.endTime).getTime() ? "异常" : text.record.signStatus ? "正常" : text.record.leaveStatus ? "异常" : text.record.signStatus == null ? "-" : "异常"}</span>
|
||||
</div>
|
||||
);
|
||||
},
|
||||
@@ -756,6 +756,7 @@ export default {
|
||||
pid: props.datasource.routerId,
|
||||
// status: Number(state.name),
|
||||
studentName: state.name,
|
||||
signStatus: state.projectName2,
|
||||
taskId: props.datasource.routerTaskId,
|
||||
taskType: props.datasource.type,
|
||||
});
|
||||
@@ -767,6 +768,7 @@ export default {
|
||||
type: 2,
|
||||
pid: props.datasource.routerId,
|
||||
// status: Number(state.name),
|
||||
signStatus: state.projectName2,
|
||||
studentName: state.name,
|
||||
taskId: props.datasource.routerTaskId,
|
||||
taskType: props.datasource.type,
|
||||
|
||||
@@ -149,6 +149,7 @@
|
||||
v-model:eScorevisible="Evisible"
|
||||
:type="2"
|
||||
:id="datasource?.routerTaskId"
|
||||
:pid="datasource?.routerId"
|
||||
v-model:searchTaskList="searchTaskList"
|
||||
/>
|
||||
<!-- 查看作业抽屉 -->
|
||||
|
||||
@@ -130,6 +130,7 @@
|
||||
v-model:eScorevisible="Evisible"
|
||||
:type="2"
|
||||
:id="datasource?.routerTaskId"
|
||||
:pid="datasource?.routerId"
|
||||
v-model:searchTaskList="searchTaskList"
|
||||
/>
|
||||
<!-- 查看作业抽屉 -->
|
||||
|
||||
@@ -594,6 +594,7 @@ const auditRowSelection = computed(() => ({
|
||||
preserveSelectedRowKeys: true,
|
||||
}));
|
||||
const closeDrawer = () => {
|
||||
deleteDepSelect();
|
||||
visiable.value = false;
|
||||
stuData.value = [];
|
||||
nameSearch.value.keyword = "";
|
||||
@@ -687,7 +688,7 @@ function peopleName(name) {
|
||||
}
|
||||
|
||||
const resetStu = () => {
|
||||
deleteDepSelect();
|
||||
// deleteDepSelect();
|
||||
nameSearch.value.keyword = "";
|
||||
nameSearch.value.page = 1;
|
||||
nameSearch.value.pageSize = 10;
|
||||
@@ -742,6 +743,7 @@ function handleStageOk() {
|
||||
groupIds: selectsData.value.groupList?.map((e) => e.id),
|
||||
studentList: selectsData.value.studentList,
|
||||
}).then(() => {
|
||||
deleteDepSelect();
|
||||
emit("finash", true);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -117,6 +117,11 @@
|
||||
导出学习信息
|
||||
</a-button>
|
||||
</a-col>
|
||||
<a-col :span="1.5" v-else>
|
||||
<a-button class="cus-btn white" @click="exportTaskStuRouter">
|
||||
导出学习信息
|
||||
</a-button>
|
||||
</a-col>
|
||||
<a-col :span="1.5">
|
||||
<a-button class="cus-btn white" @click="bathDel">
|
||||
<template #icon
|
||||
@@ -340,6 +345,7 @@
|
||||
v-model:eScorevisible="eScorevisible"
|
||||
:type="3"
|
||||
:id="id"
|
||||
:pid="id"
|
||||
v-model:searchTaskList="getStuList"
|
||||
/>
|
||||
<!-- 导出作业提示框 -->
|
||||
@@ -496,13 +502,22 @@ const stuRowSelection = computed(() => ({
|
||||
}));
|
||||
// 导出数据
|
||||
function exportTaskStu() {
|
||||
console.log("props.datasource", props.datasource);
|
||||
console.log("props.datasource", props);
|
||||
window.open(
|
||||
`${
|
||||
process.env.VUE_APP_BASE_API
|
||||
}/admin/student/exportTaskStudent?type=${1}&pid=${props.id}&taskType=0`
|
||||
);
|
||||
}
|
||||
|
||||
function exportTaskStuRouter() {
|
||||
console.log("props.datasource", props);
|
||||
window.open(
|
||||
`${
|
||||
process.env.VUE_APP_BASE_API
|
||||
}/admin/student/exportTaskStudent?type=${2}&pid=${props.id}&taskType=0`
|
||||
);
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
getStuList();
|
||||
|
||||
@@ -32,6 +32,7 @@ export default createStore({
|
||||
projectSys: [],//培训分类
|
||||
pathmapPic: [],//学习路径背景图
|
||||
memberInitInfo: [],//学员默认
|
||||
sysType: [],//学员默认
|
||||
},
|
||||
getters: {},
|
||||
mutations: {
|
||||
|
||||
@@ -39,15 +39,6 @@
|
||||
</a-select>
|
||||
</div>
|
||||
<div class="select">
|
||||
<!-- <a-select
|
||||
v-model:value="categoryId"
|
||||
dropdownClassName="dropdown-style"
|
||||
style="width: 200px"
|
||||
placeholder="请选择内容分类"
|
||||
:options="options2"
|
||||
allowClear
|
||||
showSearch
|
||||
></a-select> -->
|
||||
<a-tree-select
|
||||
:getPopupContainer="
|
||||
(triggerNode) => {
|
||||
@@ -61,12 +52,13 @@
|
||||
placeholder="请选择内容分类"
|
||||
allow-clear
|
||||
tree-default-expand-all
|
||||
:tree-data="options2222"
|
||||
:fieldNames="{
|
||||
children: 'children',
|
||||
title: 'dictName',
|
||||
value: 'dictCode',
|
||||
}"
|
||||
:tree-data="sysTypeOptions"
|
||||
>
|
||||
<template #title="{ value: val, title }">
|
||||
<b v-if="val === '11111'" style="color: #08c">sss</b>
|
||||
<template v-else>{{ title }}</template>
|
||||
</template>
|
||||
</a-tree-select>
|
||||
</div>
|
||||
<div class="select">
|
||||
@@ -2298,7 +2290,7 @@ import {
|
||||
shallowRef,
|
||||
onMounted,
|
||||
onBeforeUnmount,
|
||||
watch,
|
||||
watch, computed,
|
||||
} from "vue";
|
||||
|
||||
import * as api from "../../api/indexInvist.js";
|
||||
@@ -2359,6 +2351,8 @@ import AddTest from "../../components/drawers/AddTest.vue";
|
||||
import TableStudent from "@/components/student/TableStudent";
|
||||
import FJUpload from "@/components/common/FJUpload";
|
||||
import { updateStudent } from "@/api/indexProjStu";
|
||||
import {useStore} from "vuex";
|
||||
|
||||
//列表表格
|
||||
const columns1 = [
|
||||
// {
|
||||
@@ -2388,11 +2382,9 @@ const columns1 = [
|
||||
title: "内容分类",
|
||||
width: 130,
|
||||
dataIndex: "contentTxt",
|
||||
ellipsis: true,
|
||||
key: "1",
|
||||
align: "center",
|
||||
customRender: ({ text }) => {
|
||||
return text ? text : "-";
|
||||
},
|
||||
},
|
||||
{
|
||||
title: "课程形式",
|
||||
@@ -2992,6 +2984,7 @@ export default defineComponent({
|
||||
},
|
||||
setup() {
|
||||
const CourseModalRef = ref(null);
|
||||
const store = useStore();
|
||||
|
||||
const state = reactive({
|
||||
//新加
|
||||
@@ -3284,14 +3277,14 @@ export default defineComponent({
|
||||
corpowerlistvisible: false,
|
||||
|
||||
lookCourseModal: false,
|
||||
faceDetailObj: null,
|
||||
faceDetailObj: {},
|
||||
|
||||
offcourseId: null,
|
||||
projectName: "",
|
||||
name: "",
|
||||
createName: "",
|
||||
auditStatus: null,
|
||||
categoryId: null,
|
||||
categoryId: undefined,
|
||||
projectTime: "",
|
||||
|
||||
//列表
|
||||
@@ -3550,6 +3543,31 @@ export default defineComponent({
|
||||
state.viewpowervisible = true;
|
||||
};
|
||||
|
||||
const sysTypeOptions = computed(() => formateDictT(store.state.sysType));
|
||||
|
||||
// console.log('12344', sysTypeOptions)
|
||||
|
||||
// 处理数据字典
|
||||
function formateDictT(data) {
|
||||
for(let i=0;i<data.length;i++){
|
||||
data[i].title = data[i].dictName;
|
||||
data[i].value = data[i].dictCode;
|
||||
if(data[i].children.length!==0){
|
||||
for(let j=0;j<data[i].children.length;j++){
|
||||
data[i].children[j].title = data[i].children[j].dictName;
|
||||
data[i].children[j].value = data[i].children[j].dictCode;
|
||||
if(data[i].children[j].children.length!==0){
|
||||
for(let k=0; k<data[i].children[j].children.length; k++) {
|
||||
data[i].children[j].children[k].title = data[i].children[j].children[k].dictName;
|
||||
data[i].children[j].children[k].value = data[i].children[j].children[k].dictCode;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
// 富文本 sssssssssssssss
|
||||
// 编辑器实例,必须用 shallowRef
|
||||
const editorRef = shallowRef();
|
||||
@@ -3717,6 +3735,7 @@ export default defineComponent({
|
||||
|
||||
// 渲染列表1操作
|
||||
const getTableDate = async () => {
|
||||
console.log('我是点击搜索的数据',state.categoryId)
|
||||
// let datas = state.tableData1;
|
||||
let startTime = "";
|
||||
let endTime = "";
|
||||
@@ -3769,70 +3788,19 @@ export default defineComponent({
|
||||
true
|
||||
);
|
||||
|
||||
// datas.forEach((itm) => {
|
||||
// itm.pageNo = pageNo;
|
||||
// for (let item of options2.value) {
|
||||
// if (String(item.value) === String(itm.content)) {
|
||||
// itm.contentTxt = item.label;
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
|
||||
datas.forEach((itm) => {
|
||||
itm.pageNo = pageNo;
|
||||
console.log(itm);
|
||||
for (let i = 0; i < options2.value.length; i++) {
|
||||
for (let j = 0; j < options2.value[i].children.length; j++) {
|
||||
itm.contentTxt = changeTreeSelectValue(itm.categoryId);
|
||||
// if (
|
||||
// String(options2.value[i].children[j].value) ===
|
||||
// String(itm.categoryId)
|
||||
// ) {
|
||||
// console.log();
|
||||
// itm.contentTxt = options2.value[i].children[j].title;
|
||||
// return false;
|
||||
// }
|
||||
}
|
||||
}
|
||||
itm.contentTxt = findClassFullName(sysTypeOptions.value,itm.categoryId) || '-'
|
||||
});
|
||||
|
||||
console.log(datas, options2.value);
|
||||
state.tableData1 = datas;
|
||||
};
|
||||
// 格式化树型结构选择数据
|
||||
const changeTreeSelectValue = (values) => {
|
||||
let data = state.options2222;
|
||||
console.log(values, data);
|
||||
let str = "";
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
if (data[i].value == values) {
|
||||
str = data[i].title;
|
||||
} else {
|
||||
for (let j = 0; j < data[i].children.length; j++) {
|
||||
if (data[i].children[j].value == values) {
|
||||
str = data[i].title + "/" + data[i].children[j].title;
|
||||
} else {
|
||||
if (data[i].children[j].children) {
|
||||
for (let k = 0; k < data[i].children[j].children.length; k++) {
|
||||
if (data[i].children[j].children[k].value == values) {
|
||||
str =
|
||||
data[i].title +
|
||||
"/" +
|
||||
data[i].children[j].title +
|
||||
"/" +
|
||||
data[i].children[j].children[k].title;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log("str-str-str-str", str);
|
||||
state.fen_lei1 = str;
|
||||
return str;
|
||||
};
|
||||
|
||||
function findClassFullName(list,classify, name = '') {
|
||||
return list && list.length && list
|
||||
.map(e => classify == e.dictCode ? name ? name + '-' + e.dictName : e.dictName : findClassFullName(e.children, classify,name ? name + '-' + e.dictName : e.dictName))
|
||||
.filter(name => name)
|
||||
.join('') || ''
|
||||
}
|
||||
|
||||
getTableDate();
|
||||
const handelChangePage1 = (page, pageSize) => {
|
||||
@@ -5557,6 +5525,7 @@ export default defineComponent({
|
||||
};
|
||||
return {
|
||||
...toRefs(state),
|
||||
sysTypeOptions,
|
||||
CourseModalRef,
|
||||
auditStudent,
|
||||
getdateToDateFn,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -138,26 +138,15 @@
|
||||
</div>
|
||||
<div class="item_inp">
|
||||
<div class="select i6_input">
|
||||
<!-- <a-select-->
|
||||
<!-- :getPopupContainer="-->
|
||||
<!-- (triggerNode) => {-->
|
||||
<!-- return triggerNode.parentNode || document.body;-->
|
||||
<!-- }-->
|
||||
<!-- "-->
|
||||
<!-- v-model:value="fen_lei"-->
|
||||
<!-- dropdownClassName="dropdown-style"-->
|
||||
<!-- style="width: 440px"-->
|
||||
<!-- placeholder="请选择"-->
|
||||
<!-- :options="options2"-->
|
||||
<!-- allowClear-->
|
||||
<!-- showSearch-->
|
||||
<!-- />-->
|
||||
<a-tree-select style="width: 440px" placeholder="请选择内容分类" :treeDefaultExpandAll="true"
|
||||
:getPopupContainer="
|
||||
(triggerNode) => {
|
||||
return triggerNode.parentNode || document.body;
|
||||
}
|
||||
" @change="changeTreeSelectValue" v-model:value="fen_lei" :tree-data="options2222">
|
||||
:getPopupContainer="triggerNode => triggerNode.parentNode || document.body"
|
||||
v-model:value="fen_lei"
|
||||
:tree-data="sysTypeOptions"
|
||||
:fieldNames="{
|
||||
children: 'children',
|
||||
label: 'dictName',
|
||||
value: 'dictCode',
|
||||
}">
|
||||
</a-tree-select>
|
||||
</div>
|
||||
</div>
|
||||
@@ -321,13 +310,12 @@
|
||||
</template>
|
||||
<script>
|
||||
import {
|
||||
reactive,
|
||||
toRefs,
|
||||
defineComponent,
|
||||
ref,
|
||||
shallowRef,
|
||||
// onMounted,
|
||||
onUnmounted,
|
||||
reactive,
|
||||
toRefs,
|
||||
defineComponent,
|
||||
ref,
|
||||
shallowRef,
|
||||
onUnmounted, computed, watch,
|
||||
} from "vue";
|
||||
import { validateName } from "@/api/index1";
|
||||
import { message } from "ant-design-vue";
|
||||
@@ -336,11 +324,11 @@ import { fileUp } from "../../api/indexEval";
|
||||
import * as api1 from "../../api/index1";
|
||||
import "@wangeditor/editor/dist/css/style.css";
|
||||
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
|
||||
//import ProjectManager from "@/components/project/ProjectManagerNew";
|
||||
import NameInput from "@/components/project/NameInput";
|
||||
import FJUpload from "@/components/common/FJUpload";
|
||||
import * as moment from "moment";
|
||||
import * as api2 from "../../api/indexAudit";
|
||||
import {useStore} from "vuex";
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
@@ -348,7 +336,6 @@ export default defineComponent({
|
||||
Toolbar,
|
||||
FJUpload,
|
||||
NameInput,
|
||||
//ProjectManager,
|
||||
},
|
||||
props: {
|
||||
xzinputV1: {
|
||||
@@ -514,6 +501,19 @@ export default defineComponent({
|
||||
}
|
||||
],
|
||||
});
|
||||
const store = useStore();
|
||||
|
||||
const sysTypeOptions = computed(() => store.state.sysType);
|
||||
|
||||
watch(()=>state.fen_lei,()=>{
|
||||
state.fen_lei1 = findClassFullName(sysTypeOptions.value)
|
||||
})
|
||||
|
||||
function findClassFullName(list,name=''){
|
||||
return list && list.length && list.map(e=>{
|
||||
return state.fen_lei == e.dictCode ? name?name+'-'+e.dictName:e.dictName : findClassFullName(e.children,name?name+'-'+e.dictName:e.dictName)
|
||||
}).filter(name=>name).join('')
|
||||
}
|
||||
|
||||
// 删除文件返回参数
|
||||
const changevalue = (e) => {
|
||||
@@ -769,8 +769,8 @@ export default defineComponent({
|
||||
categoryId: state.fen_lei,
|
||||
sceneContent: state.chang_jin,
|
||||
tips: state.tags_val ? state.tags_val.join(",") : null,
|
||||
teacherId: state.member.value,
|
||||
teacher: state.member.name,
|
||||
// teacherId: state.member.value,
|
||||
// teacher: state.member.name,
|
||||
intro: state.qdms_inputV6,
|
||||
attach: state.attach,
|
||||
outline: valueHtml.value,
|
||||
@@ -781,7 +781,7 @@ export default defineComponent({
|
||||
postData.name,
|
||||
postData.targetUser,
|
||||
postData.categoryId,
|
||||
postData.teacherId,
|
||||
// postData.teacherId,
|
||||
postData.picUrl,
|
||||
postData.intro,
|
||||
];
|
||||
@@ -855,8 +855,7 @@ export default defineComponent({
|
||||
state.feng_mian_1 = item.picUrl;
|
||||
state.qdms_inputV2 = item.targetUser;
|
||||
state.qdms_inputV3 = item.meaning;
|
||||
state.fen_lei = String(item.categoryId);
|
||||
state.fen_lei1 = changeTreeSelectValue(String(item.categoryId));
|
||||
state.fen_lei = item.categoryId;
|
||||
state.chang_jin = String(item.sceneContent ? item.sceneContent : '');
|
||||
state.tags_val = item.tips ? item.tips.split(",") : [];
|
||||
state.qdms_inputV6 = item.intro;
|
||||
@@ -911,37 +910,9 @@ export default defineComponent({
|
||||
});
|
||||
};
|
||||
|
||||
// 格式化树型结构选择数据
|
||||
const changeTreeSelectValue = (values) => {
|
||||
let data = state.options2222;
|
||||
console.log(values, data)
|
||||
let str = ''
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
if (data[i].value == values) {
|
||||
str = data[i].title
|
||||
} else {
|
||||
for (let j = 0; j < data[i].children.length; j++) {
|
||||
if (data[i].children[j].value == values) {
|
||||
str = data[i].title + '/' + data[i].children[j].title
|
||||
} else {
|
||||
if (data[i].children[j].children) {
|
||||
for (let k = 0; k < data[i].children[j].children.length; k++) {
|
||||
if (data[i].children[j].children[k].value == values) {
|
||||
str = data[i].title + '/' + data[i].children[j].title + '/' + data[i].children[j].children[k].title
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log('str-str-str-str', str)
|
||||
state.fen_lei1 = str;
|
||||
return str;
|
||||
}
|
||||
|
||||
return {
|
||||
...toRefs(state),
|
||||
sysTypeOptions,
|
||||
moment,
|
||||
options2,
|
||||
options3,
|
||||
@@ -963,7 +934,6 @@ export default defineComponent({
|
||||
handleCreated,
|
||||
choicePic,
|
||||
changevalue,
|
||||
changeTreeSelectValue
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
return triggerNode.parentNode || document.body;
|
||||
}
|
||||
" v-model:value="valueproj" show-search :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
|
||||
placeholder="请选择内容分类" allow-clear tree-default-expand-all :tree-data="options2222">
|
||||
placeholder="请选择内容分类" allow-clear tree-default-expand-all :tree-data="sysTypeOptions">
|
||||
<template #title="{ value: val, title }">
|
||||
<b v-if="val === '11111'" style="color: #08c">sss</b>
|
||||
<template v-else>{{ title }}</template>
|
||||
@@ -107,9 +107,10 @@
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { reactive, toRefs, onMounted } from "vue";
|
||||
import {reactive, toRefs, onMounted, computed} from "vue";
|
||||
import { courseListView } from "../../api/indexAudit";
|
||||
import * as api1 from "@/api/index1";
|
||||
import {useStore} from "vuex";
|
||||
|
||||
export default {
|
||||
name: "CoursereViewed",
|
||||
@@ -398,48 +399,40 @@ export default {
|
||||
],
|
||||
});
|
||||
|
||||
// 课程三级分类回显
|
||||
const sHX = (data) => {
|
||||
let str = '-'
|
||||
let sdata = state.options2222
|
||||
for (let i = 0; i < sdata.length; i++) {
|
||||
for (let j = 0; j < sdata[i].children.length; j++) {
|
||||
str = changeTreeSelectValue(String(data))
|
||||
{/* if (String(sdata[i].children[j].value) === String(data)) {
|
||||
str = sdata[i].children[j].title;
|
||||
} */}
|
||||
}
|
||||
}
|
||||
return str
|
||||
}
|
||||
const store = useStore();
|
||||
|
||||
// 格式化树型结构选择数据
|
||||
const changeTreeSelectValue = (values) => {
|
||||
let data = state.options2222;
|
||||
console.log(values, data)
|
||||
let str = ''
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
if (data[i].value == values) {
|
||||
str = data[i].title
|
||||
} else {
|
||||
for (let j = 0; j < data[i].children.length; j++) {
|
||||
if (data[i].children[j].value == values) {
|
||||
str = data[i].title + '/' + data[i].children[j].title
|
||||
} else {
|
||||
if (data[i].children[j].children) {
|
||||
for (let k = 0; k < data[i].children[j].children.length; k++) {
|
||||
if (data[i].children[j].children[k].value == values) {
|
||||
str = data[i].title + '/' + data[i].children[j].title + '/' + data[i].children[j].children[k].title
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log('str-str-str-str', str)
|
||||
state.fen_lei1 = str;
|
||||
return str;
|
||||
const sysTypeOptions = computed(() => formateDictT(store.state.sysType));
|
||||
|
||||
// 处理数据字典
|
||||
function formateDictT(data) {
|
||||
for(let i=0;i<data.length;i++){
|
||||
data[i].title = data[i].dictName;
|
||||
data[i].value = data[i].dictCode;
|
||||
if(data[i].children.length!==0){
|
||||
for(let j=0;j<data[i].children.length;j++){
|
||||
data[i].children[j].title = data[i].children[j].dictName;
|
||||
data[i].children[j].value = data[i].children[j].dictCode;
|
||||
if(data[i].children[j].children.length!==0){
|
||||
for(let k=0; k<data[i].children[j].children.length; k++) {
|
||||
data[i].children[j].children[k].title = data[i].children[j].children[k].dictName;
|
||||
data[i].children[j].children[k].value = data[i].children[j].children[k].dictCode;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
function findClassFullName(list,classify,name=''){
|
||||
return list && list.length && list.map(e=>{
|
||||
return classify == e.dictCode ? name?name+'-'+e.dictName:e.dictName : findClassFullName(e.children,classify,name?name+'-'+e.dictName:e.dictName)
|
||||
}).filter(name=>name).join('')
|
||||
}
|
||||
|
||||
// 课程三级分类回显
|
||||
const sHX = (classify) => {
|
||||
return findClassFullName(sysTypeOptions.value,classify) || '-'
|
||||
}
|
||||
|
||||
const getList = () => {
|
||||
@@ -543,6 +536,7 @@ export default {
|
||||
changePagination,
|
||||
showProjAuditModal,
|
||||
closeProjAuditModal,
|
||||
sysTypeOptions
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
@@ -22,16 +22,19 @@
|
||||
...calssifyList,
|
||||
]"
|
||||
/>-->
|
||||
<a-tree-select :getPopupContainer="
|
||||
(triggerNode) => {
|
||||
return triggerNode.parentNode || document.body;
|
||||
}
|
||||
" v-model:value="valueproj" show-search :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
|
||||
placeholder="请选择内容分类" tree-default-expand-all :tree-data="options2222">
|
||||
<template #title="{ value: val, title }">
|
||||
<b v-if="val === '11111'" style="color: #08c">sss</b>
|
||||
<template v-else>{{ title }}</template>
|
||||
</template>
|
||||
<a-tree-select
|
||||
:fieldNames="{
|
||||
children: 'children',
|
||||
title: 'dictName',
|
||||
value: 'dictCode',
|
||||
}"
|
||||
:getPopupContainer="triggerNode => triggerNode.parentNode || document.body"
|
||||
v-model:value="valueproj"
|
||||
show-search
|
||||
:dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
|
||||
placeholder="请选择内容分类"
|
||||
tree-default-expand-all
|
||||
:tree-data="sysTypeOptions">
|
||||
</a-tree-select>
|
||||
</div>
|
||||
<div class="inpbox1">
|
||||
@@ -130,12 +133,13 @@
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { reactive, toRefs, onMounted, ref } from "vue";
|
||||
import {reactive, toRefs, onMounted, ref, computed} from "vue";
|
||||
import { list, courseAuditView, courseDetail } from "../../api/indexAudit";
|
||||
import { message } from "ant-design-vue";
|
||||
import SeeModal from "../courselibrary/components/seeModal.vue";
|
||||
import { iframeUrl } from "../../api/method";
|
||||
import * as api1 from "@/api/index1";
|
||||
import {useStore} from "vuex";
|
||||
|
||||
export default {
|
||||
name: "CoursereViewedN",
|
||||
@@ -171,7 +175,7 @@ export default {
|
||||
chooseCreater: null,
|
||||
chooseOffId: null,
|
||||
lookCourseModal: false, //预览
|
||||
faceDetailObj: null,
|
||||
faceDetailObj: {},
|
||||
columns1: [
|
||||
// {
|
||||
// title: "序号",
|
||||
@@ -257,7 +261,6 @@ export default {
|
||||
<span
|
||||
onClick={() => {
|
||||
getFaceDetail(value.record.offId);
|
||||
console.log(value.record);
|
||||
}}
|
||||
style="cursor:pointer;color:#387DF7"
|
||||
>
|
||||
@@ -406,20 +409,41 @@ export default {
|
||||
}
|
||||
],
|
||||
});
|
||||
const store = useStore();
|
||||
|
||||
const sysTypeOptions = computed(() => formateDictT(store.state.sysType));
|
||||
// console.log('asdasd--------------------------------------', sysTypeOptions)
|
||||
|
||||
// 处理数据字典
|
||||
function formateDictT(data) {
|
||||
for(let i=0;i<data.length;i++){
|
||||
data[i].title = data[i].dictName;
|
||||
data[i].value = data[i].dictCode;
|
||||
if(data[i].children.length!==0){
|
||||
for(let j=0;j<data[i].children.length;j++){
|
||||
data[i].children[j].title = data[i].children[j].dictName;
|
||||
data[i].children[j].value = data[i].children[j].dictCode;
|
||||
if(data[i].children[j].children.length!==0){
|
||||
for(let k=0; k<data[i].children[j].children.length; k++) {
|
||||
data[i].children[j].children[k].title = data[i].children[j].children[k].dictName;
|
||||
data[i].children[j].children[k].value = data[i].children[j].children[k].dictCode;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
function findClassFullName(list,classify,name=''){
|
||||
return list && list.length && list.map(e=>{
|
||||
return classify == e.dictCode ? name?name+'-'+e.dictName:e.dictName : findClassFullName(e.children,classify,name?name+'-'+e.dictName:e.dictName)
|
||||
}).filter(name=>name).join('')
|
||||
}
|
||||
|
||||
// 课程三级分类回显
|
||||
const sHX = (data) => {
|
||||
let str = '-'
|
||||
let sdata = state.options2222
|
||||
for (let i = 0; i < sdata.length; i++) {
|
||||
for (let j = 0; j < sdata[i].children.length; j++) {
|
||||
str = changeTreeSelectValue(String(data))
|
||||
// if (String(sdata[i].children[j].value) === String(data)) {
|
||||
// str = sdata[i].children[j].title;
|
||||
// }
|
||||
}
|
||||
}
|
||||
return str
|
||||
const sHX = (classify) => {
|
||||
return findClassFullName(sysTypeOptions.value,classify) || '-'
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -642,35 +666,6 @@ export default {
|
||||
}));
|
||||
});
|
||||
|
||||
// 格式化树型结构选择数据
|
||||
const changeTreeSelectValue = (values) => {
|
||||
let data = state.options2222;
|
||||
console.log(values, data)
|
||||
let str = ''
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
if (data[i].value == values) {
|
||||
str = data[i].title
|
||||
} else {
|
||||
for (let j = 0; j < data[i].children.length; j++) {
|
||||
if (data[i].children[j].value == values) {
|
||||
str = data[i].title + '/' + data[i].children[j].title
|
||||
} else {
|
||||
if (data[i].children[j].children) {
|
||||
for (let k = 0; k < data[i].children[j].children.length; k++) {
|
||||
if (data[i].children[j].children[k].value == values) {
|
||||
str = data[i].title + '/' + data[i].children[j].title + '/' + data[i].children[j].children[k].title
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log('str-str-str-str', str)
|
||||
state.fen_lei1 = str;
|
||||
return str;
|
||||
}
|
||||
|
||||
// 禁止用户编辑文本框内容
|
||||
const onEditorFocus = (event) => {
|
||||
event.enable(false);
|
||||
@@ -693,7 +688,8 @@ export default {
|
||||
contentList11,
|
||||
sceneist11,
|
||||
onEditorFocus,
|
||||
sHX
|
||||
sHX,
|
||||
sysTypeOptions
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
@@ -525,11 +525,77 @@
|
||||
</a-tab-pane>
|
||||
<a-tab-pane key="3" tab="学员管理" force-render>
|
||||
<TableStudent
|
||||
v-if="isreload"
|
||||
:type="2"
|
||||
:id="routerId"
|
||||
:stage="stage"
|
||||
:columns="tableDataFunc()"
|
||||
></TableStudent>
|
||||
>
|
||||
<template #extension="{ data: { record } }">
|
||||
<div style="display: flex">
|
||||
<div
|
||||
@click="showStudent(record)"
|
||||
style="
|
||||
color: #4ea6ff;
|
||||
font-size: 14px;
|
||||
text-align: center;
|
||||
margin-left: 20px;
|
||||
cursor: pointer;
|
||||
"
|
||||
>
|
||||
查看
|
||||
</div>
|
||||
<div
|
||||
@click="setLevels(record)"
|
||||
style="
|
||||
color: #4ea6ff;
|
||||
font-size: 14px;
|
||||
text-align: center;
|
||||
margin-left: 20px;
|
||||
cursor: pointer;
|
||||
"
|
||||
>
|
||||
调整
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</TableStudent>
|
||||
<TableStudent
|
||||
v-else
|
||||
:type="2"
|
||||
:id="routerId"
|
||||
:stage="stage"
|
||||
:columns="tableDataFunc()"
|
||||
>
|
||||
<template #extension="{ data: { record } }">
|
||||
<div style="display: flex">
|
||||
<div
|
||||
@click="showStudent(record)"
|
||||
style="
|
||||
color: #4ea6ff;
|
||||
font-size: 14px;
|
||||
text-align: center;
|
||||
margin-left: 20px;
|
||||
cursor: pointer;
|
||||
"
|
||||
>
|
||||
查看
|
||||
</div>
|
||||
<div
|
||||
@click="setLevels(record)"
|
||||
style="
|
||||
color: #4ea6ff;
|
||||
font-size: 14px;
|
||||
text-align: center;
|
||||
margin-left: 20px;
|
||||
cursor: pointer;
|
||||
"
|
||||
>
|
||||
调整
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</TableStudent>
|
||||
</a-tab-pane>
|
||||
<!-- 1211注释 待开放 -->
|
||||
<a-tab-pane key="4" tab="设置">
|
||||
@@ -794,7 +860,8 @@
|
||||
>{{ item.name }}</span
|
||||
>
|
||||
<a
|
||||
:href="item.response ? item.response.data : ''"
|
||||
href="javascript:void(0);"
|
||||
@click="downloadFile(item.response ? item.response.data : '')"
|
||||
style="margin-left: 5px"
|
||||
>下载</a
|
||||
>
|
||||
@@ -831,21 +898,21 @@
|
||||
</div>
|
||||
<div class="mid">
|
||||
<div class="inher">
|
||||
<div class="cur">当前关卡:关卡2</div>
|
||||
<div class="cur">当前关卡:{{ curLevelName }}</div>
|
||||
<div class="select">
|
||||
<a-select
|
||||
v-model:value="curLevel"
|
||||
style="width: 100%"
|
||||
placeholder="请选择关卡"
|
||||
:options="projectNameList4"
|
||||
:options="statess"
|
||||
@change="selectProjectName4"
|
||||
allowClear
|
||||
showSearch
|
||||
></a-select>
|
||||
</div>
|
||||
<div class="btn">
|
||||
<button class="sameb btn1">取消</button>
|
||||
<button class="sameb btn2">确定</button>
|
||||
<button class="sameb btn1" style="cursor:pointer;" @click="closeChangeModal">取消</button>
|
||||
<button class="sameb btn2" style="cursor:pointer;" @click="changeLevel">确定</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -856,7 +923,7 @@
|
||||
<see-stu
|
||||
v-model:Seevisible="Seevisible"
|
||||
v-model:checkStuId="checkStuId"
|
||||
v-model:projectId="projectId"
|
||||
v-model:projectId="routerId"
|
||||
/>
|
||||
|
||||
<!-- 批量删除学员弹窗 -->
|
||||
@@ -989,6 +1056,7 @@
|
||||
<!-- 学员管理查看抽屉 -->
|
||||
<check-stu
|
||||
v-model:CheckStuvisible="CheckStuvisible"
|
||||
v-model:routerId="routerId"
|
||||
v-model:studentId="studentId"
|
||||
/>
|
||||
<!-- 面授学员抽屉 -->
|
||||
@@ -1265,7 +1333,7 @@ import { codeUrl } from "../../api/method";
|
||||
import TwoDimensionalCode from "../../components/TwoDimensionalCode.vue";
|
||||
import TableStudent from "@/components/student/TableStudent";
|
||||
// import * as student from "@/api/student";
|
||||
import { getStuPage } from "@/api/index1";
|
||||
import { getStuPage, moveStudent } from "@/api/index1";
|
||||
|
||||
import RouterFaceTeachManage from "../../components/drawers/router/RouterFaceTeachManage";
|
||||
import RouterExaminationManage from "../../components/drawers/router/RouterExaminationManage";
|
||||
@@ -1301,6 +1369,7 @@ export default {
|
||||
// const store = useStore();
|
||||
const state = reactive({
|
||||
stage: [],
|
||||
statess: [],
|
||||
routerId: storage.get("routerId")
|
||||
? JSON.parse(storage.get("routerId"))
|
||||
: null, //学习路径页面传的学习路径id
|
||||
@@ -1404,7 +1473,9 @@ export default {
|
||||
sh: false,
|
||||
nodata: true,
|
||||
closeDeleteAll: false,
|
||||
curLevel: "",
|
||||
curLevel: undefined,
|
||||
curLevelName: "",
|
||||
curStuID:"",
|
||||
taskSyllabusActive: 0,
|
||||
//在线管理等页面传递参数
|
||||
showTimeText: "",
|
||||
@@ -1486,6 +1557,7 @@ export default {
|
||||
location.href.indexOf("http://") !== -1
|
||||
? "http://111.231.196.214:12016/"
|
||||
: location.href.slice(0, location.href.indexOf("/m")) + "/upload/",
|
||||
isreload: true
|
||||
});
|
||||
|
||||
const levelList = reactive({
|
||||
@@ -1661,6 +1733,9 @@ export default {
|
||||
state.visible = true;
|
||||
};
|
||||
const closeChangeModal = () => {
|
||||
state.curLevel = undefined;
|
||||
state.curStuID = "";
|
||||
state.curLevelName = "";
|
||||
state.visiblene = false;
|
||||
};
|
||||
const showAddStu = () => {
|
||||
@@ -2116,6 +2191,10 @@ export default {
|
||||
id: e.chapterId,
|
||||
name: e.name,
|
||||
}));
|
||||
state.statess = res.data.data.chapterList.map((e) => ({
|
||||
value: e.chapterId,
|
||||
label: e.name,
|
||||
}));
|
||||
state.taskSyllabus = data;
|
||||
// for(let i in data) {
|
||||
// state.taskSyllabus[i].name = data[i].name
|
||||
@@ -2427,6 +2506,78 @@ export default {
|
||||
});
|
||||
};
|
||||
|
||||
// 共享文档文件下载
|
||||
const downloadFile = (url) => {
|
||||
console.log(url)
|
||||
if(url){
|
||||
window.open(url)
|
||||
}
|
||||
// if(url){
|
||||
// const filename = '操作指南'
|
||||
// const x = new XMLHttpRequest()
|
||||
// x.open('GET', url, true)
|
||||
// x.responseType = 'blob'
|
||||
// x.onload = () => {
|
||||
// // 会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象。
|
||||
// const url = window.URL.createObjectURL(x.response)
|
||||
// const a = document.createElement('a')
|
||||
// a.href = url
|
||||
// a.download = filename
|
||||
// a.click()
|
||||
// }
|
||||
// x.send()
|
||||
// }
|
||||
}
|
||||
|
||||
// 点击学员管理-查看学员操作
|
||||
function showStudent(record) {
|
||||
console.log(record)
|
||||
state.CheckStuvisible = true;
|
||||
state.studentId = record.studentId;
|
||||
}
|
||||
|
||||
// 调整关卡
|
||||
function setLevels(record) {
|
||||
console.log(record)
|
||||
state.curLevelName = record.currentStageName;
|
||||
state.curStuID = record.id;
|
||||
state.visiblene = true;
|
||||
}
|
||||
|
||||
// 选择要调整的关卡
|
||||
function selectProjectName4(e){
|
||||
console.log(e)
|
||||
state.curLevel = e;
|
||||
}
|
||||
|
||||
// 点击确定 调整关卡
|
||||
function changeLevel() {
|
||||
state.isreload = false;
|
||||
if(!state.curLevel){
|
||||
message.error("请选择关卡")
|
||||
return
|
||||
}
|
||||
moveStudent({targetId: state.curLevel, ids: [state.curStuID]}).then(res => {
|
||||
console.log(res)
|
||||
state.visiblene = false;
|
||||
message.destroy();
|
||||
state.isreload = true;
|
||||
message.success("调整关卡成功")
|
||||
state.curLevel = undefined;
|
||||
state.curStuID = "";
|
||||
state.curLevelName = "";
|
||||
getStudent();
|
||||
}).catch(err=>{
|
||||
console.log(err)
|
||||
state.visiblene = false;
|
||||
message.error("调整关卡失败");
|
||||
state.isreload = true;
|
||||
state.curLevel = undefined;
|
||||
state.curStuID = "";
|
||||
state.curLevelName = "";
|
||||
})
|
||||
}
|
||||
|
||||
return {
|
||||
...toRefs(state),
|
||||
...toRefs(levelList),
|
||||
@@ -2492,6 +2643,11 @@ export default {
|
||||
evaluationModel,
|
||||
homeworkModel,
|
||||
commonModel,
|
||||
downloadFile,
|
||||
showStudent,
|
||||
setLevels,
|
||||
selectProjectName4,
|
||||
changeLevel
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
@@ -526,7 +526,7 @@
|
||||
</div>
|
||||
-->
|
||||
</div>
|
||||
<div class="boom">
|
||||
<div class="boom" :style="{minHeight:level.length>6? ((level.length - 6)*106+512) + 'px' : 512 + 'px'}">
|
||||
<div class="boomcen">
|
||||
<div class="title">
|
||||
<div class="tit_left">
|
||||
|
||||
@@ -50,8 +50,8 @@ export default {
|
||||
const router = useRouter();
|
||||
const state = reactive({
|
||||
form: {
|
||||
account: "00004409",
|
||||
// account: "10181457",
|
||||
// account: "00004409",
|
||||
account: "10181457",
|
||||
password: "1234567890Aa",
|
||||
},
|
||||
});
|
||||
|
||||
@@ -671,7 +671,10 @@
|
||||
<span style="font: oblique bold 16px Sans-serif;width:300px;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;">{{
|
||||
item.name
|
||||
}}</span>
|
||||
<a :href="item.response?item.response.data:''" style="margin-left: 5px">下载</a>
|
||||
<a
|
||||
href="javascript:void(0);"
|
||||
@click="downloadFile(item.response ? item.response.data : '')"
|
||||
style="margin-left: 5px">下载</a>
|
||||
<span
|
||||
style="color: #4ea6ff; cursor: pointer"
|
||||
@click="deFile(item.uid)"
|
||||
@@ -1335,6 +1338,30 @@ export default defineComponent({
|
||||
|
||||
state.edit = true;
|
||||
};
|
||||
|
||||
// 共享文档文件下载
|
||||
const downloadFile = (url) => {
|
||||
console.log(url)
|
||||
if(url){
|
||||
window.open(url)
|
||||
}
|
||||
// if(url){
|
||||
// const filename = '操作指南'
|
||||
// const x = new XMLHttpRequest()
|
||||
// x.open('GET', url, true)
|
||||
// x.responseType = 'blob'
|
||||
// x.onload = () => {
|
||||
// // 会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象。
|
||||
// const url = window.URL.createObjectURL(x.response)
|
||||
// const a = document.createElement('a')
|
||||
// a.href = url
|
||||
// a.download = filename
|
||||
// a.click()
|
||||
// }
|
||||
// x.send()
|
||||
// }
|
||||
}
|
||||
|
||||
return {
|
||||
...toRefs(state),
|
||||
value,
|
||||
@@ -1356,7 +1383,8 @@ export default defineComponent({
|
||||
scoresum,
|
||||
checkedClose,
|
||||
editNotice,
|
||||
deFile
|
||||
deFile,
|
||||
downloadFile
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
@@ -507,6 +507,7 @@ export default {
|
||||
};
|
||||
|
||||
function managerChange(e, l, d, t, orgName) {
|
||||
console.log(e, l)
|
||||
state.projectInfo.sourceBelongId = d
|
||||
state.projectInfo.sourceBelongName = t
|
||||
state.projectInfo.sourceBelongFullName = orgName
|
||||
|
||||
@@ -1097,7 +1097,10 @@
|
||||
:title="item.name"
|
||||
>{{ item.name }}</span
|
||||
>
|
||||
<a :href="item.response?item.response.data:''" style="margin-left: 5px">下载</a>
|
||||
<a
|
||||
href="javascript:void(0);"
|
||||
@click="downloadFile(item.response ? item.response.data : '')"
|
||||
style="margin-left: 5px">下载</a>
|
||||
<span
|
||||
style="color: #4ea6ff; float: right; cursor: pointer"
|
||||
@click="deFile(item.uid)"
|
||||
@@ -1855,6 +1858,20 @@ export default {
|
||||
</div>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: "状态",
|
||||
dataIndex: "status",
|
||||
key: "status",
|
||||
width: 80,
|
||||
align: "center",
|
||||
className: "h",
|
||||
ellipsis: true,
|
||||
customRender: ({ record }) => (
|
||||
<div>
|
||||
{record.finishTaskNum ==0?"未开始":record.finishTaskNum == record.totalTaskNum?"已完成":"进行中"}
|
||||
</div>
|
||||
),
|
||||
},
|
||||
{
|
||||
title: "最近学习时间",
|
||||
dataIndex: "lastStudyTime",
|
||||
@@ -4147,6 +4164,30 @@ export default {
|
||||
state.Seevisible = true;
|
||||
state.checkStuId = record.studentId;
|
||||
}
|
||||
|
||||
// 共享文档文件下载
|
||||
const downloadFile = (url) => {
|
||||
console.log(url)
|
||||
if(url){
|
||||
window.open(url)
|
||||
}
|
||||
// if(url){
|
||||
// const filename = '操作指南'
|
||||
// const x = new XMLHttpRequest()
|
||||
// x.open('GET', url, true)
|
||||
// x.responseType = 'blob'
|
||||
// x.onload = () => {
|
||||
// // 会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象。
|
||||
// const url = window.URL.createObjectURL(x.response)
|
||||
// const a = document.createElement('a')
|
||||
// a.href = url
|
||||
// a.download = filename
|
||||
// a.click()
|
||||
// }
|
||||
// x.send()
|
||||
// }
|
||||
}
|
||||
|
||||
return {
|
||||
...toRefs(state),
|
||||
...toRefs(levelList),
|
||||
@@ -4253,6 +4294,7 @@ export default {
|
||||
showCodeModel,
|
||||
showCodeModel2,
|
||||
checkType,
|
||||
downloadFile,
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
@@ -298,6 +298,7 @@ const createProject = () => {
|
||||
};
|
||||
|
||||
function managerChange(e, l, d, t,orgName) {
|
||||
console.log(e, l)
|
||||
projectInfo.value.valuesourceBelongId = d;
|
||||
projectInfo.value.sourceBelongName = t;
|
||||
projectInfo.value.sourceBelongFullName = orgName
|
||||
|
||||
Reference in New Issue
Block a user