Merge branch 'zcwy-zsx' into 'master'

Zcwy zsx

See merge request !42
This commit is contained in:
joshen
2024-03-01 15:19:00 +08:00
8 changed files with 279 additions and 44 deletions

View File

@@ -282,14 +282,14 @@
<div class="box"></div>
</div>
<!-- todo #面授课接口 讲师缺少img和介绍-->
<div class="teacheritem">
<img class="peopleimg" :src="teacherInfo?.avatar"/>
<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;">
{{ data.planDto?.teacher }}
{{ item.realName }}
</div>
<!-- <div class="introduce">{{ data.planDto?.bandDesc }}</div> -->
<div class="introduce" style="margin: 0;">{{useOrgName(teacherInfo.orgNamePath)}}</div>
<div class="introduce" style="margin: 0;">{{useOrgName(item.orgNamePath)}}</div>
</div>
</div>
</div>
@@ -298,9 +298,9 @@
</template>
<script setup>
import {computed, onBeforeMount, onUnmounted, ref} from "vue";
import {computed, onBeforeMount, onUnmounted, ref,watch} from "vue";
import FileTypeImg from "@/components/FileTypeImg.vue";
import {request, useRequest} from "@/api/request";
import {request, useRequest,boeRequest} from "@/api/request";
import {STU_OFFCOURSE_DETAIL, TASK_OFFCOURSE_NOTASK_SIGN,} from "@/api/api";
import {useRoute, useRouter} from "vue-router";
import {useUserInfo} from "@/api/utils";
@@ -308,6 +308,7 @@ import {ElMessage} from "element-plus";
import dayjs from "dayjs";
import isBetween from "dayjs/plugin/isBetween";
import { useOrgName } from "@/hooks/useOrgName.js";
import {BASE, GET_USER_LIST,GET_USER_INFO_OLDURL} from "@/api/ThirdApi";
const router = useRouter();
@@ -324,7 +325,42 @@ const { data } = useRequest(STU_OFFCOURSE_DETAIL, {
courseId,
usePermission: true,
});
const teacherInfo = useUserInfo(computed(() => data.value?.planDto?.teacherId));
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';
const index = teacherIdsArray.indexOf(userInfo.userId)
userInfo.realName = newVal.planDto.offteachers[index].teacherName
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;
// console.log(userInfo,'userInfo')
// 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?.offteachers[0].teacherId));
const isAllowSign = computed(() => dayjs().isBetween(dayjs(data.value.planDto?.beginTime).subtract(data.value.planDto?.beforeStart || 0, "minute"), dayjs(data.value.planDto?.afterStart ? data.value.planDto?.beginTime : data.value.planDto?.endTime).add(data.value.planDto?.afterStart || 0, "minute")));
const handleClick = (tab, event) => {
@@ -383,6 +419,7 @@ function toSurvery() {
chapterOrStageId: 0,
sName: data.value.planDto.name,
type: 3,
isSubmitTrue:data.value.isSurvery
},
});
}

View File

@@ -94,16 +94,15 @@
<div class="box"></div>
</div>
<!-- todo #面授课接口 讲师缺少img和介绍-->
<div class="teacheritem">
<img class="peopleimg" :src="teacherInfo.avatar"/>
<div class="nameSpan" style="align-items: flex-start;justify-content:flex-start;flex-direction: column;padding-left: 10px;">
<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;">
{{ data.planDto?.teacher }}
{{ item.realName }}
</div>
<!-- <div class="introduce">{{ data.planDto?.bandDesc }}</div> -->
<div class="introduce" style="margin: 0;">{{useOrgName(teacherInfo.orgNamePath)}}</div>
<div class="introduce" style="margin: 0;">{{useOrgName(item.orgNamePath)}}</div>
</div>
<!-- <div class="follow">+ 关注</div>-->
</div>
</div>
</div>
@@ -112,9 +111,9 @@
</template>
<script setup>
import {computed, reactive, toRefs, watch, onUnmounted} from "vue";
import {computed, reactive, toRefs, watch, onUnmounted,ref} from "vue";
import FileTypeImg from "@/components/FileTypeImg.vue";
import {request, useRequest} from "@/api/request";
import {request, useRequest,boeRequest} from "@/api/request";
import {
STU_OFFCOURSE_DETAIL,
FACETEACH_SIGNUP
@@ -124,6 +123,7 @@ 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 = () => {
@@ -134,9 +134,43 @@ const {
} = useRoute();
const {data} = useRequest(STU_OFFCOURSE_DETAIL, {courseId});
const teacherInfo = useUserInfo(
computed(() => data.value?.planDto?.teacherId)
);
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';
const index = teacherIdsArray.indexOf(userInfo.userId)
userInfo.realName = newVal.planDto.offteachers[index].teacherName
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",

View File

@@ -92,14 +92,14 @@
<div class="box"></div>
</div>
<!-- todo #面授课接口 讲师缺少img和介绍-->
<div class="teacheritem">
<img class="peopleimg" :src="teacherInfo.avatar"/>
<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;">
{{ data.planDto?.teacher }}
{{ item.realName }}
</div>
<!-- <div class="introduce">{{ data.planDto?.bandDesc }}</div> -->
<div class="introduce" style="margin: 0;">{{useOrgName(teacherInfo.orgNamePath)}}</div>
<div class="introduce" style="margin: 0;">{{useOrgName(item.orgNamePath)}}</div>
</div>
</div>
</div>
@@ -111,7 +111,7 @@
<script setup>
import {computed, reactive, toRefs, watch, onUnmounted, ref} from "vue";
import FileTypeImg from "@/components/FileTypeImg.vue";
import {request, useRequest} from "@/api/request";
import {request, useRequest,boeRequest} from "@/api/request";
import {
STU_OFFCOURSE_DETAIL,
FACETEACH_SIGNUP
@@ -121,6 +121,7 @@ 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 = () => {
@@ -131,7 +132,40 @@ const {
} = 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';
const index = teacherIdsArray.indexOf(userInfo.userId)
userInfo.realName = newVal.planDto.offteachers[index].teacherName
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");

View File

@@ -302,15 +302,15 @@
<div class="box"></div>
</div>
<!-- todo #面授课接口 讲师缺少img和介绍-->
<div class="teacheritem">
<img class="peopleimg" :src="teacherInfo.avatar"/>
<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;">
{{ data.planDto?.teacher }}
{{ item.realName }}
</div>
<div class="introduce" style="margin: 0;">{{useOrgName(teacherInfo.orgNamePath)}}</div>
<!-- <div class="introduce">{{ data.planDto?.bandDesc }}</div> -->
<div class="introduce" style="margin: 0;">{{useOrgName(item.orgNamePath)}}</div>
</div>
<!-- <div class="follow">+ 关注</div>-->
</div>
</div>
</div>
@@ -320,7 +320,7 @@
<script setup>
import {computed, reactive, toRefs, watch, onUnmounted, ref, onBeforeMount} from "vue";
import FileTypeImg from "@/components/FileTypeImg.vue";
import {request, useRequest} from "@/api/request";
import {request, useRequest,boeRequest} from "@/api/request";
import {
STU_OFFCOURSE_DETAIL,
FACETEACH_SIGNUP,
@@ -336,6 +336,7 @@ import {ElMessage, messageConfig} from "element-plus";
import dayjs from "dayjs";
import isBetween from "dayjs/plugin/isBetween";
import { useOrgName } from "@/hooks/useOrgName.js";
import {BASE, GET_USER_LIST,GET_USER_INFO_OLDURL} from "@/api/ThirdApi";
const router = useRouter();
onBeforeMount(() => dayjs.extend(isBetween));
@@ -345,7 +346,40 @@ const returnclick = () => {
const { query: {courseId} } = useRoute();
const {data = {}} = useRequest(STU_OFFCOURSE_DETAIL, {courseId});
console.log(data.value);
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';
const index = teacherIdsArray.indexOf(userInfo.userId)
userInfo.realName = newVal.planDto.offteachers[index].teacherName
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 isCourseEnd = computed(() => dayjs(data.value.planDto?.endTime).isBefore(dayjs()));

View File

@@ -65,6 +65,22 @@
@click="signClick"
>{{ data.signFlag ? "已签到" : "签到" }}
</botton>
<botton
v-if="data.planDto?.evalFlag !== 0"
:style="{
background: `${
new Date(data.planDto?.beginTime).getTime() >
new Date().getTime()
? '#999'
: data.isSurvery
? '#999'
: 'rgb(57, 146, 249)'
}`,
}"
class="btn"
@click="toSurvery"
>{{ data.isSurvery ? "已评估" : "评估" }}
</botton>
</div>
</div>
</div>
@@ -132,14 +148,14 @@
<div class="text">面授课讲师</div>
<div class="box"></div>
</div>
<div class="teacheritem">
<img class="peopleimg" :src="teacherInfo.avatar"/>
<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;">
{{ data.planDto?.teacher }}
{{ item.realName }}
</div>
<!-- <div class="introduce">{{ data.planDto?.bandDesc }}</div> -->
<div class="introduce" style="margin: 0;">{{useOrgName(teacherInfo.orgNamePath)}}</div>
<div class="introduce" style="margin: 0;">{{useOrgName(item.orgNamePath)}}</div>
</div>
</div>
</div>
@@ -148,9 +164,9 @@
</template>
<script setup>
import {computed, onBeforeMount, onUnmounted, ref} from "vue";
import {computed, onBeforeMount, onUnmounted, ref,watch} from "vue";
import FileTypeImg from "@/components/FileTypeImg.vue";
import {request, useRequest} from "@/api/request";
import {request, useRequest,boeRequest} from "@/api/request";
import {STU_OFFCOURSE_DETAIL, TASK_OFFCOURSE_NOTASK_SIGN,} from "@/api/api";
import {useRoute, useRouter} from "vue-router";
import {useUserInfo} from "@/api/utils";
@@ -158,6 +174,7 @@ import {ElMessage} from "element-plus";
import dayjs from "dayjs";
import isBetween from "dayjs/plugin/isBetween";
import { useOrgName } from "@/hooks/useOrgName.js";
import {BASE, GET_USER_LIST,GET_USER_INFO_OLDURL} from "@/api/ThirdApi";
const router = useRouter();
@@ -168,6 +185,40 @@ const returnclick = () => router.back();
const { query: { courseId }} = useRoute();
const { data } = useRequest(STU_OFFCOURSE_DETAIL, { courseId, usePermission: true, });
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';
const index = teacherIdsArray.indexOf(userInfo.userId)
userInfo.realName = newVal.planDto.offteachers[index].teacherName
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 isAllowSign = computed(() => dayjs().isBetween(dayjs(data.value?.planDto?.beginTime).subtract(data.value?.planDto?.beforeStart || 0, "minute"), dayjs(data.value?.planDto?.afterStart ? data.value?.planDto?.beginTime : data.value?.planDto?.endTime).add(data.value?.planDto?.afterStart || 0, "minute")));
@@ -199,6 +250,28 @@ const signClick = () => {
ElMessage.warning("签到成功");
request(TASK_OFFCOURSE_NOTASK_SIGN, { courseId: courseId, taskId: courseId, type: 3 });
};
function toSurvery() {
if (dayjs().isBefore(data.value.planDto.beginTime)) {
ElMessage.warning("课程未开始,请耐心等待!");
return;
}
if (!data.value.planDto.evalFlag) {
ElMessage.warning("此课程无评估");
return;
}
router.push({
path: "/surveydetail",
query:{
id: data.value.planDto.id,
courseId: data.value.planDto.assessmentId,
pName: "面授课",
infoId: data.value.planDto.id,
chapterOrStageId: 0,
sName: data.value.planDto.name,
type: 3,
}
});
}
</script>
<style lang="scss">

View File

@@ -199,7 +199,7 @@
</div>
<!-- 个人信息及学习进度 -->
<!-- 学员积分及个人完成度排行榜 -->
<div class="detailRB">
<div class="detailRB" v-if="data.rankFlag">
<div class="info">
<div
style="display:flex;justify-content: space-between;align-items: center;height: 56px;padding-left: 27px;padding-right: 27px;">
@@ -757,7 +757,7 @@ function continueLearn(lastLearnedId) {
z-index: 9;
}
.el-popper {
// z-index: 0 !important;
z-index: 0 !important;
}
.pathdetails {
.el-dialog__body{

View File

@@ -34,6 +34,11 @@
<!-- 标题 -->
<!-- 基本信息 -->
<div class="bascinfo">
<div class="header_wrap" v-if="data.projectInfoList&&type!=1">
<div class="header_wrap_item" v-if="level!=0">项目名称{{ data.projectInfoList[0].projectName }}</div>
<div class="header_wrap_item">开课名称{{ data.projectInfoList[0].courseName }}</div>
<div>培训讲师{{ data.projectInfoList.map(item => item.teacherName).join('') }}</div>
</div>
<div>
<div class="question" v-for="(value, index) in questionList " :key="index"
:style="{ 'margin-top': index === 0 ? '57px' : '41px' }">
@@ -176,7 +181,7 @@
</div>
<el-dialog v-model="centerDialogVisible" title="" width="20%" center :show-close="false" :align-center="true">
<div style="text-align: center;font-size:16px;"> <span style="color:black">
提交成功
您已完成评估
</span></div>
<template #footer>
<span class="dialog-footer">
@@ -222,7 +227,7 @@ import dayjs from "dayjs";
import {useTaskPage} from "@/api/useCommon";
const {
query: { courseId, id: taskId, infoId, type, pName, sName, chapterOrStageId, projectStatus, projectEndTime },
query: { courseId, id: taskId, infoId, type, pName, sName, chapterOrStageId, projectStatus, projectEndTime,isSubmitTrue,level },
} = useRoute();
const router = useRouter();
const returnclick = () => {
@@ -236,7 +241,7 @@ const { data } = useRequest(ASSESSMENT_QUERY(courseId), {
chapterOrStageId,
targetId: infoId ? infoId : 0
});
console.log(data,'data')
// 答题时间
const answerTime = dayjs(new Date()).format("YYYY-MM-DD HH:mm:ss");
@@ -275,6 +280,10 @@ function orderArr(a, b) {
return arrs;
}
onMounted(() => {
if(isSubmitTrue==true){
open();
return
}
useRequest(ASSESSMENT_QUERY(courseId), {
id: courseId,
type,
@@ -421,7 +430,15 @@ function submit() {
display: flex;
flex-direction: column;
align-items: center;
.header_wrap{
margin: 10px 0 0 0;
padding: 5px 0 5px 10px;
background: #fff;
margin-left: -680px;
.header_wrap_item{
margin-bottom: 5px;
}
}
.question .text {
font-size: 16px;
font-weight: 500;

View File

@@ -167,7 +167,13 @@ export default defineConfig(({ command, mode }) =>
},'/vote/editVoteInvolvedAndBrowse': {
target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true,
}
},'/stu/project/process': {
target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true,
},'/stu/project/rank_list/point_list': {
target: loadEnv(mode, process.cwd()).VITE_PROXY_URL,
changeOrigin: true,
},
}
}
})