Files
fe-manage/src/components/drawers/AddLive.vue

760 lines
22 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!-- 直播抽屉 -->
<template>
<a-drawer
:visible="addliveVisible"
class="drawerStyle addliveDrawer"
width="80%"
title="添加直播"
placement="right"
@after-visible-change="afterVisibleChange"
>
<div class="drawerMain">
<div class="header">
<div v-if="isLiveEdit == 2" class="headerTitle">编辑直播</div>
<div v-else class="headerTitle">添加直播</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: 424px; height: 32px"
placeholder="请输入考试名称"
maxlength="20"
/>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">直播说明</span>
</div>
<div class="textarea">
<a-textarea
v-model:value="textV1"
placeholder="请输入考试说明"
allow-clear
maxlength="150"
/>
</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">
<a-range-picker
style="width: 424px"
v-model:value="time"
:placeholder="[' 开始时间', ' 结束时间']"
/>
</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">
<a-input
v-model:value="inputV2"
style="width: 388px; height: 32px"
/>
<span style="margin-left: 5px">分钟</span>
</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">
<a-input
v-model:value="inputV3"
style="width: 424px; height: 32px"
placeholder="请输入授课老师"
/>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">直播封面</span>
</div>
<div class="textarea" style="overflow: hidden">
<a-upload
v-model:file-list="fileList"
name="avatar"
list-type="picture-card"
class="avatar-uploader"
:show-upload-list="false"
action="/api/file/upload"
: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">Upload</div>
</div>
</a-upload>
<div class="tip">支持图片格式为jpg/jpeg/png 图片最大为2MB</div>
</div>
</div>
<div class="main_item" style="margin-top: -10px">
<div class="signbox">
<span style="margin-right: 3px">直播链接</span>
</div>
<div class="btnbox">
<a-input
v-model:value="inputV4"
style="width: 424px; height: 32px"
placeholder="请输入直播链接"
/>
</div>
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">回放设置</span>
</div>
<div class="btnbox">
<a-switch v-model:checked="switchC1" @click="PlayBack" />
</div>
</div>
<div :style="{ display: playback ? 'block' : 'none' }">
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">回放链接</span>
</div>
<div class="btnbox">
<a-input
v-model:value="inputV5"
style="width: 424px; height: 32px"
placeholder="请输入回放链接"
/>
</div>
</div>
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">评价</span>
</div>
<div class="btnbox">
<a-checkbox v-model:checked="checkedC1">需要评估</a-checkbox>
</div>
</div>
<div class="main_item" style="margin-top: -25px">
<div class="signbox"></div>
<div class="btnbox">
<a-select
dropdownClassName="dropdown-style"
style="width: 424px"
placeholder="选择评估"
:options="options1"
allowClear
showSearch
/>
</div>
</div>
<div class="main_item2">
<div class="signbox">
<span style="margin-right: 3px">考勤设置</span>
</div>
<div class="kqszbox">
<div class="qdqtbox">
<div class="qdbtn"><div class="btntext">签到</div></div>
</div>
<div class="setbox">
<div class="timerbox">
<span>开始前</span>
<a-input-number
:min="0"
:max="30"
:precision="0"
style="
width: 88px;
height: 32px;
border-radius: 8px;
overflow: hidden;
"
v-model:value="inputV6"
></a-input-number>
<span style="color: #999999; margin-left: 8px">分钟</span>
</div>
<div class="timerbox">
<span>开始后</span>
<a-input-number
:min="0"
:max="30"
:precision="0"
style="
width: 88px;
height: 32px;
border-radius: 8px;
overflow: hidden;
"
v-model:value="inputV7"
></a-input-number>
<span style="color: #999999; margin-left: 8px">分钟</span>
</div>
</div>
<div class="qdqtbox">
<div class="qtbtn"><div class="btntext">签退</div></div>
</div>
<div class="setbox">
<div class="timerbox">
<span>结束前</span>
<a-input-number
:min="0"
:max="30"
:precision="0"
style="
width: 88px;
height: 32px;
border-radius: 8px;
overflow: hidden;
"
v-model:value="inputV8"
></a-input-number>
<span style="color: #999999; margin-left: 8px"
>分钟提前签退则记为早退</span
>
</div>
</div>
</div>
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">完成标准设置</span>
</div>
<div class="btnbox">
<a-radio-group v-model:value="radioV1">
<a-radio :value="1" @click="cloradio1">仅签到</a-radio>
<a-radio :value="2" @click="cloradio1"
>签到签退全部完成</a-radio
>
</a-radio-group>
</div>
</div>
<div class="main_item">
<div class="signbox">
<span style="margin-right: 3px">其他设置</span>
</div>
<div class="btnbox">
<a-checkbox v-model:checked="checkedC2"
>学员请假后记为任务完成</a-checkbox
>
</div>
</div>
</div>
</div>
<div class="main_btns">
<button class="btn1" @click="closeDrawer">取消</button>
<button class="btn2" @click="createLiveBroadcast">确定</button>
</div>
</div>
</a-drawer>
</template>
<script>
import { reactive, toRefs, ref } from "vue";
import { message } from "ant-design-vue";
import * as api from "../../api/indexLiveBroadcast";
import * as apiTask from "../../api/indexTaskadd";
import { toDate } from "@/api/method";
import { RouterEditTask } from "@/api/indexTask";
// import { useRouter } from "vue-router";
function getBase64(img, callback) {
const reader = new FileReader();
reader.addEventListener("load", () => callback(reader.result));
reader.readAsDataURL(img);
}
const options1 = ref([
{
value: "value1",
label: "请选择状态",
},
]);
const rowSelection = ref({
checkStrictly: false,
onChange: (selectedRowKeys, selectedRows) => {
console.log(
`selectedRowKeys: ${selectedRowKeys}`,
"selectedRows: ",
selectedRows
);
},
onSelect: (record, selected, selectedRows) => {
console.log(record, selected, selectedRows);
},
onSelectAll: (selected, selectedRows, changeRows) => {
console.log(selected, selectedRows, changeRows);
},
});
export default {
name: "AddLive",
// components: {
// },
props: {
addliveVisible: {
type: Boolean,
default: false,
},
isStudy: {
type: Number,
default: null,
},
projectId: {
type: Number,
default: null,
},
chooseStageId: {
type: Number,
default: null,
},
isLiveEdit: {
type: Number,
default: null,
},
EditLiveId: {
type: Number,
default: null,
},
isactive: {
type: Number,
default: null,
},
routerId: {
type: Number,
default: null,
},
},
setup(props, ctx) {
// const router = useRouter();
const state = reactive({
currentPage: 1,
tableDataTotal: 100,
pageSize: 10,
inputV1: "", //*直播名称
time: "", //*直播时间
inputV2: "", //*直播时长
inputV3: "", //*授课老师
fileList: [], //直播封面
inputV4: "", //直播链接
inputV5: "", //回放链接
inputV6: "", //活动开始前多少分钟结束签到
inputV7: "", //活动开始后多少分钟结束签到
inputV8: "", //结束前多少分钟开始签退
textV1: "",
radioV1: "", //标准设置的单选
imageUrl: "", //上传图片地址
loading: false,
switchC1: "",
checkedC1: "",
checkedC2: true,
playback: false,
obj: {}, //要传的obj数据
});
const closeDrawer = () => {
ctx.emit("update:addliveVisible", false);
ctx.emit("update:isLiveEdit", 1);
console.log(props, "props");
state.radioV1 = "";
state.playback = false;
state.inputV6 = "";
state.inputV7 = "";
state.inputV2 = "";
state.inputV3 = "";
state.inputV1 = "";
state.inputV4 = "";
state.inputV5 = "";
state.inputV8 = "";
state.time = "";
state.textV1 = "";
state.switchC1 = "";
state.imageUrl = "";
};
const afterVisibleChange = (bool) => {
console.log("state", bool);
};
const PlayBack = () => {
state.playback = !state.playback;
};
const cloradio1 = (value) => {
console.log(value.target._value); //点击的选项
if (state.radioV1 === value.target._value) {
state.radioV1 = "";
}
};
const handleChange = (info) => {
if (info.file.status === "uploading") {
state.loading = true;
return;
}
if (info.file.status === "done") {
// Get this url from response in real world.
getBase64(info.file.originFileObj, (base64Url) => {
state.imageUrl = base64Url;
state.loading = false;
});
}
if (info.file.status === "error") {
state.loading = false;
message.error("upload error");
}
};
const beforeUpload = (file) => {
const isJpgOrPng =
file.type === "image/jpeg" ||
file.type === "image/png" ||
file.type === "image/jpg";
if (!isJpgOrPng) {
message.error("You can only upload JPG file!");
}
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isLt2M) {
message.error("Image must smaller than 2MB!");
}
return isJpgOrPng && isLt2M;
};
//创建直播
const createLiveBroadcast = () => {
if (!state.inputV1) {
message.destroy();
return message.warning("请输入直播名称");
}
if (!state.time) {
message.destroy();
return message.warning("请输入直播时间");
}
if (!state.inputV2) {
message.destroy();
return message.warning("请输入直播时长");
}
const regular = /^[+]{0,1}(\d+)$/;
if (!regular.test(state.inputV2)) {
message.destroy();
return message.warning("直播时长需大于0");
}
if (!state.inputV3) return message.warning("请输入授课老师");
let check = state.checkedC2 * 1;
// let startTime = state.time[0].$d;
// let endTime = state.time[1].$d;
// console.log(startTime); //时间需要处理
// console.log(endTime);
let startTime = toDate(
new Date(state.time[0].$d).getTime() / 1000,
"Y-M-D"
);
let endTime = toDate(
new Date(state.time[1].$d).getTime() / 1000,
"Y-M-D"
);
state.obj = {
afterSignIn: state.inputV6,
beforeSignIn: state.inputV7,
assessmentId: 0,
createTime: "",
createUser: 0,
// liveCover: state.fileList,//直播封面
liveDuration: state.inputV2,
liveEndTime: endTime,
liveStartTime: startTime,
liveExplain: state.textV1,
liveFlag: "",
liveId: props.EditLiveId == null ? 0 : props.EditLiveId,
liveLink: state.inputV4,
liveName: state.inputV1,
livePlayback: "",
livePlaybackLink: state.inputV5,
liveTag: "",
liveTeacherId: 0,
otherSettings: check, //1或0
signOutTime: state.inputV8,
standardSettings: state.radioV1, //1或2
updateTime: "",
updateUser: 0,
};
let name = state.inputV1;
if (props.isLiveEdit == 2) {
api
.updateLiveBroadcastMessage(state.obj)
.then((res) => {
console.log("编辑成功", res);
message.success("编辑成功");
closeDrawer();
ctx.emit("changeData", false);
})
.catch((err) => console.log(err));
} else {
api
.createLiveBroadcast(state.obj)
.then((res) => {
console.log("调用添加直播接口后", res.data.data);
// console.log(state, 2222);
message.success("提交成功");
closeDrawer();
//学习路径的创建
if (props.isStudy == 1) {
console.log("hhhhh", name);
let objj = {
chapterId: props.isactive,
courseId: res.data.data.liveId,
duration: state.obj.liveDuration,
flag: true,
name: name,
routerId: props.routerId,
routerTaskId: 0,
type: 6,
};
RouterEditTask(objj)
.then((res) => {
console.log(res, 11111);
})
.catch((err) => {
console.log(err, 1111);
});
} else {
//项目的创建
apiTask
.addTask({
courseId: res.data.data.liveId,
duration: state.obj.liveDuration,
flag: true,
name: state.obj.liveName,
projectId: props.projectId,
projectTaskId: 0,
stageId: props.chooseStageId,
type: 6,
})
.then((res) => {
console.log("调用项目添加接口后", res.data);
//自定义事件给父组件传值
ctx.emit("changeData", false);
//重新获取任务列表
// apiTask.getTask({ projectId: 28 });
// router.push("/taskadd");
})
.catch((err) => {
console.log(err);
});
}
})
.catch((err) => {
console.log(err, 2222);
});
}
};
return {
...toRefs(state),
afterVisibleChange,
closeDrawer,
PlayBack,
options1,
// columns1,
rowSelection,
cloradio1,
createLiveBroadcast,
handleChange,
beforeUpload,
};
},
};
</script>
<style lang="scss">
.ant-table-striped :deep(.table-striped) td {
background-color: #fafafa !important;
}
.addliveDrawer {
.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;
.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: #388be1;
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: 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 {
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: #388be1;
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>