|
@@ -1,74 +1,82 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <div
|
|
|
|
|
- class="card_item">
|
|
|
|
|
- <!-- 顶部区域:图标 + 标题 -->
|
|
|
|
|
- <div class="card_header">
|
|
|
|
|
- <!-- 模拟图片中的文档图标 -->
|
|
|
|
|
- <span class="card_img">
|
|
|
|
|
- <img :src="questionnaireCardIcon" alt=""/>
|
|
|
|
|
- </span>
|
|
|
|
|
- <span class="card_title two_line_ellipsis">{{ questionnaire.title }}</span>
|
|
|
|
|
-
|
|
|
|
|
- <el-switch
|
|
|
|
|
- :model-value="Boolean(questionnaire.openStatus)"
|
|
|
|
|
- v-if="showSwitch"
|
|
|
|
|
- @change="(newVal)=>HandleOnOffChange(newVal,questionnaire.openStatus,questionnaire)"
|
|
|
|
|
- style="--el-switch-on-color: #2e64fa; --el-switch-off-color: #bbbbbb"
|
|
|
|
|
- />
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <div class="questionnaire_list">
|
|
|
|
|
+ <div v-for="questionnaire in questionnaireList"
|
|
|
|
|
+ :key="questionnaire.id" class="card_item">
|
|
|
|
|
+ <!-- 顶部区域:图标 + 标题 -->
|
|
|
|
|
+ <div class="card_header">
|
|
|
|
|
+ <!-- 模拟图片中的文档图标 -->
|
|
|
|
|
+ <span class="card_img">
|
|
|
|
|
+ <img :src="questionnaireCardIcon" alt=""/>
|
|
|
|
|
+ </span>
|
|
|
|
|
+ <span class="card_title two_line_ellipsis">{{ questionnaire.title }}</span>
|
|
|
|
|
|
|
|
- <!-- 中间区域:元数据 (分数、创建人、状态、时间) -->
|
|
|
|
|
- <div class="card_meta">
|
|
|
|
|
- <div class="meta_row">
|
|
|
|
|
- <!-- 问卷总分 -->
|
|
|
|
|
- <span v-if="cardType == 'questionnareManage'" class="score_text icon_text">
|
|
|
|
|
- <img :src="scoreIcon" alt="">
|
|
|
|
|
- {{ questionnaire.assessmentScore }}分</span>
|
|
|
|
|
-
|
|
|
|
|
- <!-- 创建者 -->
|
|
|
|
|
- <span class="creator_text icon_text">
|
|
|
|
|
- <img :src="peopleIcon" alt="">
|
|
|
|
|
- {{questionnaire.teacherName}}</span>
|
|
|
|
|
- <!-- 评价类型 -->
|
|
|
|
|
- <span class="icon_text" v-if="cardType == 'reviewManage'">
|
|
|
|
|
- <img :src="questionnaire.evaluationType === 0 ? onlineDektopIcon : writeLineIcon" alt="">
|
|
|
|
|
- {{ typeNumToName(questionnaire.evaluationType).title }}
|
|
|
|
|
- </span>
|
|
|
|
|
- <!-- 状态文本:根据 cardStatus 动态变色 -->
|
|
|
|
|
- <span :class="['status_text','icon_text', statusNumToName(questionnaire.cardStatus)?.themeClass ,'']"
|
|
|
|
|
- :style="{color:statusNumToName(questionnaire.cardStatus)?.iconColor}">
|
|
|
|
|
- <RightCircle :style="{'--icon-color':statusNumToName(questionnaire.cardStatus)?.iconColor }" />
|
|
|
|
|
- {{ statusNumToName(questionnaire.cardStatus)?.title }}
|
|
|
|
|
- </span>
|
|
|
|
|
- </div>
|
|
|
|
|
- <div class="time_row icon_text">
|
|
|
|
|
- <!-- 评价管理的 线下答卷 不显示 时间 -->
|
|
|
|
|
- <template v-if="cardType == 'questionnareManage' ||
|
|
|
|
|
- cardType == 'reviewManage' && questionnaire.evaluationType === 0">
|
|
|
|
|
- <img :src="timeIcon" alt="">
|
|
|
|
|
- {{ questionnaire.time }}
|
|
|
|
|
- </template>
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <el-switch
|
|
|
|
|
+ :model-value="Boolean(questionnaire.openStatus)"
|
|
|
|
|
+ v-if=" questionnaire.evaluationType === 0 ? true : false"
|
|
|
|
|
+ @change="(newVal)=>HandleOnOffChange(newVal,questionnaire.openStatus,questionnaire)"
|
|
|
|
|
+ style="--el-switch-on-color: #2e64fa; --el-switch-off-color: #bbbbbb"
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 中间区域:元数据 (分数、创建人、状态、时间) -->
|
|
|
|
|
+ <div class="card_meta">
|
|
|
|
|
+ <div class="meta_row">
|
|
|
|
|
+ <!-- 问卷总分 -->
|
|
|
|
|
+ <span v-if="cardType == 'questionnareManage'" class="score_text icon_text">
|
|
|
|
|
+ <img :src="scoreIcon" alt="">
|
|
|
|
|
+ {{ questionnaire.assessmentScore }}分</span>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 创建者 -->
|
|
|
|
|
+ <span class="creator_text icon_text">
|
|
|
|
|
+ <img :src="peopleIcon" alt="">
|
|
|
|
|
+ {{questionnaire.teacherName}}</span>
|
|
|
|
|
+ <!-- 评价类型 -->
|
|
|
|
|
+ <span class="icon_text" v-if="cardType == 'reviewManage'">
|
|
|
|
|
+ <img :src="questionnaire.evaluationType === 0 ? onlineDektopIcon : writeLineIcon" alt="">
|
|
|
|
|
+ {{ typeNumToName(questionnaire.evaluationType).title }}
|
|
|
|
|
+ </span>
|
|
|
|
|
+ <!-- 状态文本:根据 cardStatus 动态变色 -->
|
|
|
|
|
+ <span :class="['status_text','icon_text', statusNumToName(questionnaire.cardStatus)?.themeClass ,'']"
|
|
|
|
|
+ :style="{color:statusNumToName(questionnaire.cardStatus)?.iconColor}">
|
|
|
|
|
+ <RightCircle :style="{'--icon-color':statusNumToName(questionnaire.cardStatus)?.iconColor }" />
|
|
|
|
|
+ {{ statusNumToName(questionnaire.cardStatus)?.title }}
|
|
|
|
|
+ </span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="time_row icon_text">
|
|
|
|
|
+ <!-- 评价管理的 线下答卷 不显示 时间 -->
|
|
|
|
|
+ <template v-if="cardType == 'questionnareManage' ||
|
|
|
|
|
+ cardType == 'reviewManage' && questionnaire.evaluationType === 0">
|
|
|
|
|
+ <img :src="timeIcon" alt="">
|
|
|
|
|
+ {{ questionnaire.time }}
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
|
|
|
- <div class="page_solid_line"></div>
|
|
|
|
|
|
|
+ <div class="page_solid_line"></div>
|
|
|
|
|
|
|
|
- <!-- 底部区域:操作按钮 -->
|
|
|
|
|
- <div class="card_footer">
|
|
|
|
|
- <slot name="default" :row="questionnaire"></slot>
|
|
|
|
|
|
|
+ <!-- 底部区域:操作按钮 -->
|
|
|
|
|
+ <div class="card_footer">
|
|
|
|
|
+ <slot name="default" :row="questionnaire"></slot>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="load_more" @click=" Number(pageSize || 0) >= Number(totalNum || 0)? '' : emit('loadMorePage')">
|
|
|
|
|
+ {{ Number(pageSize || 0) >= Number(totalNum || 0) ? '没有更多了' : '加载更多' }}
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
|
|
|
+import {watch} from 'vue'
|
|
|
|
|
+
|
|
|
import peopleIcon from '@/assets/evaluateTeaching/people_icon.png'
|
|
import peopleIcon from '@/assets/evaluateTeaching/people_icon.png'
|
|
|
import timeIcon from '@/assets/evaluateTeaching/time_icon.png'
|
|
import timeIcon from '@/assets/evaluateTeaching/time_icon.png'
|
|
|
import writeLineIcon from '@/assets/evaluateTeaching/write_line_icon.png'
|
|
import writeLineIcon from '@/assets/evaluateTeaching/write_line_icon.png'
|
|
|
import onlineDektopIcon from '@/assets/evaluateTeaching/online_desktop.png'
|
|
import onlineDektopIcon from '@/assets/evaluateTeaching/online_desktop.png'
|
|
|
import questionnaireCardIcon from '@/assets/evaluateTeaching/questionnaire_card_icon.png'
|
|
import questionnaireCardIcon from '@/assets/evaluateTeaching/questionnaire_card_icon.png'
|
|
|
import scoreIcon from '@/assets/evaluateTeaching/score_icon.png'
|
|
import scoreIcon from '@/assets/evaluateTeaching/score_icon.png'
|
|
|
-
|
|
|
|
|
import RightCircle from '@/assets/evaluateTeaching/RightCircle.vue'
|
|
import RightCircle from '@/assets/evaluateTeaching/RightCircle.vue'
|
|
|
|
|
|
|
|
|
|
|
|
@@ -83,7 +91,6 @@ interface QuestionnaireItm {
|
|
|
evaluationType?:Number|String, //卡片类型
|
|
evaluationType?:Number|String, //卡片类型
|
|
|
status?:Boolean,
|
|
status?:Boolean,
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
interface StatusItm {
|
|
interface StatusItm {
|
|
|
statusFlag:Number | String,
|
|
statusFlag:Number | String,
|
|
|
title:String,
|
|
title:String,
|
|
@@ -94,15 +101,14 @@ interface TypeItm {
|
|
|
type:Number | String,
|
|
type:Number | String,
|
|
|
title:String,
|
|
title:String,
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
// questionnareManage (问卷管理) | reviewManage (评价管理) |
|
|
// questionnareManage (问卷管理) | reviewManage (评价管理) |
|
|
|
type CardType = 'questionnareManage' | 'reviewManage'
|
|
type CardType = 'questionnareManage' | 'reviewManage'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const props = defineProps({
|
|
const props = defineProps({
|
|
|
- questionnaire:{
|
|
|
|
|
- type:Object as ()=>QuestionnaireItm,
|
|
|
|
|
|
|
+ questionnaireList:{
|
|
|
|
|
+ type:Array as ()=>QuestionnaireItm[],
|
|
|
requried:true,
|
|
requried:true,
|
|
|
},
|
|
},
|
|
|
cardStatusMsg:{ //卡片状态信息
|
|
cardStatusMsg:{ //卡片状态信息
|
|
@@ -116,19 +122,23 @@ const props = defineProps({
|
|
|
type:String as ()=>CardType,
|
|
type:String as ()=>CardType,
|
|
|
required:true
|
|
required:true
|
|
|
},
|
|
},
|
|
|
- showSwitch:{
|
|
|
|
|
- type:Boolean,
|
|
|
|
|
- default:false
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ scrollAimDom:{ // 监听的目标滚动元素
|
|
|
|
|
+ type:Object
|
|
|
|
|
+ },
|
|
|
|
|
+ pageSize:{
|
|
|
|
|
+ type:Number,
|
|
|
|
|
+ default:0
|
|
|
|
|
+ },
|
|
|
|
|
+ totalNum:{
|
|
|
|
|
+ type:Number,
|
|
|
|
|
+ default:0
|
|
|
|
|
+ },
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
-const emit = defineEmits(['switchOnOff'])
|
|
|
|
|
|
|
+const emit = defineEmits(['switchOnOff','loadMorePage'])
|
|
|
// 处理卡片的开关状态
|
|
// 处理卡片的开关状态
|
|
|
const HandleOnOffChange = (newVal,oldVal,row)=>{
|
|
const HandleOnOffChange = (newVal,oldVal,row)=>{
|
|
|
- // console.log('newVal',newVal,'oldVal',oldVal)
|
|
|
|
|
- // if(Boolean(newVal) !== Boolean(oldVal)){
|
|
|
|
|
- emit('switchOnOff',{id:row.id,onOffVal:newVal })
|
|
|
|
|
- // }
|
|
|
|
|
|
|
+ emit('switchOnOff',{id:row.id,onOffVal:newVal })
|
|
|
}
|
|
}
|
|
|
const statusNumToName=(status:String|Number|null|undefined)=>{
|
|
const statusNumToName=(status:String|Number|null|undefined)=>{
|
|
|
let result = props?.cardStatusMsg?.find(item=>item.statusFlag === status)
|
|
let result = props?.cardStatusMsg?.find(item=>item.statusFlag === status)
|
|
@@ -153,10 +163,32 @@ const typeNumToName=(type:String|Number|null|undefined)=>{
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+const HandleCourseScroll = (e)=>{
|
|
|
|
|
+ let totalHeight = e.target.scrollHeight //总高度
|
|
|
|
|
+ let scrollTop = e.target.scrollTop //滚动高度
|
|
|
|
|
+ let pageHeight = e.target.clientHeight // 客户端高度
|
|
|
|
|
+ console.log('totalHeight',totalHeight)
|
|
|
|
|
+ console.log('当前高度',scrollTop + pageHeight)
|
|
|
|
|
+
|
|
|
|
|
+ // 滚动到底部 且 页面还有数据
|
|
|
|
|
+ if(scrollTop + pageHeight >= (totalHeight - 5) && props?.totalNum > props?.pageSize){
|
|
|
|
|
+ emit('loadMorePage')
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+watch(()=>props.scrollAimDom,(newDom)=>{
|
|
|
|
|
+ console.log('新dom',newDom)
|
|
|
|
|
+ if(newDom){
|
|
|
|
|
+ newDom?.addEventListener('scroll',(e)=>HandleCourseScroll(e))
|
|
|
|
|
+ }
|
|
|
|
|
+},{immediate:true,flush:'post'})
|
|
|
|
|
+
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
<style lang="scss" scoped>
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
/* 单个卡片样式 */
|
|
/* 单个卡片样式 */
|
|
|
.card_item {
|
|
.card_item {
|
|
|
width: 325px; /* 固定宽度以匹配图片比例 */
|
|
width: 325px; /* 固定宽度以匹配图片比例 */
|
|
@@ -256,4 +288,15 @@ const typeNumToName=(type:String|Number|null|undefined)=>{
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+.load_more{
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ color: #999;
|
|
|
|
|
+ margin-top: 20px;
|
|
|
|
|
+ font-size: 14px;
|
|
|
|
|
+ &:hover{
|
|
|
|
|
+ cursor: pointer;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
</style>
|
|
</style>
|