diff --git a/electron.vite.config.mjs b/electron.vite.config.mjs index fcc5633..3436c6a 100644 --- a/electron.vite.config.mjs +++ b/electron.vite.config.mjs @@ -17,6 +17,8 @@ export default defineConfig({ // '@': resolve('./src/renderer/src'), // '@': path.resolve(__dirname, 'src/renderer/src'), '@': path.join(__dirname, './src/renderer/src'), + '@root': path.join(__dirname, '.'), + } }, server: { diff --git a/jsconfig.json b/jsconfig.json index 63f8c59..f611e59 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -4,7 +4,8 @@ "paths": { "@/*":[ "src/renderer/src/*" - ] + ], + "@root/*":["./*"] } }, "exclude": [ diff --git a/package.json b/package.json index 62c23fe..4f1678f 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ }, "devDependencies": { "@electron-toolkit/eslint-config": "^1.0.2", + "@electron/remote": "^2.1.2", "@rushstack/eslint-patch": "^1.10.3", "@vitejs/plugin-vue": "^5.0.5", "@vue/eslint-config-prettier": "^9.0.0", diff --git a/src/main/index.js b/src/main/index.js index 73d3f5d..f50e06d 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -3,7 +3,10 @@ import { join } from 'path' import { electronApp, optimizer, is } from '@electron-toolkit/utils' import icon from '../../resources/icon.png?asset' import File from './file' -import Tool from './tool' +import * as Tool from './tool' +// 代理 electron/remote +import remote from '@electron/remote/main' // 第一步:引入remote +remote.initialize() // 第二步: 初始化remote File({ app, shell, BrowserWindow, ipcMain }) @@ -50,7 +53,10 @@ function createMainWindow() { webPreferences: { preload: join(__dirname, '../preload/index.js'), sandbox: false, - nodeIntegration: true + // nodeIntegration: true, + nodeIntegration: true, // nodeApi调用 + contextIsolation: false, // 沙箱取消 + // webSecurity: false // 跨域关闭 } }) @@ -68,6 +74,8 @@ function createMainWindow() { } else { mainWindow.loadFile(join(__dirname, '../renderer/index.html')) } + // 第三步: 开启remote服务 + remote.enable(mainWindow.webContents) } // 作业窗口相关-开发中 @@ -152,9 +160,9 @@ app.on('ready', () => { if (!mainWindow) { createMainWindow() } - loginWindow.destroy() loginWindow = null + Tool.setWin({mainWindow}) // 将主窗口传递到工具类中 }) // 打开登录窗口 ipcMain.on('openLoginWindow', () => { @@ -171,7 +179,7 @@ app.on('ready', () => { createWork(data) }) // zdg: 创建工具窗口-如 悬浮球 - Tool() + Tool.init() // 打开-登录窗口 createLoginWindow() app.on('activate', function () { diff --git a/src/main/tool.js b/src/main/tool.js index f2f4312..27bea98 100644 --- a/src/main/tool.js +++ b/src/main/tool.js @@ -1,18 +1,23 @@ /** * @description: electron 封装的工具函数 + * 消息整理 + * tool-sphere:create 创建-悬浮球-窗口 */ import { app, shell, BrowserWindow, ipcMain } from 'electron' import { is } from '@electron-toolkit/utils' // const baseUrl = 'http://localhost:5173/#' // 开发环境使用 const baseUrl = process.env['ELECTRON_RENDERER_URL']+'/#' // 开发环境使用 - -export default function() { +// 所有窗口 +let allWindow = {} +// 其他已有窗口 wins +export function init() { // 创建工具-悬浮球 - ipcMain.on('create-tool-sphere', async(e, data) => { - console.log('测试xxxx', data) + ipcMain.on('tool-sphere:create', async(e, data) => { + console.log('xxx', allWindow) + // console.log('测试xxxx', data) await createTools(data) // 执行逻辑 - e.reply('create-tool-sphere-reply', {code: 200, msg: 'success'}) // 返回结果 + e.reply('tool-sphere:create-reply', {code: 200, msg: 'success'}) // 返回结果 }) } /** @@ -24,18 +29,22 @@ export default function() { * @author: zdg * @date 2021-07-05 14:07:01 */ -function createTools({url, width = 800, height = 600, option={}}) { + export function createTools({url, width = 800, height = 600, option={}}) { + const { mainWindow } = allWindow||{} // 获取主窗口 const devUrl = `${baseUrl}${url}` const buildUrl = `file://${__dirname}/index.html${url}` const urlAll = is.dev ? devUrl : buildUrl return new Promise((resolve) => { let win = new BrowserWindow({ width, height, - type: 'toolbar', //创建的窗口类型为工具栏窗口 - frame: false, //要创建无边框窗口 - resizable: false, //禁止窗口大小缩放 - transparent: true, //设置透明 - alwaysOnTop: true, //窗口是否总是显示在其他窗口之前 + type: 'toolbar', // 创建的窗口类型为工具栏窗口 + frame: false, // 要创建无边框窗口 + resizable: false, // 禁止窗口大小缩放 + transparent: true, // 设置透明 + alwaysOnTop: true, // 窗口是否总是显示在其他窗口之前 + + parent: mainWindow, // 父窗口 + autoClose: true, // 关闭窗口后自动关闭 webPreferences: { nodeIntegration: true, // nodeApi调用 contextIsolation: false, // 沙箱取消 @@ -47,6 +56,8 @@ function createTools({url, width = 800, height = 600, option={}}) { // url = 'https://www.baidu.com' console.log(urlAll) win.loadURL(urlAll) + // win.setFullScreen(true) // 设置窗口为全屏 + win.setIgnoreMouseEvents(true) // 忽略鼠标事件|使窗口不可选中 win.once('ready-to-show', () => { win.show() resolve(win) @@ -55,4 +66,25 @@ function createTools({url, width = 800, height = 600, option={}}) { win = null }) }) -} \ No newline at end of file +} +// 保存窗口 +export function setWin(win = {}) { + if (win && Object.keys(win).length){ + Object.keys(win).forEach(key => { + if (!allWindow[key]) { // 不存在就保存 + allWindow[key] = win[key] + } + }) + } +} + +// 工具窗口-特殊区域恢复鼠标 +function toolMouse(toolWin) { + ipcMain.on('tool-mouse', (e, data) => { + const { id } = data + const win = allWindow[id] + if (win) { + win.setIgnoreMouseEvents(false) + } + }) +} diff --git a/src/preload/index.js b/src/preload/index.js index 75383f9..9da4869 100644 --- a/src/preload/index.js +++ b/src/preload/index.js @@ -1,16 +1,15 @@ -import { contextBridge, ipcRenderer } from 'electron' +import { contextBridge } from 'electron' import { electronAPI } from '@electron-toolkit/preload' // Custom APIs for renderer -const api = {} - +const api = { +} // Use `contextBridge` APIs to expose Electron APIs to // renderer only if context isolation is enabled, otherwise // just add to the DOM global. if (process.contextIsolated) { try { contextBridge.exposeInMainWorld('electron', electronAPI) - contextBridge.exposeInMainWorld('electronAPI') contextBridge.exposeInMainWorld('api', api) } catch (error) { console.error(error) diff --git a/src/renderer/src/assets/iconfont/iconfont.css b/src/renderer/src/assets/iconfont/iconfont.css index 529bfc4..d4e9d4e 100644 --- a/src/renderer/src/assets/iconfont/iconfont.css +++ b/src/renderer/src/assets/iconfont/iconfont.css @@ -1,9 +1,9 @@ @font-face { font-family: "iconfont"; /* Project id 2794390 */ - src: url('iconfont.woff2?t=1721179711733') format('woff2'), - url('iconfont.woff?t=1721179711733') format('woff'), - url('iconfont.ttf?t=1721179711733') format('truetype'), - url('iconfont.svg?t=1721179711733#iconfont') format('svg'); + src: url('iconfont.woff2?t=1721815727687') format('woff2'), + url('iconfont.woff?t=1721815727687') format('woff'), + url('iconfont.ttf?t=1721815727687') format('truetype'), + url('iconfont.svg?t=1721815727687#iconfont') format('svg'); } .iconfont { @@ -14,6 +14,54 @@ -moz-osx-font-smoothing: grayscale; } +.icon-xiazai9:before { + content: "\e60b"; +} + +.icon-hudong:before { + content: "\e60c"; +} + +.icon-xiangpica:before { + content: "\e6be"; +} + +.icon-gengduo:before { + content: "\e62d"; +} + +.icon-jujiao:before { + content: "\e615"; +} + +.icon-huabi:before { + content: "\e795"; +} + +.icon-mouse:before { + content: "\e603"; +} + +.icon-xiayiye:before { + content: "\e68b"; +} + +.icon-shangyiye:before { + content: "\e68e"; +} + +.icon-shuangye:before { + content: "\e64e"; +} + +.icon-danyemoban:before { + content: "\e859"; +} + +.icon-lingdang:before { + content: "\e613"; +} + .icon-yidongdaozu:before { content: "\e67d"; } diff --git a/src/renderer/src/assets/iconfont/iconfont.js b/src/renderer/src/assets/iconfont/iconfont.js index 6058761..79b363e 100644 --- a/src/renderer/src/assets/iconfont/iconfont.js +++ b/src/renderer/src/assets/iconfont/iconfont.js @@ -1 +1 @@ -window._iconfont_svg_string_2794390='',function(l){var h=(h=document.getElementsByTagName("script"))[h.length-1],v=h.getAttribute("data-injectcss"),h=h.getAttribute("data-disable-injectsvg");if(!h){var c,a,t,z,p,i=function(h,v){v.parentNode.insertBefore(h,v)};if(v&&!l.__iconfont__svg__cssinject__){l.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(h){console&&console.log(h)}}c=function(){var h,v=document.createElement("div");v.innerHTML=l._iconfont_svg_string_2794390,(v=v.getElementsByTagName("svg")[0])&&(v.setAttribute("aria-hidden","true"),v.style.position="absolute",v.style.width=0,v.style.height=0,v.style.overflow="hidden",v=v,(h=document.body).firstChild?i(v,h.firstChild):h.appendChild(v))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(c,0):(a=function(){document.removeEventListener("DOMContentLoaded",a,!1),c()},document.addEventListener("DOMContentLoaded",a,!1)):document.attachEvent&&(t=c,z=l.document,p=!1,d(),z.onreadystatechange=function(){"complete"==z.readyState&&(z.onreadystatechange=null,M())})}function M(){p||(p=!0,t())}function d(){try{z.documentElement.doScroll("left")}catch(h){return void setTimeout(d,50)}M()}}(window); \ No newline at end of file +window._iconfont_svg_string_2794390='',function(v){var h=(h=document.getElementsByTagName("script"))[h.length-1],l=h.getAttribute("data-injectcss"),h=h.getAttribute("data-disable-injectsvg");if(!h){var c,a,t,i,z,p=function(h,l){l.parentNode.insertBefore(h,l)};if(l&&!v.__iconfont__svg__cssinject__){v.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(h){console&&console.log(h)}}c=function(){var h,l=document.createElement("div");l.innerHTML=v._iconfont_svg_string_2794390,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(h=document.body).firstChild?p(l,h.firstChild):h.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(c,0):(a=function(){document.removeEventListener("DOMContentLoaded",a,!1),c()},document.addEventListener("DOMContentLoaded",a,!1)):document.attachEvent&&(t=c,i=v.document,z=!1,d(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,M())})}function M(){z||(z=!0,t())}function d(){try{i.documentElement.doScroll("left")}catch(h){return void setTimeout(d,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 d630aec..5549155 100644 --- a/src/renderer/src/assets/iconfont/iconfont.json +++ b/src/renderer/src/assets/iconfont/iconfont.json @@ -5,6 +5,90 @@ "css_prefix_text": "icon-", "description": "", "glyphs": [ + { + "icon_id": "720967", + "name": "更多", + "font_class": "xiazai9", + "unicode": "e60b", + "unicode_decimal": 58891 + }, + { + "icon_id": "3596229", + "name": "互动", + "font_class": "hudong", + "unicode": "e60c", + "unicode_decimal": 58892 + }, + { + "icon_id": "5233263", + "name": "橡皮擦", + "font_class": "xiangpica", + "unicode": "e6be", + "unicode_decimal": 59070 + }, + { + "icon_id": "5905756", + "name": "更多", + "font_class": "gengduo", + "unicode": "e62d", + "unicode_decimal": 58925 + }, + { + "icon_id": "11107711", + "name": "聚焦", + "font_class": "jujiao", + "unicode": "e615", + "unicode_decimal": 58901 + }, + { + "icon_id": "36969022", + "name": "画笔", + "font_class": "huabi", + "unicode": "e795", + "unicode_decimal": 59285 + }, + { + "icon_id": "30792830", + "name": "28D鼠标箭头-copy", + "font_class": "mouse", + "unicode": "e603", + "unicode_decimal": 58883 + }, + { + "icon_id": "694110", + "name": "下一页", + "font_class": "xiayiye", + "unicode": "e68b", + "unicode_decimal": 59019 + }, + { + "icon_id": "694115", + "name": "上一页", + "font_class": "shangyiye", + "unicode": "e68e", + "unicode_decimal": 59022 + }, + { + "icon_id": "930693", + "name": "双页", + "font_class": "shuangye", + "unicode": "e64e", + "unicode_decimal": 58958 + }, + { + "icon_id": "2144697", + "name": "单页模板", + "font_class": "danyemoban", + "unicode": "e859", + "unicode_decimal": 59481 + }, + { + "icon_id": "17990800", + "name": "铃铛", + "font_class": "lingdang", + "unicode": "e613", + "unicode_decimal": 58899 + }, { "icon_id": "1207918", "name": "移动到组", diff --git a/src/renderer/src/assets/iconfont/iconfont.svg b/src/renderer/src/assets/iconfont/iconfont.svg index 69fe782..bdabebc 100644 --- a/src/renderer/src/assets/iconfont/iconfont.svg +++ b/src/renderer/src/assets/iconfont/iconfont.svg @@ -14,6 +14,30 @@ /> + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/renderer/src/assets/iconfont/iconfont.ttf b/src/renderer/src/assets/iconfont/iconfont.ttf index f179db3..409d7e1 100644 Binary files a/src/renderer/src/assets/iconfont/iconfont.ttf and b/src/renderer/src/assets/iconfont/iconfont.ttf differ diff --git a/src/renderer/src/assets/iconfont/iconfont.woff b/src/renderer/src/assets/iconfont/iconfont.woff index 06b4847..607d8f9 100644 Binary files a/src/renderer/src/assets/iconfont/iconfont.woff and b/src/renderer/src/assets/iconfont/iconfont.woff differ diff --git a/src/renderer/src/assets/iconfont/iconfont.woff2 b/src/renderer/src/assets/iconfont/iconfont.woff2 index 280df28..2acffdf 100644 Binary files a/src/renderer/src/assets/iconfont/iconfont.woff2 and b/src/renderer/src/assets/iconfont/iconfont.woff2 differ diff --git a/src/renderer/src/plugins/fabric/event/clickEvent.js b/src/renderer/src/plugins/fabric/event/clickEvent.js index 98c5816..790e47f 100644 --- a/src/renderer/src/plugins/fabric/event/clickEvent.js +++ b/src/renderer/src/plugins/fabric/event/clickEvent.js @@ -135,7 +135,6 @@ export class CanvasClickEvent { // autoDrawData.resetLoadedSVG() // this.mouseDownTime = new Date().getTime() // } - console.log('xxxx') this.isDrawBasic = true break default: @@ -211,7 +210,6 @@ export class CanvasClickEvent { } // zdg: 基础画笔 保存数据 if (this.isDrawBasic) FabricVue.history?.saveState() - window.test = FabricVue }) canvas?.on('mouse:dblclick', (e) => { diff --git a/src/renderer/src/store/modules/draw.js b/src/renderer/src/store/modules/draw.js index 3f85c56..fc28064 100644 --- a/src/renderer/src/store/modules/draw.js +++ b/src/renderer/src/store/modules/draw.js @@ -156,7 +156,7 @@ export const useDrawStore = defineStore( { state() { return { - drawWidth: 10, + drawWidth: 1, drawColors: ['#000000'], shadowWidth: 0, shadowColor: '#000000', diff --git a/src/renderer/src/utils/tool.js b/src/renderer/src/utils/tool.js index 076c931..4132cf8 100644 --- a/src/renderer/src/utils/tool.js +++ b/src/renderer/src/utils/tool.js @@ -2,23 +2,43 @@ * @description: electron 封装的工具函数 */ const { ipcRenderer } = window.electron || {} - +// const {getCurrentWindow,BrowserWindow, shell, app} = require('@electron/remote'); +import remote from '@electron/remote' +const remote = require('@electron/remote') +console.log('xxxxx ', remote) /** + * @description 消息发送-nodejs 消息发送 * @form src/main/tool.js 来源 - * @description 创建工具 - * @param {*} key 消息头 - * create-tool-sphere 创建-悬浮球 | url:路由地址,width:窗口宽度,height:窗口高度,option:自定义选项 - * @param {*} data 参数 + * @param {*} key 消息key + * tool-sphere:create 创建-悬浮球 + * @param {*} data 参数 + * url:路由地址,width:窗口宽度,height:窗口高度,option:自定义选项 + * @returns */ -export function createTools(key, data) { - const msgKey = `create-tool-${key}` // 消息头 - const msgKeyRes = `${msgKey}-reply` // 消息头-返回结果 +export function ipcMsgSend(key, data) { return new Promise((resolve) => { // 返回结果-监听 - ipcRenderer.once(msgKeyRes, async (e, res) => { + ipcRenderer.once(`${key}-reply`, (e, res) => { resolve(res) }) // 发送消息 - ipcRenderer.send(msgKey, data) + ipcRenderer.send(key, data) }) +} + +export function test() { + // console.log(BrowserWindow) + // const win = new BrowserWindow({ + // width: 400, height: 400 + // }) + // win.loadURL('https://www.baidu.com') + // win.show() + // win.on('close', () => { + // win = null + // }) + // const url = app.getPath('userData')+'/123.pdf' + // console.log(app.getPath('userData')) + // shell.openExternal(url) + const win = getCurrentWindow() + console.log(win) } \ No newline at end of file diff --git a/src/renderer/src/views/resource/index.vue b/src/renderer/src/views/resource/index.vue index 2dd57e8..c46d0a3 100644 --- a/src/renderer/src/views/resource/index.vue +++ b/src/renderer/src/views/resource/index.vue @@ -16,6 +16,7 @@ + \ No newline at end of file diff --git a/src/renderer/src/views/tool/test.vue b/src/renderer/src/views/tool/test.vue new file mode 100644 index 0000000..a0cd220 --- /dev/null +++ b/src/renderer/src/views/tool/test.vue @@ -0,0 +1,31 @@ + + + + + \ No newline at end of file