zdg_dev #163
|
@ -59,6 +59,7 @@ export class PPTApi {
|
||||||
|
|
||||||
// 获取所有幻灯片列表 isUpdate为true不更新
|
// 获取所有幻灯片列表 isUpdate为true不更新
|
||||||
static getSlideList(parentid: (Number | String),isUpdate?:Boolean): Promise<Boolean> {
|
static getSlideList(parentid: (Number | String),isUpdate?:Boolean): Promise<Boolean> {
|
||||||
|
const classcourse = sessionStore.get('curr.classcourse') // 课堂信息
|
||||||
return new Promise(async (resolve, reject) => {
|
return new Promise(async (resolve, reject) => {
|
||||||
const params: object = { parentid, orderByColumn: 'fileidx', isAsc: 'asc', pageSize: 9999 }
|
const params: object = { parentid, orderByColumn: 'fileidx', isAsc: 'asc', pageSize: 9999 }
|
||||||
const res: Result = await API_entpcoursefile.listEntpcoursefileNew(params)
|
const res: Result = await API_entpcoursefile.listEntpcoursefileNew(params)
|
||||||
|
@ -79,12 +80,10 @@ export class PPTApi {
|
||||||
// 活动列表处理
|
// 活动列表处理
|
||||||
// const workList = (res.rows || []).map(o => o.activityContent)
|
// const workList = (res.rows || []).map(o => o.activityContent)
|
||||||
const workItem = res.rows ? [...res.rows] : []
|
const workItem = res.rows ? [...res.rows] : []
|
||||||
// 写入作业列表数据
|
|
||||||
// slidesStore.setWorkList(workList)
|
|
||||||
// 获取所有的pptlist的数据
|
// 获取所有的pptlist的数据
|
||||||
slidesStore.setWorkItem(workItem)
|
slidesStore.setWorkItem(workItem)
|
||||||
|
// 没有上课时调用-作业列表
|
||||||
this.updateWorkList()
|
if(!classcourse) this.updateWorkList()
|
||||||
resolve(true)
|
resolve(true)
|
||||||
} else msgUtils.msgError(res.msg || '获取数据失败');resolve(false)
|
} else msgUtils.msgError(res.msg || '获取数据失败');resolve(false)
|
||||||
})
|
})
|
||||||
|
@ -232,10 +231,22 @@ export class PPTApi {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 批量更新缩略图-异步
|
||||||
|
static batchUpdateThumUrl() {
|
||||||
|
return new Promise(async resolve => {
|
||||||
|
const list = slidesStore.workItem || []
|
||||||
|
if (!list.length) return resolve()
|
||||||
|
const upList = []
|
||||||
|
for (const [ind,o] of list.entries()) {
|
||||||
|
const thumUrl = await this.getSlideThumUrl(ind)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// thumbnail-slide thumbnail 缩略图
|
// thumbnail-slide thumbnail 缩略图
|
||||||
static getSlideThumUrl(): Promise<Boolean> {
|
static getSlideThumUrl(index?:number): Promise<Boolean> {
|
||||||
return nextTick().then(async() => {
|
return nextTick().then(async() => {
|
||||||
const slideIndex = slidesStore.slideIndex
|
const slideIndex = index ?? slidesStore.slideIndex
|
||||||
const elements = document.querySelectorAll('.thumbnail-slide')
|
const elements = document.querySelectorAll('.thumbnail-slide')
|
||||||
if (elements.length && slideIndex >= 0) {
|
if (elements.length && slideIndex >= 0) {
|
||||||
const element = elements[slideIndex]
|
const element = elements[slideIndex]
|
||||||
|
|
|
@ -36,8 +36,8 @@
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="tools-right" :class="{ 'visible': rightToolsVisible }"
|
class="tools-right" :class="{ 'visible': rightToolsVisible }"
|
||||||
@mouseleave="rightToolsVisible = false"
|
@mouseleave="toolTrigger('leave')"
|
||||||
@mouseenter="rightToolsVisible = true"
|
@mouseenter="toolTrigger('enter')"
|
||||||
>
|
>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div class="tool-btn page-number" @click="slideThumbnailModelVisible = true">幻灯片 {{slideIndex + 1}} / {{slides.length}}</div>
|
<div class="tool-btn page-number" @click="slideThumbnailModelVisible = true">幻灯片 {{slideIndex + 1}} / {{slides.length}}</div>
|
||||||
|
@ -50,6 +50,10 @@
|
||||||
<IconPower class="tool-btn" v-tooltip="'结束放映'" @click="exitScreening()" />
|
<IconPower class="tool-btn" v-tooltip="'结束放映'" @click="exitScreening()" />
|
||||||
<IconPower class="tool-btn close" v-if="chat.groupid" v-tooltip="'结束课堂'" @click="exitCourse()" />
|
<IconPower class="tool-btn close" v-if="chat.groupid" v-tooltip="'结束课堂'" @click="exitCourse()" />
|
||||||
</div>
|
</div>
|
||||||
|
<div :class="['tools-icon',{opacity:iconHide}]" @click.stop="toolTrigger('icon')">
|
||||||
|
<circle-double-down v-if="rightToolsVisible" theme="outline" size="30" fill="#409EFF"/>
|
||||||
|
<circle-double-up v-else="!rightToolsVisible" theme="outline" size="30" fill="#E6A23C"/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -71,6 +75,7 @@ import WritingBoardTool from './WritingBoardTool.vue'
|
||||||
import CountdownTimer from './CountdownTimer.vue'
|
import CountdownTimer from './CountdownTimer.vue'
|
||||||
import emitter from '@/utils/mitt';
|
import emitter from '@/utils/mitt';
|
||||||
import Chat from '../../api/chat' // 聊天
|
import Chat from '../../api/chat' // 聊天
|
||||||
|
import { CircleDoubleDown, CircleDoubleUp } from '@icon-park/vue-next' // icon-park 图标库
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
changeViewMode: (mode: 'base' | 'presenter') => void
|
changeViewMode: (mode: 'base' | 'presenter') => void
|
||||||
|
@ -103,12 +108,15 @@ const { exitScreening } = useScreening()
|
||||||
const { fullscreenState, manualExitFullscreen } = useFullscreen()
|
const { fullscreenState, manualExitFullscreen } = useFullscreen()
|
||||||
const chat:any = Chat() // 聊天室
|
const chat:any = Chat() // 聊天室
|
||||||
|
|
||||||
|
const screenStore =useScreenStore()
|
||||||
const rightToolsVisible = ref(false)
|
const rightToolsVisible = ref(false)
|
||||||
const writingBoardToolVisible = ref(false)
|
const writingBoardToolVisible = ref(false)
|
||||||
const timerlVisible = ref(false)
|
const timerlVisible = ref(false)
|
||||||
const slideThumbnailModelVisible = ref(false)
|
const slideThumbnailModelVisible = ref(false)
|
||||||
const laserPen = ref(false)
|
const laserPen = ref(false)
|
||||||
const screenStore =useScreenStore()
|
const timer = ref(0) // 记录操作时间
|
||||||
|
const iconHide = ref(false) // 工具栏图标是否显示
|
||||||
|
const timerId = ref(null) // 定时器id
|
||||||
const contextmenus = (): ContextmenuItem[] => {
|
const contextmenus = (): ContextmenuItem[] => {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
|
@ -191,6 +199,30 @@ const contextmenus = (): ContextmenuItem[] => {
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const toolTrigger = (type:string) => {
|
||||||
|
const curT = Date.now()
|
||||||
|
if (curT - timer.value < 200) return
|
||||||
|
iconHide.value = false // 显示图标按钮
|
||||||
|
if (timerId.value) clearTimeout(timerId.value) // 清除定时器
|
||||||
|
switch (type) {
|
||||||
|
case 'icon': // 点击图标
|
||||||
|
timer.value = curT
|
||||||
|
rightToolsVisible.value = !rightToolsVisible.value
|
||||||
|
break
|
||||||
|
case 'enter': // 移入
|
||||||
|
timer.value = curT
|
||||||
|
rightToolsVisible.value = true
|
||||||
|
break
|
||||||
|
case 'leave': // 移出
|
||||||
|
rightToolsVisible.value = false
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
timerId.value = setTimeout(() => { // 定时器
|
||||||
|
iconHide.value = true // 隐藏图标按钮
|
||||||
|
}, 2000)
|
||||||
|
}
|
||||||
// 下课
|
// 下课
|
||||||
const exitCourse = async () => {
|
const exitCourse = async () => {
|
||||||
// console.log('下课', chat)
|
// console.log('下课', chat)
|
||||||
|
@ -253,6 +285,18 @@ const exitCourse = async () => {
|
||||||
top: -66px;
|
top: -66px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tools-icon{
|
||||||
|
position: absolute;
|
||||||
|
right: 8px;
|
||||||
|
top: -35px;
|
||||||
|
z-index: 1;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: opacity $transitionDelay;
|
||||||
|
&.opacity{
|
||||||
|
opacity: .35;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|
|
@ -194,7 +194,7 @@ import outLink from '@/utils/linkConfig'
|
||||||
import { createWindow, sessionStore, getAppInstallUrl, ipcMsgSend } from '@/utils/tool'
|
import { createWindow, sessionStore, getAppInstallUrl, ipcMsgSend } from '@/utils/tool'
|
||||||
import { cloneDeep } from 'lodash'
|
import { cloneDeep } from 'lodash'
|
||||||
import { delClasswork, listEntpcourse } from '@/api/teaching/classwork'
|
import { delClasswork, listEntpcourse } from '@/api/teaching/classwork'
|
||||||
import { updateClasscourse } from '@/api/teaching/classcourse'
|
import { updateClasscourse, getClasscourse } from '@/api/teaching/classcourse'
|
||||||
import { getClassInfo, getSelfReserv, endClass } from '@/api/classManage'
|
import { getClassInfo, getSelfReserv, endClass } from '@/api/classManage'
|
||||||
import { useGetHomework } from '@/hooks/useGetHomework'
|
import { useGetHomework } from '@/hooks/useGetHomework'
|
||||||
import { editListItem } from '@/hooks/useClassTask'
|
import { editListItem } from '@/hooks/useClassTask'
|
||||||
|
@ -389,12 +389,13 @@ export default {
|
||||||
if (res.code == 200) {
|
if (res.code == 200) {
|
||||||
const resource = res.data
|
const resource = res.data
|
||||||
if (resource.filetype != 'aippt') this.$refs.calssRef.open(aptFileId, row)
|
if (resource.filetype != 'aippt') this.$refs.calssRef.open(aptFileId, row)
|
||||||
else {
|
else { // aippt 继续上课
|
||||||
if (!!sessionStore.get('curr.classcourse')) return ElMessage.warning('公屏已打开,请勿重复操作')
|
if (!!sessionStore.get('curr.classcourse')) return ElMessage.warning('公屏已打开,请勿重复操作')
|
||||||
|
const { data:classcourse } = await getClasscourse(row.id) // 获取最新课堂信息
|
||||||
const msgEl = ElMessage.warning({message:'正在打开公屏,请稍后...',duration: 0})
|
const msgEl = ElMessage.warning({message:'正在打开公屏,请稍后...',duration: 0})
|
||||||
setTimeout(()=>{
|
setTimeout(()=>{
|
||||||
msgEl.close()
|
msgEl.close()
|
||||||
this.openPublicScreen('class', resource, row) // 打开公屏-窗口
|
this.openPublicScreen('class', resource, classcourse||row) // 打开公屏-窗口
|
||||||
}, 2000)
|
}, 2000)
|
||||||
}
|
}
|
||||||
} else ElMessage.error(res.msg||'获取课件信息失败')
|
} else ElMessage.error(res.msg||'获取课件信息失败')
|
||||||
|
|
Loading…
Reference in New Issue