From 5d6c946e0814f86b13cbf6a0a4fe2b1485a2cea8 Mon Sep 17 00:00:00 2001 From: zdg Date: Mon, 16 Dec 2024 17:49:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/src/AixPPTist/src/api/chat.ts | 23 +++++++++++++++++++ src/renderer/src/AixPPTist/src/api/index.ts | 10 +++++++- src/renderer/src/AixPPTist/src/api/watcher.ts | 1 + .../AixPPTist/src/views/Screen/BaseView.vue | 11 +++++++++ .../src/views/Screen/PresenterView.vue | 10 ++++++++ src/renderer/src/plugins/socket/index.js | 3 --- src/renderer/src/utils/tool.js | 2 +- .../src/views/classTask/teachClassTask.vue | 7 +++++- 8 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 src/renderer/src/AixPPTist/src/api/chat.ts diff --git a/src/renderer/src/AixPPTist/src/api/chat.ts b/src/renderer/src/AixPPTist/src/api/chat.ts new file mode 100644 index 0000000..92a5806 --- /dev/null +++ b/src/renderer/src/AixPPTist/src/api/chat.ts @@ -0,0 +1,23 @@ +/** + * 统一处理消息 发送 避免找不到 + */ + +import ChatWs from '@/plugins/socket' // 聊天socket +import { sessionStore } from '@/utils/store' // electron-store 状态管理 + +export default () => { + const classcourse = sessionStore.get('curr.classcourse') // 课堂信息 + const timgroupid = classcourse?.timgroupid // 群组id + if (!ChatWs.ws) ChatWs.init() + // 下课消息 + const exitCourse = async() => { + if(!timgroupid) throw new Error('未获取到群组ID') + await updateClasscourse({ id: classcourse.id, status: 'closed' }) + return ChatWs.closedCourse(timgroupid) + } + return { + exitCourse, + classcourse, + groupid: timgroupid, + } +} \ No newline at end of file diff --git a/src/renderer/src/AixPPTist/src/api/index.ts b/src/renderer/src/AixPPTist/src/api/index.ts index 685c367..203ba3e 100644 --- a/src/renderer/src/AixPPTist/src/api/index.ts +++ b/src/renderer/src/AixPPTist/src/api/index.ts @@ -258,6 +258,7 @@ export class PPTApi { } export class Homework{ + static win: null // 作业弹窗 // 作业弹窗 static async showHomework(id: any) { let result = await getClassWorkList(id) @@ -265,7 +266,14 @@ export class Homework{   localStorage.setItem('teachClassWorkItem', JSON.stringify(result[0]));   toolStore.isTaskWin=true; // 设置打开批改窗口 //   emit('closeActive') -   createWindow('open-taskwin',{url:'/teachClassTask'}); + // 重复打开,先关闭弹窗 + // if (this.win) this.win?.close?.() + this.win = await createWindow('open-taskwin',{url:'/teachClassTask'}) +  return this.win; + } + static closeHomework() { + if (this.win) this.win?.close?.() + this.win = null } } export default PPTApi \ No newline at end of file diff --git a/src/renderer/src/AixPPTist/src/api/watcher.ts b/src/renderer/src/AixPPTist/src/api/watcher.ts index f5d91cb..d4cea21 100644 --- a/src/renderer/src/AixPPTist/src/api/watcher.ts +++ b/src/renderer/src/AixPPTist/src/api/watcher.ts @@ -122,4 +122,5 @@ export default () => { window.close() // 关闭窗口 }, 1000) } + } diff --git a/src/renderer/src/AixPPTist/src/views/Screen/BaseView.vue b/src/renderer/src/AixPPTist/src/views/Screen/BaseView.vue index ae2add1..c8ef0b3 100644 --- a/src/renderer/src/AixPPTist/src/views/Screen/BaseView.vue +++ b/src/renderer/src/AixPPTist/src/views/Screen/BaseView.vue @@ -52,6 +52,7 @@ + @@ -74,6 +75,7 @@ import WritingBoardTool from './WritingBoardTool.vue' import CountdownTimer from './CountdownTimer.vue' import upvoteVue from '@/views/tool/components/upvote.vue' // 点赞-子组件 import emitter from '@/utils/mitt'; +import Chat from '../../api/chat' // 聊天 const props = defineProps<{ changeViewMode: (mode: 'base' | 'presenter') => void @@ -103,6 +105,7 @@ const { const { slideWidth, slideHeight } = useSlideSize() const { exitScreening } = useScreening() const { fullscreenState, manualExitFullscreen } = useFullscreen() +const chat:any = Chat() // 聊天室 const rightToolsVisible = ref(false) const writingBoardToolVisible = ref(false) @@ -192,6 +195,14 @@ const contextmenus = (): ContextmenuItem[] => { }, ] } + +// 下课 +const exitCourse = async () => { + // console.log('下课', chat) + await chat.exitCourse() // 下课消息 + exitScreening() // 结束放映 +} + // 打开点赞或者疑问 1点赞 2疑问 emitter.on('upvoteTrigger', (type) => { upvoteRef.value?.trigger(type) diff --git a/src/renderer/src/AixPPTist/src/views/Screen/PresenterView.vue b/src/renderer/src/AixPPTist/src/views/Screen/PresenterView.vue index 4d2076d..aabc72a 100644 --- a/src/renderer/src/AixPPTist/src/views/Screen/PresenterView.vue +++ b/src/renderer/src/AixPPTist/src/views/Screen/PresenterView.vue @@ -12,6 +12,7 @@
结束放映
+
结束课堂
@@ -94,6 +95,7 @@ import ScreenSlideList from './ScreenSlideList.vue' import WritingBoardTool from './WritingBoardTool.vue' import CountdownTimer from './CountdownTimer.vue' import Divider from '../../components/Divider.vue' +import Chat from '../../api/chat' // 聊天 const props = defineProps<{ changeViewMode: (mode: 'base' | 'presenter') => void @@ -122,12 +124,20 @@ const { slideWidth, slideHeight } = useSlideSize(slideListWrapRef) const { exitScreening } = useScreening() const { slidesLoadLimit } = useLoadSlides() const { fullscreenState, manualExitFullscreen } = useFullscreen() +const chat:any = Chat() // 聊天室 const remarkFontSize = ref(16) const currentSlideRemark = computed(() => { return parseText2Paragraphs(currentSlide.value.remark || '无备注') }) +// 下课 +const exitCourse = async () => { + // console.log('下课', chat) + await chat.exitCourse() // 下课消息 + exitScreening() // 结束放映 +} + const handleMousewheelThumbnails = (e: WheelEvent) => { if (!thumbnailsRef.value) return thumbnailsRef.value.scrollBy(e.deltaY, 0) diff --git a/src/renderer/src/plugins/socket/index.js b/src/renderer/src/plugins/socket/index.js index 5e9870f..5d9cd6c 100644 --- a/src/renderer/src/plugins/socket/index.js +++ b/src/renderer/src/plugins/socket/index.js @@ -167,9 +167,6 @@ export class ChatWs { return new Promise((resolve, reject) => { this.sendMsg('closed', '下课', null, 'group', id) resolve() - // setTimeout(() => { - // this.close() // 关闭链接 - // }, 1000); }) } // 延时 ms 毫秒 diff --git a/src/renderer/src/utils/tool.js b/src/renderer/src/utils/tool.js index 02aeae2..9673f11 100644 --- a/src/renderer/src/utils/tool.js +++ b/src/renderer/src/utils/tool.js @@ -225,7 +225,7 @@ export const createWindow = async (type, data) => { .filter(k => typeof data[k] === 'function') .forEach(k => events[k] = data[k]) eventHandles(type, win, events) // 事件监听处理 - break + return win } default: break diff --git a/src/renderer/src/views/classTask/teachClassTask.vue b/src/renderer/src/views/classTask/teachClassTask.vue index 3db91ae..83b5ec9 100644 --- a/src/renderer/src/views/classTask/teachClassTask.vue +++ b/src/renderer/src/views/classTask/teachClassTask.vue @@ -163,8 +163,10 @@ import quizStats from '@/views/classTask/container/quizStats.vue' import ClassOverview from '@/views/classTask/container/classOverview.vue' import {sessionStore} from '@/utils/store' // import Chat from '@/utils/chat' // im 登录初始化 +import { Homework } from '@/AixPPTist/src/api/index' import MsgEnum from '@/plugins/imChat/msgEnum' // im 消息枚举 import ChatWs from '@/plugins/socket' // 聊天socket +import { set } from 'lodash' if (!ChatWs.ws) ChatWs.init() const { proxy } = getCurrentInstance() const emit = defineEmits(['cle-click']) @@ -719,14 +721,17 @@ const msgHandle = (msg) => { const { head, content, ...other } = msg switch(head) { case MsgEnum.HEADS.MSG_closed: // 下课: + Homework.win = null window.close() // 关闭窗口 break case MsgEnum.HEADS.MSG_finishHomework: // 跟新作业: + console.log('更新作业', head, content) const data = JSON.parse(localStorage.getItem('teachClassWorkItem')); openDialog(data, false); break case MsgEnum.HEADS.MSG_slideFlapping: // 切换页面 console.log('切换页面-关闭窗口') + Homework.win = null window.close() // 关闭窗口 break // case 'TIMAddRecvNewMsgCallback': // 收到新消息 data=[] @@ -769,7 +774,7 @@ onMounted(() => { console.log('socket监听消息') ChatWs.watch((msg, e) => { try { - msgHandle(JSON.parse(msg)) + msgHandle(JSON.parse(msg)?.msg) } catch (error) { console.error('socket 解析异常 ', error, e) msgHandle(msg)