This commit is contained in:
dongruihua
2023-01-15 18:03:53 +08:00
30 changed files with 1485 additions and 1122 deletions

View File

@@ -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) => {

View File

@@ -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)

View File

@@ -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>

View File

@@ -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;

View File

@@ -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 {

View File

@@ -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;

View File

@@ -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,
});

View File

@@ -246,8 +246,8 @@ export default {
);
},
},
{
title: "学员关卡",
/** {
title: "学员阶段",
dataIndex: "currentStageName",
key: "currentStageName",
width: 60,
@@ -261,7 +261,7 @@ export default {
</div>
);
},
},
},*/
{
title: "提交时间",
dataIndex: "endStudyTime",

View File

@@ -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>
);
},

View File

@@ -169,6 +169,7 @@
v-model:eScorevisible="Evisible"
:type="1"
:id="projectTaskInfo?.projectTaskId"
:pid="projectTaskInfo?.projectId"
v-model:searchTaskList="searchTaskList"
/>
<!-- 查看作业抽屉 -->

View File

@@ -135,6 +135,7 @@
v-model:eScorevisible="Evisible"
:type="1"
:id="projectTaskInfo?.projectTaskId"
:pid="projectTaskInfo?.projectId"
v-model:searchTaskList="searchTaskList"
/>
<!-- 查看作业抽屉 -->

View File

@@ -261,7 +261,7 @@ export default {
);
},
},
{
/** {
title: "学员关卡",
dataIndex: "currentStageName",
key: "currentStageName",
@@ -276,7 +276,7 @@ export default {
</div>
);
},
},
},*/
{
title: "完成时间",
dataIndex: "lastStudyTime",

View File

@@ -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,

View File

@@ -149,6 +149,7 @@
v-model:eScorevisible="Evisible"
:type="2"
:id="datasource?.routerTaskId"
:pid="datasource?.routerId"
v-model:searchTaskList="searchTaskList"
/>
<!-- 查看作业抽屉 -->

View File

@@ -130,6 +130,7 @@
v-model:eScorevisible="Evisible"
:type="2"
:id="datasource?.routerTaskId"
:pid="datasource?.routerId"
v-model:searchTaskList="searchTaskList"
/>
<!-- 查看作业抽屉 -->

View File

@@ -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);
});
}

View File

@@ -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();

View File

@@ -32,6 +32,7 @@ export default createStore({
projectSys: [],//培训分类
pathmapPic: [],//学习路径背景图
memberInitInfo: [],//学员默认
sysType: [],//学员默认
},
getters: {},
mutations: {

View File

@@ -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

View File

@@ -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
};
},
});

View File

@@ -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
};
},
};

View File

@@ -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
};
},
};

View File

@@ -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
};
},
};

View File

@@ -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">

View File

@@ -50,8 +50,8 @@ export default {
const router = useRouter();
const state = reactive({
form: {
account: "00004409",
// account: "10181457",
// account: "00004409",
account: "10181457",
password: "1234567890Aa",
},
});

View File

@@ -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
};
},
});

View File

@@ -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

View File

@@ -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,
};
},
};

View File

@@ -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