zdg #167

Merged
zhengdegang merged 4 commits from zdg into main 2024-09-02 22:23:09 +08:00
9 changed files with 65 additions and 34 deletions

View File

@ -13,7 +13,7 @@ import remote from '@electron/remote/main'
// 第二步: 初始化remote // 第二步: 初始化remote
remote.initialize() remote.initialize()
// 日志配置-初始化(日志直接绑定到console上) // 日志配置-初始化(日志直接绑定到console上)
Logger.initialize() if(!is.dev) Logger.initialize()
// 持久化数据-初始化 // 持久化数据-初始化
Store.initialize() Store.initialize()

View File

@ -383,16 +383,7 @@ defineExpose({
savaDataStore savaDataStore
}) })
watchEffect(() => { watchEffect(() => {
setTimeout(() => {
console.log(toolState,'监听')
}, 300)
if(toolState.isPdfWin){ if(toolState.isPdfWin){
// if(toolState.isToolWin){
// ispointer.value=false
// }else{
// ispointer.value=true
// }
watchToolState() // watchToolState() //
} }
}) })

View File

@ -3,13 +3,14 @@
*/ */
const isNode = typeof require !== 'undefined' // 是否支持node函数 const isNode = typeof require !== 'undefined' // 是否支持node函数
const { ipcRenderer } = isNode?require('electron'):{} // app使用 const { ipcRenderer } = isNode?require('electron'):{} // app使用
import { sessionStore } from '@/utils/tool'
// const Remote = isNode?require('@electron/remote'):{} // 远程模块 // const Remote = isNode?require('@electron/remote'):{} // 远程模块
export function shareStorePlugin({store}) { export function shareStorePlugin({store}) {
store.$subscribe((mutation, state) => { // 自动同步 store.$subscribe((mutation, state) => { // 自动同步
// mutation 变量包含了变化前后的状态 // mutation 变量包含了变化前后的状态
// mutation.events: key newValue target oldValue oldTarget // mutation.events: key newValue target oldValue oldTarget
// state 是变化后的状态 // state 是变化后的状态
// console.log('store.$subscribe', mutation) // console.log('store.$subscribe', mutation, state, store)
// 在存储变化的时候执行 // 在存储变化的时候执行
// const storeName = store.$id // const storeName = store.$id
const storeName = mutation.storeId const storeName = mutation.storeId
@ -19,13 +20,15 @@ export function shareStorePlugin({store}) {
const { storeId: storeName, payload, events, type } = mutation // direct const { storeId: storeName, payload, events, type } = mutation // direct
// if (!Object.keys(payload).length) return // if (!Object.keys(payload).length) return
if (type != 'direct' || !events || Array.isArray(events) || !events.key) return if (type != 'direct' || !events || Array.isArray(events) || !events.key) return
stateSync(storeName, events.key, events.newValue) // 需要同步 stateSync(storeName, events.key, events.newValue, state) // 需要同步
} }
}) })
// 暴露方法-手动同步 // 暴露方法-手动同步
store.stateSync = (storeName, key, value) => { store.stateSync = (storeName, key, value) => {
if (!storeName && !!key && !!value) stateSync(storeName, key, value) const state = store.$state
else stateSyncAll(store) if (!storeName && !!key && !!value) stateSync(storeName, key, value, state)
else stateSyncAll(store, state)
} }
// 暴露方法-发送当前状态-新窗口 // 暴露方法-发送当前状态-新窗口
store.stateSyncInit = wid => stateSyncInit(wid, store) store.stateSyncInit = wid => stateSyncInit(wid, store)
@ -34,14 +37,16 @@ export function shareStorePlugin({store}) {
} }
// 同步数据-发送给主线程-单独 // 同步数据-发送给主线程-单独
function stateSync(storeName, key, value) { function stateSync(storeName, key, value, state) {
// console.log('state-change', storeName, key, value) // console.log('state-change', storeName, key, value)
try { try {
let jsonStr = '' const { data, keystr } = filterByKey(state, key, value)
if (typeof key === 'string') jsonStr = JSON.stringify({[key]:value}) const jsonStr = JSON.stringify(data) // 从新组装-json数据
else if (typeof value === 'object') jsonStr = JSON.stringify(key) // 更新本地数据-session
sessionStore.set(keystr, value)
// 通知主线程更新 // 通知主线程更新
ipcRenderer?.invoke('pinia-state-change', storeName, jsonStr) ipcRenderer?.invoke('pinia-state-change', storeName, jsonStr)
// console.log('======',keystr, data )
} catch (error) { } catch (error) {
console.log('state-change-error', error) console.log('state-change-error', error)
} }
@ -95,3 +100,27 @@ const circularSafeStringify = (obj) => {
}); });
} }
// 过滤对象
const filterByKey = (obj, key, value) => {
let res = { data:{}, keystr:'' }
for (let k in obj) {
if (obj.hasOwnProperty(k)) {
const isEqual = JSON.stringify(obj[k]) === JSON.stringify(value) // 值是否相同
if (k === key && isEqual) {
// 如果匹配,则添加到新对象中
res.data[k] = obj[k];
res.keystr = k;
} else {
if (obj[k] !== null && typeof obj[k] === 'object') {
// 如果是对象,则递归处理
const {data, keystr} = filterByKey(obj[k], key, value)
res.data[k] = data
res.keystr = keystr ? `${k}.${keystr}`: key
}
}
}
}
return res;
}
// 对象克隆
const objClone = (obj) => JSON.parse(JSON.stringify(obj))

View File

@ -2,6 +2,10 @@
* 工具类-窗口-状态管理 * 工具类-窗口-状态管理
*/ */
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import { sessionStore } from '@/utils/tool'
// 默认数据
const defData = sessionStore.store || {}
export const useToolState = defineStore('tool', { export const useToolState = defineStore('tool', {
state: () => ({ state: () => ({
@ -10,9 +14,10 @@ export const useToolState = defineStore('tool', {
isPdfWin: false, // pdf窗口是否打开 isPdfWin: false, // pdf窗口是否打开
isToolWin: false, // 工具窗口是否打开 isToolWin: false, // 工具窗口是否打开
curSubjectNode: { curSubjectNode: {
data: {}, // 当前教材节点 (包含当前教材 单元) data: {}, // 当前教材节点 (包含当前教材 单元)
querySearch: {} // 查询资源所需参数 querySearch: {} // 查询资源所需参数
} },
...defData // 默认数据-覆盖上面的配置(不要删除, 会导致新窗口-获取状态失败)
}), }),
actions: { actions: {
} }

View File

@ -11,13 +11,13 @@ const path = isNode?require('path'):{}
const Remote = isNode?require('@electron/remote'):{} const Remote = isNode?require('@electron/remote'):{}
const { ipcRenderer } = isNode?require('electron'):window.electron || {} const { ipcRenderer } = isNode?require('electron'):window.electron || {}
const API = isNode?window.api:{} // preload-api const API = isNode?window.api:{} // preload-api
import { useToolState } from '@/store/modules/tool' // 获取store状态 // import { useToolState } from '@/store/modules/tool' // 获取store状态
const Store = isNode?require('electron-store'):null // 持久化存储 const Store = isNode?require('electron-store'):null // 持久化存储
// 常用变量 // 常用变量
const BaseUrl = isNode?process.env['ELECTRON_RENDERER_URL']+'/#':'' const BaseUrl = isNode?process.env['ELECTRON_RENDERER_URL']+'/#':''
const isDev = isNode?process.env.NODE_ENV !== 'production':'' const isDev = isNode?process.env.NODE_ENV !== 'production':''
const toolState = useToolState() // 获取store状态 // const toolState = useToolState() // 获取store状态
// 暴露Remote中的属性 // 暴露Remote中的属性
export const ipcMain = Remote?.ipcMain || {} export const ipcMain = Remote?.ipcMain || {}
@ -137,7 +137,7 @@ export const createWindow = async (type, data) => {
winPdf.restore(); winPdf.restore();
} else{ } else{
winPdf.focus(); winPdf.focus();
toolState.isPdfWin=true // toolState.isPdfWin=true
} }
return return
@ -204,9 +204,9 @@ export function toolWindow({url, isConsole, isWeb=true, option={}}) {
mainWin.once('closed', () => { win.destroy()}) mainWin.once('closed', () => { win.destroy()})
// 内部监听器 // 内部监听器
win.webContents.on('did-finish-load', () => { win.webContents.on('did-finish-load', () => {
setTimeout(() => { // setTimeout(() => {
toolState.stateSyncInit(win.id) // 同步状态 // toolState.stateSyncInit(win.id) // 同步状态
}, 200); // }, 200);
}) })
// 内部监听器-是否打印 // 内部监听器-是否打印
if (!!isConsole) { if (!!isConsole) {

View File

@ -104,9 +104,12 @@ const switchPageMode = () => {
} }
} }
onMounted(async () => { onMounted(async () => {
const isDev = process.env.NODE_ENV == 'development'
toolState.isPdfWin=true //pdf toolState.isPdfWin=true //pdf
pdfObj.pdfUrl = getStaticUrl(route.query.path, 'user', 'selfFile', true) //线 if (isDev)
// pdfObj.pdfUrl = getStaticUrl('aaa.pdf', 'user', 'selfFile', true) // pdfObj.pdfUrl = getStaticUrl('aaa.pdf', 'user', 'selfFile', true) //
else
pdfObj.pdfUrl = getStaticUrl(route.query.path, 'user', 'selfFile', true) //线
textbookId.value = route.query.textbookId textbookId.value = route.query.textbookId
pdfObj.bookId=textbookId.value pdfObj.bookId=textbookId.value
// //

View File

@ -144,12 +144,13 @@ import { parseCataByNode, creatPPT, asyncLocalFile } from '@/utils/talkFile'
import FileOperBatch from '@/views/prepare/container/file-oper-batch.vue' import FileOperBatch from '@/views/prepare/container/file-oper-batch.vue'
import SetHomework from '@/components/set-homework/index.vue' import SetHomework from '@/components/set-homework/index.vue'
import outLink from '@/utils/linkConfig' import outLink from '@/utils/linkConfig'
import { createWindow } from '@/utils/tool' import { createWindow, sessionStore } from '@/utils/tool'
import { cloneDeep } from 'lodash' import { cloneDeep } from 'lodash'
import { delClasswork } from '@/api/teaching/classwork' import { delClasswork } from '@/api/teaching/classwork'
import { getSelfReserv, startClass } from '@/api/classManage' import { getSelfReserv, startClass } from '@/api/classManage'
import { useGetHomework } from '@/hooks/useGetHomework' import { useGetHomework } from '@/hooks/useGetHomework'
const toolStore = useToolState() const toolStore = useToolState()
const fs = require('fs') const fs = require('fs')
const { ipcRenderer } = window.electron || {} const { ipcRenderer } = window.electron || {}
@ -423,7 +424,8 @@ export default {
this.uploadData.levelThirdId = cata[2] this.uploadData.levelThirdId = cata[2]
this.uploadData.textbookId = data.textBook.curBookId this.uploadData.textbookId = data.textBook.curBookId
toolStore.curSubjectNode.data = data toolStore.curSubjectNode.data = data
toolStore.curSubjectNode.querySearch = this.uploadData //
this.$nextTick(() =>{ toolStore.curSubjectNode.querySearch = this.uploadData })
this.initHomeWork() this.initHomeWork()
await this.asyncAllFile() await this.asyncAllFile()
}, },

View File

@ -29,7 +29,7 @@ onMounted(async() => {
const handleMode = (newVal, oldVal) => { const handleMode = (newVal, oldVal) => {
if(toolStore.isPdfWin){ if(toolStore.isPdfWin){
if(newVal=='clear'){ if(newVal=='clear'){
emit('update:modelValue', oldVal) setTimeout(() => emit('update:modelValue', oldVal), 10)
} }
return return
} }
@ -47,7 +47,7 @@ const handleMode = (newVal, oldVal) => {
case 'clear': // case 'clear': //
if(oldVal){ if(oldVal){
FabricVue.history?.clean() FabricVue.history?.clean()
emit('update:modelValue', oldVal) setTimeout(() => emit('update:modelValue', oldVal), 10)
} }
break break

View File

@ -51,8 +51,9 @@ import imChat from './components/imChat.vue' // im-chat-子组件
import vDrag from './directive/drag' // - import vDrag from './directive/drag' // -
import vIgnore from './directive/ignore' // -穿 import vIgnore from './directive/ignore' // -穿
import { useToolState } from '@/store/modules/tool' // - import { useToolState } from '@/store/modules/tool' // -
import { ipcMsgSend, ipcHandle, ipcMain, ipcMsgInvoke } from '@/utils/tool' // import { ipcMsgSend, ipcMain, sessionStore } from '@/utils/tool' //
import MsgEnum from '@/plugins/imChat/msgEnum' // -(nuem) import MsgEnum from '@/plugins/imChat/msgEnum' // -(nuem)
const route = useRoute(); const route = useRoute();
const tabActive = ref('select') // const tabActive = ref('select') //
const isFold = ref(false) // const isFold = ref(false) //
@ -82,6 +83,7 @@ const btnList = [ // 工具栏按钮列表
// === === // === ===
onMounted(async() => { onMounted(async() => {
if (!electron) return // if (!electron) return //
// console.log(sessionStore)
getClassInfo() // ex3 getClassInfo() // ex3
setTimeout(() => { setTimeout(() => {
resetStatus() // - resetStatus() // -
@ -104,7 +106,6 @@ const getClassInfo = async () => {
const tabChange = (val) => { const tabChange = (val) => {
const bool = !toolStore.isPdfWin && !toolStore.showBoardAll const bool = !toolStore.isPdfWin && !toolStore.showBoardAll
if(bool) toolStore.showBoardAll = true if(bool) toolStore.showBoardAll = true
// ipcMsgSend('tool-sphere:close')
toolStore.model = val // tab toolStore.model = val // tab
} }
// logo - | // logo - |