From 38c041465e44a0dfe4de14e648ffc834bfe645d4 Mon Sep 17 00:00:00 2001 From: zdg Date: Tue, 10 Dec 2024 10:08:53 +0800 Subject: [PATCH 1/7] =?UTF-8?q?ppt=E4=B8=8A=E8=AF=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 4 +-- src/renderer/src/AixPPTist/src/App.vue | 2 +- .../src/AixPPTist/src/api/classcourse.ts | 12 ++++---- src/renderer/src/AixPPTist/src/api/index.ts | 21 ++++++++++++- src/renderer/src/AixPPTist/src/api/types.ts | 1 + src/renderer/src/AixPPTist/src/api/watcher.ts | 30 +++++++++++++++++++ .../src/AixPPTist/src/store/classcourse.ts | 2 +- src/renderer/src/plugins/socket/index.js | 25 +++++++++------- src/renderer/src/views/model/index.vue | 4 +-- .../views/prepare/container/class-start.vue | 11 +++---- 10 files changed, 84 insertions(+), 28 deletions(-) diff --git a/.env.development b/.env.development index b3a7114..422cd04 100644 --- a/.env.development +++ b/.env.development @@ -17,8 +17,8 @@ VITE_APP_RES_FILE_PATH = 'https://file.ysaix.com:7868/src/assets/textbook/booktx VITE_APP_BUILD_BASE_PATH = 'https://file.ysaix.com:7868/' # websocket 地址 -# VITE_APP_WS_URL = 'wss://file.ysaix.com:7868' -VITE_APP_WS_URL = 'ws://192.168.2.16:7865' +VITE_APP_WS_URL = 'wss://file.ysaix.com:7868' +# VITE_APP_WS_URL = 'ws://192.168.2.16:7865' # 是否显示开发工具 VITE_SHOW_DEV_TOOLS = 'true' diff --git a/src/renderer/src/AixPPTist/src/App.vue b/src/renderer/src/AixPPTist/src/App.vue index 77b800d..f90545d 100644 --- a/src/renderer/src/AixPPTist/src/App.vue +++ b/src/renderer/src/AixPPTist/src/App.vue @@ -27,8 +27,8 @@ import msgUtils from '@/plugins/modal' // 消息工具 import * as API_entpcoursefile from '@/api/education/entpcoursefile' // 相关api import { PPTApi } from './api' import { sessionStore } from '@/utils/store' // electron-store 状态管理 -import './api/watcher' // 监听 import './api/classcourse' // 课程相关 +import './api/watcher' // 监听 const loading = ref(true) const _isPC = isPC() diff --git a/src/renderer/src/AixPPTist/src/api/classcourse.ts b/src/renderer/src/AixPPTist/src/api/classcourse.ts index ca162e1..efa8df9 100644 --- a/src/renderer/src/AixPPTist/src/api/classcourse.ts +++ b/src/renderer/src/AixPPTist/src/api/classcourse.ts @@ -2,20 +2,20 @@ * @author zdg * @description 上课相关内容 */ -import type { Classcourse } from './types' +// import type { Classcourse } from './types' import { sessionStore } from '@/utils/store' // electron-store 状态管理 import * as useStore from '../store' // pptist-状态管理 -import { ChatWs } from '@/plugins/socket' // 聊天socket +import ChatWs from '@/plugins/socket' // 聊天socket const screenStore = useStore.useScreenStore() // 全屏-状态管理 const classcourseStore = useStore.useClasscourseStore() // 课堂信息-状态管理 -const classcourse: Classcourse = sessionStore.get('curr.classcourse') // 课堂信息 +const classcourse = sessionStore.get('curr.classcourse') // 课堂信息 // 如果课堂信息有值,则连接socket if (!!classcourse) { // 连接socket - const ws = new ChatWs() - console.log('ws- ',ws) - // ChatWs.connect(classcourse.id) + if (!ChatWs.ws) ChatWs.init() + ChatWs.id = classcourse.timgroupid // 群组id + console.log('ws- ',ws, classcourse) classcourseStore.setClasscourse(classcourse) } // 打开全屏 diff --git a/src/renderer/src/AixPPTist/src/api/index.ts b/src/renderer/src/AixPPTist/src/api/index.ts index b0c8239..57bc29e 100644 --- a/src/renderer/src/AixPPTist/src/api/index.ts +++ b/src/renderer/src/AixPPTist/src/api/index.ts @@ -3,7 +3,7 @@ * @author zdg * @date 2024-11-26 */ -import { toRaw } from 'vue' +import { toRaw, nextTick } from 'vue' import type { Result } from './types' // 接口类型 import msgUtils from '@/plugins/modal' // 消息工具 import * as API_entpcoursefile from '@/api/education/entpcoursefile' // 相关api @@ -12,6 +12,8 @@ import * as useStore from '../store' // pptist-状态管理 import { sessionStore } from '@/utils/store' // electron-store 状态管理 import useUserStore from '@/store/modules/user' // 外部-用户信息 +import { toPng, toJpeg } from 'html-to-image' // 引入html-to-image库 + const slidesStore = useStore.useSlidesStore() const userStore = useUserStore() @@ -142,6 +144,8 @@ export class PPTApi { // 更新幻灯片 static updateSlide(data: object): Promise { return new Promise(async (resolve, reject) => { + const thumUrl = await this.getSlideThumUrl() + data.base64Code = thumUrl // 更新缩略图 const res: Result = await API_entpcoursefile.updateEntpcoursefileNew(data) if (res.code === 200) { resolve(true) @@ -184,6 +188,21 @@ export class PPTApi { else msgUtils.msgError(res.msg || '更新失败');return false }) } + // thumbnail-slide thumbnail + static getSlideThumUrl(): Promise { + return nextTick().then(async() => { + const slideIndex = slidesStore.slideIndex + const elements = document.querySelectorAll('.thumbnail-slide') + if (elements.length && slideIndex >= 0) { + const element = elements[slideIndex] + return await toPng(element) + } + return null + }) + // return API_smarttalk.updateThumbnail().then(res => { + // if (res.code === 200) return true + // else msgUtils.msgError(res.msg || '更新失败');return false + } } export default PPTApi \ No newline at end of file diff --git a/src/renderer/src/AixPPTist/src/api/types.ts b/src/renderer/src/AixPPTist/src/api/types.ts index 8d4f81c..1f2de61 100644 --- a/src/renderer/src/AixPPTist/src/api/types.ts +++ b/src/renderer/src/AixPPTist/src/api/types.ts @@ -19,6 +19,7 @@ export interface Classcourse { entpcoursefileid?: number|string, // 课程文件id classid?: number|string, // 班级id entpcourseid?: number|string, // 章节中间表id + timgroupid?: number|string, // ws 群组id plandate?: string, // 计划时间 opendate?: string, // 开课时间 } \ 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 f1f21ba..f515b8e 100644 --- a/src/renderer/src/AixPPTist/src/api/watcher.ts +++ b/src/renderer/src/AixPPTist/src/api/watcher.ts @@ -6,6 +6,7 @@ import { watch } from 'vue' import { PPTApi } from './index' import * as store from '../store' import { sessionStore } from '@/utils/store' // electron-store 状态管理 +import ChatWs from '@/plugins/socket' // 聊天socket const slidesStore = store.useSlidesStore() const resource = sessionStore.get('curr.resource') // apt 资源 const smarttalk = sessionStore.get('curr.smarttalk') // 备课资源 @@ -24,6 +25,19 @@ watch(() => slidesStore.title, (newVal, oldVal) => { updatePPT({title: newVal}) }) +// 消息监听ws +if (ChatWs.ws) { + ChatWs.watch((msg, e) => { + try { + handleMessage(JSON.parse(msg)) + } catch (error) { + console.error('socket 解析异常 ', error, e) + handleMessage(msg) + } + }) +} + +// 更新ppt内容 const updatePPT = async (data) => { if (!resource) return data.id = resource.id @@ -36,4 +50,20 @@ const updatePPT = async (data) => { await PPTApi.updateSmarttalk(params) // 更新ppt内容 sessionStore.set('curr.smarttalk.fileShowName', params.fileShowName) } +} + +// ws消息处理 +const handleMessage = (msg) => { + if (typeof msg === 'object'){ + const { head, content, ...other } = msg + console.log('ws-msg', head, content, other) + switch (head) { + case 'chat': + break + case 'update': + break + default: + break + } + } } \ No newline at end of file diff --git a/src/renderer/src/AixPPTist/src/store/classcourse.ts b/src/renderer/src/AixPPTist/src/store/classcourse.ts index 7abd3fe..bd77fbd 100644 --- a/src/renderer/src/AixPPTist/src/store/classcourse.ts +++ b/src/renderer/src/AixPPTist/src/store/classcourse.ts @@ -2,7 +2,7 @@ import { defineStore } from 'pinia' import type { Classcourse } from '../api/types' export interface ClasscourseState { - classcourse: Classcourse + classcourse: Classcourse | any, // 课堂信息 } export const useClasscourseStore = defineStore('classcourse', { diff --git a/src/renderer/src/plugins/socket/index.js b/src/renderer/src/plugins/socket/index.js index 968ac53..3edd643 100644 --- a/src/renderer/src/plugins/socket/index.js +++ b/src/renderer/src/plugins/socket/index.js @@ -8,6 +8,7 @@ import useUserStore from '@/store/modules/user' // 用户信息 export class ChatWs { instance = null; // 实例 id = null; // 群聊id || 单聊id-用户id(userId) + url = null; // ws地址 closed = false; // 关闭状态 onmessage = null; // 自定义处理 errCount = 5; // 重连次数 (ms) 暂时不使用 @@ -19,12 +20,16 @@ export class ChatWs { beat: 'heart_beat', // 心跳 } static base = 'wss://file.ysaix.com:7868' - constructor() { + + // 构造函数 是否自动连接 + constructor(bool = true) { if (!ChatWs.instance) { - const userStore = useUserStore() // 用户信息 - const wsBase = import.meta.env.VITE_APP_WS_URL; // ws地址 - const url = `${wsBase||ChatWs.base}/ws/websocket/${userStore.id}`; - this.init(url); + if (bool) { // 是否自动连接 + const userStore = useUserStore() // 用户信息 + const wsBase = import.meta.env.VITE_APP_WS_URL; // ws地址 + this.url = `${wsBase||ChatWs.base}/ws/websocket/${userStore.id}`; + // this.init(url); + } ChatWs.instance = this; } return ChatWs.instance; @@ -32,7 +37,7 @@ export class ChatWs { // 初始化 init(url) { - this.url = url; + !!url && (this.url = url); this.ws = null; const _this = this this.heartCheck = { @@ -78,10 +83,9 @@ export class ChatWs { // 拿到任何消息都说明当前连接是正常的 const isBeat = e.data == 'pong' isBeat && self.heartCheck.reset().start(); - const exts = ['sessionId', 'pong'] // 不处理的消息头 const isEmpty = !e.data - const isExts = exts.some(item => e.data.includes(item)) - if (isEmpty && isExts) return; + const isExts = e.data.includes('sessionId') || e.data == ('pong') + if (isEmpty || isExts) return; // 自定义处理 self.onmessage && self.onmessage(e.data, e); }; @@ -137,7 +141,7 @@ export class ChatWs { * @param {*} id 群聊id || 单聊id-用户id(userId) */ getMsgObj(msg, chatType = 'group', id) { - if (typeof msg === "object") msg = JSON.stringify(msg) + // if (typeof msg === "object") msg = JSON.stringify(msg) const res = {msg, chatType} // if (!id) throw new Error(`${type=='group'?'群ID':'用户ID'} is not null`) if (chatType == 'group') res.groupId = id || this.id || '' @@ -160,5 +164,6 @@ export class ChatWs { } // 连接socket export const connect = () => new ChatWs() +export const getInstance = () => new ChatWs(false) // 默认实例 export default new ChatWs() \ No newline at end of file diff --git a/src/renderer/src/views/model/index.vue b/src/renderer/src/views/model/index.vue index 3fe9bbc..b290275 100644 --- a/src/renderer/src/views/model/index.vue +++ b/src/renderer/src/views/model/index.vue @@ -199,8 +199,8 @@ const HTTP_SERVER_API = (type, params = {}) => { case 'addSmarttalk': { // 获取课程 const def = { fileId: '', // 文件id - Entpcoursefile 对应id - fileFlag: 'aptist', - fileShowName: courseObj.coursetitle + '.aptist', + fileFlag: 'aippt', + fileShowName: courseObj.coursetitle + '.aippt', textbookId: courseObj.textbookId, levelFirstId: courseObj.levelFirstId, levelSecondId: courseObj.levelSecondId, diff --git a/src/renderer/src/views/prepare/container/class-start.vue b/src/renderer/src/views/prepare/container/class-start.vue index 77eb615..08b3b7f 100644 --- a/src/renderer/src/views/prepare/container/class-start.vue +++ b/src/renderer/src/views/prepare/container/class-start.vue @@ -267,10 +267,10 @@ const createClasscourse = async () => { setTimeout(() => { msgEl.close() msgEl = ElMessage.warning({message:'正在打开公屏,请稍后...',duration: 0}) - setTimeout(() => { + setTimeout(async() => { msgEl.close() - const classcourse = {...params, id: teacherForm.form.classcourseid} - openPublicScreen(classcourse) + const res = await Http_Classcourse.getClasscourse(teacherForm.form.classcourseid) + openPublicScreen(res.data) }, 2000); }, 1000); } @@ -303,9 +303,10 @@ const classTeachingStart = async () => { // 新版-pptList 打开公屏 if (myClassActive.value.filetype == 'aptist') { const msgEl = ElMessage.warning({message:'正在打开公屏,请稍后...',duration: 0}) - setTimeout(() => { + setTimeout(async () => { msgEl.close() - openPublicScreen({id}) + const res = await Http_Classcourse.getClasscourse(teacherForm.form.classcourseid) + openPublicScreen(res.data) }, 2000); }else { const url = `/teaching/classteaching?classcourseid=${id}&actor=classTeachingOnPublicScreen` From 85d06f306a5f4307710725f46254121eab8ca434 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E6=9D=A8?= <666> Date: Tue, 10 Dec 2024 15:34:46 +0800 Subject: [PATCH 2/7] =?UTF-8?q?fix=EF=BC=9Appt=E6=B4=BB=E5=8A=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/src/AixPPTist/src/api/index.ts | 4 +- .../ElementStylePanel/Active/index.vue | 107 ++++++++++-------- .../classTask/newClassTaskAssign/index.vue | 16 ++- 3 files changed, 75 insertions(+), 52 deletions(-) diff --git a/src/renderer/src/AixPPTist/src/api/index.ts b/src/renderer/src/AixPPTist/src/api/index.ts index c893a00..c27f0d8 100644 --- a/src/renderer/src/AixPPTist/src/api/index.ts +++ b/src/renderer/src/AixPPTist/src/api/index.ts @@ -55,7 +55,6 @@ export class PPTApi { return new Promise(async (resolve, reject) => { const params: object = { parentid, orderByColumn: 'fileidx', isAsc: 'asc', pageSize: 9999 } const res: Result = await API_entpcoursefile.listEntpcoursefileNew(params) - console.log(res.rows,'res.rows'); if (res.code === 200) { const slides = (res.rows || []).map(o => { if (!!o.datacontent) { @@ -69,7 +68,8 @@ export class PPTApi { // 活动列表处理 const workList = (res.rows || []).map(o => o.activityContent) const workItem = [...res.rows] - slidesStore.updateSlideIndex(0) // 下标0 为第一页 + // 加入活动后刷新ppt数据内容,不跟换为第一页 + // slidesStore.updateSlideIndex(0) // 下标0 为第一页 slidesStore.setSlides(slides) // 写入数据 // 写入作业列表数据 slidesStore.setWorkList(workList) diff --git a/src/renderer/src/AixPPTist/src/views/Editor/Toolbar/ElementStylePanel/Active/index.vue b/src/renderer/src/AixPPTist/src/views/Editor/Toolbar/ElementStylePanel/Active/index.vue index c5f5c31..c4bc362 100644 --- a/src/renderer/src/AixPPTist/src/views/Editor/Toolbar/ElementStylePanel/Active/index.vue +++ b/src/renderer/src/AixPPTist/src/views/Editor/Toolbar/ElementStylePanel/Active/index.vue @@ -30,7 +30,7 @@ -
+
- - - + + +
+ +
@@ -142,7 +144,6 @@ const currentCourse = reactive({ worktype: '', }) -const dataList = ref([]) const dialogVisible = ref(false) const tasklist_loading = ref(false) @@ -152,11 +153,6 @@ const taskList = ref([]) // 活动引用的弹窗 const activeVisible = ref(false) -const params = reactive({ - parentid: 14766, - pageSize: 500, - orderby: 'fileidx' -}) const type = ref([ { @@ -179,6 +175,8 @@ const workList = ref([]) // 获取所选择的作业列表 const selectedWorkList = ref([]) +// 活动页面的loading框 +const loadingActive = ref(false) const paramData = ref<{ id: number, activityContent: string }>({} as { id: number, activityContent: string }) @@ -196,7 +194,6 @@ const formatClassWorkFile = async (postData: WorkItem[]): Promise => { } break; case '习题训练': { - console.log(item,'item'); // let workIds = item.quizlist!.map(items => items.id).join(','); // let ress = await listEntpcoursework({ ids: workIds }); // const arr = ress.rows.map((item:{id:number}) => { @@ -213,23 +210,20 @@ const formatClassWorkFile = async (postData: WorkItem[]): Promise => { case '常规作业': { // item.prevData = JSON.parse(item.workcodes); } - } - const arr = paramData.value.activityContent.split(',') - arr.push(item.id.toString()) - await PPTApi.updateSlide(paramData.value) - addWorkList(item) + } + workList.value.push(item) + loadingActive.value = false } await nextTick(); -} -// 添加的活动回显到页面上面去 -const addWorkList = (item: WorkItem) => { - workList.value.push(item) -} -// 删除作业 +}// 删除作业 const handleRemoveDemoActivityClassWork = (item: WorkItem) => { ElMessageBox.confirm('是否确认删除?') .then(() => { - workList.value.splice(workList.value.indexOf(item), 1); + workList.value = [] + const arr = paramData.value.activityContent.split(',') + const filterArr = arr.filter(itemId => itemId!== item.id.toString()) + paramData.value.activityContent = filterArr.join(',') + upDateData() }) .catch(() => { }); } @@ -269,13 +263,52 @@ const savePPtData = async () => { ElMessage.warning('请选择活动') return } + workList.value = [] const arr = selectedWorkList.value.map(item => item.id) // 应该是新加而不是覆盖 - paramData.value.activityContent = arr.join(',') - await PPTApi.updateSlide(paramData.value) + debugger + const existingIds = paramData.value.activityContent ? paramData.value.activityContent.split(',') : [] + paramData.value.activityContent = Array.from(new Set([...existingIds, ...arr])).join(',') + upDateData() activeVisible.value = false } +// 获取当前ppt页的数据 +const getCurrentPPtData = async () => { + workList.value = [] + objItem.value = workItem.value[slideIndex.value] + paramData.value.id = objItem.value.id + paramData.value.activityContent = objItem.value?.activityContent + if (objItem.value?.activityContent) { + loadingActive.value = true + const res = await homeworklist({ ids: objItem.value?.activityContent, pageSize: 100 }) + await formatClassWorkFile(res.rows) + } +} + +// 接收习题训练的值 +const getData = async (data: WorkItem) => { + workList.value = [] + if(paramData.value.activityContent){ + const arr = paramData.value.activityContent.split(',') + arr.push(data.id.toString()) + const unitArr = Array.from(new Set(arr)) + paramData.value.activityContent = unitArr.join(',') + }else{ + paramData.value.activityContent = data.id.toString() + } + upDateData() + dialogVisible.value = false +} +const upDateData = async () => { + await PPTApi.updateSlide(paramData.value) + loadingActive.value = true + const res = await homeworklist({ ids: paramData.value.activityContent, pageSize: 100 }) + await formatClassWorkFile(res.rows) + const resource = sessionStore.get('curr.resource') + await PPTApi.getSlideList(resource.id) +} + onMounted(() => { const curNode = sessionStore.get('subject.curNode') as CourseNode currentCourse.textbookId = curNode.rootid @@ -283,33 +316,12 @@ onMounted(() => { currentCourse.levelSecondId = curNode.id currentCourse.coursetitle = curNode.itemtitle currentCourse.node = curNode - listEntpcoursefile(params).then((res: { rows: WorkItem[] }) => { - dataList.value = [...res.rows] - }) objItem.value = workItem.value[slideIndex.value] getCurrentPPtData() }) watch(() => slideIndex.value, () => { getCurrentPPtData() }) -// 获取当前ppt页的数据 -const getCurrentPPtData = async () => { - workList.value = [] - objItem.value = workItem.value[slideIndex.value] - paramData.value.id = objItem.value.id - if (objItem.value?.activityContent) { - paramData.value.activityContent = objItem.value?.activityContent - const res = await homeworklist({ ids: objItem.value?.activityContent, pageSize: 100 }) - await formatClassWorkFile(res.rows) - } -} - -// 接收习题训练的值 -const getData = async (data: WorkItem) => { - console.log(data, 'data') - await formatClassWorkFile([data]) -} - \ No newline at end of file diff --git a/src/renderer/src/views/classTask/newClassTaskAssign/index.vue b/src/renderer/src/views/classTask/newClassTaskAssign/index.vue index 577a881..21d239f 100644 --- a/src/renderer/src/views/classTask/newClassTaskAssign/index.vue +++ b/src/renderer/src/views/classTask/newClassTaskAssign/index.vue @@ -157,6 +157,7 @@ const props = defineProps({ currentCourse: Object, }) const emits = defineEmits(['getData']) +// 这个代表的是是否从ppt里面添加的作业 const isShow = ref(false) const propsQueryCourseObj = route.query.courseObj;//作业布置的内容对象 @@ -490,11 +491,13 @@ const handleClassWorkFormQuizRemove = (index) =>{ // 当前为[编辑]状态下点进来得处理 newWorkSpaceEdit true 为编辑状态 - if(classWorkForm.id != '' ) {// 编辑状态 有id - - editWork(cform); // 编辑作业 + if(isShow.value === false){ + if(classWorkForm.id != '' ) {// 编辑状态 有id + editWork(cform); // 编辑作业 return; + } } + if (classWorkForm.worktype === "课堂展示") { boardLoading.value = true @@ -596,7 +599,12 @@ const handleClassWorkFormQuizRemove = (index) =>{ } console.log('该清空左侧列表数据了'); // 清空左侧 选中的布置列表 并刷新列表 - currentRow.value = {id:0}; + debugger + if(isShow.value){ + currentRow.value = {id:1}; + }else{ + currentRow.value = {id:0}; + } initHomeWork(); From c159d6be1a22645cd32eaf61b2f9a2cb0f2c406f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E6=9D=A8?= <666> Date: Tue, 10 Dec 2024 15:38:19 +0800 Subject: [PATCH 3/7] =?UTF-8?q?fix:=E6=B8=85=E9=99=A4debugger;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/Editor/Toolbar/ElementStylePanel/Active/index.vue | 1 - src/renderer/src/views/classTask/newClassTaskAssign/index.vue | 1 - 2 files changed, 2 deletions(-) diff --git a/src/renderer/src/AixPPTist/src/views/Editor/Toolbar/ElementStylePanel/Active/index.vue b/src/renderer/src/AixPPTist/src/views/Editor/Toolbar/ElementStylePanel/Active/index.vue index c4bc362..bc658cf 100644 --- a/src/renderer/src/AixPPTist/src/views/Editor/Toolbar/ElementStylePanel/Active/index.vue +++ b/src/renderer/src/AixPPTist/src/views/Editor/Toolbar/ElementStylePanel/Active/index.vue @@ -266,7 +266,6 @@ const savePPtData = async () => { workList.value = [] const arr = selectedWorkList.value.map(item => item.id) // 应该是新加而不是覆盖 - debugger const existingIds = paramData.value.activityContent ? paramData.value.activityContent.split(',') : [] paramData.value.activityContent = Array.from(new Set([...existingIds, ...arr])).join(',') upDateData() diff --git a/src/renderer/src/views/classTask/newClassTaskAssign/index.vue b/src/renderer/src/views/classTask/newClassTaskAssign/index.vue index 21d239f..8d18094 100644 --- a/src/renderer/src/views/classTask/newClassTaskAssign/index.vue +++ b/src/renderer/src/views/classTask/newClassTaskAssign/index.vue @@ -599,7 +599,6 @@ const handleClassWorkFormQuizRemove = (index) =>{ } console.log('该清空左侧列表数据了'); // 清空左侧 选中的布置列表 并刷新列表 - debugger if(isShow.value){ currentRow.value = {id:1}; }else{ From 013669dd35cfd9fd076974c851959895aad950f7 Mon Sep 17 00:00:00 2001 From: lyc Date: Tue, 10 Dec 2024 15:42:59 +0800 Subject: [PATCH 4/7] =?UTF-8?q?edit=20=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../container/adjust-dialog.vue | 58 +- .../container/keyword-dialog.vue | 30 +- .../template-study/container/left-dialog.vue | 167 +++++- .../template-study/container/left.vue | 7 +- .../template-study/container/right.vue | 17 +- .../src/components/typing-effect/index.vue | 5 +- .../container/adjust-dialog.vue | 306 ----------- .../examination-analysis/container/dialog.vue | 268 --------- .../container/edit-dialog.vue | 78 --- .../examination-analysis/container/header.vue | 143 ----- .../container/keyword-dialog.vue | 161 ------ .../examination-analysis/container/pdf.vue | 32 -- .../examination-analysis/container/result.vue | 513 ------------------ .../src/views/examination-analysis/index.vue | 47 +- 14 files changed, 232 insertions(+), 1600 deletions(-) delete mode 100644 src/renderer/src/views/examination-analysis/container/adjust-dialog.vue delete mode 100644 src/renderer/src/views/examination-analysis/container/dialog.vue delete mode 100644 src/renderer/src/views/examination-analysis/container/edit-dialog.vue delete mode 100644 src/renderer/src/views/examination-analysis/container/header.vue delete mode 100644 src/renderer/src/views/examination-analysis/container/keyword-dialog.vue delete mode 100644 src/renderer/src/views/examination-analysis/container/pdf.vue delete mode 100644 src/renderer/src/views/examination-analysis/container/result.vue diff --git a/src/renderer/src/components/template-study/container/adjust-dialog.vue b/src/renderer/src/components/template-study/container/adjust-dialog.vue index 5cf6251..65316c3 100644 --- a/src/renderer/src/components/template-study/container/adjust-dialog.vue +++ b/src/renderer/src/components/template-study/container/adjust-dialog.vue @@ -29,6 +29,20 @@
+
+ + + {{ curFile.fileName }} + + + + +
@@ -40,13 +54,15 @@ +const clickItem = (index, item) => { + activeIndex.value = index + Object.assign(curFile, item) + emitter.emit('changeCurFile', item) +} +const prevItem = reactive({}) +const onPrevItem = (item) => { + Object.assign(prevItem, item) + prevVisible.value = true +} + +onMounted(() => { + let data = sessionStore.get('subject.curNode') + Object.assign(curNode, data); + // 暂时写死"考试-" 目前只有考试分析才会弹出来 + let jsonKey = `考试-${curNode.edustage}-${curNode.edusubject}` + dataset_id.value = dataSetJson[jsonKey] + getList() +}) + + \ No newline at end of file diff --git a/src/renderer/src/components/template-study/container/left.vue b/src/renderer/src/components/template-study/container/left.vue index ae67aed..02db0d4 100644 --- a/src/renderer/src/components/template-study/container/left.vue +++ b/src/renderer/src/components/template-study/container/left.vue @@ -2,12 +2,13 @@
- {{ curNode.edustage }}{{ curNode.edusubject }}{{ type == 1 ? '课标研读' : '教材分析' }}
+
@@ -24,7 +25,7 @@ const props = defineProps(['curNode', 'type']) const showDialog = ref(false) const onClick = () => { - if (props.type == 1) return + if (props.type != 3) return showDialog.value = true } @@ -37,7 +38,9 @@ onMounted(async () => { if(props.type == 1){ fileurl = `${data.edustage}-${data.edusubject}-课标.txt` } + if(fileurl == '') return pdfUrl.value = import.meta.env.VITE_APP_RES_FILE_PATH + fileurl.replace('.txt', '.pdf') + }) diff --git a/src/renderer/src/components/template-study/container/right.vue b/src/renderer/src/components/template-study/container/right.vue index d62793a..8bc77e1 100644 --- a/src/renderer/src/components/template-study/container/right.vue +++ b/src/renderer/src/components/template-study/container/right.vue @@ -39,7 +39,7 @@ @@ -79,7 +79,7 @@ - + diff --git a/src/renderer/src/views/examination-analysis/container/dialog.vue b/src/renderer/src/views/examination-analysis/container/dialog.vue deleted file mode 100644 index 5e41740..0000000 --- a/src/renderer/src/views/examination-analysis/container/dialog.vue +++ /dev/null @@ -1,268 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/renderer/src/views/examination-analysis/container/edit-dialog.vue b/src/renderer/src/views/examination-analysis/container/edit-dialog.vue deleted file mode 100644 index 06548d6..0000000 --- a/src/renderer/src/views/examination-analysis/container/edit-dialog.vue +++ /dev/null @@ -1,78 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/renderer/src/views/examination-analysis/container/header.vue b/src/renderer/src/views/examination-analysis/container/header.vue deleted file mode 100644 index 880debf..0000000 --- a/src/renderer/src/views/examination-analysis/container/header.vue +++ /dev/null @@ -1,143 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/renderer/src/views/examination-analysis/container/keyword-dialog.vue b/src/renderer/src/views/examination-analysis/container/keyword-dialog.vue deleted file mode 100644 index 4821d6e..0000000 --- a/src/renderer/src/views/examination-analysis/container/keyword-dialog.vue +++ /dev/null @@ -1,161 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/renderer/src/views/examination-analysis/container/pdf.vue b/src/renderer/src/views/examination-analysis/container/pdf.vue deleted file mode 100644 index c871a8d..0000000 --- a/src/renderer/src/views/examination-analysis/container/pdf.vue +++ /dev/null @@ -1,32 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/renderer/src/views/examination-analysis/container/result.vue b/src/renderer/src/views/examination-analysis/container/result.vue deleted file mode 100644 index 304d70a..0000000 --- a/src/renderer/src/views/examination-analysis/container/result.vue +++ /dev/null @@ -1,513 +0,0 @@ - - - - - - diff --git a/src/renderer/src/views/examination-analysis/index.vue b/src/renderer/src/views/examination-analysis/index.vue index 7461e1c..ce74808 100644 --- a/src/renderer/src/views/examination-analysis/index.vue +++ b/src/renderer/src/views/examination-analysis/index.vue @@ -1,52 +1,11 @@ \ No newline at end of file From a1a4e11de7d08b94b4929d5eb4440ebc450d8b7c Mon Sep 17 00:00:00 2001 From: lyc Date: Wed, 11 Dec 2024 09:40:51 +0800 Subject: [PATCH 5/7] add icon --- src/renderer/src/assets/iconfont/iconfont.css | 26 +++++++++++-- src/renderer/src/assets/iconfont/iconfont.js | 2 +- .../src/assets/iconfont/iconfont.json | 35 ++++++++++++++++++ src/renderer/src/assets/iconfont/iconfont.ttf | Bin 32644 -> 34960 bytes .../src/assets/iconfont/iconfont.woff | Bin 18412 -> 19780 bytes .../src/assets/iconfont/iconfont.woff2 | Bin 15664 -> 16764 bytes .../src/components/file-image/index.vue | 5 +++ 7 files changed, 64 insertions(+), 4 deletions(-) diff --git a/src/renderer/src/assets/iconfont/iconfont.css b/src/renderer/src/assets/iconfont/iconfont.css index ea364a2..48ced18 100644 --- a/src/renderer/src/assets/iconfont/iconfont.css +++ b/src/renderer/src/assets/iconfont/iconfont.css @@ -1,8 +1,8 @@ @font-face { font-family: "iconfont"; /* Project id 4723712 */ - src: url('iconfont.woff2?t=1732240267757') format('woff2'), - url('iconfont.woff?t=1732240267757') format('woff'), - url('iconfont.ttf?t=1732240267757') format('truetype'); + src: url('iconfont.woff2?t=1733880548695') format('woff2'), + url('iconfont.woff?t=1733880548695') format('woff'), + url('iconfont.ttf?t=1733880548695') format('truetype'); } .iconfont { @@ -13,6 +13,26 @@ -moz-osx-font-smoothing: grayscale; } +.icon-yuyin:before { + content: "\e648"; +} + +.icon-dianying:before { + content: "\e693"; +} + +.icon-jiqirenfushi:before { + content: "\e624"; +} + +.icon-xiangmuicon_maobishufa:before { + content: "\e651"; +} + +.icon-meishu-F:before { + content: "\e638"; +} + .icon-shangchuan:before { content: "\e61b"; } diff --git a/src/renderer/src/assets/iconfont/iconfont.js b/src/renderer/src/assets/iconfont/iconfont.js index a4efe1b..55c5cce 100644 --- a/src/renderer/src/assets/iconfont/iconfont.js +++ b/src/renderer/src/assets/iconfont/iconfont.js @@ -1 +1 @@ -window._iconfont_svg_string_4723712='',(l=>{var h=(c=(c=document.getElementsByTagName("script"))[c.length-1]).getAttribute("data-injectcss"),c=c.getAttribute("data-disable-injectsvg");if(!c){var a,v,t,i,z,p=function(h,c){c.parentNode.insertBefore(h,c)};if(h&&!l.__iconfont__svg__cssinject__){l.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(h){console&&console.log(h)}}a=function(){var h,c=document.createElement("div");c.innerHTML=l._iconfont_svg_string_4723712,(c=c.getElementsByTagName("svg")[0])&&(c.setAttribute("aria-hidden","true"),c.style.position="absolute",c.style.width=0,c.style.height=0,c.style.overflow="hidden",c=c,(h=document.body).firstChild?p(c,h.firstChild):h.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(v=function(){document.removeEventListener("DOMContentLoaded",v,!1),a()},document.addEventListener("DOMContentLoaded",v,!1)):document.attachEvent&&(t=a,i=l.document,z=!1,o(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,M())})}function M(){z||(z=!0,t())}function o(){try{i.documentElement.doScroll("left")}catch(h){return void setTimeout(o,50)}M()}})(window); \ No newline at end of file +window._iconfont_svg_string_4723712='',(l=>{var h=(c=(c=document.getElementsByTagName("script"))[c.length-1]).getAttribute("data-injectcss"),c=c.getAttribute("data-disable-injectsvg");if(!c){var a,v,t,i,z,p=function(h,c){c.parentNode.insertBefore(h,c)};if(h&&!l.__iconfont__svg__cssinject__){l.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(h){console&&console.log(h)}}a=function(){var h,c=document.createElement("div");c.innerHTML=l._iconfont_svg_string_4723712,(c=c.getElementsByTagName("svg")[0])&&(c.setAttribute("aria-hidden","true"),c.style.position="absolute",c.style.width=0,c.style.height=0,c.style.overflow="hidden",c=c,(h=document.body).firstChild?p(c,h.firstChild):h.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(v=function(){document.removeEventListener("DOMContentLoaded",v,!1),a()},document.addEventListener("DOMContentLoaded",v,!1)):document.attachEvent&&(t=a,i=l.document,z=!1,o(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,M())})}function M(){z||(z=!0,t())}function o(){try{i.documentElement.doScroll("left")}catch(h){return void setTimeout(o,50)}M()}})(window); \ No newline at end of file diff --git a/src/renderer/src/assets/iconfont/iconfont.json b/src/renderer/src/assets/iconfont/iconfont.json index fc6689f..7e335cb 100644 --- a/src/renderer/src/assets/iconfont/iconfont.json +++ b/src/renderer/src/assets/iconfont/iconfont.json @@ -5,6 +5,41 @@ "css_prefix_text": "icon-", "description": "", "glyphs": [ + { + "icon_id": "6338162", + "name": "语音生成", + "font_class": "yuyin", + "unicode": "e648", + "unicode_decimal": 58952 + }, + { + "icon_id": "6880941", + "name": "视频生成", + "font_class": "dianying", + "unicode": "e693", + "unicode_decimal": 59027 + }, + { + "icon_id": "11532042", + "name": "数字人生成", + "font_class": "jiqirenfushi", + "unicode": "e624", + "unicode_decimal": 58916 + }, + { + "icon_id": "13522843", + "name": "文生图片", + "font_class": "xiangmuicon_maobishufa", + "unicode": "e651", + "unicode_decimal": 58961 + }, + { + "icon_id": "37635062", + "name": "文生连环画", + "font_class": "meishu-F", + "unicode": "e638", + "unicode_decimal": 58936 + }, { "icon_id": "4942656", "name": "上传", diff --git a/src/renderer/src/assets/iconfont/iconfont.ttf b/src/renderer/src/assets/iconfont/iconfont.ttf index 04dd21f4fc21cbd19051a57dbb6f9e94b9706a11..51df6e8ec978b8688e99533c838fda23d52901c1 100644 GIT binary patch delta 4232 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 delta 1941 zcma*nSxj7I6bJDCodt${M}}dUvUQ-WQ#M;{k!p*TR%#cqE%T?rirv%QrP` z8{f31a)Z%;^%j7(j=uJR+7CuQ2kgB-_^s~V;nRahbM^pHe*=BRJzedcMW6J>^RsuU zx`!8B*PLa1K1X>yeM5n<%bTnGy%oCH+uzadeGnGl_iOq7LSK7ez`A5r^1U>^_MUC; z>x#dgUUvf+_5rr;f&Rgv&q^*%05sKusP~ju)o3AF4)Xf9_D*(p)Bj16&{+hx@ID56IN#9)@9flVBdOH%oxf4YJ|g< z8oFUm$;_1kDU=eak=?RS4oH(U%W)Zz3vxxShN>OKp;*Tk!6E#224K!np0hl^!uM&_ zN0E#ps74KH@i2CUTAbO3JUECak$~-pLo^rZLm9SV2a1u0Ry>CYG$9q0cpgPagahe_ zXCjhtk{LXVa-<*=h0J9x6B#!1qtj*u`8zxuz0#ICqZ z2uo*h!4Rk7(jnoBNr1Q%(*cQ4ObjH*ItejH5SHFxwjjJMgL#9*C}t26tC&kjoMKiX zY+!@=g(N6u8j`4(b4Ze6_8}=M$U;EeiY0+~lxZYko(z@=QlMBcNTFisAm(O?MTFES zmJ_mDv9ORw6*wW%px|ZPhoE@?%MLl9*Z`0w#a4hER%{B0`9orRKuj5kjRG;*Beo30 ze4p4n5OX8MHiDSa5*rHArcfK?lXk@}gPc;>#n_=>R??|Z$JnLt2;*smJ&fH7dl`Ea z>KR{BFj+XGV6yNs1^EDGKzbD(W9(CSobjx}e#U+Ulc@oPM#ggrPcXisV9GeCI5dzU z#qoi>syIjp%6YyZ&J^S|#p!|sl$j41R-8D;JAipYZ36NFA z%>lA*>c7s_#{)}|%50rWV~TqRmUt5ecM&Xos<@wEnUiC1XTdTX(%>G0Wj3F|-3H4a zD(*YD$L2J+1L58&g`f>ssZwTJ;?aO9E86yvz0|(wXmZ?fraJ@9wXn-!e}s>P|Kzf{ z8eMa)^@wW`3z3tNKSz~EZA3T4B*%=!EXLlCuT1zZaWttV>4)T;6r{YFvXXi`?PS{T zX>0CO_c8aZdn3KqTY9sst!$&*SN?HDQN{j>aet9N;D6tL%YT1oQDuEqeAPtN Zdi8sl`8IjB-)ak;AD_1{bKz2g{U6D`!%YAH diff --git a/src/renderer/src/assets/iconfont/iconfont.woff b/src/renderer/src/assets/iconfont/iconfont.woff index 0771012637957237af8b43579aab6f79d4f3440e..e9b9ac109982c6969f3120e24408fa2611678c62 100644 GIT binary patch delta 19418 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

#BRk0TMx6sLK$0|`G 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 lz^aN>$}v|bOO<%{PKi@tSsRTSxlO96D>o#+4n delta 18080 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 diff --git a/src/renderer/src/assets/iconfont/iconfont.woff2 b/src/renderer/src/assets/iconfont/iconfont.woff2 index dd21fa95bcaa741f29bd537eebef388a76804ed3..ac355d5f298254c03007dead8bd7a60e5208c1a2 100644 GIT binary patch literal 16764 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 z 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

G#_D_7c%GUo@a6a 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 W8HHw75iREt*M^UiGbf-K0000e4e3V! diff --git a/src/renderer/src/components/file-image/index.vue b/src/renderer/src/components/file-image/index.vue index c68ee78..427a53a 100644 --- a/src/renderer/src/components/file-image/index.vue +++ b/src/renderer/src/components/file-image/index.vue @@ -36,6 +36,11 @@ const getFileTypeIcon = () => { rar: 'icon-rar', apt: 'icon-A', aippt: 'icon-A', + aiyuyin: 'icon-yuyin', // 语音生成 + aivideo: 'icon-dianying', // 视频生成 + airobot: 'icon-jiqirenfushi', // 数字人生成 + aiimg: 'icon-xiangmuicon_maobishufa', // 文生图片 + aidraw: 'icon-meishu-F', // 文生连环画 } if (iconObj[name]) { return '#' + iconObj[name] From 9e5609fbdd118708d169969417c815790b12c39b Mon Sep 17 00:00:00 2001 From: zdg Date: Wed, 11 Dec 2024 09:44:52 +0800 Subject: [PATCH 6/7] =?UTF-8?q?ppt=E4=B8=8A=E8=AF=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderer/src/AixPPTist/src/App.vue | 1 - .../src/AixPPTist/src/api/classcourse.ts | 48 ++++-- src/renderer/src/AixPPTist/src/api/types.ts | 142 +++++++++++++++++- src/renderer/src/AixPPTist/src/api/watcher.ts | 35 ++++- src/renderer/src/plugins/imChat/msgEnum.js | 4 + src/renderer/src/plugins/modal.js | 37 ++--- src/renderer/src/plugins/socket/index.js | 10 +- .../src/views/classManage/reserv-item-apt.vue | 40 +++-- .../views/prepare/container/class-start.vue | 53 ++++--- src/renderer/src/views/prepare/index.vue | 34 ++++- 10 files changed, 330 insertions(+), 74 deletions(-) diff --git a/src/renderer/src/AixPPTist/src/App.vue b/src/renderer/src/AixPPTist/src/App.vue index f90545d..7cb504f 100644 --- a/src/renderer/src/AixPPTist/src/App.vue +++ b/src/renderer/src/AixPPTist/src/App.vue @@ -27,7 +27,6 @@ import msgUtils from '@/plugins/modal' // 消息工具 import * as API_entpcoursefile from '@/api/education/entpcoursefile' // 相关api import { PPTApi } from './api' import { sessionStore } from '@/utils/store' // electron-store 状态管理 -import './api/classcourse' // 课程相关 import './api/watcher' // 监听 const loading = ref(true) diff --git a/src/renderer/src/AixPPTist/src/api/classcourse.ts b/src/renderer/src/AixPPTist/src/api/classcourse.ts index efa8df9..e78a19d 100644 --- a/src/renderer/src/AixPPTist/src/api/classcourse.ts +++ b/src/renderer/src/AixPPTist/src/api/classcourse.ts @@ -6,17 +6,47 @@ import { sessionStore } from '@/utils/store' // electron-store 状态管理 import * as useStore from '../store' // pptist-状态管理 import ChatWs from '@/plugins/socket' // 聊天socket +import msgUtils from '@/plugins/modal' // 消息工具 + const screenStore = useStore.useScreenStore() // 全屏-状态管理 const classcourseStore = useStore.useClasscourseStore() // 课堂信息-状态管理 const classcourse = sessionStore.get('curr.classcourse') // 课堂信息 -// 如果课堂信息有值,则连接socket -if (!!classcourse) { - // 连接socket - if (!ChatWs.ws) ChatWs.init() - ChatWs.id = classcourse.timgroupid // 群组id - console.log('ws- ',ws, classcourse) - classcourseStore.setClasscourse(classcourse) +export class Classcourse { + msgObj:ElMessageBox = null // 提示消息对象 + + constructor() { + this.load() + } + /** + * @description 加载 + */ + load() { + // 打开全屏 + screenStore.setScreening(!!classcourse) + // 如果课堂信息有值,则连接socket + if (!!classcourse) { + // 连接socket + if (!ChatWs.ws) ChatWs.init() + ChatWs.id = classcourse.timgroupid // 群组id + console.log('ws- ', classcourse) + classcourseStore.setClasscourse(classcourse) + // 待上课提示 + if (!classcourse.status) { + this.msgObj = { + type: 'success', + title: '系统提示', + message: '公屏课堂已准备完毕,请等待老师开启课堂!', + center: true, + showClose: false, + showCancelButton: false, + showConfirmButton: false, + beforeClose: () => {} + } + msgUtils.ElMessageBox(this.msgObj) + } + } + } } -// 打开全屏 -screenStore.setScreening(!!classcourse) \ No newline at end of file + +export default new Classcourse() \ No newline at end of file diff --git a/src/renderer/src/AixPPTist/src/api/types.ts b/src/renderer/src/AixPPTist/src/api/types.ts index 1f2de61..26881e9 100644 --- a/src/renderer/src/AixPPTist/src/api/types.ts +++ b/src/renderer/src/AixPPTist/src/api/types.ts @@ -22,4 +22,144 @@ export interface Classcourse { timgroupid?: number|string, // ws 群组id plandate?: string, // 计划时间 opendate?: string, // 开课时间 -} \ No newline at end of file +} + +/** + * @description 消息枚举 + * @author zdg + * @date 2021-07-05 14:07:01 + */ + +export class MsgEnum { + /** + * @description: 消息类型 + * + * | 名称 | 含义 | 值(enum) | + * | ---- | ---- | ---- | + * | SYSTEM | 系统消息 | system | + * | TEACHER | 老师消息 | teacher | + * | STUDENT | 学生消息 | student | + * | NOTICE | 通知消息 | notice | + */ + static TYPES = { + /** @desc: 系统消息 */ + SYSTEM: 'system', + /** @desc: 老师消息 */ + TEACHER: 'teacher', + /** @desc: 学生消息 */ + STUDENT: 'student', + /** @desc: 通知消息 */ + NOTICE: 'notice' + } + /** + * @description: 消息头-类型 + * + * | 名称 | 含义 | 值(enum) | + * | ---- | ---- | ---- | + * | --- | 以下为旧定义-消息头 | --- | + * | MSG_closed | 结束课程(下课) | closed | + * | MSG_onlineStatus | 在线状态 | onlineStatus | + * | MSG_pushQuizOfClassWorkdata2Public | 老师端:把选中的学生习题作业,推到大屏 | pushQuizOfClassWorkdata2Public | + * | MSG_pushClassWorkdata2Public | 老师端:把选中的学生作业,推到大屏 | pushClassWorkdata2Public | + * | MSG_shareStudentPresentdata2All | 把某个学生的展示成果数据推给全班所有学生 | shareStudentPresentdata2All | + * | MSG_pushStudentPresentdata2Public | 老师端:课堂展示活动,把选中的学生展示数据,推到大屏 | pushStudentPresentdata2Public | + * | MSG_pushClassWorkPresentList2Public | 老师端:课堂展示活动,任务列表,推到大屏 | pushClassWorkPresentList2Public | + * | MSG_activePageType | 课标研读-分页切换 | activePageType | + * | MSG_slideFlapping | 幻灯片-切换 | slideFlapping | + * | MSG_anmationclick | 幻灯片-动画切换 | anmationclick | + * | MSG_classcourseopen | 群组创建成功 | classcourseopen | + * | MSG_classquizfeedback | 学生的测练结果反馈 | classquizfeedback | + * | MSG_classtaskfeedback | 老师端:接收到学生反馈消息-课堂测练中的其他任务 | classtaskfeedback | + * | MSG_studentfeedback | 老师端:学生反馈的消息,具体要看其中的feedbackkey,类别较繁杂 | studentfeedback | + * | MSG_studentfeedbackcancel | 老师端:学生反馈的消息取消,如取消学会了,取消困惑 | studentfeedbackcancel | + * | MSG_classshowdata | 学生提交的课堂展示数据-要在老师端显示,再由老师选择推送到公屏上 | classshowdata | + * | MSG_classWorkOfPresentDataUpdate | 学生在公屏上展示并完善后,保存后,老师端要更新 | classWorkOfPresentDataUpdate | + * | MSG_classlecturePagesrc | 课堂讲授活动,选择不同的内容 | classlecturePagesrc | + * | --- | 以下为新定义-消息头 | --- | + * | MSG_0001 | 点赞 | 0x0001 | + * | MSG_0002 | xx | 0x0002 | + * | MSG_0003 | xx | 0x0003 | + */ + static HEADS = { + // === 旧定义-消息头(兼容以前) === + /** @desc: 开课 */ + MSG_open : 'open', + /** @desc: 结束课程(下课) */ + MSG_closed : 'closed', + /** @desc: 在线状态 */ + MSG_onlineStatus : 'onlineStatus', + /** @desc: 老师端:把选中的学生习题作业,推到大屏 */ + MSG_pushQuizOfClassWorkdata2Public : 'pushQuizOfClassWorkdata2Public', + /** @desc: 老师端:把选中的学生作业,推到大屏 */ + MSG_pushClassWorkdata2Public : 'pushClassWorkdata2Public', + /** @desc: 把某个学生的展示成果数据推给全班所有学生 */ + MSG_shareStudentPresentdata2All : 'shareStudentPresentdata2All', + /** @desc: 老师端:课堂展示活动,把选中的学生展示数据,推到大屏 */ + MSG_pushStudentPresentdata2Public : 'pushStudentPresentdata2Public', + /** @desc: 老师端:课堂展示活动,任务列表,推到大屏 */ + MSG_pushClassWorkPresentList2Public : 'pushClassWorkPresentList2Public', + /** @desc: 课标研读-分页切换 */ + MSG_activePageType : 'activePageType', + /** @desc: 幻灯片-切换 */ + MSG_slideFlapping : 'slideFlapping', + /** @desc: 幻灯片-动画切换 */ + MSG_anmationclick : 'anmationclick', + /** @desc: 群组创建成功 */ + MSG_classcourseopen : 'classcourseopen', + /** @desc: 学生的测练结果反馈 */ + MSG_classquizfeedback : 'classquizfeedback', + /** @desc: 老师端:接收到学生反馈消息-课堂测练中的其他任务 */ + MSG_classtaskfeedback : 'classtaskfeedback', + /** @desc: 老师端:学生反馈的消息,具体要看其中的feedbackkey,类别较繁杂 */ + MSG_studentfeedback : 'studentfeedback', + /** @desc: 老师端:学生反馈的消息取消,如取消学会了,取消困惑 */ + MSG_studentfeedbackcancel : 'studentfeedbackcancel', + /** @desc: 学生提交的课堂展示数据-要在老师端显示,再由老师选择推送到公屏上 */ + MSG_classshowdata : 'classshowdata', + /** @desc: 学生在公屏上展示并完善后,保存后,老师端要更新 */ + MSG_classWorkOfPresentDataUpdate : 'classWorkOfPresentDataUpdate', + /** @desc: 课堂讲授活动,选择不同的内容 */ + MSG_classlecturePagesrc : 'classlecturePagesrc', + // === 新定义-消息头 === + /** @desc: 课程创建-待开课 */ + MSG_0000: 0x0000, + /** @desc: 点赞 */ + MSG_0001: 0x0001, + /** @desc: 疑惑 */ + MSG_0002: 0x0002, + MSG_0003: 0x0003, + MSG_0004: 0x0004, + MSG_0005: 0x0005, + MSG_0006: 0x0006, + MSG_0007: 0x0007, + MSG_0008: 0x0008, + MSG_0009: 0x0009, + MSG_0010: 0x000a, + MSG_0011: 0x000b, + MSG_0012: 0x000c, + MSG_0013: 0x000d, + MSG_0014: 0x000e, + MSG_0015: 0x000f, + /** @desc: 作业推送 */ + MSG_0016: 0x0010, + MSG_0017: 0x0011, + MSG_0018: 0x0012, + MSG_0019: 0x0013, + MSG_0020: 0x0014, + MSG_0021: 0x0015, + MSG_0022: 0x0016, + MSG_0023: 0x0017, + MSG_0024: 0x0018, + MSG_0025: 0x0019, + MSG_0026: 0x001a, + MSG_0027: 0x001b, + MSG_0028: 0x001c, + MSG_0029: 0x001d, + MSG_0030: 0x001e, + MSG_0031: 0x001f, + MSG_0032: 0x0020, + MSG_0033: 0x0021, + MSG_0034: 0x0022, + MSG_0035: 0x0023, + } +} diff --git a/src/renderer/src/AixPPTist/src/api/watcher.ts b/src/renderer/src/AixPPTist/src/api/watcher.ts index f515b8e..ff14229 100644 --- a/src/renderer/src/AixPPTist/src/api/watcher.ts +++ b/src/renderer/src/AixPPTist/src/api/watcher.ts @@ -6,14 +6,17 @@ import { watch } from 'vue' import { PPTApi } from './index' import * as store from '../store' import { sessionStore } from '@/utils/store' // electron-store 状态管理 +import { MsgEnum } from './types' // 消息枚举 import ChatWs from '@/plugins/socket' // 聊天socket +import Classcourse from './classcourse' // 课程相关 +import msgUtils from '@/plugins/modal' // 消息工具 const slidesStore = store.useSlidesStore() +const classcourseStore = store.useClasscourseStore() // 课堂信息-状态管理 const resource = sessionStore.get('curr.resource') // apt 资源 const smarttalk = sessionStore.get('curr.smarttalk') // 备课资源 /** * @description 监听器 */ - // 监听幻灯片内容变化 watch(() => slidesStore.slides, (newVal, oldVal) => { PPTApi.updateSlides(newVal, oldVal) // 更新幻灯片内容 @@ -26,6 +29,7 @@ watch(() => slidesStore.title, (newVal, oldVal) => { }) // 消息监听ws +console.log('监听器已开启', ChatWs) if (ChatWs.ws) { ChatWs.watch((msg, e) => { try { @@ -56,14 +60,35 @@ const updatePPT = async (data) => { const handleMessage = (msg) => { if (typeof msg === 'object'){ const { head, content, ...other } = msg - console.log('ws-msg', head, content, other) switch (head) { - case 'chat': + case MsgEnum.HEADS.MSG_open: // 开课 + // 课堂信息不一致 + if (Classcourse.id !== content.id) { + msgUtils.alertError('老师开课信息异常,请重新进入公屏!') + .then(() => { // 点击确定按钮,关闭窗口 + window.close() + }) + } else { // 正常更新数据 + classcourseStore.classcourse.status = 'open' + // 更新课堂信息-关闭警告框 + Classcourse?.msgObj?.onVanish() + } break - case 'update': + case MsgEnum.HEADS.MSG_slideFlapping: // 幻灯片翻页 + const slideIndex = content.current + slidesStore.updateSlideIndex(slideIndex) // 更新幻灯片下标 + break + case MsgEnum.HEADS.MSG_closed: // 下课: + window.close() // 关闭窗口 break default: break } } -} \ No newline at end of file +} +// console.log('监听器已开启', Classcourse) +// setTimeout(() => { +// console.log('关闭弹窗') +// // Classcourse.msgObj?.close() +// Classcourse?.msgObj?.onVanish() +// }, 10 * 1000) \ No newline at end of file diff --git a/src/renderer/src/plugins/imChat/msgEnum.js b/src/renderer/src/plugins/imChat/msgEnum.js index da8e486..d685406 100644 --- a/src/renderer/src/plugins/imChat/msgEnum.js +++ b/src/renderer/src/plugins/imChat/msgEnum.js @@ -56,6 +56,8 @@ export class MsgEnum { */ static HEADS = { // === 旧定义-消息头(兼容以前) === + /** @desc: 开课 */ + MSG_open : 'open', /** @desc: 结束课程(下课) */ MSG_closed : 'closed', /** @desc: 在线状态 */ @@ -93,6 +95,8 @@ export class MsgEnum { /** @desc: 课堂讲授活动,选择不同的内容 */ MSG_classlecturePagesrc : 'classlecturePagesrc', // === 新定义-消息头 === + /** @desc: 课程创建-待开课 */ + MSG_0000: 0x0000, /** @desc: 点赞 */ MSG_0001: 0x0001, /** @desc: 疑惑 */ diff --git a/src/renderer/src/plugins/modal.js b/src/renderer/src/plugins/modal.js index b59e14d..679b446 100644 --- a/src/renderer/src/plugins/modal.js +++ b/src/renderer/src/plugins/modal.js @@ -5,51 +5,51 @@ let loadingInstance; export default { // 消息提示 msg(content) { - ElMessage.info(content) + return ElMessage.info(content) }, // 错误消息 msgError(content) { - ElMessage.error(content) + return ElMessage.error(content) }, // 成功消息 msgSuccess(content) { - ElMessage.success(content) + return ElMessage.success(content) }, // 警告消息 msgWarning(content) { - ElMessage.warning(content) + return ElMessage.warning(content) }, // 弹出提示 - alert(content) { - ElMessageBox.alert(content, "系统提示") + alert(content, option = {}) { + return ElMessageBox.alert(content, "系统提示", option) }, // 错误提示 - alertError(content) { - ElMessageBox.alert(content, "系统提示", { type: 'error' }) + alertError(content, option = {}) { + return ElMessageBox.alert(content, "系统提示", { type: 'error', ...option }) }, // 成功提示 - alertSuccess(content) { - ElMessageBox.alert(content, "系统提示", { type: 'success' }) + alertSuccess(content, option = {}) { + return ElMessageBox.alert(content, "系统提示", { type: 'success', ...option }) }, // 警告提示 - alertWarning(content) { - ElMessageBox.alert(content, "系统提示", { type: 'warning' }) + alertWarning(content, option = {}) { + return ElMessageBox.alert(content, "系统提示", { type: 'warning', ...option }) }, // 通知提示 notify(content) { - ElNotification.info(content) + return ElNotification.info(content) }, // 错误通知 notifyError(content) { - ElNotification.error(content); + return ElNotification.error(content); }, // 成功通知 notifySuccess(content) { - ElNotification.success(content) + return ElNotification.success(content) }, // 警告通知 notifyWarning(content) { - ElNotification.warning(content) + return ElNotification.warning(content) }, // 确认窗体 confirm(content) { @@ -78,5 +78,8 @@ export default { // 关闭遮罩层 closeLoading() { loadingInstance.close(); - } + }, + // messageBox: opt => ElMessageBox(opt), + // 其他实例放出去,方便调用 + ElMessage, ElMessageBox, ElNotification, ElLoading } diff --git a/src/renderer/src/plugins/socket/index.js b/src/renderer/src/plugins/socket/index.js index 3edd643..e5d3289 100644 --- a/src/renderer/src/plugins/socket/index.js +++ b/src/renderer/src/plugins/socket/index.js @@ -41,7 +41,7 @@ export class ChatWs { this.ws = null; const _this = this this.heartCheck = { - timeout: 1000 * 10, // 60s + timeout: 1000 * 60, // 60s timeoutObj: null, serverTimeoutObj: null, reset() { @@ -122,12 +122,12 @@ export class ChatWs { this.ws.send(msg) } // 发送消息-带消息头(key) - sendMsg(head, content, option = {}) { - if (!head) throw new Error("head is not null") - if (!content) throw new Error("content is not null") + sendMsg(head, content, option = {}, ...arg) { + if (!head && head!==0) throw new Error("head is not null") + if (!content && content!==0) throw new Error("content is not null") let msg = { head, content, ...option } // 发送消息 - this.send(this.getMsgObj(msg)) + this.send(this.getMsgObj(msg, ...arg)) } // 发送心跳 sendMsgBeat() { diff --git a/src/renderer/src/views/classManage/reserv-item-apt.vue b/src/renderer/src/views/classManage/reserv-item-apt.vue index 59c1137..55a2a51 100644 --- a/src/renderer/src/views/classManage/reserv-item-apt.vue +++ b/src/renderer/src/views/classManage/reserv-item-apt.vue @@ -7,15 +7,20 @@ {{item.caption}}

- 已结束 - 上课中 - 继续上课 - - 下课{{ loading?'中...':'' }} + 待开课 + 已结束 + 上课中 + +
@@ -25,10 +30,12 @@