feat:合并

This commit is contained in:
lixg
2023-01-30 16:48:25 +08:00
10 changed files with 3066 additions and 176 deletions

View File

@@ -31,3 +31,9 @@ export const DownLoadTotalSize = (obj) => http.get('/admin/download/totalSize',
// 下载中心删除
export const RemoveDownLoadHomeWork = (obj) => http.get('/admin/download/del', {params: obj})
// 获取投票管理的信息
export const QueryVoteManagementDetail = (obj) => http.post('/admin/vote/manage/queryVoteManagementDetail', obj)
// 根据投票任务Id获取投票任务信息
export const QueryVoteTaskDetailById = (obj) => http.post('/voteSubmit/queryVoteTaskDetailById', obj)

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -15,21 +15,21 @@
@click="closeDrawer"
/>
</div>
<div class="headersup"><span>评估名称<span style="color:#999ba3">管理者进阶投票</span></span></div>
<div class="headersup"><span>投票名称<span style="color:#999ba3">{{voteResource.voteName}}</span></span></div>
<div class="main">
<div class="basetext"><span>投票说明</span></div>
<div class="basequestion">
<div class="ques" v-for=" item,index in queData" :key="index">
<div class="quename">{{ index+1 +"."+ item.quename }}</div>
<div class="basetext"><span>投票题目</span></div>
<div v-if="voteResource" class="basequestion">
<div class="ques" v-for=" item,index in voteResource.ballotVo.voteStemVoList" :key="index">
<div class="quename">{{ index+1 +"."+ item.voteStemName }}</div>
<div class="queanswer">
<a-radio-group v-model:value="item.value">
<a-radio-group v-model:value="currentChoice[index]">
<div class="queaboxs" :style="{display: item.quetype ? 'flex' : 'block'}">
<div class="queabox" v-for="items,index in item.answer" :key="index">
<div class="queabox" v-for="items,index in item.optionDetailList" :key="index">
<a-radio
v-model:checked="checked"
:value="items.value"
:value="items.optionId"
>
{{items.answercontent}}
{{items.optionName}}
</a-radio>
</div>
</div>
@@ -39,8 +39,8 @@
</div>
</div>
<div class="btnn">
<button class="btn1">取消</button>
<button class="btn2">确定</button>
<button class="btn1" @click="closeDrawer">取消</button>
<button class="btn2" @click="closeDrawer">确定</button>
</div>
</div>
</a-drawer>
@@ -48,6 +48,10 @@
<script>
import { toRefs,reactive } from '@vue/reactivity';
import {computed} from "vue";
import { useStore } from "vuex";
import * as api from "../../api/indexTaskManage";
export default {
name:"CheckWork",
props:{
@@ -55,8 +59,18 @@ export default {
type:Boolean,
default:false,
},
voteID: {
type: Number,
default: null,
},
courseID: {
type: Number,
default: null,
},
},
setup(props,ctx){
const store = useStore();
const state = reactive({
valueE1:"",
queData:[
@@ -91,6 +105,8 @@ export default {
]
}
],
voteResource:"",
currentChoice: [], // 当前投票项
})
const closeDrawer = ()=> {
@@ -98,11 +114,56 @@ export default {
}
const afterVisibleChange = (bool) => {
console.log(bool);
if(bool){
console.log('当前的投票id为', props.voteID)
getData();
}
}
const userInfo = computed(()=>store.state.userInfo)
// 获取投票基础信息查询
function getData() {
console.log('我是请求的参数', {
"courseId": props.courseID,
"studentId": userInfo.value.id,
"voteSubmitId": props.voteID
})
api.QueryVoteTaskDetailById({
"courseId": props.courseID,
"studentId": userInfo.value.id,
"voteSubmitId": props.voteID
}).then(res=>{
console.log(res)
state.voteResource = res.data.data
let choiceArr = []
let dataQuestion = state.voteResource.ballotVo.voteStemVoList
for(let i=0;i<dataQuestion.length;i++){
for(let j=0;j<dataQuestion[i].optionDetailList.length;j++){
if(dataQuestion[i].optionDetailList[j].isAnswer){
choiceArr.push(dataQuestion[i].optionDetailList[j].optionId)
break
}
if(j==dataQuestion[i].optionDetailList.length - 1 && dataQuestion[i].optionDetailList[j].isAnswer == false){
choiceArr.push("")
break
}
}
}
state.currentChoice = choiceArr
}).catch(err=>{
console.log(err)
})
}
return{
...toRefs(state),
closeDrawer,
afterVisibleChange,
userInfo
}
}
};

View File

@@ -0,0 +1,756 @@
<template>
<a-drawer
:visible="ACertificate"
class="drawerStyle AddCertificate"
width="80%"
title="添加证书"
placement="right"
@after-visible-change="afterVisibleChange"
>
<div class="drawerMain">
<div class="header">
<div class="headerTitle">{{ edit ? "编辑" : "添加" }}证书</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<div class="contentMain">
<div class="main_left">
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">证书名称</span>
</div>
<div class="btnbox">
<a-input
v-model:value="inputV1"
style="width: 400px; height: 40px; border-radius: 8px"
placeholder="请输入活动名称"
maxlength="20"
/>
</div>
</div>
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">证书</span>
</div>
<div class="btnbox">
<button class="xkbtn11" @click="CreateCertificate" style="margin-top: 0px;">
创建证书
</button>
</div>
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px;font-size: 16px;color: #333;">设置获得条件</span>
</div>
<div class="btnbox">
</div>
</div>
<div class="main_item">
<div class="signbox" style="width:30px;">
<span style="margin-right: 3px;font-size: 16px;color: #333;"></span>
</div>
<div class="btnbox">
<a-radio-group v-model:value="radioV1">
<a-radio v-model:checked="checked" :value="1" @click="cloradio1">
完成项目
</a-radio>
<br/>
<div style="height:60px;margin-left: 24px;display: flex;align-items: center;">
<a-radio-group v-model:value="large" size="small">
<a-radio-button value="1">全部任务</a-radio-button>
<a-radio-button value="2">完成必修任务</a-radio-button>
</a-radio-group>
</div>
<a-radio v-model:checked="checked" :value="2" @click="cloradio1">
完成阶段
</a-radio>
<br/>
<div style="height:60px;margin-left: 24px;display: flex;align-items: center;">
<a-select
ref="select"
size="small"
placeholder="请选择阶段"
v-model:value="value1"
style="width: 120px"
@focus="focus"
@change="handleChange"
>
<a-select-option value="jack">第一阶段</a-select-option>
<a-select-option value="lucy">第二阶段</a-select-option>
<a-select-option value="Yiminghe">第三阶段</a-select-option>
</a-select>
</div>
<a-radio v-model:checked="checked" :value="3" @click="cloradio1">
完成任务
</a-radio>
<br/>
<div style="height:60px;margin-left: 24px;display: flex;align-items: center;">
<a-select
ref="select"
size="small"
placeholder="请选择任务"
v-model:value="value1"
style="width: 120px"
@focus="focus"
@change="handleChange"
>
<a-select-option value="jack">任务一</a-select-option>
<a-select-option value="lucy">任务二</a-select-option>
<a-select-option value="Yiminghe">任务三</a-select-option>
</a-select>
</div>
<a-radio v-model:checked="checked" :value="4" @click="cloradio1">
考试合格
</a-radio>
<br/>
<div style="height:60px;margin-left: 24px;display: flex;align-items: center;">
<a-select
ref="select"
size="small"
placeholder="请选择考试"
v-model:value="value1"
style="width: 120px"
@focus="focus"
@change="handleChange"
>
<a-select-option value="jack">考试一</a-select-option>
<a-select-option value="lucy">考试二</a-select-option>
<a-select-option value="Yiminghe">考试三</a-select-option>
</a-select>
</div>
<a-radio v-model:checked="checked" :value="5" @click="cloradio1">
获得积分
</a-radio>
<br/>
<div style="height:60px;margin-left: 24px;display: flex;align-items: center;">
<a-button style="border:0px solid red;box-shadow: none;">高于</a-button>
<a-input-number id="inputNumber" v-model:value="value" :min="1" :max="100" style="width:70px;" />
<a-button style="border:0px solid red;box-shadow: none;">分可获得当前项目积分为 10 </a-button>
</div>
<a-radio v-model:checked="checked" :value="6" @click="cloradio1">
完成作业
</a-radio>
<br/>
<div style="height:60px;margin-left: 24px;display: flex;align-items: center;">
<a-button style="border:0px solid red;box-shadow: none;">高于</a-button>
<a-input-number id="inputNumber" v-model:value="value" :min="1" :max="100" style="width:70px;" />
<a-button style="border:0px solid red;box-shadow: none;">分可获得证书</a-button>
</div>
<a-radio v-model:checked="checked" :value="7" @click="cloradio1">
优秀小组长
</a-radio>
<br/>
<div style="height:60px;margin-left: 24px;display: flex;align-items: center;">
<a-button style="border:0px solid red;box-shadow: none;">小组积分高于</a-button>
<a-input-number id="inputNumber" v-model:value="value" :min="1" :max="100" style="width:70px;" />
<a-button style="border:0px solid red;box-shadow: none;">分小组长可获得证书</a-button>
</div>
<a-radio v-model:checked="checked" :value="8" @click="cloradio1">
考勤按时签到可获得证书
</a-radio>
<br/>
<div style="height:40px;"></div>
</a-radio-group>
</div>
</div>
<div class="main_item" style="height: 40px">
<div class="signbox">
<span style="margin-right: 3px"></span>
</div>
<div class="btnbox"></div>
</div>
</div>
</div>
<div class="main_btns">
<button class="btn1" @click="closeDrawer1">取消</button>
<button class="btn2" @click="updateActivityInfo">确定</button>
</div>
</div>
</a-drawer>
<!-- 创建证书抽屉 -->
<CreateCertificate
v-model:CCertificate="CCertificate"
/>
</template>
<script>
import { reactive, toRefs } from "vue";
import * as api from "../../../api/indexActivity";
import * as apiTask from "../../../api/indexTaskadd";
import { RouterEditTask } from "@/api/indexTask";
import { message } from "ant-design-vue";
import dayjs from "dayjs";
import CreateCertificate from "../../../components/drawers/project/CreateCertificate";
export default {
name: "AddActive",
components: {
CreateCertificate
},
props: {
ACertificate: {
type: Boolean,
default: false,
},
EditActiveId: {
type: Number,
default: null,
},
edit: {
// 是否为编辑
type: Boolean,
default: null,
},
projectId: {
type: Number,
default: null,
},
chooseStageId: {
type: Number,
default: null,
},
routerTaskId: {
type: Number,
default: 0,
},
isLevel: {
// 是否是关卡页面触发
type: Number,
default: null,
},
EditWorkId: {
// 要编辑的workId
type: Number,
default: null,
},
projectTaskId: {
// 要编辑的projectId
type: Number,
default: null,
},
routerId: {
type: Number,
default: null,
},
isactive: {
type: Number,
default: null,
},
projectTemplateId: {
type: Number,
default: null,
},
},
setup(props, ctx) {
const state = reactive({
inputV1: "",
inputV2: "",
inputV3: "",
inputV4: "",
inputV5: "",
inputV6: "",
textV1: "",
textV2: "",
radioV1: "",
time: "",
isClick: false,
CCertificate: false,
});
const closeDrawer = () => {
ctx.emit("update:ACertificate", false);
ctx.emit("update:edit", false);
state.radioV1 = "";
state.inputV1 = "";
state.inputV2 = "";
state.inputV3 = "";
state.inputV4 = "";
state.inputV5 = "";
state.inputV6 = "";
state.textV1 = "";
state.textV2 = "";
state.time = "";
localStorage.setItem("stageId", props.chooseStageId);
localStorage.setItem("chapterId", props.isactive);
};
const closeDrawer1 = () => {
ctx.emit("update:ACertificate", false);
ctx.emit("update:edit", false);
state.radioV1 = "";
state.inputV1 = "";
state.inputV2 = "";
state.inputV3 = "";
state.inputV4 = "";
state.inputV5 = "";
state.inputV6 = "";
state.textV1 = "";
state.textV2 = "";
state.time = "";
localStorage.setItem("stageId", props.chooseStageId);
localStorage.setItem("chapterId", props.isactive);
};
const queryActive = () => {
api
.getActivity(props.EditActiveId)
.then((res) => {
console.log("获取活动信息", res);
//获取活动信息
state.inputV1 = res.data.data.activityName;
state.textV1 = res.data.data.activityNotice;
state.textV2 = res.data.data.activityExplain;
state.inputV2 = res.data.data.activityDuration;
state.inputV3 = res.data.data.activityAddress;
state.inputV5 = res.data.data.afterSignIn;
state.inputV6 = res.data.data.signOutTime;
state.inputV4 = res.data.data.beforeSignIn;
state.radioV1 = Number(res.data.data.standardSettings);
state.time = [
dayjs(res.data.data.activityStartTime, "YYYY-MM-DD HH:mm"),
dayjs(res.data.data.activityEndTime, "YYYY-MM-DD HH:mm"),
];
})
.catch(() => {});
};
const afterVisibleChange = (bool) => {
if (bool && props.edit) {
queryActive();
}
};
const cloradio1 = (value) => {
if (value != "") {
state.radioV1 = "";
}
};
const updateTask = async (res) => {
if (props.isLevel == 1) {
if (!props.isactive) {
message.destroy();
return message.warning("请先选中关卡");
}
await RouterEditTask({
chapterId: props.isactive,
courseId: res.data.data.activityId,
duration: res.data.data.activityDuration,
name: res.data.data.activityName,
routerId: props.routerId,
routerTaskId: props.routerTaskId || 0,
type: 9,
})
.then(() => {
//message.success(`${props.edit ? "编辑" : "新增"}关卡任务成功`);
})
.catch(() => {
//message.error(`${props.edit ? "编辑" : "新增"}关卡任务失败`);
});
} else if (props.isLevel == 2) {
await apiTask
.addTask({
courseId: res.data.data.activityId,
duration: res.data.data.activityDuration,
name: res.data.data.activityName,
projectId: props.projectId,
projectTaskId: props.projectTaskId || 0,
stageId: props.chooseStageId || 0,
type: 9,
})
.then(() => {
//message.success(`${props.edit ? "编辑" : "新增"}阶段任务成功`);
})
.catch(() => {
//////message.error(`${props.edit ? "编辑" : "新增"}阶段任务失败`);
});
} else if (props.isLevel == 3) {
await apiTask
.addTempTask({
courseId: res.data.data.activityId,
duration: res.data.data.activityDuration,
name: res.data.data.activityName,
projectTemplateId: props.projectTemplateId,
projectTaskId: props.projectTaskId || 0,
stageId: props.chooseStageId || 0,
type: 9,
})
.then(() => {
ctx.emit("changeData", false);
//message.success(`${props.edit ? "编辑" : "新增"}阶段任务成功`);
})
.catch(() => {
//message.error(`${props.edit ? "编辑" : "新增"}阶段任务失败`);
});
}
};
//创建活动
const updateActivityInfo = () => {
let c = 1111;
if(c>0){
closeDrawer();
return
}
if (!state.inputV1) {
message.destroy();
return message.warning("请输入活动名称");
}
if (!state.textV1) {
message.destroy();
return message.warning("请输入活动公告");
}
if (!state.time) {
message.destroy();
return message.warning("请输入活动时间");
}
if (!state.inputV2) {
message.destroy();
return message.warning("请输入活动时长");
}
if (!state.inputV3) {
message.destroy();
return message.warning("请输入活动地址");
}
if (state.isClick) {
message.destroy();
message.error("请勿频繁点击");
return;
}
state.isClick = true;
let obj = {
activityAddress: state.inputV3, //活动地址
activityDuration: state.inputV2, //活动时长
activityExplain: state.textV2, //活动说明
activityEndTime: dayjs(state.time[1]).format("YYYY-MM-DD HH:mm"), //活动结束时间
activityId: props.edit ? props.EditActiveId : 0, //活动ID
activityName: state.inputV1, //活动名称
activityNotice: state.textV1, //活动公告
activityStartTime: dayjs(state.time[0]).format("YYYY-MM-DD HH:mm"), //活动开始时间
activityTag: "", //活动逻辑删除标识
afterSignIn: state.inputV5 ? state.inputV5 : 0, //活动开始后多少分钟签到
beforeSignIn: state.inputV4 ? state.inputV4 : 0, //活动开始前多少分钟签到
signOutTime: state.inputV6, //签退开始时间
standardSettings: state.radioV1, //标准设置
};
console.log("obj", obj);
if (props.edit) {
//更新编辑活动信息
api
.updateActivity(obj)
.then(async (res) => {
closeDrawer();
await updateTask(res);
ctx.emit("changeData", false);
message.destroy();
message.success("更新成功");
state.isClick = false;
})
.catch(() => {
message.destroy();
message.error("更新失败");
state.isClick = false;
});
} else {
//新建活动信息
api
.createActivity(obj)
.then(async (res) => {
message.destroy();
message.success("创建成功");
closeDrawer();
await updateTask(res);
ctx.emit("changeData", false);
state.isClick = false;
})
.catch(() => {
message.destroy();
message.error("创建失败");
state.isClick = false;
});
}
};
const range = (start, end) => {
const result = [];
for (let i = start; i < end; i++) {
result.push(i);
}
return result;
};
const disabledDate = (current) => {
// Can not select days before today and today
console.log("1111", dayjs().endOf("day"));
return current && current < dayjs().startOf("day");
};
const disabledDateTime = () => {
return {
disabledHours: () => range(0, 24).splice(4, 20),
disabledMinutes: () => range(30, 60),
disabledSeconds: () => [55, 56],
};
};
// 创建证书
function CreateCertificate() {
state.CCertificate = true;
}
return {
...toRefs(state),
afterVisibleChange,
closeDrawer,
closeDrawer1,
cloradio1,
updateActivityInfo,
disabledDateTime,
disabledDate,
CreateCertificate
};
},
};
</script>
<style lang="scss">
.ant-table-striped :deep(.table-striped) td {
background-color: #fafafa !important;
}
.xkbtn11 {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 8px;
color: #fff;
margin-top: 0px;
}
.AddCertificate {
.drawerMain {
.header {
height: 73px;
border-bottom: 1px solid #e8e8e8;
display: flex;
justify-content: space-between;
align-items: center;
flex-shrink: 0;
.headerTitle {
font-size: 18px;
font-weight: 600;
color: #333333;
line-height: 25px;
margin-left: 24px;
}
}
.contentMain {
display: flex;
justify-content: space-between;
.ant-input {
height: 88px;
width: 384px;
border-radius: 8px;
}
.ant-picker {
border-radius: 8px;
}
.main_left {
margin-top: 32px;
padding-right: 30px;
flex: 1;
border-right: 1px solid #e8e8e8;
.main_item {
display: flex;
align-items: center;
margin-top: 32px;
margin-bottom: 32px;
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
.sign {
margin-right: 5px;
}
}
.btnbox {
display: flex;
flex: 1;
align-items: center;
.xkbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 8px;
color: #fff;
}
}
}
.main_item2 {
display: flex;
align-items: flex-start;
margin-bottom: 32px;
.textarea {
width: 400px;
.ant-input {
width: 100%;
}
.ant-input-textarea-show-count {
position: relative;
}
.ant-input-textarea-show-count::after {
position: absolute;
right: 10px;
bottom: 0px;
}
.ant-input {
border-radius: 8px;
}
}
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
.sign {
margin-right: 5px;
}
}
.kqszbox {
.qdqtbox {
margin-left: 5px;
cursor: pointer;
}
.qdbtn,
.qtbtn {
width: 75px;
height: 24px;
background: rgba(56, 139, 225, 0.16);
border-radius: 2px;
border: 1px solid #387df7;
display: flex;
align-items: center;
justify-content: center;
.btntext {
color: #387df7;
}
}
.setbox {
flex-wrap: wrap;
margin-top: 10px;
margin-bottom: 24px;
.timerbox {
margin-top: 22px;
margin-right: 32px;
display: flex;
align-items: center;
flex-wrap: nowrap;
}
}
}
.btnbox2 {
display: flex;
flex-direction: column;
justify-content: flex-start;
.xkbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 16px 8px 32px 0;
color: #fff;
margin-top: 16px;
margin-bottom: 60px;
}
}
}
}
}
.main_btns {
height: 72px;
width: 100%;
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

@@ -0,0 +1,481 @@
<template>
<a-drawer
:visible="CCertificate"
class="drawerStyle CreateCertificate"
width="35%"
placement="right"
@after-visible-change="afterVisibleChange"
>
<div class="drawerMain">
<div class="header">
<div class="headerTitle">{{ edit ? "编辑" : "创建" }}证书</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<a-form
ref="formRef"
name="custom-validation"
:model="state"
:rules="rules"
v-bind="layout"
@finish="handleFinish"
@validate="handleValidate"
@finishFailed="handleFinishFailed"
>
<div class="contentMain">
<div class="main_left">
<div class="main_item">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">证书名称</span>
</div>
<div class="btnbox">
<a-input
v-model:value="inputV1"
style="width: 400px; height: 40px; border-radius: 8px;"
placeholder="请输入证书名称"
show-count :maxlength="20"
/>
</div>
</div>
<div class="main_item" style="align-items:flex-start;">
<div class="signbox">
<div class="sign">
<img
src="@/assets/images/coursewareManage/asterisk.png"
alt=""
/>
</div>
<span style="margin-right: 3px">证书封面</span>
</div>
<div class="btnbox" style="flex-direction:column;align-items:flex-start;">
<a-upload
v-model:file-list="fileList"
name="avatar"
style="width:200px;"
list-type="picture-card"
class="avatar-uploader"
:show-upload-list="false"
action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
:before-upload="beforeUpload"
@change="handleChange"
>
<img v-if="imageUrl" :src="imageUrl" alt="avatar" />
<div v-else>
<loading-outlined v-if="loading"></loading-outlined>
<plus-outlined v-else></plus-outlined>
<div class="ant-upload-text">+</div>
</div>
</a-upload>
<div style="font-size:14px;color:#666;">建议尺寸750*348 格式支持jpggifpngjpegsvgbmp</div>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">证书说明</span>
</div>
<div class="textarea" style="width:400px;">
<a-textarea
v-model:value="textV1"
placeholder="请输入证书说明"
allow-clear
:rows="6"
show-count :maxlength="200"
/>
</div>
</div>
</div>
</div>
</a-form>
<div class="main_btns">
<button class="btn1" @click="closeDrawer">取消</button>
<button class="btn2" @click="updateRef">确定</button>
</div>
</div>
</a-drawer>
</template>
<script>
import { reactive, toRefs } from "vue";
import * as api from "../../../api/indexExternalChain";
import * as apiTask from "../../../api/indexTaskadd";
import { message } from "ant-design-vue";
import { RouterEditTask } from "@/api/indexTask";
import { addTempTask } from "../../../api/indexTaskadd";
export default {
name: "AddRef",
props: {
CCertificate: {
type: Boolean,
default: false,
},
EditRefId: {
type: Number,
default: null,
},
edit: {
// 是否为编辑
type: Boolean,
default: null,
},
projectId: {
type: Number,
default: null,
},
chooseStageId: {
type: Number,
default: null,
},
routerTaskId: {
type: Number,
default: 0,
},
isLevel: {
// 是否是关卡页面触发
type: Number,
default: null,
},
projectTaskId: {
// 要编辑的projectId
type: Number,
default: null,
},
routerId: {
type: Number,
default: null,
},
isactive: {
type: Number,
default: null,
},
projectTemplateId:{
type: Number,
default: null,
},
},
setup(props, ctx) {
const state = reactive({
inputV1: "",
inputV2: "",
textV1: "",
title: null,
isClick: false
});
const closeDrawer = () => {
ctx.emit("update:CCertificate", false);
ctx.emit("update:edit", false);
state.inputV2 = "";
state.inputV1 = "";
state.textV1 = "";
// ctx.emit("changeData", false);
localStorage.setItem("stageId", props.chooseStageId);
localStorage.setItem("chapterId", props.isactive);
};
const afterVisibleChange = () => {
if (props.edit) {
queryRef();
}
};
const handleFinish = (values) => {
console.log(values);
//updateRef(props.EditRefId)
};
const handleFinishFailed = (errors) => {
console.log(errors);
// message.error("handleFinishFailed");
};
const updateTask = async (res) => {
if (props.isLevel == 1) {
if(!props.isactive){
message.destroy();
return message.warning("请先选中关卡");
}
RouterEditTask({
chapterId: props.isactive,
courseId: res.data.data.linkId,
name: res.data.data.linkName,
routerId: props.routerId,
routerTaskId: props.routerTaskId || 0,
type: 7,
})
.then(async () => {
// message.success(`${props.edit ? "编辑" : "新增"}关卡任务成功`);
await ctx.emit("changeData", false);
closeDrawer();
state.addLoading = false;
})
.catch(() => {
// message.error(`${props.edit ? "编辑" : "新增"}关卡任务失败`);
});
} else if (props.isLevel == 2) {
apiTask
.addTask({
courseId: res.data.data.linkId,
name: res.data.data.linkName,
projectId: props.projectId,
projectTaskId: props.projectTaskId || 0,
stageId: props.chooseStageId || 0,
type: 7,
})
.then(() => {
// message.success(`${props.EditTestId ? "编辑" : "新增"}阶段任务成功`);
ctx.emit("changeData", false);
closeDrawer();
})
.catch(() => {
//message.error(`${props.EditTestId ? "编辑" : "新增"}阶段任务失败`);
});
} else if (props.isLevel == 3) {
addTempTask({
courseId: res.data.data.linkId,
name: res.data.data.linkName,
projectTemplateId:props.projectTemplateId,
projectTaskId: props.projectTaskId || 0,
stageId: props.chooseStageId || 0,
type: 7,
})
.then(() => {
//message.success( `${props.EditTestId ? "编辑" : "新增"}阶段任务成功`);
ctx.emit("changeData", false);
closeDrawer();
})
.catch(() => {
//message.error(`${props.EditTestId ? "编辑" : "新增"}阶段任务失败`);
});
}
};
//创建外链
const updateRef = () => {
let c = 1111;
if(c>0){
closeDrawer();
return
}
if (!state.inputV1) return message.warning("请输入外链名称");
if (!state.inputV2) {
return message.warning("请输入链接");
} else {
const reg =
/(https?|ftp|file):\/\/[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]/;
if (!reg.test(state.inputV2) && state.inputV2 != "") {
return message.warning("请输入合法的链接地址");
}
}
if(state.isClick){
message.destroy();
message.error('请勿频繁点击')
return
}
state.isClick = true;
let obj = {
linkAddress: state.inputV2,
linkDescription: state.textV1,
linkId: props.edit ? props.EditRefId : 0,
linkName: state.inputV1,
};
if (props.edit) {
api
.updateLinks(obj)
.then(async (res) => {
message.success("编辑成功");
await updateTask(res);
ctx.emit("changeData", false);
state.isClick = false;
})
.catch(() => {
state.isClick = false;
});
} else {
api
.createExternalChain(obj)
.then(async (res) => {
message.success("提交成功");
await updateTask(res);
ctx.emit("changeData", false);
state.isClick = false;
})
.catch(() => {
state.isClick = false;
});
}
};
// 查询任务
const queryRef = () => {
let d = props.EditRefId;
api
.getLink({ linkId: d })
.then((res) => {
state.inputV1 = res.data.data.linkName;
state.inputV2 = res.data.data.linkAddress;
state.textV1 = res.data.data.linkDescription;
})
.catch(() => {
//message.error(`查询失败`);
});
};
return {
...toRefs(state),
afterVisibleChange,
closeDrawer,
handleFinish,
handleFinishFailed,
updateRef,
};
},
};
</script>
<style lang="scss">
.ant-table-striped :deep(.table-striped) td {
background-color: #fafafa !important;
}
.CreateCertificate {
.drawerMain {
.header {
height: 73px;
border-bottom: 1px solid #e8e8e8;
display: flex;
justify-content: space-between;
align-items: center;
flex-shrink: 0;
.headerTitle {
font-size: 18px;
font-weight: 600;
color: #333333;
line-height: 25px;
margin-left: 24px;
}
}
.contentMain {
display: flex;
justify-content: space-between;
.main_left {
padding-right: 30px;
flex: 1;
border-right: 1px solid #e8e8e8;
margin-top: 32px;
.main_item {
display: flex;
align-items: center;
margin-bottom: 32px;
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
.sign {
margin-right: 5px;
}
}
.btnbox {
display: flex;
flex: 1;
align-items: center;
.xkbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 8px;
color: #fff;
}
}
}
.main_item2 {
display: flex;
align-items: flex-start;
margin-bottom: 32px;
.signbox {
width: 120px;
display: flex;
justify-content: end;
align-items: center;
.sign {
margin-right: 5px;
}
}
.kqszbox {
.qdqtbox {
margin-left: 56px;
}
.setbox {
display: flex;
flex-wrap: wrap;
margin-top: 10px;
margin-bottom: 24px;
.timerbox {
margin-top: 6px;
margin-right: 32px;
display: flex;
align-items: center;
flex-wrap: nowrap;
}
}
}
.btnbox2 {
display: flex;
flex-direction: column;
justify-content: flex-start;
.xkbtn {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 16px 8px 32px 0;
color: #fff;
margin-top: 16px;
margin-bottom: 60px;
}
}
}
}
}
.main_btns {
height: 72px;
width: 100%;
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

@@ -0,0 +1,696 @@
<template>
<a-drawer
v-if="ProjectVoteModelVisible"
:visible="ProjectVoteModelVisible"
class="drawerStyle ProjectVoteManage"
placement="right"
width="80%"
@after-visible-change="afterVisibleChange"
>
<div class="drawerMain">
<div class="header">
<div class="headerTitle">
投票{{ title }}
</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<div class="main">
<div
v-if="datasource.type !== 6 && datasource.type !== 9"
class="endtime"
>
<!-- 起止时间-->
</div>
<div v-else class="endtime">
起止时间{{ datasource.startTime }} {{ datasource.endTime }}
</div>
<div class="search" style="justify-content:flex-start;">
<div class="sealeft">
<div class="namecon" style="margin-right: 30px">
<div class="name">姓名</div>
<a-input
v-model:value="name"
style="width: 200px; height: 40px; border-radius: 8px"
placeholder="请输入姓名"
/>
</div>
<div v-if="datasource.type !==1" class="namecon" style="margin-right: 50px">
<div class="name">任务状态</div>
<div class="select">
<a-select
v-model:value="projectName"
style="width: 200px"
placeholder="请选择"
:options="projectNameList"
@change="selectProjectName"
></a-select>
</div>
</div>
</div>
<div class="btns">
<div
class="btn btn1"
style="margin-right: 20px"
@click="searchTaskList"
>
<div class="img1"></div>
<div class="wz">搜索</div>
</div>
<div class="btn btn2" @click="resetTaskList">
<div class="img2"></div>
<div class="wz">重置</div>
</div>
</div>
</div>
<div class="btnss" style="margin-top: 20px">
<!--
<div class="btn btn1" @click="godie" style="margin-right: 20px">
<div class="img1"></div>
<div class="wz">催促学习</div>
</div>-->
<div class="btn btn2" @click="exportTaskStu">
<div class="img2"></div>
<div class="wz">导出数据</div>
</div>
</div>
<div class="tab" style="margin-top: 20px; margin-bottom: 100px">
<a-table
style="border: 1px solid #f2f6fe"
:columns="tableDataFunc()"
:data-source="tabledata"
:loading="tableDataTotalLoading"
:scroll="{ x: 900 }"
:pagination="false"
/>
<div class="tableBox">
<div class="pa">
<a-pagination
:showSizeChanger="false"
showQuickJumper="true"
hideOnSinglePage="true"
:pageSize="pageSize"
:current="currentPage"
:total="tableDataTotal"
class="pagination"
@change="changePaginationStu"
v-if="tableDataTotal > 10"
/>
</div>
</div>
</div>
</div>
<!--
<div class="btnn">
<button class="btn1" @click="closeDrawer">取消</button>
<button class="btn2" @click="closeDrawer">确定</button>
</div>-->
</div>
</a-drawer>
<CVote
v-model:CVvisible="CVvisible"
:voteID="voteID"
:courseID="courseID"
/>
</template>
<script>
import { toRefs, reactive, onMounted, onUnmounted } from "vue";
import { message } from "ant-design-vue";
// import * as api from "../../../api/index";
import * as api from "../../../api/indexTaskManage";
import CVote from "../CheckVote.vue"
export default {
name: "ProjectVoteManage",
components:{
CVote,
},
props: {
ProjectVoteModelVisible: {
type: Boolean,
default: false,
},
title: {
type: String,
default: "",
},
levelName: {
type: String,
default: "",
},
projectTaskId: {
type: Number,
default: null,
},
itemsType: {
type: Number,
default: null,
},
datasource: {
type: Object,
default: function () {
return {};
},
},
},
setup(props, ctx) {
const state = reactive({
visible: props.ProjectVoteModelVisible,
name: "",
pageNo: 1,
pageSize: 10,
currentPage: 1,
tableDataTotal: 0,
projectName: undefined,
projectNameList: [
{
id: 1,
value: "1",
label: "未开始",
},
{
id: 2,
value: "2",
label: "进行中",
},
{
id: 3,
value: "3",
label: "已完成",
},
{
id: 4,
value: "4",
label: "未完成",
},
],
tabledata: [],
tableDataTotalLoading: true, // 表格loading加载配置
CVvisible:false, //查看投票抽屉
voteID: "",
courseID: ""
});
const tableDataFunc = () => {
const columns = [
{
title: "工号",
dataIndex: "studentUserNo",
key: "studentUserNo",
width: "20%",
align: "center",
ellipsis: true,
className: "h head",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.studentUserNo?text.record.studentUserNo:"-"}</span>
</div>
);
},
},
{
title: "姓名",
dataIndex: "studentName",
key: "studentName",
width: "10%",
align: "center",
ellipsis: true,
className: "h head",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.studentName?text.record.studentName:"-"}</span>
</div>
);
},
},
{
title: "所在部门",
dataIndex: "studentDepartName",
key: "studentDepartName",
width: "20%",
align: "center",
className: "h",
ellipsis: true,
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.studentDepartName?text.record.studentDepartName:"-"}</span>
</div>
);
},
},
{
title: "所在岗位",
dataIndex: "studentJobName",
key: "studentJobName",
width: "10%",
align: "center",
ellipsis: true,
className: "h",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.studentJobName?text.record.studentJobName:"-"}</span>
</div>
);
},
},
{
title: "完成时间",
dataIndex: "lastStudyTime",
key: "lastStudyTime",
width: "15%",
align: "center",
ellipsis: true,
className: "h",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.lastStudyTime?text.record.lastStudyTime:"-"}</span>
</div>
);
},
},
{
title: "任务状态",
dataIndex: "finishStatus",
key: "finishStatus",
width: "10%",
align: "center",
ellipsis: true,
className: "h",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.finishStatus == 1 || text.record.finishStatus == 0 || text.record.finishStatus==null ? "未开始" :text.record.finishStatus == 2 ?"进行中":text.record.finishStatus == 3 ? "已完成" :"未完成"}</span>
</div>
);
},
},
{
title: "操作",
dataIndex: "voteSubmitId",
key: "voteSubmitId",
width: "10%",
align: "center",
ellipsis: true,
className: "h",
customRender: (value) => {
return (
<div
style="color:#387df7;cursor:pointer"
onClick={
() => {
if(value.record.finishStatus !== 3){
message.destroy()
message.error("当前任务未完成")
return
}
{/* 当前投票提交的ID 用来查看投票详情 */}
console.log(value.record.voteSubmitId);
state.voteID = value.record.voteSubmitId;
state.CVvisible = true;
}}>
{value.record.finishStatus == 3 ?
<span style='color:#387df7;'> 查看 </span>
:
<span style='color:#999;'> 查看 </span>}
</div>
);
},
},
];
return columns;
};
const closeDrawer = () => {
ctx.emit("update:ProjectVoteModelVisible", false);
state.currentPage = 1;
state.name = "";
state.projectName = undefined;
state.tabledata = [];
};
const afterVisibleChange = (bol) => {
if (bol == true) {
console.log("当前是什么类型", props.datasource.type);
state.tableDataTotalLoading = true;
getData();
}
};
const selectProjectName = (value) => {
state.projectName = value;
};
//催促
const godie = () => {
message.destroy();
message.success("催促" + props.title + "成功");
};
const onChange = (pageNumber) => {
console.log("Page: ", pageNumber);
};
// 获取数据
function getData() {
if(props.datasource.type == 12){
console.log("我是传递的查询参数", {
"pageNo": state.currentPage,
"pageSize": state.pageSize,
"chapterId": props.datasource.stageId=="0"?"":props.datasource.stageId,
"status": state.projectName,
"studentName": state.name,
"targetId":props.datasource.projectId,
"taskId": props.datasource.courseId,
"type": 2
});
api.QueryVoteManagementDetail({
"pageNo": state.currentPage,
"pageSize": state.pageSize,
"chapterId": props.datasource.chapterId,
"status": state.projectName,
"studentName": state.name,
"targetId":props.datasource.routerId,
"taskId": props.datasource.courseId,
"type": 2
}).then(res=>{
console.log('投票数据获取', res)
if(res.data.code==200){
state.tableDataTotalLoading = false;
let newData = []
for(let i=0;i<res.data.data.rows.length;i++){
// 处理在线课字段和表格中字段保持一致
let obj = {
studentUserNo: res.data.data.rows[i].studentCode,
studentName: res.data.data.rows[i].studentName,
studentDepartName: res.data.data.rows[i].studentDepartName,
studentJobName: res.data.data.rows[i].studentJobName,
lastStudyTime: res.data.data.rows[i].submitTime,
finishStatus: res.data.data.rows[i].status?res.data.data.rows[i].status:0,
voteSubmitId: res.data.data.rows[i].voteSubmitId
}
newData.push(obj)
}
state.tabledata = newData;
state.courseID = props.datasource.courseId;
state.tableDataTotal = res.data.data.total;
}
}).catch(err=>{
console.log(err)
state.tableDataTotalLoading = false;
})
}else{
state.tableDataTotalLoading = false;
state.tabledata = [];
}
}
// 搜索按钮
function searchTaskList() {
state.currentPage = 1;
state.tableDataTotalLoading = true;
getData();
}
// 重置按钮
function resetTaskList() {
state.tableDataTotalLoading = true;
state.currentPage = 1;
state.name = "";
state.projectName = undefined;
getData();
}
//分页
const changePaginationStu = (page) => {
state.tableDataTotalLoading = true;
state.currentPage = page;
getData();
};
// 导出数据
function exportTaskStu() {
console.log(`${process.env.VUE_APP_BASE_API}/admin/vote/manage/export/vote?type=${2}&voteId=${props.datasource.projectTaskId}`)
window.open(`${process.env.VUE_APP_BASE_API}/admin/vote/manage/export/vote?type=${2}&voteId=${props.datasource.projectTaskId}`)
}
return {
...toRefs(state),
selectProjectName,
closeDrawer,
afterVisibleChange,
tableDataFunc,
godie,
onMounted,
onUnmounted,
onChange,
searchTaskList,
resetTaskList,
changePaginationStu,
exportTaskStu,
};
},
};
</script>
<style lang="scss">
// .drawerStyle {
// .ant-drawer-content-wrapper {
// // max-width: 1000px;
// .ant-drawer-header {
// display: none !important;
// }
// .ant-drawer-body {
// padding: 0;
// }
// }
// }
.ProjectVoteManage {
// overflow-x: auto;
.drawerMain {
min-width: 550px;
margin: 0px 32px 0px 32px;
overflow-x: auto;
display: flex;
flex-direction: column;
.noticebox {
width: 240px;
height: 64px;
background: rgba(255, 255, 255, 1);
border-radius: 4px;
position: absolute;
top: 161px;
display: flex;
align-items: center;
justify-content: center;
.notext {
color: rgba(51, 51, 51, 1);
font-size: 14px;
font-weight: 500;
margin-left: 20px;
}
}
.header {
height: 73px;
border-bottom: 1px solid #e8e8e8;
display: flex;
flex-shrink: 0;
justify-content: space-between;
align-items: center;
// background-color: red;
margin-bottom: 20px;
.headerTitle {
font-size: 18px;
font-weight: 600;
color: #333333;
line-height: 25px;
// margin-left: 24px;
}
}
.main {
width: 100%;
height: 100%;
// background-color: #bfa;
overflow-y: auto;
padding-right: 10px;
.endtime {
font-size: 16px;
font-weight: 500;
color: #333333;
}
.search {
width: 100%;
display: flex;
flex-wrap: wrap;
margin-top: 20px;
justify-content: space-between;
.sealeft {
display: flex;
flex-wrap: wrap;
.namecon {
display: flex;
flex-wrap: nowrap;
margin-bottom: 10px;
.name {
margin-top: 8px;
white-space: nowrap;
}
}
}
.btns {
display: flex;
flex-wrap: nowrap;
.btn {
cursor: pointer;
width: 100px;
height: 40px;
border-radius: 8px;
display: flex;
justify-content: center;
align-items: center;
.img1 {
width: 15px;
height: 17px;
background-image: url(../../../assets/images/courseManage/search0.png);
background-size: 100% 100%;
margin-right: 7px;
}
.img2 {
width: 16px;
height: 18px;
background-image: url(../../../assets/images/courseManage/reset1.png);
background-size: 100% 100%;
margin-right: 7px;
}
}
.btn1 {
background: #4ea6ff;
color: #ffffff;
}
.btn2 {
background: #ffffff;
color: #4ea6ff;
border: 1px solid #4ea6ff;
}
}
}
.btnss {
display: flex;
flex-wrap: nowrap;
.btn {
cursor: pointer;
width: 130px;
height: 40px;
border-radius: 8px;
display: flex;
justify-content: center;
align-items: center;
.img1 {
width: 18px;
height: 18px;
background-image: url(../../../assets/images/basicinfo/call.png);
background-size: 100% 100%;
margin-right: 7px;
}
.img2 {
width: 17px;
height: 16px;
background-image: url(../../../assets/images/coursewareManage/export.png);
background-size: 100% 100%;
margin-right: 7px;
}
}
.btn1 {
background: #4ea6ff;
color: #ffffff;
}
.btn2 {
background: #ffffff;
color: #4ea6ff;
border: 1px solid #4ea6ff;
}
}
.tab {
th.h {
background-color: #eff4fc !important;
}
.ant-table-tbody
> tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected)
> td {
background: #f6f9fd;
}
.tableBox {
.pa {
// left: 0;
margin-top: 15px;
width: 100%;
// height: 20px;
// background-color: red;
display: flex;
justify-content: center;
// position: absolute;
// bottom: 20px;
.ant-pagination-prev,
.ant-pagination-next,
.ant-pagination-item,
.ant-pagination-options {
margin-bottom: 10px;
}
}
}
}
}
.btnn {
height: 72px;
width: 100%;
position: absolute;
bottom: 0;
left: 0;
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

@@ -0,0 +1,711 @@
<template>
<a-drawer
v-if="VoteModelVisible"
:visible="VoteModelVisible"
class="drawerStyle RouterVoteManage"
placement="right"
width="80%"
@after-visible-change="afterVisibleChange"
>
<div class="drawerMain">
<div class="header">
<div class="headerTitle">
投票{{ title }}
</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
src="../../../assets/images/basicinfo/close.png"
@click="closeDrawer"
/>
</div>
<div class="main">
<div
v-if="datasource.type !== 6 && datasource.type !== 9"
class="endtime"
>
<!-- 起止时间-->
</div>
<div v-else class="endtime">
起止时间{{ datasource.startTime }} {{ datasource.endTime }}
</div>
<div class="search" style="justify-content:flex-start;">
<div class="sealeft">
<div class="namecon" style="margin-right: 30px">
<div class="name">姓名</div>
<a-input
v-model:value="name"
style="width: 200px; height: 40px; border-radius: 8px"
placeholder="请输入姓名"
/>
</div>
<div v-if="datasource.type !==1" class="namecon" style="margin-right: 50px">
<div class="name">任务状态</div>
<div class="select">
<a-select
v-model:value="projectName"
style="width: 200px"
placeholder="请选择"
:options="projectNameList"
@change="selectProjectName"
></a-select>
</div>
</div>
</div>
<div class="btns">
<div
class="btn btn1"
style="margin-right: 20px"
@click="searchTaskList"
>
<div class="img1"></div>
<div class="wz">搜索</div>
</div>
<div class="btn btn2" @click="resetTaskList">
<div class="img2"></div>
<div class="wz">重置</div>
</div>
</div>
</div>
<div class="btnss" style="margin-top: 20px">
<!--
<div class="btn btn1" @click="godie" style="margin-right: 20px">
<div class="img1"></div>
<div class="wz">催促学习</div>
</div>-->
<div class="btn btn2" @click="exportTaskStu">
<div class="img2"></div>
<div class="wz">导出数据</div>
</div>
</div>
<div class="tab" style="margin-top: 20px; margin-bottom: 100px">
<a-table
style="border: 1px solid #f2f6fe"
:columns="tableDataFunc()"
:data-source="tabledata"
:loading="tableDataTotalLoading"
:scroll="{ x: 900 }"
:pagination="false"
/>
<div class="tableBox">
<div class="pa">
<a-pagination
:showSizeChanger="false"
showQuickJumper="true"
hideOnSinglePage="true"
:pageSize="pageSize"
:current="currentPage"
:total="tableDataTotal"
class="pagination"
@change="changePaginationStu"
v-if="tableDataTotal > 10"
/>
</div>
</div>
</div>
</div>
<!--
<div class="btnn">
<button class="btn1" @click="closeDrawer">取消</button>
<button class="btn2" @click="closeDrawer">确定</button>
</div>-->
</div>
</a-drawer>
<CVote
v-model:CVvisible="CVvisible"
:voteID="voteID"
:courseID="courseID"
/>
</template>
<script>
import { toRefs, reactive, onMounted, onUnmounted } from "vue";
import { message } from "ant-design-vue";
// import * as api from "../../../api/index";
import * as api from "../../../api/indexTaskManage";
import CVote from "../CheckVote.vue"
export default {
name: "RouterVoteManage",
components:{
CVote,
},
props: {
VoteModelVisible: {
type: Boolean,
default: false,
},
title: {
type: String,
default: "",
},
levelName: {
type: String,
default: "",
},
projectTaskId: {
type: Number,
default: null,
},
itemsType: {
type: Number,
default: null,
},
datasource: {
type: Object,
default: function () {
return {};
},
},
},
setup(props, ctx) {
const state = reactive({
visible: props.VoteModelVisible,
name: "",
pageNo: 1,
pageSize: 10,
currentPage: 1,
tableDataTotal: 0,
projectName: undefined,
projectNameList: [
{
id: 1,
value: "1",
label: "未开始",
},
{
id: 2,
value: "2",
label: "进行中",
},
{
id: 3,
value: "3",
label: "已完成",
},
{
id: 4,
value: "4",
label: "未完成",
},
],
tabledata: [],
tableDataTotalLoading: true, // 表格loading加载配置
CVvisible:false, //查看投票抽屉
voteID: "",
courseID: ""
});
const tableDataFunc = () => {
const columns = [
{
title: "工号",
dataIndex: "studentUserNo",
key: "studentUserNo",
width: "20%",
align: "center",
ellipsis: true,
className: "h head",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.studentUserNo?text.record.studentUserNo:"-"}</span>
</div>
);
},
},
{
title: "姓名",
dataIndex: "studentName",
key: "studentName",
width: "10%",
align: "center",
ellipsis: true,
className: "h head",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.studentName?text.record.studentName:"-"}</span>
</div>
);
},
},
{
title: "所在部门",
dataIndex: "studentDepartName",
key: "studentDepartName",
width: "20%",
align: "center",
className: "h",
ellipsis: true,
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.studentDepartName?text.record.studentDepartName:"-"}</span>
</div>
);
},
},
{
title: "所在岗位",
dataIndex: "studentJobName",
key: "studentJobName",
width: "10%",
align: "center",
ellipsis: true,
className: "h",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.studentJobName?text.record.studentJobName:"-"}</span>
</div>
);
},
},
{
title: "学员关卡",
dataIndex: "currentStageName",
key: "currentStageName",
width: "10%",
align: "center",
ellipsis: true,
className: "h",
customRender: () => {
return (
<div class="racona">
<span> {props.levelName}</span>
</div>
);
},
},
{
title: "完成时间",
dataIndex: "lastStudyTime",
key: "lastStudyTime",
width: "15%",
align: "center",
ellipsis: true,
className: "h",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.lastStudyTime?text.record.lastStudyTime:"-"}</span>
</div>
);
},
},
{
title: "任务状态",
dataIndex: "finishStatus",
key: "finishStatus",
width: "10%",
align: "center",
ellipsis: true,
className: "h",
customRender: (text) => {
return (
<div class="racona">
<span> {text.record.finishStatus == 1 || text.record.finishStatus == 0 || text.record.finishStatus==null ? "未开始" :text.record.finishStatus == 2 ?"进行中":text.record.finishStatus == 3 ? "已完成" :"未完成"}</span>
</div>
);
},
},
{
title: "操作",
dataIndex: "voteSubmitId",
key: "voteSubmitId",
width: "10%",
align: "center",
ellipsis: true,
className: "h",
customRender: (value) => {
return (
<div
style="color:#387df7;cursor:pointer"
onClick={
() => {
if(value.record.finishStatus !== 3){
message.destroy()
message.error("当前任务未完成")
return
}
{/* 当前投票提交的ID 用来查看投票详情 */}
console.log(value.record.voteSubmitId);
state.voteID = value.record.voteSubmitId;
state.CVvisible = true;
}}>
{value.record.finishStatus == 3 ?
<span style='color:#387df7;'> 查看 </span>
:
<span style='color:#999;'> 查看 </span>}
</div>
);
},
},
];
return columns;
};
const closeDrawer = () => {
ctx.emit("update:VoteModelVisible", false);
state.currentPage = 1;
state.name = "";
state.projectName = undefined;
state.tabledata = [];
};
const afterVisibleChange = (bol) => {
if (bol == true) {
console.log("当前是什么类型", props.datasource.type);
state.tableDataTotalLoading = true;
getData();
}
};
const selectProjectName = (value) => {
state.projectName = value;
};
//催促
const godie = () => {
message.destroy();
message.success("催促" + props.title + "成功");
};
const onChange = (pageNumber) => {
console.log("Page: ", pageNumber);
};
// 获取数据
function getData() {
if(props.datasource.type == 12){
console.log("我是传递的查询参数", {
"pageNo": state.currentPage,
"pageSize": state.pageSize,
"chapterId": props.datasource.stageId=="0"?"":props.datasource.stageId,
"status": state.projectName,
"studentName": state.name,
"targetId":props.datasource.projectId,
"taskId": props.datasource.courseId,
"type": 1
});
api.QueryVoteManagementDetail({
"pageNo": state.currentPage,
"pageSize": state.pageSize,
"chapterId": props.datasource.chapterId,
"status": state.projectName,
"studentName": state.name,
"targetId":props.datasource.routerId,
"taskId": props.datasource.courseId,
"type": 1
}).then(res=>{
console.log('投票数据获取', res)
if(res.data.code==200){
state.tableDataTotalLoading = false;
let newData = []
for(let i=0;i<res.data.data.rows.length;i++){
// 处理在线课字段和表格中字段保持一致
let obj = {
studentUserNo: res.data.data.rows[i].studentCode,
studentName: res.data.data.rows[i].studentName,
studentDepartName: res.data.data.rows[i].studentDepartName,
studentJobName: res.data.data.rows[i].studentJobName,
lastStudyTime: res.data.data.rows[i].submitTime,
finishStatus: res.data.data.rows[i].status?res.data.data.rows[i].status:0,
voteSubmitId: res.data.data.rows[i].voteSubmitId
}
newData.push(obj)
}
state.tabledata = newData;
state.courseID = props.datasource.courseId;
state.tableDataTotal = res.data.data.total;
}
}).catch(err=>{
console.log(err)
state.tableDataTotalLoading = false;
})
}else{
state.tableDataTotalLoading = false;
state.tabledata = [];
}
}
// 搜索按钮
function searchTaskList() {
state.currentPage = 1;
state.tableDataTotalLoading = true;
getData();
}
// 重置按钮
function resetTaskList() {
state.tableDataTotalLoading = true;
state.currentPage = 1;
state.name = "";
state.projectName = undefined;
getData();
}
//分页
const changePaginationStu = (page) => {
state.tableDataTotalLoading = true;
state.currentPage = page;
getData();
};
// 导出数据
function exportTaskStu() {
console.log(`${process.env.VUE_APP_BASE_API}/admin/vote/manage/export/vote?type=${1}&voteId=${props.datasource.routerTaskId}`)
window.open(`${process.env.VUE_APP_BASE_API}/admin/vote/manage/export/vote?type=${1}&voteId=${props.datasource.routerTaskId}`)
}
return {
...toRefs(state),
selectProjectName,
closeDrawer,
afterVisibleChange,
tableDataFunc,
godie,
onMounted,
onUnmounted,
onChange,
searchTaskList,
resetTaskList,
changePaginationStu,
exportTaskStu,
};
},
};
</script>
<style lang="scss">
// .drawerStyle {
// .ant-drawer-content-wrapper {
// // max-width: 1000px;
// .ant-drawer-header {
// display: none !important;
// }
// .ant-drawer-body {
// padding: 0;
// }
// }
// }
.RouterVoteManage {
// overflow-x: auto;
.drawerMain {
min-width: 550px;
margin: 0px 32px 0px 32px;
overflow-x: auto;
display: flex;
flex-direction: column;
.noticebox {
width: 240px;
height: 64px;
background: rgba(255, 255, 255, 1);
border-radius: 4px;
position: absolute;
top: 161px;
display: flex;
align-items: center;
justify-content: center;
.notext {
color: rgba(51, 51, 51, 1);
font-size: 14px;
font-weight: 500;
margin-left: 20px;
}
}
.header {
height: 73px;
border-bottom: 1px solid #e8e8e8;
display: flex;
flex-shrink: 0;
justify-content: space-between;
align-items: center;
// background-color: red;
margin-bottom: 20px;
.headerTitle {
font-size: 18px;
font-weight: 600;
color: #333333;
line-height: 25px;
// margin-left: 24px;
}
}
.main {
width: 100%;
height: 100%;
// background-color: #bfa;
overflow-y: auto;
padding-right: 10px;
.endtime {
font-size: 16px;
font-weight: 500;
color: #333333;
}
.search {
width: 100%;
display: flex;
flex-wrap: wrap;
margin-top: 20px;
justify-content: space-between;
.sealeft {
display: flex;
flex-wrap: wrap;
.namecon {
display: flex;
flex-wrap: nowrap;
margin-bottom: 10px;
.name {
margin-top: 8px;
white-space: nowrap;
}
}
}
.btns {
display: flex;
flex-wrap: nowrap;
.btn {
cursor: pointer;
width: 100px;
height: 40px;
border-radius: 8px;
display: flex;
justify-content: center;
align-items: center;
.img1 {
width: 15px;
height: 17px;
background-image: url(../../../assets/images/courseManage/search0.png);
background-size: 100% 100%;
margin-right: 7px;
}
.img2 {
width: 16px;
height: 18px;
background-image: url(../../../assets/images/courseManage/reset1.png);
background-size: 100% 100%;
margin-right: 7px;
}
}
.btn1 {
background: #4ea6ff;
color: #ffffff;
}
.btn2 {
background: #ffffff;
color: #4ea6ff;
border: 1px solid #4ea6ff;
}
}
}
.btnss {
display: flex;
flex-wrap: nowrap;
.btn {
cursor: pointer;
width: 130px;
height: 40px;
border-radius: 8px;
display: flex;
justify-content: center;
align-items: center;
.img1 {
width: 18px;
height: 18px;
background-image: url(../../../assets/images/basicinfo/call.png);
background-size: 100% 100%;
margin-right: 7px;
}
.img2 {
width: 17px;
height: 16px;
background-image: url(../../../assets/images/coursewareManage/export.png);
background-size: 100% 100%;
margin-right: 7px;
}
}
.btn1 {
background: #4ea6ff;
color: #ffffff;
}
.btn2 {
background: #ffffff;
color: #4ea6ff;
border: 1px solid #4ea6ff;
}
}
.tab {
th.h {
background-color: #eff4fc !important;
}
.ant-table-tbody
> tr:hover:not(.ant-table-expanded-row):not(.ant-table-row-selected)
> td {
background: #f6f9fd;
}
.tableBox {
.pa {
// left: 0;
margin-top: 15px;
width: 100%;
// height: 20px;
// background-color: red;
display: flex;
justify-content: center;
// position: absolute;
// bottom: 20px;
.ant-pagination-prev,
.ant-pagination-next,
.ant-pagination-item,
.ant-pagination-options {
margin-bottom: 10px;
}
}
}
}
}
.btnn {
height: 72px;
width: 100%;
position: absolute;
bottom: 0;
left: 0;
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

@@ -11,7 +11,7 @@
<div class="drawerMain" id="ProjCheckship" style="">
<div class="header">
<div class="headerTitle">
{{ { 1: "添加学员", 2: "添加学员", 3: "添加学员" }[type] || "" }}
{{ {1: "添加学员", 2: "添加学员", 3: "添加学员"}[type] || "" }}
</div>
<img
style="width: 29px; height: 29px; cursor: pointer"
@@ -38,7 +38,7 @@
style="margin-left: 20px; border-radius: 4px"
>
<template #icon>
<SearchOutlined />
<SearchOutlined/>
</template>
搜索
</a-button>
@@ -99,7 +99,7 @@
</div>
</div>
</a-tab-pane>
<!-- <a-tab-pane :key="2" tab="添加组织">
<a-tab-pane :key="2" tab="添加组织">
<div :style="{ height: screenHeight - 235 + 'px' }">
<div class="tab2">
<a-form-item label="组织:">
@@ -114,21 +114,24 @@
style="margin-left: 20px; border-radius: 4px"
>
<template #icon>
<SearchOutlined />
<SearchOutlined/>
</template>
搜索
</a-button>
<a-button
@click="resetOrg"
style="margin-left: 20px; border-radius: 4px"
>重置</a-button
>重置
</a-button
>
</a-form-item>
</div>
<div class="boeTree">
<a-tree
:tree-data="searchOrgName.keyword ? orgData : treeData"
:tree-data="searchOrgName.keyword ? orgData : treeOrgData"
@select="onOrgSelectChange"
:loading="orgOrgLoading"
:load-data="onLoadOrgData"
:fieldNames="{
children: 'treeChildList',
key: 'id',
@@ -142,7 +145,7 @@
</a-tree>
</div>
</div>
</a-tab-pane> -->
</a-tab-pane>
<a-tab-pane :key="3" tab="受众关联">
<div :style="{ height: screenHeight - 235 + 'px' }">
<div>
@@ -158,7 +161,7 @@
style="margin-left: 20px; border-radius: 4px"
>
<template #icon>
<SearchOutlined />
<SearchOutlined/>
</template>
搜索
</a-button>
@@ -224,28 +227,31 @@
>
<div @click="person = !person" class="sw">收起&lt;</div>
</div>
<!--组织-->
<!-- <div class="dept">添加组织</div>-->
<!-- <div v-for="(item,i) in selectsData.deptList" >-->
<!-- <div v-if="i<11">-->
<!-- <div class="chose1">-->
<!-- <div class="span"> {{ item.name }}</div>-->
<!-- <div class="ch1" @click="orgDel(i)"></div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div v-else> -->
<!-- <div v-if ="dept">-->
<!-- <div class="chose1">-->
<!-- <div class="span"> {{ item.name }}</div>-->
<!-- <div class="ch1" @click="orgDel(i)"></div>-->
<!-- </div>-->
<!-- </div>-->
<!-- -->
<!-- </div>-->
<!-- -->
<!-- </div>-->
<!-- <div v-if="!dept && selectsData.deptList.length >10" class="ifsw"><div @click="dept = !dept" class=sw>查看更多></div></div>-->
<!-- <div v-if="dept && selectsData.deptList.length >10" class="ifsw" ><div @click="dept = !dept" class="sw"> 收起&lt; </div></div>-->
<div class="dept">添加组织</div>
<div v-for="(item,i) in selectsData.deptList">
<div v-if="i<11">
<div class="chose1">
<div class="span"> {{ item.name }}</div>
<div class="ch1" @click="orgDel(i)"></div>
</div>
</div>
<div v-else>
<div v-if="dept">
<div class="chose1">
<div class="span"> {{ item.name }}</div>
<div class="ch1" @click="orgDel(i)"></div>
</div>
</div>
</div>
</div>
<div v-if="!dept && selectsData.deptList.length >10" class="ifsw">
<div @click="dept = !dept" class=sw>查看更多></div>
</div>
<div v-if="dept && selectsData.deptList.length >10" class="ifsw">
<div @click="dept = !dept" class="sw"> 收起&lt;</div>
</div>
<!--受众-->
<div class="group">受众关联</div>
<div v-for="(item, i) in selectsData.groupList">
@@ -375,7 +381,7 @@
</a-select>
</div>
<span style="color: #999999; margin-left: 10px"
><minus-circle-outlined />已在其他关卡的学员不会被添加到该关卡</span
><minus-circle-outlined/>已在其他关卡的学员不会被添加到该关卡</span
>
<div class="btn" style="margin-top: 50px">
<button
@@ -399,15 +405,15 @@
</a-modal>
</template>
<script setup>
import { computed, defineEmits, defineProps, ref, watch } from "vue";
import { request, useBoeApi, useBoeApiPage } from "@/api/request";
import {computed, defineEmits, defineProps, ref, watch} from "vue";
import {request, useBoeApi, useBoeApiPage} from "@/api/request";
import {
AUDIENCE_LIST,
ORG_CHILD_LIST,
ORG_LIST,
USER_LIST,
} from "@/api/ThirdApi";
import { saveStu } from "@/api/index1";
import {saveStu} from "@/api/index1";
const emit = defineEmits({});
const props = defineProps({
@@ -444,11 +450,11 @@ const audienceName = ref({
page: 1,
pageSize: 10,
});
// const searchOrgName = ref({
// keyword: '',
// page: 1,
// pageSize: 10
// })
const searchOrgName = ref({
keyword: '',
page: 1,
pageSize: 10
})
const stageIds = computed(() => props.stage);
const {
data: stuData,
@@ -464,18 +470,27 @@ const {
totalPage: (res) => res.result.totalPage,
total: (res) => res.result.totalElement,
});
// const {
// data: orgData,
// fetch: searchOrg,
// } = useBoeApiPage(ORG_LIST, searchOrgName.value)
const { data: treeData, loading: orgLoading } = useBoeApi(
const {
data: orgData,
fetch: searchOrg,
} = useBoeApiPage(ORG_LIST, searchOrgName.value)
const {data: treeData, loading: orgLoading} = useBoeApi(
ORG_LIST,
{ keyword: "" },
{keyword: ""},
{
init: true,
result: (res) => res.result.map((e) => ({ ...e, isLeaf: false })),
result: (res) => res.result.map((e) => ({...e, isLeaf: false})),
}
);
const {data: treeOrgData, loading: orgOrgLoading} = useBoeApi(
ORG_LIST,
{keyword: ""},
{
init: true,
result: (res) => res.result.map((e) => ({...e, isLeaf: false})),
}
);
const {
data: audiData,
fetch: searchAudi,
@@ -487,7 +502,7 @@ const {
} = useBoeApiPage(AUDIENCE_LIST, audienceName.value, {
init: true,
result: (res) =>
res.result.audienceList.map((e) => ({ ...e, id: e.id + "" })),
res.result.audienceList.map((e) => ({...e, id: e.id + ""})),
totalPage: (res) => res.result.totalPage,
total: (res) => res.result.totalElement,
});
@@ -599,14 +614,25 @@ const closeDrawer = () => {
stuData.value = [];
nameSearch.value.keyword = "";
};
function onLoadData(treeNode) {
return request(ORG_CHILD_LIST, { keyword: "", orgId: treeNode.id }).then(
return request(ORG_CHILD_LIST, {keyword: "", orgId: treeNode.id}).then(
(r) => {
treeNode.dataRef.treeChildList = r.result.directChildList;
treeData.value = [...treeData.value];
}
);
}
function onLoadOrgData(treeNode) {
return request(ORG_CHILD_LIST, {keyword: "", orgId: treeNode.id}).then(
(r) => {
treeNode.dataRef.treeChildList = r.result.directChildList;
treeOrgData.value = [...treeOrgData.value];
}
);
}
const closeChangeModal = () => {
stageVisible.value = false;
};
@@ -702,9 +728,9 @@ const deleteDepSelect = () => {
stuSelectKeys.value = [];
};
//重置组织
// const resetOrg = () => {
// searchOrgName.value = {keyword: '', page: 1, pageSize: 10}
// };
const resetOrg = () => {
searchOrgName.value = {keyword: '', page: 1, pageSize: 10}
};
//重置受众
const resetAudienceInfo = () => {
audienceName.value.keyword = "";

View File

@@ -488,7 +488,6 @@
item.type === 8 ||
item.type === 6 ||
item.type === 11 ||
item.type === 12 ||
item.type === 9
? commonModel(item, value.name)
: item.type === 2
@@ -499,6 +498,8 @@
? examinationModel(item, value.name)
: item.type === 10
? evaluationModel(item, value.name)
: item.type === 12
? voteModel(item, value.name)
: null
"
>
@@ -1309,6 +1310,15 @@
:levelName="commonLevelName"
/>
<!-- 公共管理抽屉 结束-->
<!-- 投票管理抽屉 开始-->
<router-vote-manage
v-model:VoteModelVisible="voteModelVisible"
:title="voteModelVisibleTitle"
:datasource="voteData"
:levelName="voteLevelName"
/>
<!-- 投票管理抽屉 结束-->
</div>
</template>
<script>
@@ -1345,6 +1355,7 @@ import RouterExaminationManage from "../../components/drawers/router/RouterExami
import RouterEvaluationManage from "../../components/drawers/router/RouterEvaluationManage";
import RouterHomeworkManage from "../../components/drawers/router/RouterHomeworkManage";
import RouterCommonManage from "../../components/drawers/router/RouterCommonManage";
import RouterVoteManage from "../../components/drawers/router/RouterVoteManage";
export default {
name: "LevelAdd",
@@ -1368,6 +1379,7 @@ export default {
RouterEvaluationManage,
RouterHomeworkManage,
RouterCommonManage,
RouterVoteManage
},
setup() {
const router = useRouter();
@@ -1544,20 +1556,24 @@ export default {
evaluationModelVisible: false,
homeworkModelVisible: false,
commonModelVisible: false,
voteModelVisible: false,
faceTeachModelVisibleTitle: "",
examinationModelVisibleTitle: "",
evaluationModelVisibleTitle: "",
homeworkModelVisibleTitle: "",
commonModelVisibleTitle: "",
voteModelVisibleTitle: "",
faceData: "",
examinationData: "",
evaluationData: "",
homeworkData: "",
commonData: "",
voteData: "",
commonLevelName: "",
examLevelName: "",
evaluationLevelName: "",
voteLevelName: "",
facestudent: "",
locationHref:
@@ -1862,6 +1878,15 @@ export default {
state.evaluationData = data;
// 测评弹框名称 RouterEvaluationManage
};
// 投票点击管理弹框
const voteModel = (data, levelname) => {
console.log(data);
state.voteLevelName = levelname;
state.voteModelVisible = true;
state.voteModelVisibleTitle = data.name;
state.voteData = data;
// 投票弹框名称 RouterVoteManage
};
// 作业点击管理弹框
const homeworkModel = (data) => {
console.log(data);
@@ -2653,6 +2678,7 @@ export default {
faceTeachModel,
examinationModel,
evaluationModel,
voteModel,
homeworkModel,
commonModel,
downloadFile,

View File

@@ -1,6 +1,6 @@
<!-- eslint-disable vue/valid-v-model -->
<!-- eslint-disable vue/no-parsing-error -->
<!-- 任务页面 -->img
<!-- 任务页面 -->
<template>
<div class="taskpage">
<div class="addhead" style="flex-shrink: 0">
@@ -617,7 +617,7 @@
item
)
: item.type == '12'
? showWork(item.name, item.projectTaskId)
? showVote(item.name, item.projectTaskId, item)
: item.type == '13'
? showWork(item.name, item.projectTaskId)
: null
@@ -867,7 +867,48 @@
</div>
</div>
</a-tab-pane>
<a-tab-pane key="7" tab="设置">
<a-tab-pane key="7" tab="证书">
<div class="split"></div>
<!-- 没有证书显示的页面 -->
<div v-if="3>7" style="display:flex; justify-content:center; align-items:center;height: 600px;flex-direction:column;">
<img
src="@/assets/images/nodata.png"
style=" width: 212px; height: 212px;"
alt=""
/>
<button class="xkbtn11" @click="addCertificate">
添加证书
</button>
</div>
<!-- 有证书显示的页面 -->
<div v-else style="padding: 36px; display: flex;min-height: 400px;">
<div style="width:170px;height:200px;border:1px solid #b1b3b8;display: flex;justify-content: center;align-items: center;color: #4ea6ff;cursor: pointer;" @click="addCertificate">
<div class="ant-upload-text">+添加证书</div>
</div>
<div style="width:170px;height:200px;border:1px solid #b1b3b8;margin-left: 32px;display: flex;justify-content: center;align-items: center;flex-direction:column;">
<img
@click="previewPic"
style="cursor:pointer"
width="140"
height="160"
src="https://picb6.photophoto.cn/32/552/32552236_1.jpg" alt="" srcset="">
<div style="display:flex;height: 26px;justify-content: space-around;align-items: center;">
<div style="font-size:14px; width: 85px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">培训认证证书</div>
<div style="font-size:12px;color:#999;width:50px;margin-left: 6px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">完成项目</div>
<div style="cursor:pointer;position: relative;">
...
<div style="position:absolute;width: 45px;height: 60px;background: #fff;display: flex;flex-direction: column;justify-content: center;align-items: center;border: 1px solid #b1b3b8;">
<div style="font-size:12px;color:#999">查看</div>
<div style="font-size:12px;color:#999">编辑</div>
<div style="font-size:12px;color:#999">删除</div>
</div>
</div>
</div>
</div>
</div>
</a-tab-pane>
<a-tab-pane key="8" tab="设置">
<div class="split"></div>
<a-tabs v-model:activeKey="activeSetKey">
@@ -1140,6 +1181,13 @@
:projectTaskId="projectTaskId"
:datasource="examData"
/>
<!-- 投票管理抽屉 -->
<ProjectVoteManage
v-model:ProjectVoteModelVisible="projectVoteModelVisible"
:title="voteModelVisibleTitle"
:levelName="voteLevelName"
:datasource="voteData"
/>
<!-- 测评抽屉 -->
<ProjectEvalManage
v-model:Evalvisible="Evalvisible"
@@ -1149,6 +1197,30 @@
:datasource="evalData"
/>
<!-- 添加证书抽屉 -->
<AddCertificate
v-model:ACertificate="ACertificate"
/>
<!-- 创建证书抽屉 -->
<CreateCertificate
v-model:CCertificate="CCertificate"
/>
<!-- 预览 -->
<a-modal
:title="null"
width="60%"
:footer="null"
v-model:visible="modal1Visible"
style="display:flex; justify-content:center; align-items:center;"
@ok="setModal1Visible(false)"
>
<img
:width="screenWidth*0.55"
src="https://picb6.photophoto.cn/32/552/32552236_1.jpg" alt="" srcset="">
</a-modal>
<!-- 学员(小组管理)创建小组抽屉 -->
<subset-manage v-model:Svisible="subsetVisivle" />
<!-- 学员管理-添加学员抽屉 -->
@@ -1754,6 +1826,10 @@ import ProjectOnlineManage from "../../components/drawers/project/ProjectOnlineM
import ProjectHomeWorkManage from "../../components/drawers/project/ProjectHomeWorkManage";
import ProjectExamManage from "../../components/drawers/project/ProjectExamManage";
import ProjectEvalManage from "../../components/drawers/project/ProjectEvalManage";
import AddCertificate from "../../components/drawers/project/AddCertificate";
import CreateCertificate from "../../components/drawers/project/CreateCertificate";
import ProjectVoteManage from "../../components/drawers/project/ProjectVoteManage";
import SubsetManage from "../../components/drawers/SubsetManage";
import MemberList from "../../components/drawers/MemberList";
import ActiveAttendance from "../../components/drawers/ActiveAttendance";
@@ -1786,6 +1862,7 @@ import { toDate, codeUrl } from "../../api/method";
import projSet from "../../components/Modals/projSet";
import { overview } from "../../api/indexProjStu";
import TwoDimensionalCode from "../../components/TwoDimensionalCode.vue";
import ProjectScore from "../../components/drawers/ProjectScore";
import { useStore } from "vuex";
import ProjectLevel from "@/components/project/ProjectLevel";
import TrainClass from "@/components/project/TrainClass";
@@ -1813,18 +1890,23 @@ export default {
SeeStu,
ChangeGroup,
NoticePub,
// ProjectScore,
ProjectScore,
TaskImpStu,
projSet,
NoticeHis,
TwoDimensionalCode,
ProjectManager,
TableStudent,
AddCertificate,
CreateCertificate,
ProjectVoteManage
},
setup() {
const store = useStore();
const route = useRoute();
const state = reactive({
screenHeight: document.body.clientHeight,
screenWidth: document.body.clientWidth,
editRecord: {},
choosedStageIndex:0,
hasTask:false,
@@ -1962,8 +2044,11 @@ export default {
FSvisible: false, //面授学员
AAvisible: false, //活动考勤
Wvisible: false, //作业管理
projectVoteModelVisible: false, // 投票管理
TMvisible: false, //考试管理
Evalvisible: false, //测评管理
ACertificate: false, //证书添加
CCertificate: false, //证书创建
Stuvisible: false, //添加学员
Importvisible: false, //导入学员
Seevisible: false, //查看学员
@@ -2502,7 +2587,12 @@ export default {
commonLevelName: "",
evaltype: "",
evalData: "",
facestudent: ""
voteData: "",
voteModelVisibleTitle:'',
voteLevelName:'',
facestudent: "",
modal1Visible: false, // 证书预览
});
const levelList = reactive({
@@ -2790,6 +2880,14 @@ export default {
state.projectTaskId = id;
state.projectTaskInfo = item;
};
{/* 直播管理的抽屉 */}
const showVote = (name, id, data) => {
console.log(name, id, data)
state.projectVoteModelVisible = true;
state.voteData = data;
state.voteModelVisibleTitle = name;
state.voteLevelName = '无阶段任务';
}
//考试管理的抽屉
const showTest = (name, id, data) => {
state.examData = data;
@@ -4173,6 +4271,15 @@ export default {
state.choosedStageIndex = index;
}
{/* 证书 */}
function addCertificate(){
state.ACertificate = true;
}
function previewPic() {
state.modal1Visible = true;
}
return {
...toRefs(state),
...toRefs(levelList),
@@ -4199,6 +4306,7 @@ export default {
showFS,
showAA,
showWork,
showVote,
showTest,
showEval,
showStuAdd,
@@ -4281,6 +4389,8 @@ export default {
showCodeModel2,
checkType,
downloadFile,
addCertificate,
previewPic
};
},
};
@@ -4293,6 +4403,11 @@ export default {
clear: both;
}
.ant-upload.ant-upload-select-picture-card {
width: 170px;
height: 200px;
}
.pubproject {
.ant-modal {
.ant-modal-body {
@@ -4458,6 +4573,18 @@ export default {
}
}
.xkbtn11 {
cursor: pointer;
width: 130px;
height: 40px;
background: #4ea6ff;
border-radius: 8px;
border: 0;
margin-right: 8px;
color: #fff;
margin-top: 24px;
}
.canclestu {
.ant-modal {
width: 424px !important;