'合并代码'

This commit is contained in:
fooperage
2023-02-12 20:19:04 +08:00
32 changed files with 2677 additions and 1253 deletions

View File

@@ -52,17 +52,14 @@ function beforeunloadHandler() {
function init() {
getUserInfo();
initDict("faceclassPic");
initDict("faceclassClass");
initDict("faceclassScene");
initDict("projectLevel");
initDict("projectSys");
initDict("pathmapPic");
initDict("projectClass");
initDict("projectPic");
initDict("sysType");
getMemberInfo();
getUserPermission();
initDict("content_type"); //内容分类
initDict("project_level"); //项目级别
initDict("project_sys"); //培训分类
initDict("project_pic"); //项目封面
initDict("router_pic"); //路径图封面
initDict("course_pic"); //课程封面
}
function unloadHandler() {
@@ -91,17 +88,8 @@ async function getUserInfo() {
store.commit("SET_USER", userInfo.data.data);
}
async function initDict(key, localStory = false) {
let list;
if (localStory) {
list = localStorage.getItem(key);
if (list) {
store.commit("SET_DICT", {key, data: JSON.parse(list)});
return;
}
}
list = await getDictList(key);
localStory && localStorage.setItem(key, JSON.stringify(list));
async function initDict(key) {
const list = await getDictList(key);
store.commit("SET_DICT", {key, data: list});
}
@@ -111,7 +99,7 @@ function getUserPermission(){
})
}
const getDictList = (param) => api1.getDictTree({setCode: param,}).then((res) => res.data.data);
const getDictList = (param) => api1.getDictTree({code: param,}).then((res) => res.data.data);
</script>
<style lang="scss">
#app {

View File

@@ -2,7 +2,7 @@
* @Author: lixg lixg@dongwu-inc.com
* @Date: 2022-11-04 22:45:31
* @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2023-02-09 09:36:11
* @LastEditTime: 2023-02-11 16:22:43
* @FilePath: /fe-manage/src/api/index1.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
@@ -92,6 +92,8 @@ export const editLearnInfo = (obj) => http.post('/admin/router/editInfo', obj)
export const scoreRank = (params) => http.get('/points/top/list', { params })
// 项目进度排行
export const completionRank = (params) => http.get('/stu/project/rank_list/completion_list', { params })
// 项目学时排行榜
export const studytimeRank = (params) => http.get('/stu/project/rank_list/study_time_list', { params })
//排行榜
export const billboard = (obj) => http.post("/admin/project/billboard", obj);
//项目基础信息-----------------------------------
@@ -107,7 +109,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 getDictTree = (params) => http.get('/dict', { params })
//获取组织树一级列表
export const getOrgTree = (obj) => http.post('/admin/router/orgList', obj)
//根据id获取组织树一级元素下所有子元素
@@ -219,3 +221,7 @@ export const updateStuCert = (obj) => http.post('/admin/certificate/updateStuCer
// 外部考试导入成绩
export const ImportExternalExamScore = (obj) => http.post('/admin/external/exam/manage/importExternalExamScore', obj, { headers: { "Content-Type": "multipart/form-data" } })
//分组
export const changeGroupByStudentId = (obj) => http.post('/admin/student/changeGroupByStudentId', obj)
//导入小组
export const importGroup = (uuid) => http.post('/admin/studentGroup/importGroup/{pid}', { params: { uuid: uuid } })

View File

@@ -23,3 +23,5 @@ export const queryExaminationAloneExtendList = (obj) => http.post('/examination/
export const examinationTaskSave = (obj) => http.post('/examination/examinationTaskSave', obj);
//编辑考试信息
export const updateExamination = (obj) => http.post('/examination/updateExamination', obj);
//编辑外部考试信息
export const updateExternalExam = (obj) => http.post('/external/exam/updateExternalExam', obj);

View File

@@ -2,7 +2,7 @@
* @Author: lixg lixg@dongwu-inc.com
* @Date: 2022-11-18 14:09:43
* @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2022-12-05 15:27:36
* @LastEditTime: 2023-02-11 18:55:44
* @FilePath: /fe-manage/src/api/indexProjStu.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
@@ -43,3 +43,5 @@ export const studentScoreList = (obj) => http.post('/admin/project/studentScoreL
//添加项目学员
export const addStudent = (obj) => http.post('/admin/project/addStudent', obj)
//获取组员名单
export const groupMemberList = (obj) => http.post('/admin/studentGroup/groupMemberList', obj)

View File

@@ -17,6 +17,27 @@
</div>
<!-- 2022-11-30注释 后面放开 修改div的padding-topL:32 -->
<div style="display: flex; flex-direction: row; padding-top: 0px; margin-top: 20px; margin-left: 32px;">
<div v-if="edit">
<button
v-if="isOuter == 1"
style="width: 100px; cursor: pointer;"
@click="changeOuter(1)"
:class="[isOuter == 1 ? 'outer' : 'notOuter']"
>
系统考试
</button>
<button
v-else
style="width: 100px; cursor: pointer;"
@click="changeOuter(2)"
:class="[isOuter == 2 ? 'outer' : 'notOuter']"
>
外部考试
</button>
</div>
<div v-else>
<button
style="width: 100px; cursor: pointer;"
@click="changeOuter(1)"
@@ -34,6 +55,8 @@
</button>
</div>
</div>
<div v-if="isOuter==1" class="contentMain">
<div class="main_left">
<div class="main_item">
@@ -48,6 +71,7 @@
</div>
<div class="btnbox">
<a-input
:disabled="edit"
v-model:value="test.examinationName"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入考试名称"
@@ -67,11 +91,11 @@
<span style="margin-right: 3px">选择试卷</span>
</div>
<div class="btnbox">
<button class="xkbtn" @click="selectTest">
<button :disabled="edit" class="xkbtn" @click="selectTest">
{{ chooseCourse ? "重选" : "选择" }}试卷
</button>
<div v-if="paperName != ''">
<a-tag closable color="processing" @close="delTag">
<a-tag closable color="processing" @close="delTag" :closeIcon="edit">
<span style="font-size: 14px; line-height: 33px">{{
paperName
}}</span>
@@ -122,6 +146,7 @@
</div>
<div class="select">
<a-input-number
:disabled="edit"
:min="0"
:max="300"
:precision="0"
@@ -143,6 +168,7 @@
</div>
<div class="btnbox">
<a-input
:disabled="edit"
v-model:value="test.passLine"
type="number"
style="width: 400px; height: 40px; border-radius: 8px"
@@ -157,6 +183,7 @@
</div>
<div class="textarea">
<a-textarea
:disabled="edit"
v-model:value="test.examinationExplain"
placeholder="请输入考试说明"
allow-clear
@@ -175,6 +202,7 @@
<div class="timerbox">
<span>允许重复考试</span>
<a-input-number
:disabled="edit"
:min="-1"
:max="300"
:precision="0"
@@ -200,6 +228,7 @@
</div>
<div class="btnbox">
<a-radio-group
:disabled="edit"
style="margin-right: 12px"
v-model:value="test.showAnswers"
>
@@ -218,6 +247,7 @@
</div>
<div class="btnbox">
<a-radio-group
:disabled="edit"
style="margin-right: 12px"
v-model:value="test.showAnalysis"
>
@@ -236,6 +266,7 @@
</div>
<div class="btnbox">
<a-radio-group
:disabled="edit"
style="margin-right: 12px"
v-model:value="test.scoringModel"
>
@@ -256,6 +287,7 @@
</div>
<div class="btnbox">
<a-radio-group
:disabled="edit"
style="margin-right: 12px"
v-model:value="test.questionArrangement"
>
@@ -366,6 +398,8 @@ import {message} from "ant-design-vue";
import {
createExamination,
queryExaminationDetailById,
updateExamination,
updateExternalExam
} from "@/api/indexExam";
// updateExamination,
import STest from "./SelectTest.vue";
@@ -496,6 +530,12 @@ export default {
scoringModel: 2,
questionArrangement: 4,
};
state.test1 = {
externalName: '',
source: '',
externalExplain: null
}
};
const closeDrawer = () => {
@@ -522,7 +562,7 @@ export default {
console.log("props", props);
if (props.addtestVisible && props.EditTestId && props.EditTestId >0) {
// 该页面显示同时 edit为true 时,发送查询请求,
// queryTest();
queryTest();
}
if (bool) {
state.test.showAnswers = 1;
@@ -541,6 +581,19 @@ export default {
const queryTest = () => {
queryExaminationDetailById({examinationId: props.EditTestId})
.then((res) => {
console.log(res)
// 判断获取的考试
if(res.data.data.examType==2){
state.isOuter = 2;
// 外部考试
state.test1 = {
externalName: res.data.data.examinationName,
source: res.data.data.source,
externalExplain: res.data.data.examinationExplain
}
}else{
// 系统考试
state.isOuter = 1;
state.test = res.data.data;
state.test.showAnswers = Number(state.test.showAnswers);
state.test.showAnalysis = Number(state.test.showAnalysis);
@@ -557,6 +610,7 @@ export default {
state.paperId = state.test.examinationTestId;
console.log("querytest", state.test);
}
})
.catch(() => {
//message.error(`查询失败`);
@@ -630,18 +684,18 @@ export default {
// if (props.EditTestId > 0) {
// // 编辑任务
// updateExamination(state.test)
// .then(async (res) => {
// await updateTask(res);
// // closeDrawer();
// })
// .catch(() => {
// message.destroy();
// message.error(`编辑失败`);
// });
// } else {
if (props.EditTestId > 0) {
// 编辑任务
updateExamination(state.test)
.then(async (res) => {
await updateTask(res);
// closeDrawer();
})
.catch(() => {
message.destroy();
message.error(`编辑失败`);
});
} else {
// 创建任务
createExamination(state.test)
.then(async (res) => {
@@ -652,7 +706,7 @@ export default {
message.destroy();
message.error(`创建失败`);
});
// }
}
}else{
// 创建外部考试
console.log('我是点了外部考试')
@@ -687,15 +741,35 @@ export default {
}
}
if (props.EditTestId > 0) {
console.log('我要开始编辑外部考试任务了 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊')
let obj = {
examinationId:props.EditTestId,
examinationName:state.test1.externalName,
examinationExplain:state.test1.externalExplain,
source:state.test1.source
}
updateExternalExam(obj)
.then(async (res) => {
await updateTask1(res);
// closeDrawer();
})
.catch(() => {
message.destroy();
message.error(`编辑失败`);
});
}else{
// 新建外部考试
CreateExternalExam(state.test1).then( async res=>{
console.log(res)
console.log('新建外部考试返回的参数',res)
// 添加更新到任务
await updateTask1(res);
}).catch(err=>{
console.log(err)
})
}
}
};
// 系统考试
const updateTask = (res) => {
@@ -711,6 +785,7 @@ export default {
return message.warning("请先选中关卡");
}
let editObj1 = {
examType: 1,
chapterId: props.isactive,
duration: res.data.data.examinationDuration,
courseId: res.data.data.examinationId,
@@ -732,6 +807,7 @@ export default {
});
} else if (props.isLevel == 2) {
let editObj = {
examType: 1,
courseId: res.data.data.examinationId,
duration: res.data.data.examinationDuration,
name: res.data.data.examinationName,
@@ -753,6 +829,7 @@ export default {
});
} else if (props.isLevel == 3) {
addTempTask({
examType: 1,
courseId: res.data.data.examinationId,
duration: res.data.data.examinationDuration,
name: res.data.data.examinationName,
@@ -775,9 +852,9 @@ export default {
};
// 外部考试
const updateTask1 = (res) => {
state.EditTestId = res.data.data.externalId;
state.EditTestId = res.data.data.examinationId;
if (props.faceLevel) {
state.EditTestId = res.data.data.externalId;
state.EditTestId = res.data.data.examinationId;
state.paperName = "";
closeDrawer();
} else {
@@ -787,9 +864,10 @@ export default {
return message.warning("请先选中关卡");
}
let editObj1 = {
examType: 2,
chapterId: props.isactive,
courseId: res.data.data.externalId,
name: res.data.data.externalName,
courseId: res.data.data.examinationId,
name: res.data.data.examinationName,
routerId: props.routerId,
routerTaskId: props.routerTaskId || 0,
type: 5,
@@ -807,8 +885,9 @@ export default {
});
} else if (props.isLevel == 2) {
let editObj = {
courseId: res.data.data.externalId,
name: res.data.data.externalName,
examType: 2,
courseId: res.data.data.examinationId,
name: res.data.data.examinationName,
projectId: props.projectId,
projectTaskId: props.projectTaskId || 0,
stageId: props.chooseStageId || 0,
@@ -827,8 +906,9 @@ export default {
});
} else if (props.isLevel == 3) {
addTempTask({
courseId: res.data.data.externalId,
name: res.data.data.externalName,
examType: 2,
courseId: res.data.data.examinationId,
name: res.data.data.examinationName,
projectTemplateId: props.projectTemplateId,
projectTaskId: props.projectTaskId || 0,
stageId: props.chooseStageId || 0,

View File

@@ -47,20 +47,19 @@
<span class="total">/{{pro.totalReqCnt}}</span>
</div>
</div>
<!-- <a-divider
<a-divider
type="vertical"
style="
height: 49px;
margin-left: 34px;
background-color: rgba(170, 166, 166, 0.3);
"
background-color: rgba(170, 166, 166, 0.3);"
/>
<div class="sortbox" style="margin-left: 34px">
<div class="sortname">已修证书</div>
<div class="sortnub">
<span class="nub1">{{pro.certCnt}}</span>
<span class="nub1">{{pro.certCnt?pro.certCnt:0}}</span>
</div>
</div>
</div> -->
</div>
<div class="secondrow">
<div class="rowleft">{{ pro.name }}</div>

View File

@@ -37,9 +37,9 @@
:showUploadList="false"
:data="{
type: type,
targetId: Number(id),
targetId: Number(targetId),
chapterId: chapterId,
taskId:taskId
taskId: taskId,
}"
>
<p class="ant-upload-drag-icon">
@@ -235,7 +235,8 @@
const state = reactive({
fileType: ["xls", "xlsx"],
importScore:
process.env.VUE_APP_BASE_API + "/admin/external/exam/manage/importExternalExamScore",
process.env.VUE_APP_BASE_API +
"/admin/external/exam/manage/ImportExternalScore",
uploadpercent: -1,
uploadErr: false, //上传失败
addLoading: false,
@@ -244,12 +245,14 @@
errNum: 0, //失败数据数
downloadErrUrl: null, //下载失败数据
fileName: "",
locationHref:location.href.indexOf("http://") !== -1
locationHref:
location.href.indexOf("http://") !== -1
? "http://43.143.139.204:12016/"
: location.href.slice(0, location.href.indexOf("/m")) + "/upload/",
template: process.env.VUE_APP_UP_LOAD_STUDENT_SCORE_TEMPLATE
template: process.env.VUE_APP_UP_LOAD_STUDENT_SCORE_TEMPLATE,
});
const closeDrawer = () => {
ctx.emit("closeDraw", true);
ctx.emit("update:eScorevisibleExternalExternal", false);
state.fileList = [];
state.uploadpercent = -1;
@@ -259,7 +262,7 @@
const afterVisibleChange = (bool) => {
console.log("state", bool);
if (bool) {
console.log('当前是 1 项目 2 路径图', props.type)
console.log("当前是 1 项目 2 路径图", props.type);
}
};
@@ -286,6 +289,13 @@
if (status === "done") {
state.fileName = info.file.name;
let i = 0;
let timeouts = setTimeout(() => {
clearInterval(timer);
state.addLoading = false;
message.destroy();
message.error(`文件导入超时`);
}, 30000);
let timer = setInterval(() => {
let uid = info.file.response.data;
api
@@ -306,25 +316,17 @@
state.downloadErrUrl = res.data.data.url;
console.log("props.getStudent", props.getStudent);
clearInterval(timer);
clearTimeout(timeouts);
}
}else{
state.addLoading = false;
message.destroy();
message.error(`文件导入超时`);
}
})
.catch((err) => {
state.addLoading = false;
clearInterval(timer);
clearTimeout(timeouts);
console.log("查询导入状态失败", err);
});
}, 500);
setTimeout(() => {
clearInterval(timer)
state.addLoading = false;
message.destroy();
message.error(`文件导入超时`);
}, 30000);
} else if (status === "error") {
state.uploadErr = true;
message.error(`${info.file.name}上传失败`);
@@ -383,7 +385,7 @@
}
};
function downTemplate() {
console.log(state.locationHref + state.template)
console.log(state.locationHref + state.template);
window.open(state.locationHref + state.template);
}

View File

@@ -161,7 +161,11 @@
<script>
import { toRefs, reactive } from "vue";
// import StuAdd from "./StuAdd.vue";
import { getProjStu, removeGroupStudent } from "../../api/indexProjStu";
import {
// getProjStu,
removeGroupStudent,
groupMemberList,
} from "../../api/indexProjStu";
import { toDate } from "../../api/method";
import { message } from "ant-design-vue";
import AddGroupMembers from "./AddGroupMembers.vue";
@@ -332,27 +336,23 @@ export default {
totalStageCnt: value.totalStageCnt, //总阶段数
progress: value.completeStageCnt + "/" + value.totalStageCnt,
stutime: toDate(value.beginStudyTime / 1000, "Y-M-D"), //开始学习时间
};
array.push(obj);
});
state.tabledata = array;
};
//获取员列表
//获取员列表
const getStu = (obj) => {
let objf = obj || {
deptIds: [], //部门
groupName: "",
name: "",
studentName: "",
pageNo: state.currentPage,
pageSize: 10,
projectId: props.projectId,
topFlag: "",
pid: props.projectId,
groupId: props.chooseGroupId, //暂时写死
};
state.tableDataTotal = -1;
getProjStu(objf).then((res) => {
groupMemberList(objf).then((res) => {
console.log(res.data.data, "获取学员列表");
if (res.data.code === 200) {
state.total = res.data.data.total;

View File

@@ -48,22 +48,21 @@
<span class="total">/{{ totalReqCnt }}</span>
</div>
</div>
<!--
<a-divider
type="vertical"
style="
height: 49px;
margin-left: 34px;
background-color: rgba(170, 166, 166, 0.3);
"
background-color: rgba(170, 166, 166, 0.3);"
/>
<div class="sortbox" style="margin-left: 34px">
<div class="sortname">已修证书</div>
<div class="sortnub">
<span class="nub1">{{ certCnt }}</span>
<span class="nub1">{{ certCnt?certCnt:0 }}</span>
</div>
</div>
-->
</div>
<div class="secondrow">
<div class="rowleft">{{ name }}</div>

View File

@@ -307,7 +307,7 @@
id="inputNumber"
v-model:value="score"
:min="1"
:max="100"
:max="projectPoints"
style="width: 70px"
:disabled="condition !== 5"
/>
@@ -320,7 +320,7 @@
margin-left: 5px;
"
>
分可获得当前项目积分为 10
分可获得当前项目积分为 {{ projectPoints }}
</div>
</div>
<!-- <a-radio v-model:checked="checked" :value="6" >
@@ -422,6 +422,7 @@ export default {
selectExamName: null,
selectExamId: null,
score: null, //积分
projectPoints: 0,
fileType: ["jpg", "jpeg", "png", "gif", "svg", "bmp"],
});
@@ -471,6 +472,7 @@ export default {
.then((res) => {
if (res.data.code === 200) {
console.log("获取项目总积分", res);
state.projectPoints = res.data.data;
}
})
.catch((err) => {

View File

@@ -0,0 +1,652 @@
<template>
<a-drawer
:visible="ImpoterGroupLeaderV"
class="drawerStyle impotergroupleader"
placement="right"
width="800px"
@after-visible-change="afterVisibleChange"
>
<div class="drawerMain">
<div class="header">
<div class="headerTitle">导入小组长</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<div class="main">
<div class="minatitl">
<div class="up1">请下载</div>
<div class="up2" @click="downTemplate" style="cursor: pointer">
模板
</div>
<div class="up1">按要求填写数据并导入</div>
</div>
<div class="upload">
<div class="text">上传</div>
<div class="right">
<div style="height: 176px; margin-bottom: 20px">
<a-upload-dragger
v-model:fileList="fileList"
:action="importLeader"
name="uploadFile"
:multiple="true"
@change="handleChange"
:showUploadList="false"
>
<p class="ant-upload-drag-icon">
<inbox-outlined></inbox-outlined>
</p>
<p class="ant-upload-text">点击或将文件拖拽到此处上传</p>
<p class="ant-upload-hint">支持扩展名.xls/.xlsx</p>
</a-upload-dragger>
</div>
<!-- <div class="load">
<div class="cloud"></div>
<div class="tip">点击或将文件拖拽到此处上传</div>
<div class="tipz">支持扩展名.xls/.xlsx</div>
</div> -->
<div class="loadstate">
<div
class="loadborder"
v-if="uploadpercent < 100 && uploadpercent !== -1"
>
<div class="content">
<div class="img"></div>
<div class="timebox">
<div class="timetop">
<div class="tit">{{ fileName }}</div>
<div class="stateloading">正在上传</div>
</div>
<a-progress :percent="uploadpercent" />
<!-- <div class="prog">
<div class="inprogloading"></div>
</div> -->
</div>
<div class="curloading">
<!-- <div class="cur">55%</div> -->
<!-- <div class="cancel" style="margin-left: 20px">暂停</div>
<div class="cancel" style="margin-left: 15px">取消</div> -->
</div>
</div>
</div>
<div class="loadborder" v-if="uploadErr">
<div class="content">
<div class="img"></div>
<div class="timebox">
<div class="timetop">
<div class="tit">{{ fileName }}</div>
<div class="statedefeat">上传失败</div>
</div>
<a-progress :percent="uploadpercent" />
<!-- <div class="prog">
<div class="inprogdefeat"></div>
</div> -->
</div>
<div class="curloading">
<!-- <div class="cur">55%</div> -->
<div
style="color: #387df7; margin-left: 20px; cursor: pointer"
>
下载失败数据
</div>
<!-- <div class="cancel" style="margin-left: 20px">暂停</div>
<div class="cancel" style="margin-left: 15px">取消</div> -->
</div>
<div
class="defeat"
style="display: flex; align-items: center"
>
<div style="color: #ff7474">
{{ succNum }}条数据导入成功{{ errNum }}条数据导入失败
</div>
</div>
</div>
</div>
<!-- v-if="uploadpercent === 100" -->
<div class="loadborder" v-if="uploadpercent === 100">
<div class="content">
<div class="img"></div>
<div class="timebox">
<div class="timetop">
<div class="tit">{{ fileName }}</div>
<div class="statesucce">上传成功</div>
</div>
<a-progress :percent="uploadpercent" />
<!-- <div class="prog">
<div class="inprogsucce"></div>
</div> -->
</div>
<div class="curloading">
<!-- <div class="cur">100%</div> -->
<div
class="cancel"
style="margin-left: 20px; cursor: pointer"
@click="removeUpload"
>
删除
</div>
</div>
</div>
<div v-if="errNum">
<div class="downloadErr" @click="downloadEeeorData">
下载失败数据
</div>
</div>
</div>
<div
v-if="uploadpercent === 100"
class="defeat"
style="
display: flex;
align-items: center;
width: 500px;
height: 40px;
"
:style="{
background: errNum
? 'rgba(255, 116, 116, 0.1)'
: 'rgba(53, 174, 105, 0.1)',
border: errNum ? '1px solid #ff7474' : '1px solid #35AE69',
}"
>
<img
style="width: 14px; height: 14px; margin-left: 16px"
:src="
errNum
? require('../../../assets/images/err.png')
: require('../../../assets/images/success.png')
"
/>
<div
style="margin-left: 8px"
:style="{ color: errNum ? '#ff7474' : 'rgba(0,0,0,0.65)' }"
>
{{ succNum }}条数据导入成功{{ errNum }}条数据导入失败
</div>
</div>
</div>
</div>
</div>
</div>
<div class="btnn">
<button class="btn1" @click="closeDrawer">取消</button>
<button class="btn2" @click="closeDrawer">确定</button>
</div>
</div>
<!-- 加载动画 -->
<div class="aeLoading" :style="{ display: addLoading ? 'flex' : 'none' }">
<a-spin :spinning="addLoading" tip="" />
</div>
</a-drawer>
</template>
<script>
import { reactive, toRefs } from "vue";
import { message } from "ant-design-vue";
import * as api from "../../../api/index1";
import { BATCH_IMPORT_SCORE } from "@/api/config";
export default {
name: "EScore",
props: {
ImpoterGroupLeaderV: {
type: Boolean,
default: false,
},
projectId: {
type: Number,
default: null,
},
//type=1 路径图 type=2 项目
type: {
type: String,
default: null,
},
id: {
type: Number,
default: null,
},
targetId: {
type: Number,
default: null,
},
taskId: {
type: Number,
default: null,
},
chapterId: {
type: Number,
default: null,
},
pid: {
type: Number,
default: null,
},
searchTaskList: {
type: Function,
default: null,
},
},
setup(props, ctx) {
const state = reactive({
fileType: ["xls", "xlsx"],
importLeader:
process.env.VUE_APP_BASE_API +
`/admin/studentGroup/importGroup/${props.projectId}`,
uploadpercent: -1,
uploadErr: false, //上传失败
addLoading: false,
fileList: [],
succNum: 0, //成功数据数
errNum: 0, //失败数据数
downloadErrUrl: null, //下载失败数据
fileName: "",
locationHref:
location.href.indexOf("http://") !== -1
? "http://43.143.139.204:12016/"
: location.href.slice(0, location.href.indexOf("/m")) + "/upload/",
template: process.env.VUE_APP_UP_LOAD_STUDENT_SCORE_TEMPLATE,
});
const closeDrawer = () => {
ctx.emit("closeDraw", true);
ctx.emit("update:ImpoterGroupLeaderV", false);
state.fileList = [];
state.uploadpercent = -1;
state.uploadErr = false; //上传失败
};
const afterVisibleChange = (bool) => {
console.log("state", bool);
if (bool) {
console.log("当前是 1 项目 2 路径图", props.type);
}
};
//上传文件
const handleChange = (info) => {
if (info) {
var FileExt = info.file.name.replace(/.+\./, "");
if (["xls", "xlsx"].indexOf(FileExt.toLowerCase()) === -1) {
state.fileList = [];
state.uploadpercent = -1;
message.destroy();
message.error("请上传正确的文件格式");
return;
}
}
state.addLoading = true;
state.uploadpercent = parseInt(info.file.percent);
console.log("我是文件上传的进度---------->", info.file.percent);
const status = info.file.status;
if (status !== "uploading") {
// console.log(info.file, info.fileList);
}
if (status === "done") {
state.fileName = info.file.name;
let i = 0;
let timeouts = setTimeout(() => {
clearInterval(timer);
state.addLoading = false;
message.destroy();
message.error(`文件导入超时`);
}, 30000);
let timer = setInterval(() => {
let uid = info.file.response.data;
api
.getImportStatus(uid)
.then((res) => {
console.log("查询导入状态", res);
if (res.data.code === 200) {
if (res.data.data.status !== "START") {
i++;
if (i === 1) {
message.destroy();
message.success(`${info.file.name}上传成功`);
state.addLoading = false;
props.searchTaskList && props.searchTaskList();
}
state.succNum = res.data.data.successNum;
state.errNum = res.data.data.failedNum;
state.downloadErrUrl = res.data.data.url;
console.log("props.getStudent", props.getStudent);
clearInterval(timer);
clearTimeout(timeouts);
}
}
})
.catch((err) => {
state.addLoading = false;
clearInterval(timer);
clearTimeout(timeouts);
console.log("查询导入状态失败", err);
});
}, 500);
} else if (status === "error") {
state.uploadErr = true;
message.error(`${info.file.name}上传失败`);
}
};
const beforeUpload = (file) => {
return new Promise((resolve, reject) => {
// const isJpgOrPng =
// file.name.indexOf(".xlsx") !== "-1" ||
// file.name.indexOf(".xls") !== "-1";
// if (!isJpgOrPng) {
// message.destroy();
// message.error("仅支持xls、xlsx格式!");
// return reject(false);
// }
const formData = new FormData();
formData.append("uploadFile", file);
// let progress = { percent: 1 };
// const intervalId = setInterval(() => {
// if (progress.percent < 100) {
// progress.percent++;
// file.onProgress(progress);
// } else {
// clearInterval(intervalId);
// }
// }, 100);
api.batchImportScore(formData).then((res) => {
if (res.data.code === 200) {
console.log("上传成功", res);
return reject(true);
}
});
return reject(false);
});
};
const handleUpload = (e) => {
console.log("handleUpload", e);
};
//删除
const removeUpload = () => {
state.fileList = [];
state.uploadpercent = -1;
state.uploadErr = false; //上传失败
state.succNum = 0;
state.errNum = 0;
state.downloadErrUrl = null;
state.addLoading = false;
};
// 下载失败数据
const downloadEeeorData = () => {
if (state.downloadErrUrl !== "") {
window.open(process.env.VUE_APP_FILE_PATH + state.downloadErrUrl);
}
};
function downTemplate() {
// console.log(state.locationHref + state.template);
// window.open(state.locationHref + state.template);
}
return {
...toRefs(state),
afterVisibleChange,
closeDrawer,
handleChange,
downTemplate,
BATCH_IMPORT_SCORE,
beforeUpload,
handleUpload,
removeUpload,
downloadEeeorData,
};
},
};
</script>
<style scoped lang="scss" >
.impotergroupleader {
.drawerMain {
min-width: 600px;
margin: 0px 32px 0px 32px;
overflow-x: auto;
display: flex;
flex-direction: column;
.header {
height: 73px;
border-bottom: 1px solid #e8e8e8;
display: flex;
justify-content: space-between;
align-items: center;
// background-color: red;
margin-bottom: 20px;
flex-shrink: 0;
.headerTitle {
font-size: 18px;
font-weight: 600;
color: #333333;
line-height: 25px;
// margin-left: 24px;
}
}
.main {
overflow-y: auto;
.minatitl {
display: flex;
.up1 {
font-size: 16px;
font-weight: 400;
color: #333333;
}
.up2 {
font-size: 16px;
font-weight: 400;
color: #4ea6ff;
margin-left: 4px;
}
}
.upload {
margin-top: 32px;
display: flex;
.text {
font-size: 14px;
font-weight: 400;
color: #333333;
}
.right {
margin-left: 6px;
.load {
width: 500px;
height: 176px;
background: #f5f9fd;
border-radius: 4px;
// opacity: 0.3;
border: 1px dashed #caddfd;
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 20px;
.cloud {
margin-top: 52px;
width: 28px;
height: 28px;
background-image: url(../../../assets/images/basicinfo/cloud.png);
}
.tip {
font-size: 14px;
font-weight: 400;
color: #4ea6ff;
margin-top: 15px;
cursor: pointer;
}
.tipz {
font-size: 14px;
font-weight: 400;
color: #999999;
margin-top: 10px;
}
}
.loadstate {
width: 500px;
margin-bottom: 100px;
.loadborder {
width: 500px;
height: 173px;
border-radius: 4px;
border: 1px dashed #eaeaea;
margin-bottom: 30px;
display: flex;
flex-direction: column;
justify-content: center;
position: relative;
.content {
display: flex;
margin-left: 20px;
position: relative;
.defeat {
width: 400px;
position: absolute;
left: 46px;
top: 38px;
font-size: 14px;
font-weight: 500;
justify-content: space-between;
}
.img {
width: 30px;
height: 34px;
background-image: url(../../../assets/images/basicinfo/exl.png);
}
.timebox {
margin-left: 15px;
margin-top: -5px;
.timetop {
display: flex;
width: 262px;
justify-content: space-between;
// margin-bottom: 8px;
.tit {
font-size: 14px;
font-weight: 400;
color: #333333;
}
.stateloading {
font-size: 14px;
font-weight: 400;
color: #4ea6ff;
}
.statedefeat {
font-size: 14px;
font-weight: 400;
color: #ff7474;
}
.statesucce {
font-size: 14px;
font-weight: 400;
color: #35ae69;
}
}
.prog {
width: 262px;
height: 5px;
background: #eaf1fe;
border-radius: 4px;
.inprogloading {
width: 55%;
height: 5px;
border-radius: 4px;
background: #4ea6ff;
}
//下载失败条
.inprogdefeat {
width: 55%;
height: 5px;
border-radius: 4px;
background: #ff7474;
}
//下载成功条
.inprogsucce {
width: 100%;
height: 5px;
border-radius: 4px;
background: #57c887;
}
}
}
.curloading {
margin-left: 15px;
margin-top: 15px;
display: flex;
.cur {
font-size: 14px;
font-weight: 400;
color: #333333;
}
.cancel {
font-size: 14px;
font-weight: 400;
color: #387df7;
}
}
}
.downloadErr {
width: 120px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 2px;
border: 1px solid #387df7;
font-size: 14px;
font-weight: 400;
color: #387df7;
line-height: 20px;
cursor: pointer;
margin-left: 66px;
margin-top: 16px;
position: absolute;
bottom: 28;
}
}
}
}
}
}
.btnn {
height: 72px;
width: 100%;
position: absolute;
background-color: #fff;
bottom: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.16);
.btn1 {
width: 100px;
height: 40px;
border: 1px solid #4ea6ff;
border-radius: 8px;
color: #4ea6ff;
background-color: #fff;
cursor: pointer;
}
.btn2 {
cursor: pointer;
width: 100px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-left: 15px;
color: #fff;
}
}
}
}
</style>

View File

@@ -116,10 +116,11 @@
</div>
<!-- 导出成绩抽屉 -->
<ExportAchievement
@closeDraw="closeDraw"
v-model:eScorevisibleExternalExternal="eScorevisibleExternalExternal"
:type="2"
:targetId="datasource.projectId"
:taskId="datasource.projectTaskId"
:taskId="datasource.courseId"
:chapterId="datasource.stageId" />
</a-drawer>
</template>
@@ -320,7 +321,7 @@
align: "center",
ellipsis: true,
className: "h",
customRender: ({record:{status}}) => ({0:'未开始',1:'进行中',9:'已完成'}[status] || '未开始'),
customRender: ({record:{status}}) => ({0:'未开始',1:'进行中',null:'进行中',2:'已完成'}[status] || '未开始'),
},
],
loadingData: true
@@ -368,6 +369,7 @@
// 获取数据
function getData() {
state.loadingData = true;
api.QueryExternalExamManageDetail({
chapterId: props.datasource.stageId,
pageNo: state.currentPage,
@@ -410,6 +412,11 @@
window.open(`${process.env.VUE_APP_BASE_API}/admin/external/exam/manage/exportExternalExam?chapterId=${props.datasource.stageId}&type=${2}&targetId=${props.datasource.projectId}&taskId=${props.datasource.projectTaskId}`)
}
const closeDraw = (e) => {
console.log('我关闭了导入成绩弹框吗', e)
getData();
}
return {
...toRefs(state),
selectProjectName,
@@ -422,7 +429,8 @@
searchTableData,
reseatTableData,
changePaginationStu,
exportData
exportData,
closeDraw
};
},
};

View File

@@ -347,7 +347,7 @@ export default {
<div class="racona">
<span>
{text.record.workScore || text.record.workScore == 0
? text.record.workScore
? text.record.workScore < 0 ?"-":text.record.workScore
: "-"}
</span>
</div>

View File

@@ -340,7 +340,7 @@ export default {
// 获取数据
function getData() {
if (props.datasource.type == 11 || props.datasource.type == 9 || props.datasource.type == 6 || props.datasource.type == 7 || props.datasource.type == 3) {
if (props.datasource.type == 11 || props.datasource.type == 9 || props.datasource.type == 6 || props.datasource.type == 7 || props.datasource.type == 8 || props.datasource.type == 3) {
// 此处为获取评估学员的接口 - 如后续还有用到此接口的公共任务可直接在if里面加||判断即可
console.log("我是传递的查询参数", {
pageNo: state.currentPage,

View File

@@ -344,7 +344,7 @@ export default {
// 获取数据
function getData() {
if (props.datasource.type == 11 || props.datasource.type == 9 || props.datasource.type == 6 || props.datasource.type == 7 || props.datasource.type == 3) {
if (props.datasource.type == 11 || props.datasource.type == 9 || props.datasource.type == 6 || props.datasource.type == 7 || props.datasource.type == 8 || props.datasource.type == 3) {
// 此处为获取评估学员的接口 - 如后续还有用到此接口的公共任务可直接在if里面加||判断即可
console.log("我是传递的查询参数", {
pageNo: state.currentPage,

View File

@@ -115,10 +115,11 @@
</div>
<!-- 导出成绩抽屉 -->
<ExportAchievement
@closeDraw="closeDraw"
v-model:eScorevisibleExternalExternal="eScorevisibleExternalExternal"
:type="1"
:targetId="datasource.routerId"
:taskId="datasource.routerTaskId"
:taskId="datasource.courseId"
:chapterId="datasource.chapterId" />
</a-drawer>
</template>
@@ -324,7 +325,7 @@
align: "center",
ellipsis: true,
className: "h",
customRender: ({record:{status}}) => ({0:'未开始',1:'进行中',9:'已完成'}[status] || '未开始'),
customRender: ({record:{status}}) => ({0:'未开始',1:'进行中',null:'进行中',2:'已完成'}[status] || '未开始'),
},
],
loadingData: true
@@ -368,9 +369,14 @@
const clearLine = () => {
state.selectedRowKeys = [];
};
const closeDraw = (e) => {
console.log('我关闭了导入成绩弹框吗', e)
getData();
}
// 获取数据
function getData() {
state.loadingData = true;
api.QueryExternalExamManageDetail({
chapterId: props.datasource.chapterId,
pageNo: state.currentPage,
@@ -425,7 +431,8 @@
searchTableData,
reseatTableData,
changePaginationStu,
exportData
exportData,
closeDraw
};
},
};

View File

@@ -341,7 +341,7 @@ export default {
<div class="racona">
<span>
{text.record.workScore || text.record.workScore == 0
? text.record.workScore
? text.record.workScore < 0 ?"-":text.record.workScore
: "-"}
</span>
</div>

View File

@@ -47,9 +47,9 @@ const id = computed(() => {
const emit = defineEmits({});
const options = computed(() =>
store.state.projectLevel.map((e) => ({
value: parseInt(e.dictCode),
label: e.dictName,
store.state.project_level.map((e) => ({
value: parseInt(e.value),
label: e.name,
}))
);

View File

@@ -47,12 +47,7 @@ const id = computed(() => {
const emit = defineEmits({});
const options = computed(() =>
store.state.projectSys.map((e) => ({
value: parseInt(e.dictCode),
label: e.dictName,
}))
);
const options = computed(() => store.state.project_sys.map((e) => ({value: parseInt(e.value), label: e.name,})));
function change(key) {
emit("update:value", key);

View File

@@ -2,7 +2,7 @@
* @Author: lixg lixg@dongwu-inc.com
* @Date: 2022-12-20 17:00:37
* @LastEditors: lixg lixg@dongwu-inc.com
* @LastEditTime: 2023-01-31 16:14:39
* @LastEditTime: 2023-02-11 15:06:13
* @FilePath: /fe-manage/src/components/student/ChangeLevelModal.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
@@ -28,11 +28,12 @@
<!-- <div class="cur">当前关卡关卡2</div> -->
<div class="select">
<a-select
v-model:value="selectStage"
v-model:value="selectGroupId"
style="width: 100%"
placeholder="请选择小组"
:options="option"
allowClear
@change="selectGroup"
></a-select>
</div>
<div class="btn">
@@ -58,7 +59,8 @@
</template>
<script setup>
import { computed, defineEmits, defineProps, ref } from "vue";
// import { moveStudent } from "@/api/index1";
import * as api from "@/api/index1";
import { message } from "ant-design-vue";
// import { message } from "ant-design-vue";
const props = defineProps({
@@ -66,30 +68,56 @@ const props = defineProps({
type: Boolean,
default: false,
},
stage: {
groupList: {
type: Array,
default: () => [],
},
ids: {
type: Array,
default: () => [],
checkgroupStuId: {
type: Number,
default: null,
},
});
const option = computed(() => {
return props.stage.map((e) => ({ label: e.name, value: e.id }));
console.log("props.groupList", props.groupList);
return props.groupList.map((e) => ({
label: e.groupName,
value: e.projectGroupId,
}));
});
console.log("changegroupV", props.changegroupV);
const selectStage = ref();
const selectGroupId = ref();
const selectGroupName = ref();
const emit = defineEmits({});
const closeChangeModal = () => {
emit("update:changegroupV", false);
selectGroupId.value = null;
};
const selectGroup = (e, v) => {
console.log("选择小组", e, v);
selectGroupName.value = v.label;
};
//确认换组
const changeGroup = (item) => {
console.log("换组", item);
console.log("换组", selectGroupId.value, item);
let obj = {
groupId: selectGroupId.value,
groupName: selectGroupName.value,
studentId: props.checkgroupStuId,
};
console.log("换组obj", obj);
api
.changeGroupByStudentId(obj)
.then((res) => {
console.log("换组成功", res);
if (res.data.code === 200) {
message.success("换组成功");
}
})
.catch((err) => {
console.log("换组失败", err);
});
};
</script>

View File

@@ -0,0 +1,604 @@
<template>
<a-modal
:visible="visiable"
:centered="true"
:width="1000"
title="学员管理"
@cancel="closeDrawer"
>
<div class="header-content">
<div>
xxxxxxxx课程
</div>
<div>
内容分类:12312
</div>
<div>
授课教师:12312
</div>
<div>
状态审核:12312
</div>
</div>
<div class="TableStudent">
<a-row
type="flex"
gutter="12"
style="padding-left: 20px; margin-right: 0px"
>
<a-col>
<a-form-item title="学员名称:">
<a-input
class="cus-input"
v-model:value="searchParams.studentName"
placeholder="请输入学员名称"
/>
</a-form-item>
</a-col>
<a-col>
<a-button
class="cus-btn"
style="background: #4ea6ff; color: #fff; width: 100px"
@click="searchStu"
>
<template #icon>
<img
style="margin-right: 10px"
src="../../assets/images/courseManage/search0.png"
/></template>
搜索
</a-button>
</a-col>
<a-col :span="2">
<a-button class="cus-btn white" style="width: 100px" @click="reset">
<template #icon>
<img
style="margin-right: 10px"
src="../../assets/images/leveladd/reset.png"
/></template>
重置
</a-button>
</a-col>
</a-row>
<a-row
type="flex"
gutter="12"
style="padding-left: 20px; margin-right: 0px"
v-if="checkPer(permissions)"
>
<a-col :span="1.5">
<CommonStudent
:type="type"
:id="id"
@finash="submitCall"
:stage="stage"
>
<a-button class="cus-btn" style="background: #4ea6ff; color: #fff">
<template #icon
><img
style="margin-right: 10px"
src="../../assets/images/courseManage/add0.png"
/></template>
添加学员
</a-button>
</CommonStudent>
</a-col>
<!-- 新加导入学员 批量换组 导出学习信息 -->
<a-col :span="1.5" v-if="type === 1 || type === 2">
<a-button class="cus-btn white" @click="showImpStu">
<template #icon
><img
style="margin-right: 10px"
src="../../assets/images/basicinfo/in2.png"
/></template>
导入学员
</a-button>
</a-col>
<!--
<a-col :span="1.5" v-if="type === 1">
<a-button class="cus-btn white"> 批量换组 </a-button>
</a-col>-->
<a-col :span="1.5" v-if="type === 1">
<a-button class="cus-btn white" @click="exportTaskStu">
导出学习信息
</a-button>
</a-col>
<a-col :span="1.5" v-if="type === 2">
<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
><img
style="margin-right: 10px"
src="../../assets/images/projectadd/delete.png"
/></template>
批量删除
</a-button>
</a-col>
<a-col :span="1.5" v-if="type === 2">
<a-button class="cus-btn white" @click="showChangeModal">
<template #icon></template>
批量调整关卡
</a-button>
</a-col>
<!-- 新加批量操作导出导出作业 -->
<a-col :span="1.5" v-if="type === 3" class="batchOpera">
<div class="stmm_btn btn4" @click="hideShow">
<div class="btn4_sub">
<span style="color: #4ea6ff; margin-right: 4px"> 批量操作 </span>
<div
class="b_zk"
:style="{ display: hideshow ? 'block' : 'none' }"
></div>
<div
class="b_sq"
:style="{ display: hideshow ? 'none' : 'block' }"
></div>
</div>
<div
class="btn4_sup"
:style="{ display: hideshow ? 'none' : 'block' }"
>
<div class="btnsbox">
<div class="btn4_tit" @click="showEScoreModal">
<span>批量录入成绩</span>
</div>
<div class="btn4_op1" @click="updateStatus(1)">
<span>批量结业</span>
</div>
<div class="btn4_op2" @click="updateStatus(0)">
<span>批量通过</span>
</div>
<div class="btn4_op3" @click="updateStatus(2)">
<span>批量拒绝</span>
</div>
</div>
</div>
</div>
<div class="stmm_btn btn5" @click="exportStu">
<div class="export"></div>
<div class="btnText">导出</div>
</div>
<div
class="stmm_btn btn5"
style="margin-left: 15px"
@click="exportHomeWorkShow"
>
<div class="btnText">导出作业</div>
</div>
</a-col>
</a-row>
<div style="margin-top: 20px">
<a-table
:columns="columns"
:data-source="studentList"
:pagination="stuPagination"
:loading="loading"
row-key="id"
:row-selection="stuRowSelection"
>
<template #action="{ record }">
<a-space :size="2">
<slot name="extension" v-bind:data="{ record }"></slot>
<a-button v-if="checkPer(permissions)" @click="del(record.id)" type="link" danger>删除</a-button>
</a-space>
</template>
</a-table>
</div>
</div>
</a-modal>
</template>
<script setup>
import {computed, createVNode, defineProps, defineExpose, ref, watch} from "vue";
import {usePage} from "@/api/request";
import {STUDENT_LIST} from "@/api/apis";
import {delStudentList} from "@/api/index1";
import {ExclamationCircleOutlined} from "@ant-design/icons-vue";
import {Modal} from "ant-design-vue";
import CommonStudent from "@/components/student/CommonStudent";
import {checkPer} from "@/utils/utils";
const props = defineProps({
permissions: {
type: String,
default: ''
},
type: Number,
id: String,
stage: {
type: Array,
default: () => [],
},
types: {
type: Array,
default: () => [],
},
});
const visiable = ref(false);
const initParams = {
studentName: "",
pageNo: 1,
pageSize: 10,
type: props.type || '',
types: props.types,
pid: props.id || '',
}
const searchParams = ref(initParams)
const searchName = ref('')
const columns = ref([
{
title: "姓名",
dataIndex: "studentName",
key: "studentName",
width: 30,
align: "center",
ellipsis: true,
},
{
title: "工号",
dataIndex: "studentUserNo",
key: "studentUserNo",
width: 50,
align: "center",
ellipsis: true,
},
{
title: "部门",
dataIndex: "studentDepartName",
key: "studentDepartName",
width: 80,
align: "center",
ellipsis: true,
},
{
title: "操作",
dataIndex: "operation",
key: "operation",
width: 50,
align: "center",
slots: {customRender: "action"},
},
])
const {data: studentList, fetch: searchStu, total, loading} = usePage(STUDENT_LIST, searchParams)
const stuPagination = computed(() => ({
total: total.value,
showSizeChanger: false,
current: searchParams.value.pageNo,
pageSize: searchParams.value.pageSize,
onChange: changePagination
}));
const stuSelectKeys = ref([]);
const stuRowSelection = computed(() => ({
columnWidth: 20,
selectedRowKeys: stuSelectKeys.value,
onChange: onStuSelectChange,
preserveSelectedRowKeys: true,
}));
function onStuSelectChange(e) {
stuSelectKeys.value = e;
}
const openDrawer = () => {
visiable.value = true;
};
const changePagination = (page) => {
searchParams.value.pageNo = page;
};
function del(id) {
Modal.confirm({
title: () => '确定删除?',
icon: () => createVNode(ExclamationCircleOutlined),
content: () => '数据删除后不可恢复!',
okText: () => '确定',
okType: 'danger',
cancelText: () => '取消',
onOk() {
if (id) {
loading.value = true
delStudentList({ids: [id]}).then(() => searchStu())
}
},
});
}
const closeDrawer = () => {
visiable.value = false;
};
function reset() {
searchParams.value = initParams
searchName.value = ''
}
watch(visiable, () => {
visiable.value && searchStu()
searchParams.value = initParams
});
defineExpose({
searchStu,
loading,
closeDrawer,
openDrawer
})
</script>
<style lang="scss">
.header-content{
padding:20px;
border:1px solid #eef9f3;
margin-bottom: 20px;
div{
margin-top: 10px;
}
}
.cus-btn {
width: 100%;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 16px;
border: 1px solid #4ea6ff;
border-radius: 8px;
background: #4ea6ff;
cursor: pointer;
color: #fff;
}
.white {
background: #fff;
color: #4ea6ff;
}
.cus-input {
height: 40px;
border-radius: 8px;
}
.cus-select {
height: 40px;
border-radius: 8px;
}
.CommonStudent {
.ant-btn-primary {
background-color: #4ea6ff !important;
}
.cus-select {
height: 40px;
border-radius: 8px;
}
.tableBox .ant-table-row .ant-table-cell {
height: 48px;
font-size: 14px;
font-weight: 400;
color: #4f5156;
line-height: 29px;
padding: 0px;
}
.tableBox .ant-table-thead tr th {
font-size: 14px;
}
.ant-tabs-tabpane {
height: 100%;
}
.ant-tabs {
overflow: visible;
}
.right1 {
border-left: 1px solid #f2f6fe;
margin-left: 20px;
.onerow {
display: flex;
justify-content: space-between;
align-items: center;
margin-right: 40px;
flex-wrap: wrap;
width: 100%;
.onleft {
display: flex;
text-align: center;
.already {
color: rgba(51, 51, 51, 1);
font-size: 16px;
font-weight: 500;
margin-left: 32px;
white-space: nowrap;
// margin-bottom: 20px;
}
.count {
color: #4ea6ff;
font-size: 16px;
margin: 0 6px;
}
.peo {
color: rgba(51, 51, 51, 1);
font-size: 16px;
font-weight: 500;
}
}
.clbox {
margin-right: 50px;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
width: 104px;
height: 32px;
border-radius: 4px;
background: #4ea6ff;
.colose {
width: 16px;
height: 16px;
// border-radius: 8px;
// background: #ffffff;
// position: relative;
background-image: url(../../assets/images/basicinfo/ch.png);
background-size: 100%;
margin-right: 4px;
}
.allclear {
color: rgba(255, 255, 255, 1);
font-size: 14px;
}
}
}
.selecteds {
display: flex;
flex-wrap: wrap;
margin-left: 32px;
.person {
width: 100%;
margin-top: 20px;
border-top: 1px solid #f2f6fe;
}
.chose {
width: 64px;
height: 24px;
margin-top: 25px;
margin-right: 25px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 2px;
border: 1px solid rgba(56, 139, 225, 1);
color: rgba(56, 139, 225, 1);
font-size: 12px;
position: relative;
.ch {
position: absolute;
width: 18px;
height: 18px;
background-image: url(../../assets/images/basicinfo/ch.png);
right: -8px;
top: -8px;
}
}
.ifsw {
display: flex;
align-items: end;
justify-content: center;
color: #4ea6ff;
}
.sw {
display: flex;
align-items: center;
justify-content: center;
text-align: justify;
color: #4ea6ff;
margin-top: 23px;
margin-left: 10px;
}
.dept {
width: 100%;
margin-top: 30px;
border-top: 1px solid #f2f6fe;
}
.chose1 {
//width: 90px;
height: 24px;
margin-top: 25px;
margin-right: 25px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 2px;
border: 1px solid rgba(56, 139, 225, 1);
color: rgba(56, 139, 225, 1);
font-size: 12px;
position: relative;
.span {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.ch1 {
position: absolute;
width: 18px;
height: 18px;
background-image: url(../../assets/images/basicinfo/ch.png);
right: -8px;
top: -8px;
}
}
.group {
width: 100%;
margin-top: 30px;
border-top: 1px solid #f2f6fe;
}
.chose2 {
//width: 120px;
height: 24px;
margin-top: 25px;
margin-right: 25px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 2px;
border: 1px solid rgba(56, 139, 225, 1);
color: rgba(56, 139, 225, 1);
font-size: 12px;
position: relative;
.span {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.ch2 {
position: absolute;
width: 18px;
height: 18px;
background-image: url(../../assets/images/basicinfo/ch.png);
right: -8px;
top: -8px;
}
}
}
}
}
</style>

View File

@@ -38,7 +38,7 @@
<a-button
class="cus-btn"
style="background: #4ea6ff; color: #fff; width: 100px"
@click="getStuList"
@click="search"
>
<template #icon>
<img
@@ -56,7 +56,7 @@
重置
</a-button>
</div>
<div class="batch">批量取消证书</div>
<div class="batch" @click="cancelOrAuthAll">批量取消证书</div>
<div class="tableBox" style="margin-top: 20px">
<a-table
:columns="tablecolumns"
@@ -93,6 +93,8 @@ import { reactive, toRefs } from "vue";
import * as api from "@/api/index1";
import OrgClass from "@/components/project/OrgClass";
import { message } from "ant-design-vue";
import { toDate } from "@/api/method";
import dayjs from "dayjs";
export default {
name: "TableCertificateStudent",
components: {
@@ -118,7 +120,7 @@ export default {
studentName: null,
tstudentDepartId: null,
studentDepartName: null,
selectTime: null,
selectTime: [],
tablecolumns: [
{
title: "工号",
@@ -154,11 +156,21 @@ export default {
},
{
title: "取得证书时间",
dataIndex: "time",
key: "time",
dataIndex: "createTime",
key: "createTime",
width: 60,
align: "center",
className: "h",
customRender: (record) => {
// console.log(text.record.checked1);
return (
<div>
{record.record.createTime
? toDate(record.record.createTime / 1000, "Y-M-D h:m")
: "-"}
</div>
);
},
},
{
title: "操作",
@@ -191,13 +203,13 @@ export default {
},
],
stuList: [
{
studentUserNo: "1234",
studentName: "li",
studentDepartName: "开发部",
studentJobName: "岗位一",
time: "2023-02-04",
},
// {
// studentUserNo: "1234",
// studentName: "li",
// studentDepartName: "开发部",
// studentJobName: "岗位一",
// time: "2023-02-04",
// },
],
pageSize: 10,
currentPage: 1,
@@ -207,9 +219,22 @@ export default {
//获取证书学员
const stuCertList = () => {
console.log("state.selectTime", state.selectTime);
let obj = {
name: state.studentName,
orgName: state.studentDepartName,
beginDate:
state.selectTime.length !== 0
? dayjs(new Date(state.selectTime[0]).getTime()).format(
"YYYY-MM-DD"
)
: null,
endDate:
state.selectTime.length !== 0
? dayjs(new Date(state.selectTime[1]).getTime()).format(
"YYYY-MM-DD"
)
: null,
id: props.ACertificateCheckId,
pid: props.projectId,
size: state.pageSize,
@@ -221,8 +246,9 @@ export default {
.then((res) => {
console.log("获取证书学员", res);
if (res.data.code === 200) {
state.stuList = res.data.data.record;
state.tableDataTotal = res.data.data.total;
state.stuList = res.data.data.records;
state.tableDataTotal = Number(res.data.data.total);
console.log("state.tableDataTotal", state.tableDataTotal);
}
})
.catch((err) => {
@@ -242,7 +268,8 @@ export default {
state.studentName = null;
state.tstudentDepartId = null;
state.studentDepartName = null;
state.selectTime = null;
state.selectTime = [];
stuCertList();
};
//取消证书
@@ -265,6 +292,28 @@ export default {
console.log("取消证书失败", err);
});
};
//批量取消证书
const cancelOrAuthAll = () => {
if (state.selectedRowKeys.length === 0)
return message.warning("请选择学员");
let obj = {
ids: state.selectedRowKeys,
status: -1,
};
api
.cancelOrAuth(obj)
.then((res) => {
console.log("取消证书成功", res);
if (res.data.code === 200) {
message.success("取消证书成功");
stuCertList();
state.selectedRowKeys = [];
}
})
.catch((err) => {
console.log("取消证书失败", err);
});
};
const onSelectChange = (selectedRowKeys, e) => {
console.log("selectedRowKeys changed: ", selectedRowKeys, e);
state.selectedRowKeys = selectedRowKeys;
@@ -288,6 +337,7 @@ export default {
onSelectChange,
changePaginationStu,
returnClick,
cancelOrAuthAll,
};
},
};

View File

@@ -51,8 +51,8 @@
tree-default-expand-all
:fieldNames="{
children: 'children',
label: 'dictName',
value: 'dictCode',
label: 'name',
value: 'code',
}"
:tree-data="sysTypeOptions"
>
@@ -2712,7 +2712,7 @@ export default defineComponent({
state.viewpowervisible = true;
};
const sysTypeOptions = computed(() => store.state.sysType);
const sysTypeOptions = computed(() => store.state.content_type);
// console.log('12344', sysTypeOptions)
@@ -3211,63 +3211,6 @@ export default defineComponent({
//获取分类、场景、封面图、-----------字典配置-------------------------------
const optionsUrl = ref([]);
const getDictList = (param) => {
let obj = {
pageNo: 1,
pageSize: 10000,
setCode: param,
};
api1
.getDict(obj)
.then((res) => {
console.log("获取字典成功", res);
if (res.data.code === 200) {
if (param === "faceclassPic") {
let arr = res.data.data.rows;
let newArr = [];
arr.forEach((item) => {
newArr.push({
value: item.dictValue,
label: item.dictName,
});
});
optionsUrl.value = newArr;
// if (res.data.data.rows.length > 0) {
// state.imageUrl = res.data.data.rows[0].dictValue;
// }
}
if (param === "faceclassClass") {
// let arr = res.data.data.rows;
// let newArr = [];
// arr.forEach((item) => {
// newArr.push({
// value: item.dictCode,
// label: item.dictName,
// });
// });
// console.log(newArr)
options2.value = state.options2222;
}
if (param === "faceclassScene") {
let arr = res.data.data.rows;
let newArr = [];
arr.forEach((item) => {
newArr.push({
value: item.dictCode,
label: item.dictName,
});
});
options3.value = newArr;
}
}
})
.catch((err) => {
console.log("获取字典失败", err);
});
};
getDictList("faceclassClass");
getDictList("faceclassScene");
getDictList("faceclassPic");
//获取分类、场景、封面图、----------------字典配置---------------------------
//渲染学员管理操作
@@ -3584,8 +3527,6 @@ export default defineComponent({
state.qdms_inputV1 = state.xzinputV1;
state.xzinputV1 = "";
console.log("qdms_inputV1", state.qdms_inputV1);
getDictList("faceclassPic");
getTea();
}
if (state.bs_hs && state.valueE1 == 1) {

View File

@@ -19,28 +19,26 @@
security="restricted"
sandbox="allow-forms allow-scripts allow-same-origin allow-popups"
></iframe>
<OnlineClassModelStudent ref="stuRef"></OnlineClassModelStudent>
<div @click="test">
asdfasdf
</div>
</div>
</template>
<script>
import { reactive, toRefs, onMounted } from "vue";
import { iframeUrl } from "../../api/method";
export default {
name: "OnlineManage",
<script setup>
import {onMounted, ref} from "vue";
import {iframeUrl} from "@/api/method";
import OnlineClassModelStudent from "@/components/student/OnlineClassModelStudent";
setup() {
const state = reactive({
iframeUrl: iframeUrl,
});
const stuRef = ref()
onMounted(()=>{
// console.log("执行");
});
window.openStudentModel = stuRef.value.openDrawer
})
return {
...toRefs(state),
};
},
};
function test(){
window.openStudentModel()
}
</script>
<style lang="scss">
.courseManage {
@@ -49,5 +47,33 @@
display: flex;
flex-direction: column;
}
.btnn {
height: 72px;
width: 100%;
background-color: #fff;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0px 1px 35px 0px rgba(118, 136, 166, 0.16);
.btn1 {
width: 100px;
height: 40px;
border: 1px solid #4ea6ff;
border-radius: 8px;
color: #4ea6ff;
background-color: #fff;
cursor: pointer;
}
.btn2 {
cursor: pointer;
width: 100px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-left: 15px;
color: #fff;
}
}
</style>

View File

@@ -85,7 +85,7 @@
<div style="width:440px;height:70px;display: flex;justify-content: flex-start;align-items: center;">
<img v-for="(item, index) in optionsUrl" :key="index" class="choiceoptionurl"
:style="item.value == feng_mian_1 ? 'border:3px solid rgb(78, 166, 255);' : ''" :src="item.value"
:alt="item.label" @click="choicePic(item.value)" />
:alt="item.name" @click="choicePic(item.value)" />
</div>
<!-- <a-select
:getPopupContainer="
@@ -144,8 +144,8 @@
:tree-data="sysTypeOptions"
:fieldNames="{
children: 'children',
label: 'dictName',
value: 'dictCode',
label: 'name',
value: 'code',
}">
</a-tree-select>
</div>
@@ -321,7 +321,6 @@ import { validateName } from "@/api/index1";
import { message } from "ant-design-vue";
import { edit, detail, handle } from "@/api/indexCourse";
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 NameInput from "@/components/project/NameInput";
@@ -370,140 +369,11 @@ export default defineComponent({
auditDescription: "",
contentClassify: [],
// 课程三级分类
options2222: [
{
title: '领导力',
value: '100',
children: [
{
title: '管理业务',
value: '1001',
},
{
title: '管理团队',
value: '1002',
},
{
title: '管理自我',
value: '1003',
},
],
},
{
title: '专业力',
value: '200',
children: [
{
title: '研发',
value: '2001',
},
{
title: '系统和解决方案',
value: '2002',
},
{
title: '生产技术与制造',
value: '2003',
},
{
title: '供应链',
value: '2004',
},
{
title: '营销',
value: '2005',
},
{
title: '品质',
value: '2006',
},
{
title: '专业职能',
value: '2007',
children: [
{
title: '战略与企划',
value: '200701',
},
{
title: '流程管理',
value: '200702',
},
{
title: '业绩管理',
value: '200703',
},
{
title: '项目管理',
value: '200704',
},
{
title: '信息技术',
value: '200705',
},
{
title: '环境与安全',
value: '200706',
},
{
title: '人力资源',
value: '200707',
},
{
title: '企业文化',
value: '200708',
},
{
title: '品牌',
value: '200709',
},
{
title: '财务',
value: '200710',
},
{
title: '法务',
value: '200711',
},
{
title: '风险控制',
value: '200712',
},
{
title: '行政',
value: '200713'
},
]
},
{
title: '医工',
value: '2008',
}
],
},
{
title: '通用力',
value: '300',
children: [
{
title: '职业操守与道德',
value: '3001',
},
{
title: '职业素养与技能',
value: '3002',
},
{
title: '规章制度',
value: '3003',
},
],
}
],
});
const store = useStore();
const sysTypeOptions = computed(() => store.state.sysType);
const sysTypeOptions = computed(() => store.state.content_type);
const optionsUrl = computed(() => store.state.course_pic);
watch(()=>state.fen_lei,()=>{
state.fen_lei1 = findClassFullName(sysTypeOptions.value)
@@ -511,7 +381,7 @@ export default defineComponent({
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)
return state.fen_lei === e.code ? name?name+'-'+e.name:e.name : findClassFullName(e.children,name?name+'-'+e.name:e.name)
}).filter(name=>name).join('')
}
@@ -648,77 +518,10 @@ export default defineComponent({
}
//获取分类、场景、封面图、-----------字典配置-------------------------------
const optionsUrl = ref([]);
const options2 = ref([]);
const options3 = ref([]);
const options4 = ref([]);
const getDictList = (param) => {
let obj = {
pageNo: 1,
pageSize: 10000,
setCode: param,
};
api1
.getDict(obj)
.then((res) => {
console.log("获取字典成功", res);
if (res.data.code === 200) {
if (param === "faceclassPic") {
let arr = res.data.data.rows;
let newArr = [];
arr.forEach((item) => {
newArr.push({
value: item.dictValue,
label: item.dictName,
});
});
optionsUrl.value = newArr;
}
if (param === "faceclassClass") {
let arr = res.data.data.rows;
let newArr = [];
arr.forEach((item) => {
newArr.push({
value: item.dictCode,
label: item.dictName,
});
});
options2.value = newArr;
}
if (param === "faceclassScene") {
let arr = res.data.data.rows;
let newArr = [];
arr.forEach((item) => {
newArr.push({
value: item.dictCode,
label: item.dictName,
});
});
options3.value = newArr;
}
if (param === "contentClassify") {
state.contentClassify = dealDickTree(res.data.data.rows) || []
}
}
})
.catch((err) => {
console.log("获取字典失败", err);
});
};
function dealDickTree(data, level = 1) {
return data?.filter(e => e.levelId == level).map(({ dictName, dictCode }) => ({
title: dictName,
value: dictCode,
key: dictCode,
children: dealDickTree(data, dictCode)
}))
}
getDictList("faceclassClass");
getDictList("faceclassScene");
getDictList("faceclassPic");
getDictList("contentClassify");
//获取分类、场景、封面图、----------------字典配置---------------------------
const hideShow = () => {
@@ -737,12 +540,11 @@ export default defineComponent({
}
}
return count ? false : true;
return !count;
};
//保存面授课
const handlePush = async (param) => {
let files = "";
if (state.imgList.length) {
state.imgList.forEach((item) => {
@@ -761,7 +563,7 @@ export default defineComponent({
}
const postData = {
offcourseId: state.offcourseId, //不传代表新增
id: state.offcourseId, //不传代表新增
name: state.qdms_inputV1,
picUrl: state.feng_mian_1,
targetUser: state.qdms_inputV2,

View File

@@ -229,10 +229,10 @@
class="learnBgItem"
:style="{
border:
pathBgId === item.dictCode
pathBgId === item.code
? '2px solid rgba(78, 166, 255, 1)'
: '1px solid #C7CBD2',
'background-image': 'url(' + item.dictValue + ')',
'background-image': 'url(' + item.value + ')',
display: index >= 5 ? 'none' : 'flex',
}"
style="background-size: 100% 100%"
@@ -358,10 +358,10 @@
class="learnBgItem"
:style="{
border:
pathBgId === item.dictCode
pathBgId === item.code
? '2px solid rgba(78, 166, 255, 1)'
: '1px solid #ccc',
'background-image': 'url(' + item.dictValue + ')',
'background-image': 'url(' + item.value + ')',
display: index >= 5 ? 'none' : 'flex',
}"
style="background-size: 100% 100%"
@@ -685,14 +685,14 @@
<div
@click="chooseImg2(item)"
v-for="item in imgData"
:key="item.key"
:key="item.code"
class="learnBgItem"
:style="{
border:
pathBgId === item.id
pathBgId === item.code
? '2px solid rgba(78, 166, 255, 1)'
: '1px solid #ccc',
'background-image': 'url(' + item.source + ')',
'background-image': 'url(' + item.value + ')',
}"
>
<!-- <img class="im" :src="item.source" /> -->
@@ -894,13 +894,13 @@ export default {
};
const chooseImg = (item) => {
console.log(item);
state.pathBgId = item.dictCode;
state.pathBg = item.dictValue;
state.pathBgId = item.code;
state.pathBg = item.value;
};
const chooseImg2 = (item) => {
// console.log(item);
state.pathBgId = item.dictCode;
state.pathBg = item.dictValue;
state.pathBgId = item.code;
state.pathBg = item.value;
};
//发布弹窗
const showPub = (router) => {
@@ -1502,7 +1502,7 @@ export default {
// state.imgData = ;
// }
});
const imgData = computed(() => store.state.pathmapPic);
const imgData = computed(() => store.state.router_pic);
//添加权限
watch(
() => state.addAuthList,

View File

@@ -2501,7 +2501,7 @@ export default {
//编辑基本信息
const editLearnInfo = () => {
let obj = {
routerId: state.routerId,
id: state.routerId,
enablePreview: state.previewSelect ? 1 : 0,
enableStudy: state.studySelect ? 1 : 0,
previewSetting: state.previewStartNum + "," + state.previewEndNum,
@@ -2597,8 +2597,10 @@ export default {
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/externalexam?courseId=" +
item.courseId;
"/faceteach?type=2&courseId=" +
item.courseId +
"&id=" +
item.projectTaskId;
}
if (item.type == 4) {
@@ -2727,26 +2729,8 @@ export default {
window.location.protocol +
process.env.VUE_APP_H5 +
"/projectdetails?courseId=" +
item.courseId
item.courseId;
}
// let path = {
// 1: window.location.protocol + import.meta.env.VITE_BOE_ONLINE_CLASS_URL, //在线
// 2: "/faceteach",
// 3: window.location.protocol + import.meta.env.VITE_BOE_CASS_DETAIL_URL, //案例
// 4: "/homeworkpage",
// 5: window.location.protocol + import.meta.env.VITE_BOE_EXAM_DETAIL_URL, //考试
// 6: "/livebroadcast",
// 7: "/outerchain", //外联
// 8: "/discusspage",
// 9: "/moreactive",
// 10: "/evaluation", //测评
// 11: "/surveydetail",
// 12: "/ballotpage",
// 13: "/projectdetails",
// };
state.codevisible = true;
let obj = {
title: "[" + checkType(item.type) + "]二维码",

View File

@@ -545,7 +545,7 @@
">
<div class="opa">
<div class="opacation">
<span v-if="element.type !== 5" style="
<span style="
color: #4ea6ff;
margin-right: 25px;
cursor: pointer;
@@ -558,12 +558,6 @@
">
编辑
</span>
<span v-else style="
color: #4ea6ff;
margin-right: 55px;
cursor: pointer;
">
</span>
<span style="color: #4ea6ff; cursor: pointer" @click="showDeleteModal(element.id)">
删除
</span>

View File

@@ -61,8 +61,7 @@
<div class="btn">
<button
:class="it.done ? 'btnoo' : 'btno'"
style="z-index: 999"
>
style="z-index: 999">
已完成
</button>
<button :class="it.done ? 'btntt' : 'btnt'">未完成</button>

View File

@@ -362,9 +362,9 @@ export default {
state.projectInfo.picUrl = value;
};
onMounted(() => {
state.projectPic = store.state.projectPic.map((e) => ({
value: e.dictValue,
label: e.dictName,
state.projectPic = store.state.project_pic.map((e) => ({
value: e.value,
label: e.name,
}));
state.viewDetail = routers.query.viewDetail;
getProjectInfo();

View File

@@ -100,10 +100,10 @@
<a-button v-if="(record.status===0 || record.status===2 || record.status===-5) && checkPer(record.permissions)" @click="handleEdit(record)" type="link">编辑</a-button>
<a-button v-if="record.type===1 && checkPer(record.permissions)" @click="createSub(record)" type="link">创建子项目</a-button>
<a-button v-if="record.type===2 && checkPer(record.permissions)" @click="createClass(record)" type="link">创建班级</a-button>
<a-button v-if="record.status===0 && record.type===3 && checkPer(record.permissions)" @click="showReviewModal(record.projectId)" type="link">提交审核</a-button>
<a-button v-if="record.status===1 && record.type===3 && checkPer(record.permissions)" @click="showRecallReviewModal(record.projectId)" type="link">撤回审核</a-button>
<a-button v-if="record.status===0 && record.type===3 && checkPer(record.permissions)" @click="showReviewModal(record.id)" type="link">提交审核</a-button>
<a-button v-if="record.status===1 && record.type===3 && checkPer(record.permissions)" @click="showRecallReviewModal(record.id)" type="link">撤回审核</a-button>
<a-button v-if="record.status===2 && record.type===3 && checkPer(record.permissions)" @click="push(record)" type="link">发布</a-button>
<a-button v-if="record.status===3 && record.type===3 && checkPer(record.permissions)" @click="showBackModal(record.projectId)" type="link">撤回发布</a-button>
<a-button v-if="record.status===3 && record.type===3 && checkPer(record.permissions)" @click="showBackModal(record.id)" type="link">撤回发布</a-button>
<a-button v-if="record.type===3" @click="baseInfo(record)" type="link">管理</a-button>
<DropDown v-if="checkPer(record.permissions)" value="授权">
<OwnerTableModelStudent :types="[4,5,6]" :id="record.projectId" :type="6">权限名单</OwnerTableModelStudent>
@@ -111,10 +111,10 @@
<CommonStudent :type="5" :id="record.projectId" title="管理权">管理权</CommonStudent>
</DropDown>
<DropDown v-if="checkPer(record.permissions)" value="更多">
<a-button @click="showCopyModal(record.projectId)" type="link">复制</a-button>
<a-button v-if="record.status!==3" @click="showDeleteModal(record.projectId)" type="link" danger>删除</a-button>
<a-button v-if="record.status===3" @click="showStartModal(record.projectId)" type="link">存为模版</a-button>
<a-button v-if="record.status===3 && record.type===3" @click="showStopModal(record.projectId)" type="link">结束</a-button>
<a-button @click="showCopyModal(record.id)" type="link">复制</a-button>
<a-button v-if="record.status!==3" @click="showDeleteModal(record.id)" type="link" danger>删除</a-button>
<a-button v-if="record.status===3" @click="showStartModal(record.id)" type="link">存为模版</a-button>
<a-button v-if="record.status===3 && record.type===3" @click="showStopModal(record.id)" type="link">结束</a-button>
<a-button v-if="record.status!==-1 && record.type===3" @click="showBackFinashModal(record.projectId)" type="link">撤回</a-button>
</DropDown>
</a-space>
@@ -1200,9 +1200,9 @@ export default {
state.stopModal = false;
};
//打开删除弹窗
const showDeleteModal = (projectId) => {
const showDeleteModal = (id) => {
state.deleteModal = true;
state.deleteProjectId = projectId;
state.deleteProjectId = id;
};
//确认删除
const deleteProject = () => {
@@ -1463,7 +1463,7 @@ export default {
if (data && data.length) {
data.forEach((e) => {
e.parentName = parentName;
e.key = e.projectId;
e.key = e.id;
initDataSublist(
(parentName ? parentName + "——" : "") + e.name,
e.subList
@@ -1480,7 +1480,7 @@ export default {
router.push({
path: "/projectadd",
query: {
projectId: record.projectId,
projectId: record.id,
parentId: record.parentId,
parentName: record.parentName,
},
@@ -1595,7 +1595,7 @@ export default {
function createSub(record){
state.projectInfo = {
parentName: record.name,
parentId: record.projectId,
parentId: record.id,
name: "",
sourceBelongId: record.sourceBelongId,
sourceBelongName: record.sourceBelongName,
@@ -1611,7 +1611,7 @@ export default {
router.push({
path: "/projectadd",
query: {
parentId: record.projectId,
parentId: record.id,
parentName: record.parentName + "——" + record.name,
ptojectType: 3,
}
@@ -1621,7 +1621,7 @@ export default {
function baseInfo(record){
router.push({
path: "/taskpage",
query: { projectId: record.projectId },
query: { projectId: record.id },
});
storage.set("projectId", record.projectId);
}

View File

@@ -725,7 +725,7 @@
<a-button @click="settingTopFlag(record)" type="link">{{
record.topFlag ? "取消优秀" : "优秀学员"
}}</a-button>
<a-button type="link" @click="showChangeGroupModal()"
<a-button type="link" @click="showChangeGroupModal(record)"
>换组</a-button
>
</template>
@@ -761,10 +761,10 @@
<img src="../../assets/images/courseManage/reset2.png" />
<span class="btn2text">随机分组</span>
</div>
<div class="btn2">
<div class="btn2" @click="exportGroup">
<span class="btn2text">导出小组</span>
</div>
<div class="btn2">
<div class="btn2" @click="importGroupLeader">
<span class="btn2text">导入小组长</span>
</div>
</div>
@@ -806,7 +806,7 @@
@click="showMemberList(item.projectGroupId)"
>
<div class="ftext">组员名单 ></div>
<div class="peoples">
<!-- <div class="peoples">
<div class="people1">
<img
src="../../assets/images/taskpage/people1.png"
@@ -827,7 +827,7 @@
src="../../assets/images/taskpage/people4.png"
/>
</div>
</div>
</div> -->
</div>
</div>
</div>
@@ -877,11 +877,19 @@
</div>
</div>
<div class="right">
<div class="btn btn1" @click="rankSearch" style="cursor: pointer;">
<div
class="btn btn1"
@click="rankSearch"
style="cursor: pointer"
>
<div class="img1"></div>
<div class="te">搜索</div>
</div>
<div class="btn btn2" @click="rankReset" style="cursor: pointer;">
<div
class="btn btn2"
@click="rankReset"
style="cursor: pointer"
>
<div class="img2"></div>
<div class="te">重置</div>
</div>
@@ -955,6 +963,7 @@
<div class="right">
<a-select
v-model:value="valuestu4"
@change="xsSelectChange"
style="width: 80px"
:options="rankxueshi"
></a-select>
@@ -965,7 +974,7 @@
<a-table
:columns="xueshitablecolumns"
:data-source="xueshitabledata"
:loading="tableDataTotal === -1 ? true : false"
:loading="studytimeRankLoading"
expandRowByClick="true"
:scroll="{ y: 330 }"
@expand="expandTable"
@@ -1667,6 +1676,24 @@
/>
</div>
</div>
<div class="name">
<div class="star" style="margin-top: -4px">
<img
style="width: 10px; height: 10px"
src="../../assets/images/basicinfo/asterisk.png"
/>
</div>
<div class="inname">组员人数:</div>
<div class="in">
<a-input-number
:min="0"
:max="300"
:precision="0"
style="width: 395px; height: 40px; border-radius: 8px"
v-model:value="groupNumber"
></a-input-number>
</div>
</div>
<div class="name">
<div class="star" style="margin-top: -4px">
<img
@@ -2083,8 +2110,18 @@
<!-- 二维码弹窗 -->
<!-- 换组弹窗 -->
<ChangeGroupModal v-model:changegroupV="changegroupV" />
<ChangeGroupModal
v-model:changegroupV="changegroupV"
:groupList="groupList"
:checkgroupStuId="checkgroupStuId"
/>
<!-- 换组弹窗 -->
<!-- 导入小组长 -->
<ImpoterGroupLeader
v-model:ImpoterGroupLeaderV="ImpoterGroupLeaderV"
:projectId="projectId"
/>
<!-- 导入小组长 -->
</div>
</template>
<script>
@@ -2130,7 +2167,7 @@ import { message, Modal } from "ant-design-vue";
import * as apitl from "../../api/index";
import { getTask } from "../../api/indexTaskadd";
import { editProj } from "../../api/indexTaskadd";
import { toDate, codeUrl } from "../../api/method";
import { toDate } from "../../api/method";
import projSet from "../../components/Modals/projSet";
import { overview } from "../../api/indexProjStu";
import TwoDimensionalCode from "../../components/TwoDimensionalCode.vue";
@@ -2145,7 +2182,7 @@ import TableCertificateStudent from "@/components/student/TableCertificateStuden
import { getStuPage } from "@/api/index1";
import ChangeGroupModal from "@/components/student/ChangeGroupModal.vue";
import { checkPer } from "@/utils/utils";
import ImpoterGroupLeader from "@/components/drawers/project/ImpoterGroupLeader.vue";
export default {
name: "taskPage",
components: {
@@ -2180,6 +2217,7 @@ export default {
CreateCertificate,
ProjectVoteManage,
ChangeGroupModal,
ImpoterGroupLeader,
},
setup() {
const store = useStore();
@@ -2317,10 +2355,10 @@ export default {
valuestu3: 0,
//学时排行
rankxueshi: [
{ value: "学员", label: "学员" },
{ value: "小组", label: "小组" },
{ value: 0, label: "学员" },
{ value: 1, label: "小组" },
],
valuestu4: "学员",
valuestu4: 0,
visible: false, //时间管理
onlineVisible: false, //在线管理
FaceVisivle: false, //面授管理
@@ -2371,6 +2409,7 @@ export default {
inputValue3: 5,
valueaddm: "", //创建小组输入小组长
valueaddg: "", //创建小组输入名称
groupNumber: 0, //组员人数
valuestun: "", //学员管理姓名
valuegood: "",
valuestub: "", //学员管理部门
@@ -2468,9 +2507,7 @@ export default {
scoreRankLoading: true,
processRankLoading: true,
//学分排行表
xuefentabledata: [
],
xuefentabledata: [],
xuefentablecolumns: [
{
title: "排名",
@@ -2525,83 +2562,32 @@ export default {
},
],
//学时排行表
xueshitabledata: [
{
rank: "1",
name: "哈哈",
jd: "8",
},
{
rank: "2",
name: "哈哈",
jd: "70",
},
{
rank: "3",
name: "哈哈",
jd: "70",
},
{
rank: "4",
name: "哈哈",
jd: "70",
},
{
rank: "5",
name: "哈哈",
jd: "70",
},
{
rank: "6",
name: "哈哈",
jd: "70",
},
{
rank: "7",
name: "哈哈",
jd: "70",
},
{
rank: "8",
name: "哈哈",
jd: "70",
},
{
rank: "9",
name: "哈哈",
jd: "70",
},
{
rank: "10",
name: "哈哈",
jd: "70",
},
],
studytimeRankLoading: true,
xueshitabledata: [],
xueshitablecolumns: [
{
title: "排名",
dataIndex: "rank",
key: "rank",
dataIndex: "index",
key: "index",
width: 50,
align: "center",
className: "h",
customRender: (text) => {
if (text.record.rank == "1") {
if (text.record.index == "1") {
return (
<img
style={{ width: 24, height: 24 }}
src={require("../../assets/images/taskpage/one.png")}
/>
);
} else if (text.record.rank == "2") {
} else if (text.record.index == "2") {
return (
<img
style={{ width: 24, height: 24 }}
src={require("../../assets/images/taskpage/two.png")}
/>
);
} else if (text.record.rank == "3") {
} else if (text.record.index == "3") {
return (
<img
style={{ width: 24, height: 24 }}
@@ -2609,7 +2595,7 @@ export default {
/>
);
} else {
return <div>{text.record.rank}</div>;
return <div>{text.record.index}</div>;
}
},
},
@@ -2624,8 +2610,8 @@ export default {
{
title: "时长",
dataIndex: "jd",
key: "jd",
dataIndex: "timeStr",
key: "timeStr",
width: 50,
align: "center",
className: "h",
@@ -2785,7 +2771,8 @@ export default {
modal1Visible: false, // 证书预览
changegroupV: false, //换组弹窗
checkgroupStuId: null, //换组id
ImpoterGroupLeaderV: false, //导入小组长抽屉
certificatelist: [],
fileUrl: process.env.VUE_APP_FILE_PATH,
});
@@ -2795,33 +2782,37 @@ export default {
// 积分排行榜 Top10
// 项目积分切换查询 -- 学员 小组
const jfSelectChange = (e) => {
console.log(e)
console.log(e);
scoreRank();
}
};
const jdSelectChange = (e) => {
console.log(e)
console.log(e);
completionRank();
}
};
const jdSelectChange1 = (e) => {
console.log(e)
console.log(e);
completionRank();
}
};
const xsSelectChange = (e) => {
console.log(e);
studytimeRank();
};
//项目积分榜单
const scoreRank = (period, type) => {
state.scoreRankLoading = true;
state.datascore = [];
state.datascoreg = [];
console.log("projectId----->", state.projectId, period, type);
console.log('我是查询榜单传递的数据',{
console.log("我是查询榜单传递的数据", {
projectId: state.projectId, // 项目id
name: "", // 名字,没有则传空字符串
startTime: state.rankStartTime ? state.rankStartTime : 0, // 数据查询的起始时间 10位时间戳
endTime: state.rankEndTime ? state.rankEndTime : 0,
size: 10, // 前多少名
type: Number(state.valuestu3), // 查询类型 0 学员积分榜 1 小组积分榜
})
});
let obj = {
projectId: 290, // 项目id
projectId: state.projectId, // 项目id
name: "", // 名字,没有则传空字符串
startTime: state.rankStartTime ? state.rankStartTime : 0, // 数据查询的起始时间 10位时间戳
endTime: state.rankEndTime ? state.rankEndTime : 0,
@@ -2848,7 +2839,7 @@ export default {
.catch((err) => {
console.log("获取项目积分-榜单失败", err);
message.destroy();
message.error('榜单获取失败');
message.error("榜单获取失败");
state.datascore = [];
state.datascoreg = [];
state.xuefentabledata = [];
@@ -2860,16 +2851,18 @@ export default {
const completionRank = () => {
state.processRankLoading = true;
let obj = {
projectId: 290, // 项目id
projectId: state.projectId, // 项目id
startTime: state.rankStartTime ? state.rankStartTime : 0, // 数据查询的起始时间 10位时间戳
endTime: state.rankEndTime ? state.rankEndTime : 0,
stageId: state.valuestu2, // 阶段ID
type: Number(state.valuestu3), // 查询类型 0 学员积分榜 1 小组积分榜
}
};
console.log('我是获取得项目进度排行榜--》', obj)
api.completionRank(obj).then(res=>{
console.log('项目进度榜单获取',res)
console.log("我是获取得项目进度排行榜--》", obj);
api
.completionRank(obj)
.then((res) => {
console.log("项目进度榜单获取", res);
if (res.data.datas) {
state.jindutabledata = res.data.datas;
state.processRankLoading = false;
@@ -2877,13 +2870,43 @@ export default {
state.jindutabledata = [];
state.processRankLoading = false;
}
}).catch(err=>{
console.log(err)
})
.catch((err) => {
console.log(err);
state.jindutabledata = [];
state.processRankLoading = false;
})
});
};
// 项目学时榜单
const studytimeRank = () => {
state.studytimeRankLoading = true;
let obj = {
projectId: state.projectId, // 项目id
startTime: state.rankStartTime ? state.rankStartTime : 0, // 数据查询的起始时间 10位时间戳
endTime: state.rankEndTime ? state.rankEndTime : 0,
type: Number(state.valuestu4), // 查询类型 0 学员积分榜 1 小组积分榜
};
console.log("我是获取得项目学时排行榜--》", obj);
api
.studytimeRank(obj)
.then((res) => {
console.log("项目学时榜单获取", res);
if (res.data.datas) {
state.xueshitabledata = res.data.datas;
state.studytimeRankLoading = false;
} else {
state.xueshitabledata = [];
state.studytimeRankLoading = false;
}
})
.catch((err) => {
console.log(err);
state.xueshitabledata = [];
state.studytimeRankLoading = false;
});
};
// 排行榜 - end
@@ -2951,24 +2974,27 @@ export default {
if (levelList.stageList.length == 1) {
// 无解段任务
state.rankjieduan = [{value:0, label:'无阶段'}];
state.rankjieduan = [{ value: 0, label: "无阶段" }];
state.valuestu2 = 0;
} else {
// 有阶段任务
let arrStage = []
let arrStage = [];
for (let i = 0; i < levelList.stageList.length; i++) {
if(levelList.stageList[i].stageId!=='0'){
if (levelList.stageList[i].stageId !== "0") {
let obj = {
value: levelList.stageList[i].stageId,
label:levelList.stageList[i].name
}
arrStage.push(obj)
label: levelList.stageList[i].name,
};
arrStage.push(obj);
}
}
state.rankjieduan = arrStage;
state.valuestu2 = arrStage[0].value;
}
console.log('----------------------------------->', res.data.data.stageList)
console.log(
"----------------------------------->",
res.data.data.stageList
);
//暂时传个固定的id用 到时候看数据里面是否有在更换
// state.projectTaskId = res.data.data.stageList[0].taskList[0].projectTaskId
@@ -3113,9 +3139,10 @@ export default {
};
//显示学员换组弹窗
const showChangeGroupModal = () => {
const showChangeGroupModal = (record) => {
state.changegroupV = true;
console.log("点击换组", state.changegroupV);
console.log("点击换组", record.studentId);
state.checkgroupStuId = record.studentId;
};
const showModal2 = (classify, item) => {
@@ -3126,6 +3153,7 @@ export default {
console.log("item", item);
if (item) {
state.valueaddg = item.groupName;
state.groupNumber = item.groupMemberCount;
state.stuGroupName = item.leaderName;
state.stuGroupId = item.leaderId;
}
@@ -3134,6 +3162,7 @@ export default {
const closeModal2 = () => {
state.stugroup = false;
state.valueaddg = null;
state.groupNumber = 0;
state.stuGroupName = null;
state.stuGroupId = null;
state.projectGroupId = null;
@@ -3141,7 +3170,11 @@ export default {
};
//点击确定创建小组
const createG = () => {
if (state.stuGroupName == "" || state.valueaddg == "") {
if (
state.stuGroupName == "" ||
state.valueaddg == "" ||
state.groupNumber == null
) {
message.destroy();
return message.warning("请输入必填项");
} else {
@@ -3633,7 +3666,8 @@ export default {
scoreRank();
// 获取项目进度排行榜
completionRank();
// 获取学时排行榜
studytimeRank();
} else if (e == 3) {
state.tabFlag = true;
} else {
@@ -3642,7 +3676,7 @@ export default {
}
if (e != 7) {
state.ischeckCertificate=false
state.ischeckCertificate = false;
}
console.log("切换了", state.tabFlag);
};
@@ -3690,6 +3724,8 @@ state.ischeckCertificate=false
scoreRank();
// 获取项目进度排行榜
completionRank();
// 获取学时排行榜
studytimeRank();
};
//重置
const rankReset = () => {
@@ -3702,6 +3738,8 @@ state.ischeckCertificate=false
scoreRank();
// 获取项目进度排行榜
completionRank();
// 获取学时排行榜
studytimeRank();
};
// end -----排行榜----------------排行榜----------------------排行榜-----------排行榜----------
@@ -3822,6 +3860,7 @@ state.ischeckCertificate=false
groupName: value.groupName, //小组名称
leaderId: value.leaderId, //组长id
leaderName: value.leaderName, //组长名称
groupMemberCount: value.groupMemberCount, //组员人数
source: value.source == 1 ? "指定添加" : "随机分组",
completeTaskCnt: value.completeTaskCnt, //完成任务数
totalTaskCnt: value.totalTaskCnt, //累计任务数
@@ -4052,6 +4091,7 @@ state.ischeckCertificate=false
if (state.stuMemberClassify === 1) {
let obj = {
groupName: state.valueaddg,
groupMemberCount: state.groupNumber,
leaderId: state.stuGroupId,
leaderName: state.stuGroupName,
// projectGroupId: 0,
@@ -4074,6 +4114,7 @@ state.ischeckCertificate=false
if (state.stuMemberClassify === 2) {
let obj = {
groupName: state.valueaddg,
groupMemberCount: state.groupNumber,
leaderId: state.stuGroupId,
leaderName: state.stuGroupName,
projectGroupId: state.projectGroupId,
@@ -4116,6 +4157,16 @@ state.ischeckCertificate=false
console.log(data);
getStu();
};
//导入小组长
const importGroupLeader = () => {
state.ImpoterGroupLeaderV = true;
};
//导出小组
const exportGroup = () => {
window.open(
`${process.env.VUE_APP_BASE_API}/admin/studentGroup/exportGroup/${state.projectId}`
);
};
//end---------学员------
//start---------项目概览
@@ -4578,8 +4629,207 @@ state.ischeckCertificate=false
return typeRules[type];
};
// 判断当前任务已结束及时间意义上的结束 提示用户
function judgeTaskIsEnd(type, endTimes, status) {
// type 任务类型 endTime 结束时间 status 任务状态 (状态 0 未完成 1 已完成 2 未开始 3 已结束)
console.log(type, endTimes, status);
let isEnd = false;
let nowTime = new Date().getTime();
let endTime = new Date().getTime(endTimes);
switch (type) {
case 1:
status == 3
? (isEnd = true)
: nowTime > endTime
? (isEnd = true)
: (isEnd = false);
break;
case 3:
status == 3
? (isEnd = true)
: nowTime > endTime
? (isEnd = true)
: (isEnd = false);
break;
case 5:
status == 3
? (isEnd = true)
: nowTime > endTime
? (isEnd = true)
: (isEnd = false);
break;
case 7:
status == 3
? (isEnd = true)
: nowTime > endTime
? (isEnd = true)
: (isEnd = false);
break;
case 10:
status == 3
? (isEnd = true)
: nowTime > endTime
? (isEnd = true)
: (isEnd = false);
break;
}
return isEnd;
}
//显示二维码弹窗
const showCodeModel = (item) => {
if (judgeTaskIsEnd(item.type, state.endTime, state.status)) {
message.error("当前任务已结束");
return;
}
console.log("item", item);
let codeUrl = "";
// 在线课 停用 -- 暂时没有在线课停用标记
if (item.type == 1) {
if (item.taskStatus == 1 || item.taskStatus == 2)
return message.error("该任务无法学习,请联系管理员进行替换。");
window.open(
window.location.protocol +
import.meta.env.VITE_BOE_ONLINE_CLASS_URL +
item.targetId,
"_top"
);
}
if (item.type == 2) {
let date1 = new Date(item.endTime).getTime();
let date2 = new Date().getTime();
if (date1 < date2) return message.warning("当前面授课已结束");
if (item.taskStatus == 1 || item.taskStatus == 2)
return message.error("该任务无法学习,请联系管理员进行替换。");
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/faceteach?type=2&courseId=" +
item.courseId +
"&id=" +
item.projectTaskId;
}
if (item.type == 4) {
let date1 = new Date(item.endTime).getTime();
let date2 = new Date().getTime();
if (date1 < date2) return message.warning("当前作业已结束");
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/homeworkpage?courseId=" +
item.courseId +
"&type=1&id=" +
item.projectTaskId;
}
// 考试 停用
if (item.type == 5) {
if (item.taskStatus == 1 || item.taskStatus == 2)
return message.error("该任务无法学习,请联系管理员进行替换。");
// 此处判断外部考试跳转
if (item.startTime == null || item.endTime == null) {
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/externalexam?courseId=" +
item.courseId;
}
}
// 直播结束时间
if (item.type == 6) {
let date1 = new Date(item.endTime).getTime();
let date2 = new Date().getTime();
if (date1 < date2) return message.warning("当前直播已结束");
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/livebroadcast?courseId=" +
item.courseId +
"&type=1&id=" +
item.projectTaskId;
}
// 外链
if (item.type == 7) {
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/outerchain?courseId=" +
item.courseId +
"&type=1&id=" +
item.projectTaskId +
"&status=" +
item.status +
"&chapterOrStageId=" +
item.stageId +
"&infoId=" +
state.projectId;
}
//讨论
if (item.type == 8) {
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/discusspage?courseId=" +
item.courseId +
"&type=1&id=" +
item.projectTaskId;
}
//活动
if (item.type == 9) {
let date1 = new Date(item.endTime).getTime();
let date2 = new Date().getTime();
if (date1 < date2) return message.warning("当前活动已结束");
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/activitiespage?courseId=" +
item.courseId +
"&type=1&id=" +
item.projectTaskId;
}
//活动
if (item.type == 10) {
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/evaluation?courseId=" +
item.courseId +
"&evaType=" +
item.evaType +
"&targetId=" +
item.targetId;
}
// 评估 停用
if (item.type == 11) {
if (item.taskStatus == 1 || item.taskStatus == 2)
return message.error("该任务无法学习,请联系管理员进行替换。");
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/investigatage?courseId=" +
item.courseId +
"&type=1&id=" +
item.projectTaskId +
"&chapterOrStageId=" +
item.stageId +
"&infoId=" +
state.projectId;
}
// 投票
if (item.type == 12) {
codeUrl =
window.location.protocol +
process.env.VUE_APP_H5 +
"/ballotpage?courseId=" +
item.courseId +
"&btype=2&id=" +
item.projectTaskId +
"&chapterOrStageId=" +
item.chapterId +
"&infoId=" +
state.projectId;
}
state.codevisible = true;
let obj = {
title: "[" + checkType(item.type) + "]二维码",
@@ -4594,7 +4844,7 @@ state.ischeckCertificate=false
let obj = {
title: "[项目]二维码",
name: state.name,
url: codeUrl,
// url: codeUrl,
};
state.codeInfo = obj;
};
@@ -4793,6 +5043,8 @@ state.ischeckCertificate=false
closeStartModal,
templateProject,
changeGrouped,
importGroupLeader,
exportGroup,
deFile,
toDate,
routered,
@@ -4822,6 +5074,8 @@ state.ischeckCertificate=false
jdSelectChange,
jdSelectChange1,
studytimeRank,
xsSelectChange,
};
},
};