mirror of
https://codeup.aliyun.com/67762337eccfc218f6110e0e/vue/fe-student.git
synced 2025-12-07 18:06:48 +08:00
515 lines
14 KiB
Vue
515 lines
14 KiB
Vue
<template>
|
||
<div style=" background: #0078fc;height: 150px;width: 100%;position: absolute;top: 0;z-index:-9999;"></div>
|
||
<div class="faceteach" 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" style="height: 310px;">
|
||
<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: 260px;height: 46px;" :style="{ background: '#999'}">当前任务暂未开放,请联系管理员</botton>
|
||
</div>
|
||
</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" >
|
||
<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 activeName = ref("first");
|
||
|
||
const handleClick = (tab, event) => {
|
||
console.log("附件", tab, event);
|
||
};
|
||
const download = (url) => {
|
||
window.open(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(',')
|
||
console.log('112233', arrs)
|
||
return arrs
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss">
|
||
.faceteach {
|
||
.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>
|