From 7b042fd00134e15c512731c7ed3dffa96bc96902 Mon Sep 17 00:00:00 2001 From: zdg Date: Fri, 20 Dec 2024 16:00:09 +0800 Subject: [PATCH] =?UTF-8?q?ppt=E4=B8=8A=E8=AF=BE=20=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/src/AixPPTist/src/api/index.ts | 23 ++++++--- .../AixPPTist/src/views/Screen/BaseView.vue | 50 +++++++++++++++++-- src/renderer/src/views/prepare/index.vue | 7 +-- 3 files changed, 68 insertions(+), 12 deletions(-) diff --git a/src/renderer/src/AixPPTist/src/api/index.ts b/src/renderer/src/AixPPTist/src/api/index.ts index 203ba3e..a82ffc4 100644 --- a/src/renderer/src/AixPPTist/src/api/index.ts +++ b/src/renderer/src/AixPPTist/src/api/index.ts @@ -59,6 +59,7 @@ export class PPTApi { // 获取所有幻灯片列表 isUpdate为true不更新 static getSlideList(parentid: (Number | String),isUpdate?:Boolean): Promise { + const classcourse = sessionStore.get('curr.classcourse') // 课堂信息 return new Promise(async (resolve, reject) => { const params: object = { parentid, orderByColumn: 'fileidx', isAsc: 'asc', pageSize: 9999 } const res: Result = await API_entpcoursefile.listEntpcoursefileNew(params) @@ -79,12 +80,10 @@ export class PPTApi { // 活动列表处理 // const workList = (res.rows || []).map(o => o.activityContent) const workItem = res.rows ? [...res.rows] : [] - // 写入作业列表数据 - // slidesStore.setWorkList(workList) // 获取所有的pptlist的数据 slidesStore.setWorkItem(workItem) - - this.updateWorkList() + // 没有上课时调用-作业列表 + if(!classcourse) this.updateWorkList() resolve(true) } 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 缩略图 - static getSlideThumUrl(): Promise { + static getSlideThumUrl(index?:number): Promise { return nextTick().then(async() => { - const slideIndex = slidesStore.slideIndex + const slideIndex = index ?? slidesStore.slideIndex const elements = document.querySelectorAll('.thumbnail-slide') if (elements.length && slideIndex >= 0) { const element = elements[slideIndex] diff --git a/src/renderer/src/AixPPTist/src/views/Screen/BaseView.vue b/src/renderer/src/AixPPTist/src/views/Screen/BaseView.vue index 8e7acf0..7d24e8c 100644 --- a/src/renderer/src/AixPPTist/src/views/Screen/BaseView.vue +++ b/src/renderer/src/AixPPTist/src/views/Screen/BaseView.vue @@ -36,8 +36,8 @@
幻灯片 {{slideIndex + 1}} / {{slides.length}}
@@ -50,6 +50,10 @@
+
+ + +
@@ -71,6 +75,7 @@ import WritingBoardTool from './WritingBoardTool.vue' import CountdownTimer from './CountdownTimer.vue' import emitter from '@/utils/mitt'; import Chat from '../../api/chat' // 聊天 +import { CircleDoubleDown, CircleDoubleUp } from '@icon-park/vue-next' // icon-park 图标库 const props = defineProps<{ changeViewMode: (mode: 'base' | 'presenter') => void @@ -103,12 +108,15 @@ const { exitScreening } = useScreening() const { fullscreenState, manualExitFullscreen } = useFullscreen() const chat:any = Chat() // 聊天室 +const screenStore =useScreenStore() const rightToolsVisible = ref(false) const writingBoardToolVisible = ref(false) const timerlVisible = ref(false) const slideThumbnailModelVisible = 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[] => { 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 () => { // console.log('下课', chat) @@ -253,6 +285,18 @@ const exitCourse = async () => { top: -66px; } + .tools-icon{ + position: absolute; + right: 8px; + top: -35px; + z-index: 1; + cursor: pointer; + transition: opacity $transitionDelay; + &.opacity{ + opacity: .35; + } + } + .content { width: 100%; height: 100%; diff --git a/src/renderer/src/views/prepare/index.vue b/src/renderer/src/views/prepare/index.vue index 9d3440e..af02b1e 100644 --- a/src/renderer/src/views/prepare/index.vue +++ b/src/renderer/src/views/prepare/index.vue @@ -194,7 +194,7 @@ import outLink from '@/utils/linkConfig' import { createWindow, sessionStore, getAppInstallUrl, ipcMsgSend } from '@/utils/tool' import { cloneDeep } from 'lodash' 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 { useGetHomework } from '@/hooks/useGetHomework' import { editListItem } from '@/hooks/useClassTask' @@ -389,12 +389,13 @@ export default { if (res.code == 200) { const resource = res.data if (resource.filetype != 'aippt') this.$refs.calssRef.open(aptFileId, row) - else { + else { // aippt 继续上课 if (!!sessionStore.get('curr.classcourse')) return ElMessage.warning('公屏已打开,请勿重复操作') + const { data:classcourse } = await getClasscourse(row.id) // 获取最新课堂信息 const msgEl = ElMessage.warning({message:'正在打开公屏,请稍后...',duration: 0}) setTimeout(()=>{ msgEl.close() - this.openPublicScreen('class', resource, row) // 打开公屏-窗口 + this.openPublicScreen('class', resource, classcourse||row) // 打开公屏-窗口 }, 2000) } } else ElMessage.error(res.msg||'获取课件信息失败')