mirror of
https://codeup.aliyun.com/67762337eccfc218f6110e0e/vue/fe-student.git
synced 2025-12-10 03:16:47 +08:00
524 lines
14 KiB
Vue
524 lines
14 KiB
Vue
<template>
|
|
<div style=" background: #0078fc;height: 150px;width: 100%;position: absolute;top: 0;z-index:-9999;"></div>
|
|
<div class="faceteachnocommon" style="padding: 30px">
|
|
<!-- 面包屑导航 -->
|
|
<div class="crumb">
|
|
<div>课程列表</div>
|
|
<div style="margin-left: 6px; margin-right: 6px">/</div>
|
|
<div style="font-weight: 700">课程报名</div>
|
|
|
|
|
|
<div v-if="pName != ''" class="return">
|
|
<div style="display: flex" @click="returnclick">
|
|
<el-button style="color:#0073FB"><img class="img2" style="margin-right:11px;cursor: pointer;"
|
|
src="../../assets/image/return.png"/>返回
|
|
</el-button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- 面包屑导航 -->
|
|
|
|
<!-- 基本信息 -->
|
|
<div class="bascinfo">
|
|
<div style="display:flex;">
|
|
<img style="width:405px;height:230px;margin-left: 48px;border-radius: 8px;margin-top: 40px;"
|
|
:src="data.offcourseDto.picUrl" alt="">
|
|
<div style="margin-left: 40px;margin-top: 56px;">
|
|
<div class="title">【面授课】{{ data.planDto?.name }}</div>
|
|
<!-- <div class="time" style="margin-top: 30px">
|
|
<img style="width: 15px; height: 17px" src="../../assets/image/time.png"/>
|
|
<div style="margin-left: 8px">
|
|
{{
|
|
dayjs(data.planDto?.beginTime).format('YYYY-MM-DD HH:MM') + " 至 " +
|
|
dayjs(data.planDto?.endTime).format('YYYY-MM-DD HH:MM')
|
|
}}
|
|
</div>
|
|
</div>
|
|
<div v-if="data.planDto.address" class="time" style="margin-top: 10px">
|
|
<img style="width: 16px; height: 18px" src="../../assets/image/position.png"/>
|
|
<div style="margin-left: 8px">{{ data.planDto?.address }}</div>
|
|
</div> -->
|
|
<!-- <div class="time" style="margin-top: 37px"> -->
|
|
<botton class="btn" style="margin-right: 20px;width: 160px;height: 46px;margin-top: 37px;" v-if="data.planDto.applyFlag" @click="onLineSignUp" :style="{ background: data.isSignUp ? '#999' : 'rgb(57, 146, 249)'}">{{data.isSignUp?'已报名':'立即报名'}}</botton>
|
|
</div>
|
|
</div>
|
|
<div style="display: flex">
|
|
</div>
|
|
</div>
|
|
<!-- 基本信息 -->
|
|
|
|
<!-- 详细信息 -->
|
|
<div class="detailinfo">
|
|
<div class="detail">
|
|
<div class="detailB">
|
|
<el-tabs v-model="activeName" @tab-click="handleClick">
|
|
<el-tab-pane label="内容简介" name="first">
|
|
<div class="notice" style="padding:20px;font-size:14px;">
|
|
{{ data.offcourseDto?.intro || "暂无内容简介" }}
|
|
</div>
|
|
</el-tab-pane>
|
|
<el-tab-pane label="课程速览" name="second">
|
|
<div style="display: flex; align-items: center">
|
|
<div style="padding:20px;" class="content" v-html="data.offcourseDto?.outline"></div>
|
|
</div>
|
|
</el-tab-pane>
|
|
<!-- <el-tab-pane label="课程评论" name="third" :disabed=dayjs().isBefore(dayjs(data.planDto.beginTime))>
|
|
|
|
</el-tab-pane> -->
|
|
<!-- <el-tab-pane label="材料下载" name="third" >
|
|
<div v-if="!data.offcourseDto?.attach"
|
|
style="font-size: 14px;font-weight: 400; line-height: 24px; cursor: pointer;margin-left: 40px; margin-top: 20px;">
|
|
此课程无附件
|
|
</div>
|
|
<div v-else>
|
|
<div v-for="(el, index) in formateArr(data.offcourseDto.attach)" :key="index" class="enclosure"
|
|
:style="{ borderBottom: '1px solid rgba(56, 125, 247, 0.2)' }">
|
|
<div class="enclosureL">
|
|
<FileTypeImg :v-model="el.slice(el.lastIndexOf('/')+1,el.indexOf('-')) + el.slice(el.lastIndexOf('.'))" :style="{
|
|
width: '22px',
|
|
height: '26px',
|
|
marginLeft: '10px',
|
|
}"></FileTypeImg>
|
|
<div style="margin-left: 20px">{{ el.slice(el.lastIndexOf('/')+1,el.indexOf('-')) + el.slice(el.lastIndexOf('.')) }}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</el-tab-pane> -->
|
|
</el-tabs>
|
|
</div>
|
|
</div>
|
|
<div class="teacher">
|
|
<div class="title">
|
|
<img style="width: 21px; height: 23px" src="../../assets/image/livelecturer.png"/>
|
|
<div class="text">面授课讲师</div>
|
|
<div class="box"></div>
|
|
</div>
|
|
<!-- todo #面授课接口 讲师缺少img和介绍-->
|
|
<div class="teacheritem" v-for="(item,index) in teacherItem">
|
|
<img class="peopleimg" :src="item.avatar"/>
|
|
<div class="nameSpan" style="align-items: flex-start;justify-content:flex-start;flex-direction: column;padding-left: 10px;">
|
|
<div class="teacherName" style="padding: 5px 0;">
|
|
{{ item.realName }}
|
|
</div>
|
|
<!-- <div class="introduce">{{ data.planDto?.bandDesc }}</div> -->
|
|
<div class="introduce" style="margin: 0;">{{useOrgName(item.orgNamePath)}}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- 详细信息 -->
|
|
</div>
|
|
</template>
|
|
|
|
<script setup>
|
|
import {computed, reactive, toRefs, watch, onUnmounted,ref} from "vue";
|
|
import FileTypeImg from "@/components/FileTypeImg.vue";
|
|
import {request, useRequest,boeRequest} from "@/api/request";
|
|
import {
|
|
STU_OFFCOURSE_DETAIL,
|
|
FACETEACH_SIGNUP
|
|
} from "@/api/api";
|
|
import {useRoute, useRouter} from "vue-router";
|
|
import {useUserInfo} from "@/api/utils";
|
|
import {ElMessage, messageConfig} from "element-plus";
|
|
import dayjs from "dayjs";
|
|
import { useOrgName } from "@/hooks/useOrgName.js";
|
|
import {BASE, GET_USER_LIST,GET_USER_INFO_OLDURL} from "@/api/ThirdApi";
|
|
|
|
const router = useRouter();
|
|
const returnclick = () => {
|
|
router.back();
|
|
};
|
|
const {
|
|
query: {courseId, type, id: taskId},
|
|
} = useRoute();
|
|
|
|
const {data} = useRequest(STU_OFFCOURSE_DETAIL, {courseId});
|
|
watch(data, (newVal) => {
|
|
// newVal.planDto.offteachers.map(item => teacherInfos(item.teacherId));
|
|
const teacherIdsArray = newVal.planDto.offteachers.map(item => item.teacherId);
|
|
const teacherItemArr = []
|
|
teacherIdsArray.forEach(id => {
|
|
teacherItemArr.push(boeRequest(GET_USER_INFO_OLDURL, { userId: id }))
|
|
})
|
|
Promise.all(teacherItemArr).then(responses => {
|
|
responses.map((arr)=>{
|
|
const userInfo = arr.result;
|
|
userInfo.avatar = userInfo?.avatar
|
|
? userInfo?.avatar.includes('upload')
|
|
? userInfo?.avatar
|
|
: '/upload' + userInfo?.avatar
|
|
: '/800e23f7-b58c-4192-820d-0c6a2b7544cc.png';
|
|
teacherItem.value.push(userInfo)
|
|
})
|
|
}).catch(error => {
|
|
console.log(error)
|
|
})
|
|
});
|
|
const teacherItem = ref([])
|
|
// const teacherInfos = async (id) => {
|
|
// const res = await boeRequest(GET_USER_INFO_OLDURL, { userId: id });
|
|
// const userInfo = res.result;
|
|
// userInfo.avatar = userInfo.avatar
|
|
// ? userInfo.avatar.includes('upload')
|
|
// ? userInfo.avatar
|
|
// : '/upload' + userInfo.avatar
|
|
// : '/800e23f7-b58c-4192-820d-0c6a2b7544cc.png';
|
|
// teacherItem.value.push(userInfo)
|
|
// };
|
|
// const teacherInfo = useUserInfo(
|
|
// computed(() => data.value?.planDto?.teacherId)
|
|
// );
|
|
|
|
const state = reactive({
|
|
activeName: "first",
|
|
enclosure: "",
|
|
isAllowSign: false,
|
|
});
|
|
const {activeName, enclosure, isAllowSign} = toRefs(state);
|
|
const handleClick = (tab, event) => {
|
|
console.log("附件", tab, event);
|
|
};
|
|
const download = (url) => {
|
|
console.log('下载url',url)
|
|
};
|
|
const downloads = (url) => {
|
|
ElMessage.warning("未在有效时间范围内,请耐心等待!");
|
|
};
|
|
let timer = null;
|
|
|
|
// 报名
|
|
function onLineSignUp() {
|
|
if(data.value.isSignUp){
|
|
return;
|
|
}
|
|
request(FACETEACH_SIGNUP, {courseId})
|
|
data.value.isSignUp = true
|
|
ElMessage.success("报名成功");
|
|
}
|
|
|
|
function formateArr(strs) {
|
|
let arrs = strs.split(',')
|
|
return arrs
|
|
}
|
|
</script>
|
|
|
|
<!-- Add "scoped" attribute to limit CSS to this component only -->
|
|
<style lang="scss">
|
|
.faceteachnocommon {
|
|
.crumb {
|
|
color: #fff;
|
|
display: flex;
|
|
font-size: 14px;
|
|
line-height: 24px;
|
|
}
|
|
|
|
.bascinfo {
|
|
width: 100%;
|
|
height: 310px;
|
|
border-radius: 8px;
|
|
background-color: rgba(255, 255, 255, 1);
|
|
margin-top: 37px;
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
|
|
.btn {
|
|
width: 146px;
|
|
height: 46px;
|
|
background: #2478ff;
|
|
border-radius: 4px;
|
|
box-shadow: 0px 1px 8px 0px rgba(56, 125, 247, 0.7);
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
color: #fff;
|
|
font-size: 14px;
|
|
font-weight: 800;
|
|
line-height: 24px;
|
|
cursor: pointer;
|
|
margin-right: 96px;
|
|
}
|
|
|
|
.title {
|
|
font-size: 20px;
|
|
font-weight: 800;
|
|
color: #333333;
|
|
line-height: 24px;
|
|
margin-left: -9px;
|
|
}
|
|
|
|
.time {
|
|
font-size: 14px;
|
|
color: #6e7b84;
|
|
line-height: 24px;
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
}
|
|
|
|
.return {
|
|
position: absolute;
|
|
right: 10%;
|
|
|
|
.text {
|
|
text-align: center;
|
|
display: flex;
|
|
flex-direction: row;
|
|
align-items: center;
|
|
}
|
|
}
|
|
|
|
.detailinfo {
|
|
width: 100%;
|
|
margin-top: 20px;
|
|
display: flex;
|
|
align-items: flex-start;
|
|
|
|
.detail {
|
|
flex: 1;
|
|
margin-right: 20px;
|
|
|
|
.detailT {
|
|
min-height: 263px;
|
|
background: #ffffff;
|
|
border-radius: 8px;
|
|
color: rgba(51, 51, 51, 1);
|
|
|
|
.title {
|
|
display: flex;
|
|
align-items: center;
|
|
padding-top: 39px;
|
|
position: relative;
|
|
}
|
|
|
|
.title .text {
|
|
margin-left: 8px;
|
|
font-size: 16px;
|
|
color: rgba(51, 51, 51, 1);
|
|
font-weight: 800;
|
|
}
|
|
|
|
.title .box {
|
|
width: 75px;
|
|
height: 10px;
|
|
background-color: rgba(36, 120, 255, 0.15);
|
|
position: absolute;
|
|
left: 23px;
|
|
top: 53px;
|
|
}
|
|
|
|
.content {
|
|
margin-left: 8px;
|
|
font-size: 14px;
|
|
color: rgba(51, 51, 48, 1);
|
|
font-weight: 500;
|
|
line-height: 35px;
|
|
margin-top: 30px;
|
|
padding-bottom: 30px;
|
|
}
|
|
}
|
|
|
|
.detailB {
|
|
min-height: 363px;
|
|
background: #ffffff;
|
|
border-radius: 8px;
|
|
margin-top: 20px;
|
|
|
|
.wenxintishi {
|
|
display: flex;
|
|
justify-content: stretch;
|
|
padding: 72px;
|
|
}
|
|
|
|
.el-tabs__item {
|
|
height: 69px;
|
|
padding: 25px 7px 0px 52px;
|
|
font-size: 14px;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.el-tabs__nav-wrap::after {
|
|
background-color: rgba(56, 125, 247, 0.2);
|
|
}
|
|
|
|
.enclosure {
|
|
height: 89px;
|
|
margin-left: 51px;
|
|
margin-right: 40px;
|
|
// border-bottom: 1px solid rgba(56, 125, 247, 0.2);
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
|
|
.enclosureL {
|
|
display: flex;
|
|
align-items: center;
|
|
font-size: 14px;
|
|
font-weight: 400;
|
|
color: #677d86;
|
|
line-height: 24px;
|
|
}
|
|
|
|
.download {
|
|
display: flex;
|
|
align-items: center;
|
|
font-size: 16px;
|
|
font-weight: 400;
|
|
color: #2478ff;
|
|
line-height: 24px;
|
|
cursor: pointer;
|
|
}
|
|
}
|
|
|
|
.work {
|
|
margin-left: 51px;
|
|
margin-right: 40px;
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
margin-top: 37px;
|
|
}
|
|
|
|
.work .question {
|
|
font-size: 14px;
|
|
font-weight: 500;
|
|
color: #333330;
|
|
line-height: 18px;
|
|
}
|
|
|
|
.work .submit {
|
|
width: 126px;
|
|
height: 46px;
|
|
background: #2478ff;
|
|
box-shadow: 0px 1px 8px 0px rgba(56, 125, 247, 0.7);
|
|
border-radius: 4px;
|
|
font-size: 16px;
|
|
font-weight: 800;
|
|
color: #ffffff;
|
|
line-height: 24px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
cursor: pointer;
|
|
}
|
|
}
|
|
}
|
|
|
|
.teacher {
|
|
width: 434px;
|
|
min-height: 500px;
|
|
// height: 10%;
|
|
background-color: rgba(255, 255, 255, 1);
|
|
border-radius: 8px;
|
|
|
|
.title {
|
|
display: flex;
|
|
align-items: center;
|
|
padding-top: 39px;
|
|
position: relative;
|
|
margin-left: 48px;
|
|
}
|
|
|
|
.title .text {
|
|
margin-left: 8px;
|
|
font-size: 16px;
|
|
color: rgba(51, 51, 51, 1);
|
|
font-weight: 800;
|
|
}
|
|
|
|
.title .box {
|
|
width: 75px;
|
|
height: 10px;
|
|
background-color: rgba(36, 120, 255, 0.15);
|
|
position: absolute;
|
|
left: 23px;
|
|
top: 53px;
|
|
}
|
|
|
|
.teacheritem {
|
|
margin-left: 48px;
|
|
margin-right: 48px;
|
|
// min-height: 115px;
|
|
margin-top: 20px;
|
|
padding: 25px 0px;
|
|
display: flex;
|
|
position: relative;
|
|
|
|
// align-items: center;
|
|
}
|
|
|
|
.teacheritem .peopleimg {
|
|
width: 60px;
|
|
height: 60px;
|
|
border-radius: 30px;
|
|
}
|
|
|
|
.teacheritem {
|
|
.nameSpan {
|
|
width: 190px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
|
|
.teacherName {
|
|
font-size: 14px;
|
|
font-weight: bold;
|
|
color: #394145;
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
.teacheritem {
|
|
.nameSpan {
|
|
width: 190px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
|
|
.teacherName {
|
|
font-size: 14px;
|
|
font-weight: bold;
|
|
color: #394145;
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
.teacheritem .introduce {
|
|
font-size: 14px;
|
|
font-weight: 500;
|
|
color: #394145;
|
|
margin-top: 14px;
|
|
}
|
|
|
|
.teacheritem .follow {
|
|
width: 80px;
|
|
height: 30px;
|
|
background: #387df7;
|
|
border-radius: 4px;
|
|
margin-top: 28px;
|
|
position: absolute;
|
|
right: -25px;
|
|
font-size: 14px;
|
|
font-weight: 500;
|
|
color: #ffffff;
|
|
line-height: 24px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
cursor: pointer;
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
</style>
|