fix:合并

This commit is contained in:
wyx
2023-03-09 18:04:10 +08:00
16 changed files with 190 additions and 214 deletions

View File

@@ -10,7 +10,6 @@
<!-- <!--
--> -->
<div id="container"> <div id="container">
<!-- <div id="nav"> <!-- <div id="nav">
<router-link <router-link
v-for="item in routes" v-for="item in routes"
@@ -37,8 +36,7 @@ import {onMounted} from "vue";
import {useRoute} from "vue-router/dist/vue-router"; import {useRoute} from "vue-router/dist/vue-router";
import {USER_INFO} from "@/api/api"; import {USER_INFO} from "@/api/api";
import {IsPhone} from "@/api/utils"; import {IsPhone} from "@/api/utils";
console.log("版本1.2.4------------");
console.log("版本1.2.2------------");
const store = useStore(); const store = useStore();
const { path } = useRoute(); const { path } = useRoute();
onMounted(() => { onMounted(() => {
@@ -51,7 +49,6 @@ onMounted(() => {
} }
} }
}); });
function getUserInfo() { function getUserInfo() {
if (import.meta.env.MODE === "development" || import.meta.env.MODE === "test") { if (import.meta.env.MODE === "development" || import.meta.env.MODE === "test") {
request(USER_INFO, {}).then(res => { request(USER_INFO, {}).then(res => {
@@ -76,22 +73,18 @@ function getUserInfo() {
color: #2c3e50; color: #2c3e50;
height: 100%; height: 100%;
} }
.return { .return {
right: 0 !important; right: 0 !important;
} }
.preNext { .preNext {
right: 115px !important; right: 115px !important;
margin-top: 4px; margin-top: 4px;
} }
#container { #container {
display: flex; display: flex;
width: 100%; width: 100%;
min-height: 100%; min-height: 100%;
background-color: rgba(242, 245, 247, 1); background-color: rgba(242, 245, 247, 1);
// background-color: #ccc; // background-color: #ccc;
#nav { #nav {
width: 220px; width: 220px;
@@ -103,26 +96,22 @@ function getUserInfo() {
box-sizing: border-box; box-sizing: border-box;
background: #f1f1f1; background: #f1f1f1;
box-shadow: 0 5px 15px 8px rgba(1, 22, 54, 0.795); box-shadow: 0 5px 15px 8px rgba(1, 22, 54, 0.795);
.link { .link {
text-decoration: none; text-decoration: none;
color: rgb(0, 0, 0); color: rgb(0, 0, 0);
padding: 10px; padding: 10px;
transition: all 0.4s; transition: all 0.4s;
text-align: center; text-align: center;
&:hover { &:hover {
background: rgba(4, 37, 223, 0.274); background: rgba(4, 37, 223, 0.274);
color: #f1f1f1; color: #f1f1f1;
} }
&.active { &.active {
color: #f1f1f1; color: #f1f1f1;
background: rgba(17, 120, 255, 0.74); background: rgba(17, 120, 255, 0.74);
} }
} }
} }
main { main {
flex: 1; flex: 1;
width: 100%; width: 100%;
@@ -130,4 +119,4 @@ function getUserInfo() {
box-sizing: border-box; box-sizing: border-box;
} }
} }
</style> </style>

View File

@@ -88,7 +88,7 @@ export const QueryDiscussSubmitDetailByDiscussId = '/discussSubmit/queryDiscussS
export const EvaluationToLearn = '/evaluation/evaluationToLearn post' export const EvaluationToLearn = '/evaluation/evaluationToLearn post'
// 个人/小组完成度排行 // 个人/小组完成度排行
export const CompletionList = `/stu/project/rank_list/completion_list` export const CompletionList = `/stu/project/rank_list/project_rank_list`
// 积分排行榜 // 积分排行榜
export const PointList = `/stu/project/rank_list/point_list` export const PointList = `/stu/project/rank_list/point_list`
@@ -124,7 +124,10 @@ export const PostList = `/statement/list`
export const QueryEvaluationTaskStatusOne = `/evaluation/queryEvaluationTaskStatusOne` export const QueryEvaluationTaskStatusOne = `/evaluation/queryEvaluationTaskStatusOne`
// 投票浏览和参与数目 // 投票浏览和参与数目
export const EditVoteInvolvedAndBrowse = `/vote/editVoteInvolvedAndBrowse post` export const EditVoteInvolvedAndBrowse = `/vote/editVoteInvolvedAndBrowse post`
//查询路径关卡列表
export const ROUTER_DETAIL_CHAPTER_LIST = `/stu/router/chapterPcList`

View File

@@ -16,6 +16,10 @@ export function getCookie(name) {
return document.cookie?.split(";").find(e => e.includes(name))?.replace(`${name}=`, '') || '' return document.cookie?.split(";").find(e => e.includes(name))?.replace(`${name}=`, '') || ''
} }
export function delCookie(name){
setCookie(name, "", -1)
}
export function useUserInfo(id) { export function useUserInfo(id) {
const userInfo = ref({}) const userInfo = ref({})
watch(id, () => { watch(id, () => {

View File

@@ -6,24 +6,24 @@
background:`url('${imgAttr.backurl}') no-repeat`, background:`url('${imgAttr.backurl}') no-repeat`,
backgroundSize: 'contain' backgroundSize: 'contain'
}"> }">
<div v-if="detail.chapterDtoList" v-for="(item,i) in detail.chapterDtoList.slice(0,8)" :key="i" class="cha" <div v-if="detail.chapterDtoList" v-for="(item,i) in showList" :key="i" class="cha"
:style="{top:`${imgAttr.positions[i]?.top - (current===i?5:0)}px`,left:`${imgAttr.positions[i]?.left - (current===i?10:0)}px`}"> :style="{top:`${imgAttr.positions[i]?.top - (currentIndex===i?5:0)}px`,left:`${imgAttr.positions[i]?.left - (currentIndex===i?10:0)}px`}">
<div @click="toDetail(i)" <div @click="toDetail(i)"
class="nameClass" class="nameClass"
:title="item.name" :title="item.name"
:style="{ :style="{
background: `url('${current===i?imgAttr.currentBack:imgAttr.nameBack}')`, background: `url('${currentIndex===i?imgAttr.currentBack:imgAttr.nameBack}')`,
backgroundSize:'100%', backgroundSize:'100%',
width:`${current===i?107:93}px`, width:`${currentIndex===i?107:93}px`,
height:`${current===i?imgAttr.cheightC:imgAttr.cheight}px`, height:`${currentIndex===i?imgAttr.cheightC:imgAttr.cheight}px`,
lineHeight:'50px',color: current===i?imgAttr.ccolors:imgAttr.colors}"> lineHeight:'50px',color: currentIndex===i?imgAttr.ccolors:imgAttr.colors}">
{{ item.name }} {{ item.name }}
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<script setup> <script setup>
import {computed, defineProps, ref} from "vue"; import {computed, defineProps, ref, watch} from "vue";
import {ElMessage} from "element-plus"; import {ElMessage} from "element-plus";
import back from '@/assets/image/pathdetails/pathDetailBack.png' import back from '@/assets/image/pathdetails/pathDetailBack.png'
import nameBack from '@/assets/image/pathdetails/pathDetailImg.png' import nameBack from '@/assets/image/pathdetails/pathDetailImg.png'
@@ -113,8 +113,11 @@ const imageAttrs = {
} }
const imgAttr = computed(() => imageAttrs[Object.keys(imageAttrs).find(e => props.img&&props.img.includes(e))] || {}) const imgAttr = computed(() => imageAttrs[Object.keys(imageAttrs).find(e => props.img&&props.img.includes(e))] || {})
console.log(imgAttr)
const current = computed(() => props.detail.chapterDtoList.findIndex(e => e.id === props.detail.currentStageId)) const current = computed(() => props.detail.chapterDtoList.findIndex(e => e.id === props.detail.currentStageId))
//当关卡太多时只显示 当前关卡中间8个
const currentIndex = computed(() => current.value<3?current.value:props.detail.chapterDtoList.length-current.value<=4?(8-(props.detail.chapterDtoList.length-current.value)):3)
const startIndex = computed(() => current.value<3?0:props.detail.chapterDtoList.length-current.value<=4?props.detail.chapterDtoList.length-8:current.value-3)
const showList = computed(() => props.detail.chapterDtoList?.length<=8?props.detail.chapterDtoList:props.detail.chapterDtoList?.slice(startIndex.value,startIndex.value+8))
function show() { function show() {
visiable.value = true visiable.value = true

View File

@@ -51,19 +51,31 @@ function handleChange(file) {
f.uid = file.uid; f.uid = file.uid;
file.raw = f; file.raw = f;
console.log(file.raw) console.log(file.raw)
imageRef.value.submit(); if(file.raw.name.includes('.mp4') || file.raw.name.includes('.MP4')){
files.value = []
emit('update:value', files.value)
ElMessage.error(`暂不支持视频文件上传`);
return
}else if(file.raw.name.includes('.jpeg') || file.raw.name.includes('.JPEG')){
files.value = []
emit('update:value', files.value)
ElMessage.error(`暂不支持jpeg格式图片文件上传`);
return
}else{
imageRef.value.submit();
if (file.response && file.response.code === 200) { if (file.response && file.response.code === 200) {
file.url = file.response.data file.url = file.response.data
} }
const index = files.value.findIndex(f => f.uid === file.uid) const index = files.value.findIndex(f => f.uid === file.uid)
if (index === -1) { if (index === -1) {
files.value.unshift(file) files.value.unshift(file)
} else { } else {
files.value[index] = file files.value[index] = file
} }
emit('update:value', files.value) emit('update:value', files.value)
}
} }
function remove(i) { function remove(i) {

View File

@@ -28,7 +28,7 @@ export default createStore({
if (state.projectInfo.unlockMode === 1) { if (state.projectInfo.unlockMode === 1) {
state.projectInfo.stageProcessList.forEach((t) => { state.projectInfo.stageProcessList.forEach((t) => {
t.statusName = "进行中"; t.statusName = "进行中";
t.taskProcessList?.forEach((s) => s.statusName = (s.status === 1) ? "已完成" : TASK_TYPES.toName[s.type]); t.taskProcessList?.forEach((s) => s.statusName = (s.status === 1) ? "已完成" : s.status === 2 ? (s.statusName = "进行中") : TASK_TYPES.toName[s.type]);
t.taskProcessList?.every((s) => s.status === 1) && (t.statusName = "已完成"); t.taskProcessList?.every((s) => s.status === 1) && (t.statusName = "已完成");
}); });
return; return;
@@ -38,8 +38,8 @@ export default createStore({
const stageState = t.taskProcessList?.some((s) => { const stageState = t.taskProcessList?.some((s) => {
s.unlock = true; s.unlock = true;
s.statusName = "已完成"; s.statusName = "已完成";
s.status === 2 ? (s.statusName = "进行中") : (!s.status && (s.statusName = TASK_TYPES.toName[s.type])); s.status !== 1 && (s.statusName = TASK_TYPES.toName[s.type])
return state.projectInfo.unlockMode === 2 ? s.status !== 1 : (s.status !== 1 && s.flag); return state.projectInfo.unlockMode === 2 ? s.status !== 1 : (s.status !== 1 && s.flag)
}); });
stageState && (t.statusName = "进行中"); stageState && (t.statusName = "进行中");
return stageState; return stageState;
@@ -57,7 +57,7 @@ export default createStore({
} }
state.routerInfo.statusName = "进行中"; state.routerInfo.statusName = "进行中";
if (state.routerInfo.unlockMode === 1) { if (state.routerInfo.unlockMode === 1) {
state.routerInfo.taskBoList?.forEach((s) => s.statusName = (s.status === 1) ? "已完成" : TASK_TYPES.toName[s.type]); state.routerInfo.taskBoList?.forEach((s) => s.statusName = (s.status === 1) ? "已完成" : s.status === 2 ? (s.statusName = "进行中") : TASK_TYPES.toName[s.type]);
state.routerInfo.taskBoList?.every((s) => s.status === 1) && (state.routerInfo.statusName = "已完成"); state.routerInfo.taskBoList?.every((s) => s.status === 1) && (state.routerInfo.statusName = "已完成");
return; return;
} }

View File

@@ -99,6 +99,7 @@
style="width: 140px; height: 140px; border-radius: 8px" style="width: 140px; height: 140px; border-radius: 8px"
:src="value.optionPictureAddress" :src="value.optionPictureAddress"
/> />
<div v-else-if="isExistImg(item.optionDetailList)" style="width: 140px; height: 140px; border-radius: 8px"></div>
<div class="radio"> <div class="radio">
<label @click="choiceQuestion(item,value)"> <label @click="choiceQuestion(item,value)">
<div class="radio-img"> <div class="radio-img">
@@ -219,6 +220,18 @@ const choiceQuestion = (item, value) => {
item.optionDetailList?.forEach(t => t.isAnswer = false); item.optionDetailList?.forEach(t => t.isAnswer = false);
value.isAnswer = true; value.isAnswer = true;
}; };
// 判断当前题目中是否有的选项有图片有的没有
const isExistImg = (data) => {
let exist = false;
data.forEach((i,n)=>{
console.log(i,n)
if(i.optionPictureAddress){
exist = true;
return exist;
}
})
return exist;
}
// 提交投票 // 提交投票
const submitVote = () => { const submitVote = () => {
let nowTime = new Date().getTime(); let nowTime = new Date().getTime();

View File

@@ -118,7 +118,7 @@
<div <div
class="imgone" class="imgone"
:style="{ :style="{
backgroundImage: `url('${img.url}')`, backgroundImage: `url('${fielPath}${img.url}')`,
marginLeft: '15px', marginLeft: '15px',
}" }"
></div> ></div>
@@ -143,7 +143,7 @@
<div class="bottom"> <div class="bottom">
<div v-for="(row, i) in commontList" :key="i" style="margin-bottom: 24px;"> <div v-for="(row, i) in commontList" :key="i" style="margin-bottom: 24px;">
<div class="header"> <div class="header">
<img :src="row.studentAvatar" alt="" srcset="" class="avator"> <img :src="row.studentAvatar.includes('upload') ? row.studentAvatar : fielPath+row.studentAvatar" alt="" srcset="" class="avator">
<div class="id">{{ row.createName }}</div> <div class="id">{{ row.createName }}</div>
<div class="showCareer">{{row.studentJobName}}</div> <div class="showCareer">{{row.studentJobName}}</div>
<div class="idThink"></div> <div class="idThink"></div>
@@ -156,7 +156,7 @@
</div> </div>
<div style="display:flex;margin-top: 12px;margin-bottom: 12px;"> <div style="display:flex;margin-top: 12px;margin-bottom: 12px;">
<div v-if="row.img" v-for="(rowimg, index) in row.img.split(',')" :key="index" style="width:55px;height:55px;margin-right: 12px;"> <div v-if="row.img" v-for="(rowimg, index) in row.img.split(',')" :key="index" style="width:55px;height:55px;margin-right: 12px;">
<img class="image" style="width:55px;height:55px;border-radius: 4px;" :src="rowimg" /> <img class="image" style="width:55px;height:55px;border-radius: 4px;" :src="fielPath+rowimg" />
</div> </div>
</div> </div>
<div class="intime">{{ row.ctime }}</div> <div class="intime">{{ row.ctime }}</div>
@@ -184,16 +184,16 @@
<div v-if="row.children.length!==0" :style="{height:spreadReply==i ? 'auto' : 210 +'px',overflow:'hidden',position: 'relative'}"> <div v-if="row.children.length!==0" :style="{height:spreadReply==i ? 'auto' : 210 +'px',overflow:'hidden',position: 'relative'}">
<div v-for="(replay, j) in row.children" :key="j"> <div v-for="(replay, j) in row.children" :key="j">
<div class="reply"> <div class="reply">
<img :src="replay.studentAvatar" alt="" srcset="" class="sameava avaone"> <img :src="replay.studentAvatar.includes('upload') ? replay.studentAvatar : fielPath+replay.studentAvatar" alt="" srcset="" class="sameava avaone">
<div class="sameuser">{{ replay.studentName }}</div> <div class="sameuser">{{ replay.studentName }}</div>
<div class="centerreply">回复</div> <div class="centerreply">回复</div>
<img :src="replay.targetStudentAvatar" alt="" srcset="" class="sameava avaone"> <img :src="replay.targetStudentAvatar.includes('upload') ? replay.targetStudentAvatar : fielPath+replay.targetStudentAvatar" alt="" srcset="" class="sameava avaone">
<div class="sameuser">{{ replay.targetStudentName }}</div> <div class="sameuser">{{ replay.targetStudentName }}</div>
<div class="replytime">{{ replay.createTime }}</div> <div class="replytime">{{ replay.createTime }}</div>
</div> </div>
<div style="display:flex;margin-top: 12px;margin-bottom: 12px;"> <div style="display:flex;margin-top: 12px;margin-bottom: 12px;">
<div v-if="replay.img" v-for="(rowimg, index) in replay.img.split(',')" :key="index" style="width:65px;height:65px;margin-right: 7px;"> <div v-if="replay.img" v-for="(rowimg, index) in replay.img.split(',')" :key="index" style="width:65px;height:65px;margin-right: 7px;">
<img class="image" style="width:65px;height:65px;border-radius: 4px;" :src="rowimg" /> <img class="image" style="width:65px;height:65px;border-radius: 4px;" :src="fielPath+rowimg" />
</div> </div>
</div> </div>
<div class="mainreply"> <div class="mainreply">
@@ -263,7 +263,7 @@
<div <div
class="imgone" class="imgone"
:style="{ :style="{
backgroundImage: `url('${img.url}')`, backgroundImage: `url('${fielPath}${img.url}')`,
marginLeft: '15px', marginLeft: '15px',
}" }"
></div> ></div>
@@ -324,6 +324,7 @@ import UploadPostImg from "@/components/img/UploadPostImg.vue";
const router = useRouter(); const router = useRouter();
const refInput =ref() const refInput =ref()
const fielPath = ref(import.meta.env.VITE_FILE_PATH);
const getFocus = () => { const getFocus = () => {
refInput.value.focus() refInput.value.focus()
} }

View File

@@ -307,7 +307,7 @@
</template> </template>
<script setup> <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 FileTypeImg from "@/components/FileTypeImg.vue";
import { request, useRequest } from "@/api/request"; import { request, useRequest } from "@/api/request";
import { import {
@@ -343,8 +343,10 @@ const { activeName, enclosure, isAllowSign } = toRefs(state);
const handleClick = (tab, event) => { const handleClick = (tab, event) => {
console.log("附件", tab, event); console.log("附件", tab, event);
}; };
const fielPath = ref(import.meta.env.VITE_FILE_PATH);
const download = (url) => { const download = (url) => {
window.open(url); console.log(fielPath.value+url)
window.open(fielPath.value+url);
}; };
const downloads = (url) => { const downloads = (url) => {
ElMessage.warning("未到开始时间,请耐心等待!"); ElMessage.warning("未到开始时间,请耐心等待!");
@@ -445,8 +447,12 @@ const signClick = () => {
data.value.signFlag = 1; data.value.signFlag = 1;
ElMessage.warning("签到成功"); ElMessage.warning("签到成功");
let taskId = courseId
console.log("taskId:" + taskId)
console.log("courseId:" + courseId)
console.log("请求入参:" + JSON.stringify( { courseId: courseId,taskId: taskId,type:type }))
request(TASK_OFFCOURSE_NOTASK_SIGN, { courseId: courseId }); request(TASK_OFFCOURSE_NOTASK_SIGN, { courseId: courseId,taskId: taskId,type:type });
}; };
function toSurvery() { function toSurvery() {
@@ -467,10 +473,10 @@ function toSurvery() {
router.push({ router.push({
path: "/surveydetail", path: "/surveydetail",
query: { query: {
id: taskId, id: data.value.planDto.id,
courseId: data.value.planDto.evaluateId, courseId: data.value.planDto.assessmentId,
pName: "面授课", pName: "面授课",
infoId: data.value.planDto.offcoursePlanId, infoId: data.value.planDto.id,
chapterOrStageId: 0, chapterOrStageId: 0,
sName: data.value.planDto.name, sName: data.value.planDto.name,
type: 3, type: 3,

View File

@@ -6,8 +6,6 @@
<div>课程列表</div> <div>课程列表</div>
<div style="margin-left: 6px; margin-right: 6px">/</div> <div style="margin-left: 6px; margin-right: 6px">/</div>
<div style="font-weight: 700">课程报名</div> <div style="font-weight: 700">课程报名</div>
<div v-if="pName != ''" class="return"> <div v-if="pName != ''" class="return">
<div style="display: flex" @click="returnclick"> <div style="display: flex" @click="returnclick">
<el-button style="color:#0073FB"><img class="img2" style="margin-right:11px;cursor: pointer;" <el-button style="color:#0073FB"><img class="img2" style="margin-right:11px;cursor: pointer;"
@@ -17,7 +15,6 @@
</div> </div>
</div> </div>
<!-- 面包屑导航 --> <!-- 面包屑导航 -->
<!-- 基本信息 --> <!-- 基本信息 -->
<div class="bascinfo"> <div class="bascinfo">
<div style="display:flex;"> <div style="display:flex;">
@@ -29,8 +26,7 @@
<img style="width: 15px; height: 17px" src="../../assets/image/time.png"/> <img style="width: 15px; height: 17px" src="../../assets/image/time.png"/>
<div style="margin-left: 8px"> <div style="margin-left: 8px">
{{ {{
dayjs(data.planDto?.beginTime).format('YYYY-MM-DD HH:mm') + " 至 " + data.planDto?.beginTime + " 至 " + data.planDto?.endTime
dayjs(data.planDto?.endTime).format('YYYY-MM-DD HH:mm')
}} }}
</div> </div>
</div> </div>
@@ -39,7 +35,23 @@
<div style="margin-left: 8px">{{ data.planDto?.address }}</div> <div style="margin-left: 8px">{{ data.planDto?.address }}</div>
</div> </div>
<div class="time" style="margin-top: 37px"> <div class="time" style="margin-top: 37px">
<el-button class="btn" style="margin-right: 20px;width: 160px;height: 46px;" v-if="data.hasTask || data.planDto.applyFlag" :disabled="dayjs(data.planDto?.endTime) < dayjs(new Date())" @click="onLineSignUp" :style="{ background: (data.isSignUp || (dayjs(data.planDto?.endTime) < dayjs(new Date()))) ? '#999' : 'rgb(57, 146, 249)'}">{{data.isSignUp ?'已报名':'立即报名'}}</el-button> <botton
class="btn"
style="margin-right: 20px;width: 160px;height: 46px;"
v-if="data.planDto.applyFlag"
@click="onLineSignUp(false)"
:style="{ background: isAllowSign?data.isSignUp || data.isRefused ? '#999' : 'rgb(57, 146, 249)':'#999'}">
{{
data.isRefused ? '审核拒绝' : data.isSignUp? '已报名' :'立即报名'
}}
</botton>
<botton
v-if="data.isRefused && !data.isSignUpAgain"
class="btn"
style="margin-right: 20px;width: 160px;height: 46px;"
@click="onLineSignUp(true)">
重新报名
</botton>
</div> </div>
</div> </div>
</div> </div>
@@ -47,7 +59,6 @@
</div> </div>
</div> </div>
<!-- 基本信息 --> <!-- 基本信息 -->
<!-- 详细信息 --> <!-- 详细信息 -->
<div class="detailinfo"> <div class="detailinfo">
<div class="detail"> <div class="detail">
@@ -102,11 +113,9 @@
</button> </button>
</UploadPostImg> </UploadPostImg>
</div> </div>
<button class="btntwo" @click="submitComment" v-loading="submitLoading">发表评论</button> <button class="btntwo" @click="submitComment" v-loading="submitLoading">发表评论</button>
</div> </div>
</div> </div>
<div class="thinline"></div> <div class="thinline"></div>
<div class="bottom"> <div class="bottom">
<div v-for="(row, i) in commontList" :key="i" style="margin-bottom: 24px;"> <div v-for="(row, i) in commontList" :key="i" style="margin-bottom: 24px;">
@@ -198,7 +207,6 @@
</div> </div>
</div> </div>
</div> </div>
<!-- 回复分页 --> <!-- 回复分页 -->
<div style="display:flex;justify-content:center;align-items:center;margin-top:36px;margin-bottom:36px;"> <div style="display:flex;justify-content:center;align-items:center;margin-top:36px;margin-bottom:36px;">
<!-- 分页 --> <!-- 分页 -->
@@ -211,7 +219,6 @@
@current-change="handleCurrentChange" @current-change="handleCurrentChange"
/> />
</div> </div>
<div <div
class="discuss clearfix" class="discuss clearfix"
v-if="commontList && commontList.length"> v-if="commontList && commontList.length">
@@ -256,18 +263,17 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="材料下载" name="four" > <el-tab-pane label="材料下载" name="four" >
<div v-if="data.offcourseDto?.attach == ''" <div v-if="data.planDto?.attach == ''"
style="font-size: 14px;font-weight: 400; line-height: 24px; cursor: pointer;margin-left: 40px; margin-top: 20px;"> style="font-size: 14px;font-weight: 400; line-height: 24px; cursor: pointer;margin-left: 40px; margin-top: 20px;">
此课程无附件 此课程无附件
</div> </div>
<div v-else> <div v-else>
<div v-for="(el, index) in formateArr(data.offcourseDto.attach)" :key="index" class="enclosure" <div v-for="(el, index) in formateArr(data.planDto.attach)" :key="index" class="enclosure"
:style="{ borderBottom: '1px solid rgba(56, 125, 247, 0.2)' }"> :style="{ borderBottom: '1px solid rgba(56, 125, 247, 0.2)' }">
<div class="enclosureL"> <div class="enclosureL">
<FileTypeImg :v-model="el.slice(el.lastIndexOf('/')+1,el.indexOf('-')) + el.slice(el.lastIndexOf('.'))" :style="{ <FileTypeImg :v-model="el.slice(el.lastIndexOf('/')+1,el.indexOf('-')) + el.slice(el.lastIndexOf('.'))" :style="{
@@ -279,12 +285,12 @@
</div> </div>
<div class="download"> <div class="download">
<img style="width: 16px; height: 15px" src="../../assets/image/download.png"/> <img style="width: 16px; height: 15px" src="../../assets/image/download.png"/>
<div style="margin-left: 5px;color:#999;"> <!-- <div style="margin-left: 5px;color:#999;">
下载
</div>
<!-- <div style="margin-left: 5px;color:#999;" @click="download(el)">
下载 下载
</div> --> </div> -->
<div style="margin-left: 5px;color:#2478ff;" @click="download(el)">
下载
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -314,7 +320,6 @@
<!-- 详细信息 --> <!-- 详细信息 -->
</div> </div>
</template> </template>
<script setup> <script setup>
import {computed, reactive, toRefs, watch, onUnmounted, ref} from "vue"; import {computed, reactive, toRefs, watch, onUnmounted, ref} from "vue";
import FileTypeImg from "@/components/FileTypeImg.vue"; import FileTypeImg from "@/components/FileTypeImg.vue";
@@ -322,7 +327,6 @@ import {request, useRequest} from "@/api/request";
import { import {
STU_OFFCOURSE_DETAIL, STU_OFFCOURSE_DETAIL,
FACETEACH_SIGNUP, FACETEACH_SIGNUP,
COMMENT_ADD, COMMENT_ADD,
COMMENT_LIST, COMMENT_LIST,
COMMENT_PRAISE, COMMENT_PRAISE,
@@ -333,7 +337,6 @@ import {useRoute, useRouter} from "vue-router";
import {useUserInfo} from "@/api/utils"; import {useUserInfo} from "@/api/utils";
import {ElMessage, messageConfig} from "element-plus"; import {ElMessage, messageConfig} from "element-plus";
import dayjs from "dayjs"; import dayjs from "dayjs";
const router = useRouter(); const router = useRouter();
const returnclick = () => { const returnclick = () => {
router.back(); router.back();
@@ -341,13 +344,10 @@ const returnclick = () => {
const { const {
query: {courseId, type, id: taskId}, query: {courseId, type, id: taskId},
} = useRoute(); } = useRoute();
const {data = {}} = useRequest(STU_OFFCOURSE_DETAIL, {courseId}); const {data = {}} = useRequest(STU_OFFCOURSE_DETAIL, {courseId});
const teacherInfo = useUserInfo( const teacherInfo = useUserInfo(
computed(() => data.value?.planDto?.teacherId) computed(() => data.value?.planDto?.teacherId)
); );
const state = reactive({ const state = reactive({
activeName: "first", activeName: "first",
enclosure: "", enclosure: "",
@@ -357,21 +357,32 @@ const {activeName, enclosure, isAllowSign} = toRefs(state);
const handleClick = (tab, event) => { const handleClick = (tab, event) => {
console.log("附件", tab, event); console.log("附件", tab, event);
}; };
const fielPath = ref(import.meta.env.VITE_FILE_PATH);
const download = (url) => { const download = (url) => {
// console.log('下载url',url) console.log('下载url',fielPath.value+url)
window.open(url); window.open(fielPath.value+url);
}; };
const downloads = (url) => { const downloads = (url) => {
ElMessage.warning("未在有效时间范围内,请耐心等待!"); ElMessage.warning("未在有效时间范围内,请耐心等待!");
}; };
let timer = null; //判断能否报名 (TODO-大于面授课截止时间就不能报名了,其余均可以)
function isSignClick() {
let endTime = new Date(data.value.planDto?.endTime).getTime()
let nowTime = new Date().getTime();
if (nowTime < endTime) {
state.isAllowSign = true;
} else {
state.isAllowSign = false;
}
console.log(state.isAllowSign)
}
watch(data,()=>{
isSignClick();
})
// 查看更多-展开回复列表 // 查看更多-展开回复列表
function lookMore(i) { function lookMore(i) {
i == spreadReply.value ? spreadReply.value = -1 : spreadReply.value = i; i == spreadReply.value ? spreadReply.value = -1 : spreadReply.value = i;
} }
// 获取评论数据 // 获取评论数据
const hfPage = ref({ const hfPage = ref({
currentPage: 1, currentPage: 1,
@@ -404,7 +415,6 @@ const getData = () => {
submitReplayLoading.value = false; submitReplayLoading.value = false;
}) })
} }
// 回复分页 // 回复分页
function handleCurrentChange(e, k) { function handleCurrentChange(e, k) {
console.log('分页打印', e, k) console.log('分页打印', e, k)
@@ -412,10 +422,7 @@ function handleCurrentChange(e, k) {
hfPage.value.pageNo = e; hfPage.value.pageNo = e;
getData(); getData();
} }
getData() getData()
const disDetail = ref({}); const disDetail = ref({});
const commontList = ref([]); const commontList = ref([]);
const spreadReply = ref(-1); const spreadReply = ref(-1);
@@ -424,7 +431,6 @@ const replayComment = ref({
content: "", content: "",
pid: "", pid: "",
}); });
// 清空回复及评论输入框 // 清空回复及评论输入框
const clearText = () => { const clearText = () => {
disComment.value.content = ""; disComment.value.content = "";
@@ -432,46 +438,36 @@ const clearText = () => {
fileListCommentRelpay.value = []; fileListCommentRelpay.value = [];
replayComment.value.content = ""; replayComment.value.content = "";
} }
// 评论图片展示数组 // 评论图片展示数组
const fileListComment = ref([]); const fileListComment = ref([]);
// 回复图片展示数组 // 回复图片展示数组
const fileListCommentRelpay = ref([]); const fileListCommentRelpay = ref([]);
// 上传图片成功返回的URL // 上传图片成功返回的URL
const uploadBack = (e) => { const uploadBack = (e) => {
console.log('--------->', e) console.log('--------->', e)
fileListComment.value.push(e) fileListComment.value.push(e)
} }
const uploadReplyBack = (e) => { const uploadReplyBack = (e) => {
console.log('--------->', e) console.log('--------->', e)
fileListCommentRelpay.value.push(e) fileListCommentRelpay.value.push(e)
} }
function removeImg(i) { function removeImg(i) {
fileListCommentRelpay.value.splice(i, 1); fileListCommentRelpay.value.splice(i, 1);
} }
function removeCommentImg(i) { function removeCommentImg(i) {
fileListComment.value.splice(i, 1); fileListComment.value.splice(i, 1);
} }
function commentLike(obj) { function commentLike(obj) {
obj.praised ? (obj.praiseNum = Number(obj.praiseNum) - 1) : (obj.praiseNum = Number(obj.praiseNum) + 1); obj.praised ? (obj.praiseNum = Number(obj.praiseNum) - 1) : (obj.praiseNum = Number(obj.praiseNum) + 1);
obj.praised = !obj.praised; obj.praised = !obj.praised;
request(COMMENT_PRAISE, { targetId: obj.id, type: 1 }); request(COMMENT_PRAISE, { targetId: obj.id, type: 1 });
} }
function commentComment(obj) { function commentComment(obj) {
console.log(obj) console.log(obj)
replayComment.value.placeholder = "@ " + obj.createName; replayComment.value.placeholder = "@ " + obj.createName;
replayComment.value.pid = obj.id; replayComment.value.pid = obj.id;
} }
const submitLoading = ref(false); const submitLoading = ref(false);
// 提交评论 // 提交评论
function submitComment() { function submitComment() {
if(disComment.value.content==""){ if(disComment.value.content==""){
@@ -503,9 +499,7 @@ function submitComment() {
console.log(err) console.log(err)
}); });
} }
const submitReplayLoading = ref(false); const submitReplayLoading = ref(false);
// 回复评论 // 回复评论
function submitReplayComment() { function submitReplayComment() {
if(replayComment.value.content==""){ if(replayComment.value.content==""){
@@ -539,24 +533,29 @@ function submitReplayComment() {
submitReplayLoading.value = false; submitReplayLoading.value = false;
}); });
} }
// 报名 // 报名
function onLineSignUp() { function onLineSignUp(isAgain) {
if(data.value.isSignUp){ if (!state.isAllowSign) {
// console.log("data.signFlag", data.value.signFlag, isAllowSign);
ElMessage.warning("未在允许报名时间范围内");
return;
}
if(data.value.isSignUp && !isAgain){
return; return;
} }
request(FACETEACH_SIGNUP, {courseId}) request(FACETEACH_SIGNUP, {courseId})
data.value.isSignUp = true data.value.isSignUp = true
ElMessage.success("报名成功"); //重置按钮
data.value.isSignUpAgain = isAgain;
data.value.isRefused = false;
ElMessage.success(isAgain? "重新报名成功" : "报名成功");
} }
function formateArr(strs) { function formateArr(strs) {
let arrs = strs.split(',') let arrs = strs.split(',')
console.log('112233', arrs) console.log('112233', arrs)
return arrs return arrs
} }
</script> </script>
<!-- Add "scoped" attribute to limit CSS to this component only --> <!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="scss"> <style lang="scss">
.faceteach { .faceteach {
@@ -566,7 +565,6 @@ function formateArr(strs) {
font-size: 14px; font-size: 14px;
line-height: 24px; line-height: 24px;
} }
.bascinfo { .bascinfo {
width: 100%; width: 100%;
height: 310px; height: 310px;
@@ -576,7 +574,6 @@ function formateArr(strs) {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
.btn { .btn {
width: 146px; width: 146px;
height: 46px; height: 46px;
@@ -593,7 +590,6 @@ function formateArr(strs) {
cursor: pointer; cursor: pointer;
margin-right: 96px; margin-right: 96px;
} }
.title { .title {
font-size: 20px; font-size: 20px;
font-weight: 800; font-weight: 800;
@@ -601,7 +597,6 @@ function formateArr(strs) {
line-height: 24px; line-height: 24px;
margin-left: -9px; margin-left: -9px;
} }
.time { .time {
font-size: 14px; font-size: 14px;
color: #6e7b84; color: #6e7b84;
@@ -610,11 +605,9 @@ function formateArr(strs) {
align-items: center; align-items: center;
} }
} }
.return { .return {
position: absolute; position: absolute;
right: 10%; right: 10%;
.text { .text {
text-align: center; text-align: center;
display: flex; display: flex;
@@ -622,37 +615,31 @@ function formateArr(strs) {
align-items: center; align-items: center;
} }
} }
.detailinfo { .detailinfo {
width: 100%; width: 100%;
margin-top: 20px; margin-top: 20px;
display: flex; display: flex;
align-items: flex-start; align-items: flex-start;
.detail { .detail {
flex: 1; flex: 1;
margin-right: 20px; margin-right: 20px;
.detailT { .detailT {
min-height: 263px; min-height: 263px;
background: #ffffff; background: #ffffff;
border-radius: 8px; border-radius: 8px;
color: rgba(51, 51, 51, 1); color: rgba(51, 51, 51, 1);
.title { .title {
display: flex; display: flex;
align-items: center; align-items: center;
padding-top: 39px; padding-top: 39px;
position: relative; position: relative;
} }
.title .text { .title .text {
margin-left: 8px; margin-left: 8px;
font-size: 16px; font-size: 16px;
color: rgba(51, 51, 51, 1); color: rgba(51, 51, 51, 1);
font-weight: 800; font-weight: 800;
} }
.title .box { .title .box {
width: 75px; width: 75px;
height: 10px; height: 10px;
@@ -661,7 +648,6 @@ function formateArr(strs) {
left: 23px; left: 23px;
top: 53px; top: 53px;
} }
.content { .content {
margin-left: 8px; margin-left: 8px;
font-size: 14px; font-size: 14px;
@@ -672,30 +658,25 @@ function formateArr(strs) {
padding-bottom: 30px; padding-bottom: 30px;
} }
} }
.detailB { .detailB {
min-height: 363px; min-height: 363px;
background: #ffffff; background: #ffffff;
border-radius: 8px; border-radius: 8px;
margin-top: 20px; margin-top: 20px;
.wenxintishi { .wenxintishi {
display: flex; display: flex;
justify-content: stretch; justify-content: stretch;
padding: 72px; padding: 72px;
} }
.el-tabs__item { .el-tabs__item {
height: 69px; height: 69px;
padding: 25px 7px 0px 52px; padding: 25px 7px 0px 52px;
font-size: 14px; font-size: 14px;
font-weight: 500; font-weight: 500;
} }
.el-tabs__nav-wrap::after { .el-tabs__nav-wrap::after {
background-color: rgba(56, 125, 247, 0.2); background-color: rgba(56, 125, 247, 0.2);
} }
.enclosure { .enclosure {
height: 89px; height: 89px;
margin-left: 51px; margin-left: 51px;
@@ -704,7 +685,6 @@ function formateArr(strs) {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
.enclosureL { .enclosureL {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -713,7 +693,6 @@ function formateArr(strs) {
color: #677d86; color: #677d86;
line-height: 24px; line-height: 24px;
} }
.download { .download {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -724,7 +703,6 @@ function formateArr(strs) {
cursor: pointer; cursor: pointer;
} }
} }
.work { .work {
margin-left: 51px; margin-left: 51px;
margin-right: 40px; margin-right: 40px;
@@ -733,14 +711,12 @@ function formateArr(strs) {
align-items: center; align-items: center;
margin-top: 37px; margin-top: 37px;
} }
.work .question { .work .question {
font-size: 14px; font-size: 14px;
font-weight: 500; font-weight: 500;
color: #333330; color: #333330;
line-height: 18px; line-height: 18px;
} }
.work .submit { .work .submit {
width: 126px; width: 126px;
height: 46px; height: 46px;
@@ -758,14 +734,12 @@ function formateArr(strs) {
} }
} }
} }
.teacher { .teacher {
width: 434px; width: 434px;
min-height: 500px; min-height: 500px;
// height: 10%; // height: 10%;
background-color: rgba(255, 255, 255, 1); background-color: rgba(255, 255, 255, 1);
border-radius: 8px; border-radius: 8px;
.title { .title {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -773,14 +747,12 @@ function formateArr(strs) {
position: relative; position: relative;
margin-left: 48px; margin-left: 48px;
} }
.title .text { .title .text {
margin-left: 8px; margin-left: 8px;
font-size: 16px; font-size: 16px;
color: rgba(51, 51, 51, 1); color: rgba(51, 51, 51, 1);
font-weight: 800; font-weight: 800;
} }
.title .box { .title .box {
width: 75px; width: 75px;
height: 10px; height: 10px;
@@ -789,7 +761,6 @@ function formateArr(strs) {
left: 23px; left: 23px;
top: 53px; top: 53px;
} }
.teacheritem { .teacheritem {
margin-left: 48px; margin-left: 48px;
margin-right: 48px; margin-right: 48px;
@@ -798,23 +769,19 @@ function formateArr(strs) {
padding: 25px 0px; padding: 25px 0px;
display: flex; display: flex;
position: relative; position: relative;
// align-items: center; // align-items: center;
} }
.teacheritem .peopleimg { .teacheritem .peopleimg {
width: 60px; width: 60px;
height: 60px; height: 60px;
border-radius: 30px; border-radius: 30px;
} }
.teacheritem { .teacheritem {
.nameSpan { .nameSpan {
width: 190px; width: 190px;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
.teacherName { .teacherName {
font-size: 14px; font-size: 14px;
font-weight: bold; font-weight: bold;
@@ -823,17 +790,13 @@ function formateArr(strs) {
align-items: center; align-items: center;
} }
} }
} }
.teacheritem { .teacheritem {
.nameSpan { .nameSpan {
width: 190px; width: 190px;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
.teacherName { .teacherName {
font-size: 14px; font-size: 14px;
font-weight: bold; font-weight: bold;
@@ -842,16 +805,13 @@ function formateArr(strs) {
align-items: center; align-items: center;
} }
} }
} }
.teacheritem .introduce { .teacheritem .introduce {
font-size: 14px; font-size: 14px;
font-weight: 500; font-weight: 500;
color: #394145; color: #394145;
margin-top: 14px; margin-top: 14px;
} }
.teacheritem .follow { .teacheritem .follow {
width: 80px; width: 80px;
height: 30px; height: 30px;
@@ -870,8 +830,6 @@ function formateArr(strs) {
cursor: pointer; cursor: pointer;
} }
} }
} }
} }
.bascinfor { .bascinfor {
@@ -887,7 +845,6 @@ function formateArr(strs) {
// max-height: 110px; // max-height: 110px;
margin-left: 88px; margin-left: 88px;
margin-top: 44px; margin-top: 44px;
.words { .words {
position: absolute; position: absolute;
right: 15px; right: 15px;
@@ -897,7 +854,6 @@ function formateArr(strs) {
font-weight: 500; font-weight: 500;
color: #333330; color: #333330;
} }
.el-textarea__inner { .el-textarea__inner {
font-size: 14px; font-size: 14px;
font-weight: 500; font-weight: 500;
@@ -908,14 +864,12 @@ function formateArr(strs) {
background-color: rgba(245, 246, 247, 1); background-color: rgba(245, 246, 247, 1);
padding: 11px 25px; padding: 11px 25px;
} }
.el-textarea__inner::placeholder { .el-textarea__inner::placeholder {
font-size: 14px; font-size: 14px;
font-weight: 500; font-weight: 500;
color: #666666; color: #666666;
line-height: 24px; line-height: 24px;
} }
// .el-input__inner { // .el-input__inner {
// &::-webkit-input-placeholder { // &::-webkit-input-placeholder {
// /* WebKit browsers 适配谷歌 */ // /* WebKit browsers 适配谷歌 */
@@ -929,7 +883,6 @@ function formateArr(strs) {
.allimg { .allimg {
position: relative; position: relative;
display: flex; display: flex;
.imgone { .imgone {
margin-top: 24px; margin-top: 24px;
width: 55px; width: 55px;
@@ -938,7 +891,6 @@ function formateArr(strs) {
background-image: url(../../assets/image/px.png); background-image: url(../../assets/image/px.png);
background-size: 100%; background-size: 100%;
} }
.cha { .cha {
cursor: pointer; cursor: pointer;
top: 15px; top: 15px;
@@ -952,13 +904,10 @@ function formateArr(strs) {
background-size: 100%; background-size: 100%;
} }
} }
.uploadAnd { .uploadAnd {
margin-top: 21px; margin-top: 21px;
.btwwo { .btwwo {
cursor: pointer; cursor: pointer;
.image { .image {
padding-top: 8px; padding-top: 8px;
width: 18px; width: 18px;
@@ -966,7 +915,6 @@ function formateArr(strs) {
// margin-top: 10px; // margin-top: 10px;
margin-left: -60px; margin-left: -60px;
} }
.shangchuan { .shangchuan {
position: absolute; position: absolute;
right: 20px; right: 20px;
@@ -978,18 +926,15 @@ function formateArr(strs) {
color: #2478ff; color: #2478ff;
line-height: 24px; line-height: 24px;
} }
width: 126px; width: 126px;
height: 36px; height: 36px;
border: none; border: none;
background-color: #fff; background-color: #fff;
} }
.btnone { .btnone {
cursor: pointer; cursor: pointer;
position: absolute; position: absolute;
right: 140px; right: 140px;
.image { .image {
padding-top: 8px; padding-top: 8px;
width: 18px; width: 18px;
@@ -997,7 +942,6 @@ function formateArr(strs) {
// margin-top: 10px; // margin-top: 10px;
margin-left: -60px; margin-left: -60px;
} }
.shangchuan { .shangchuan {
position: absolute; position: absolute;
right: 20px; right: 20px;
@@ -1009,14 +953,12 @@ function formateArr(strs) {
color: #2478ff; color: #2478ff;
line-height: 24px; line-height: 24px;
} }
width: 126px; width: 126px;
height: 36px; height: 36px;
border: 1px solid #2478ff; border: 1px solid #2478ff;
border-radius: 4px; border-radius: 4px;
background-color: #fff; background-color: #fff;
} }
.btntwo { .btntwo {
cursor: pointer; cursor: pointer;
position: absolute; position: absolute;
@@ -1032,7 +974,6 @@ function formateArr(strs) {
} }
} }
} }
.thinline { .thinline {
margin-top: 66px; margin-top: 66px;
// width: 1635px; // width: 1635px;
@@ -1040,7 +981,6 @@ function formateArr(strs) {
margin-left: -50px; margin-left: -50px;
opacity: 0.2; opacity: 0.2;
} }
.bottom { .bottom {
margin-top: 31px; margin-top: 31px;
// width: 100px; // width: 100px;
@@ -1048,7 +988,6 @@ function formateArr(strs) {
// background-color: #bfa; // background-color: #bfa;
.header { .header {
display: flex; display: flex;
.avator { .avator {
width: 41px; width: 41px;
height: 41px; height: 41px;
@@ -1056,7 +995,6 @@ function formateArr(strs) {
// background-image: url(../../assets/image/px.png); // background-image: url(../../assets/image/px.png);
background-size: 100%; background-size: 100%;
} }
.id { .id {
margin-left: 8px; margin-left: 8px;
font-size: 14px; font-size: 14px;
@@ -1065,7 +1003,6 @@ function formateArr(strs) {
color: #333333; color: #333333;
line-height: 41px; line-height: 41px;
} }
.showCareer { .showCareer {
margin-left: 7px; margin-left: 7px;
height: 41px; height: 41px;
@@ -1074,7 +1011,6 @@ function formateArr(strs) {
color: #666666; color: #666666;
line-height: 41px; line-height: 41px;
} }
.idThink { .idThink {
margin-left: 17px; margin-left: 17px;
height: 41px; height: 41px;
@@ -1084,7 +1020,6 @@ function formateArr(strs) {
line-height: 41px; line-height: 41px;
} }
} }
.discuss { .discuss {
margin-left: 48px; margin-left: 48px;
margin-top: 23px; margin-top: 23px;
@@ -1097,7 +1032,6 @@ function formateArr(strs) {
width: 100%; width: 100%;
display: flex; display: flex;
position: relative; position: relative;
.talkmain { .talkmain {
margin-right: 25px; margin-right: 25px;
margin-top: 2px; margin-top: 2px;
@@ -1105,7 +1039,6 @@ function formateArr(strs) {
font-weight: 500; font-weight: 500;
color: #666666; color: #666666;
} }
// .talk { // .talk {
// position: absolute; // position: absolute;
// right: 0; // right: 0;
@@ -1115,33 +1048,27 @@ function formateArr(strs) {
// background-size: 100%; // background-size: 100%;
// } // }
} }
.intime { .intime {
margin-top: 11px; margin-top: 11px;
font-size: 14px; font-size: 14px;
font-weight: 500; font-weight: 500;
color: #999999; color: #999999;
} }
.likeYou { .likeYou {
margin-top: 15px; margin-top: 15px;
display: flex; display: flex;
.same { .same {
width: 14px; width: 14px;
height: 14px; height: 14px;
} }
.pinglun { .pinglun {
background-image: url(../../assets/image/pinglun.png); background-image: url(../../assets/image/pinglun.png);
background-size: 100%; background-size: 100%;
} }
.dianzan { .dianzan {
background-image: url(../../assets/image/dianzan2.png); background-image: url(../../assets/image/dianzan2.png);
background-size: 100%; background-size: 100%;
} }
.count { .count {
margin-left: 7px; margin-left: 7px;
margin-top: -1px; margin-top: -1px;
@@ -1150,7 +1077,6 @@ function formateArr(strs) {
color: #b3bdc4; color: #b3bdc4;
} }
} }
.reply { .reply {
display: flex; display: flex;
margin-top: 32px; margin-top: 32px;
@@ -1162,7 +1088,6 @@ function formateArr(strs) {
height: 29px; height: 29px;
border-radius: 50%; border-radius: 50%;
} }
.sameuser { .sameuser {
margin-left: 14px; margin-left: 14px;
line-height: 29px; line-height: 29px;
@@ -1171,7 +1096,6 @@ function formateArr(strs) {
color: #333333; color: #333333;
font-size: 14px; font-size: 14px;
} }
.centerreply { .centerreply {
height: 29px; height: 29px;
font-size: 14px; font-size: 14px;
@@ -1181,17 +1105,14 @@ function formateArr(strs) {
margin-left: 23px; margin-left: 23px;
margin-right: 17px; margin-right: 17px;
} }
.avaone { .avaone {
// background-image: url(../../assets/image/px.png); // background-image: url(../../assets/image/px.png);
background-size: 100%; background-size: 100%;
} }
.avatwo { .avatwo {
// background-image: url(../../assets/image/px.png); // background-image: url(../../assets/image/px.png);
background-size: 100%; background-size: 100%;
} }
.replytime { .replytime {
margin-left: 17px; margin-left: 17px;
height: 29px; height: 29px;
@@ -1201,11 +1122,9 @@ function formateArr(strs) {
line-height: 29px; line-height: 29px;
} }
} }
.allreplyimg { .allreplyimg {
display: flex; display: flex;
margin-top: 21px; margin-top: 21px;
.singleimg { .singleimg {
margin-right: 7px; margin-right: 7px;
width: 65px; width: 65px;
@@ -1215,11 +1134,9 @@ function formateArr(strs) {
background-size: 100%; background-size: 100%;
} }
} }
.mainreply { .mainreply {
display: flex; display: flex;
margin-top: 16px; margin-top: 16px;
.replydetail { .replydetail {
height: 23px; height: 23px;
font-size: 14px; font-size: 14px;
@@ -1228,9 +1145,7 @@ function formateArr(strs) {
line-height: 23px; line-height: 23px;
margin-right: 11px; margin-right: 11px;
} }
} }
.inreply { .inreply {
position: relative; position: relative;
margin-top: -22px; margin-top: -22px;
@@ -1240,4 +1155,4 @@ function formateArr(strs) {
} }
} }
} }
</style> </style>

View File

@@ -229,7 +229,7 @@
<!-- <div style="font-size: 14px;color: rgba(51, 51, 51, 1);font-weight: 600;">完成度排行榜</div> --> <!-- <div style="font-size: 14px;color: rgba(51, 51, 51, 1);font-weight: 600;">完成度排行榜</div> -->
<el-select @change="choiceStatus" v-model="stateValue" class="m-2" mode="tags" placeholder="完成度排行榜" <el-select @change="choiceStatus" v-model="stateValue" class="m-2" mode="tags" placeholder="完成度排行榜"
style="width: 130px;border: 0px solid red !important; box-shadow:none !important; "> style="width: 130px;border: 0px solid red !important; box-shadow:none !important; ">
<el-option v-for="item in studyProgress" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in studyProgress" :key="item.value" :label="item.label" :value="item.value" :disabled="item.label.includes('小组') && data.groupId==null?true:false" :title="item.label.includes('小组') && data.groupId==null?'当前学员无小组':''"/>
</el-select> </el-select>
</div> </div>
<!-- line --> <!-- line -->
@@ -267,7 +267,7 @@
</div> </div>
<!-- 学员列表 --> <!-- 学员列表 -->
<div> <div>
<div v-for="(item, i) in tableRankData" :key="i" <div v-for="(item, i) in tableRankData.slice(0,5)" :key="i"
style="display: flex;justify-content: center;align-items: center;width: 100%;position: relative;top:-60px;margin-bottom: 38px;"> style="display: flex;justify-content: center;align-items: center;width: 100%;position: relative;top:-60px;margin-bottom: 38px;">
<div <div
style="font-size: 14px;color:rgba(36, 120, 255, 1);font-weight: 600;width:30%;display: flex;justify-content: center;align-items: center;position: relative;"> style="font-size: 14px;color:rgba(36, 120, 255, 1);font-weight: 600;width:30%;display: flex;justify-content: center;align-items: center;position: relative;">
@@ -290,7 +290,7 @@
</div> </div>
<!-- 我的排名 --> <!-- 我的排名 -->
<div v-if="myIndex > tableRankData.length" <div v-if="myIndex > 5"
style="display: flex;justify-content: center;align-items: center;width: 100%;position: relative;top:-60px;margin-bottom: 38px;"> style="display: flex;justify-content: center;align-items: center;width: 100%;position: relative;top:-60px;margin-bottom: 38px;">
<div <div
style="font-size: 14px;color:rgba(36, 120, 255, 1);font-weight: 600;width:30%;display: flex;justify-content: center;align-items: center;"> style="font-size: 14px;color:rgba(36, 120, 255, 1);font-weight: 600;width:30%;display: flex;justify-content: center;align-items: center;">
@@ -306,7 +306,7 @@
</div> </div>
</div> </div>
<div v-if="myIndex > tableRankData.length" <div v-if="myIndex > 5"
style="display: flex;justify-content: center;align-items: center;width: 100%;position: relative;top:-60px;margin-bottom: 38px;"> style="display: flex;justify-content: center;align-items: center;width: 100%;position: relative;top:-60px;margin-bottom: 38px;">
<div <div
style="font-size: 14px;color:rgba(36, 120, 255, 1);font-weight: 600;width:30%;display: flex;justify-content: center;align-items: center;"> style="font-size: 14px;color:rgba(36, 120, 255, 1);font-weight: 600;width:30%;display: flex;justify-content: center;align-items: center;">
@@ -364,7 +364,7 @@ const { commit, dispatch, state } = useStore()
const store = useStore() const store = useStore()
const userInfo = computed(() => state.userInfo) const userInfo = computed(() => state.userInfo)
const data = computed(() => state.projectInfo) const data = computed(() => state.projectInfo)
console.log(data)
onMounted(() => { onMounted(() => {
dispatch('getProjectInfo', { projectId }) dispatch('getProjectInfo', { projectId })
}) })
@@ -407,7 +407,6 @@ const tabChange = (tabs) => {
myIndex.value = res.data.myIndex myIndex.value = res.data.myIndex
myPoint.value = res.data.myPointsCount myPoint.value = res.data.myPointsCount
}) })
tableRankData.value = 12
} }
const myIndex = ref('') const myIndex = ref('')
const myPoint = ref('') const myPoint = ref('')

View File

@@ -52,7 +52,7 @@
</div> </div>
</div> </div>
<template #reference> <template #reference>
<div class="titleR">进入未完成任务</div> <!-- <div class="titleR">进入未完成任务</div>-->
</template> </template>
</el-popover> </el-popover>
</div> </div>

View File

@@ -0,0 +1,33 @@
<template>
<div class="mapdetail">
<PathDetailImage
:img="data?.picUrl"
:detail="data"
></PathDetailImage>
</div>
</template>
<script setup>
import PathDetailImage from "@/components/PathDetailImage.vue";
import {useRequest} from "@/api/request";
import {ROUTER_DETAIL_CHAPTER_LIST} from "@/api/api";
import {useRoute} from "vue-router/dist/vue-router";
const {query:{routerId}} = useRoute()
const {data} = useRequest(ROUTER_DETAIL_CHAPTER_LIST,{routerId})
</script>
<style lang="scss">
.mapdetail {
width: calc(100% - 107px);
min-height: 577px;
background: rgba(242, 245, 247, 0.6);
margin-top: 26px;
border-radius: 8px;
margin-left: 53px;
margin-right: 54px;
display: flex;
align-items: center;
justify-content: center;
}
</style>

View File

@@ -219,7 +219,7 @@
<div class="progress"> <div class="progress">
<div style="width: 291px"> <div style="width: 291px">
<el-progress <el-progress
:percentage="parseInt((((data.currentReqCnt || 0) / (data.totalReqCnt || 1)) * 100) / 20)" :percentage="parseInt((((data.currentReqCnt || 0) / (data.totalReqCnt || 1)) * 100))"
:show-text="false" :stroke-width="8" :color=" :show-text="false" :stroke-width="8" :color="
{ {
0: 'rgba(238, 112, 108, 1)', 0: 'rgba(238, 112, 108, 1)',
@@ -231,21 +231,18 @@
}[parseInt((((data.currentReqCnt || 0) / (data.totalReqCnt || 1)) * 100) / 20)] }[parseInt((((data.currentReqCnt || 0) / (data.totalReqCnt || 1)) * 100) / 20)]
"/> "/>
</div> </div>
<div style=" <div
font-size: 14px; style="font-size: 14px;font-weight: 500;color: #277aff;margin-left: 10px;"
font-weight: 500; :style="{
color: #277aff; color: {
margin-left: 10px; 0: 'rgba(238, 112, 108, 1)',
" :style="{ 1: 'rgba(255, 151, 38, 1)',
color: { 2: 'rgba(39, 122, 255, 1)',
0: 'rgba(238, 112, 108, 1)', 3: 'rgba(59, 94, 251, 1)',
1: 'rgba(255, 151, 38, 1)', 4: 'rgba(57, 219, 183, 1)',
2: 'rgba(39, 122, 255, 1)', 5: 'rgba(57, 219, 183, 1)',
3: 'rgba(59, 94, 251, 1)', }[parseInt((((data.currentReqCnt || 0) / (data.totalReqCnt || 1)) * 100) / 20)],
4: 'rgba(57, 219, 183, 1)', }">
5: 'rgba(57, 219, 183, 1)',
}[parseInt((((data.currentReqCnt || 0) / (data.totalReqCnt || 1)) * 100) / 20)],
}">
{{ parseInt((data.currentReqCnt || 0) / (data.totalReqCnt || 1) * 100) }}% {{ parseInt((data.currentReqCnt || 0) / (data.totalReqCnt || 1) * 100) }}%
</div> </div>
</div> </div>
@@ -473,6 +470,7 @@ async function toFinish(d) {
targetId: data.value.id, targetId: data.value.id,
logo: ROUTER, logo: ROUTER,
type: ROUTER, type: ROUTER,
taskType: d.type,
stageOrChapterId: data.value.currentStageId, stageOrChapterId: data.value.currentStageId,
taskId: d.id, taskId: d.id,
}); });

View File

@@ -348,7 +348,7 @@ const returnclick = () => {
clearInterval(timers) clearInterval(timers)
router.back(); router.back();
}; };
const {nextPage,prevPage,hasPrev, hasNext} = useTaskPage() const {nextPage,prevPage,hasPrev, hasNext} = type==3 ? '' : useTaskPage()
const fielPath = ref(import.meta.env.VITE_FILE_PATH); const fielPath = ref(import.meta.env.VITE_FILE_PATH);
const { data } = useRequest(ASSESSMENT_QUERY(courseId), { id: courseId, type, chapterOrStageId, targetId: infoId ? infoId : 0 }); const { data } = useRequest(ASSESSMENT_QUERY(courseId), { id: courseId, type, chapterOrStageId, targetId: infoId ? infoId : 0 });
console.log(data) console.log(data)

View File

@@ -60,7 +60,7 @@
<!-- <div style="display: flex; align-items: center"></div> --> <!-- <div style="display: flex; align-items: center"></div> -->
<div class="all" style="font-size:14px;color:rgba(51, 51, 48, 1);"> <div class="all" style="font-size:14px;color:rgba(51, 51, 48, 1);">
<div> <div>
{{ state.datainfo.externalExplain ? state.datainfo.externalExplain : "暂无考试说明" }} {{ state.datainfo.examinationExplain ? state.datainfo.examinationExplain : "暂无考试说明" }}
</div> </div>
</div> </div>
</div> </div>