diff --git a/src/main/index.js b/src/main/index.js index fca4014..b8c9e93 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -1,4 +1,4 @@ -import { app, shell, BrowserWindow, ipcMain } from 'electron' +import { app, shell, BrowserWindow, ipcMain, session } from 'electron' import { join } from 'path' import { electronApp, optimizer, is } from '@electron-toolkit/utils' import icon from '../../resources/icon.png?asset' @@ -6,12 +6,15 @@ import File from './file' import Tool from './tool' File({ app, shell, BrowserWindow, ipcMain }) -// zdg: 创建工具-如 悬浮球 -Tool(app, shell, BrowserWindow, ipcMain) -function createWindow() { - // Create the browser window. - const mainWindow = new BrowserWindow({ + + +let mainWindow, loginWindow + +//登录窗口 +function createLoginWindow() { + if (loginWindow) return + loginWindow = new BrowserWindow({ width: 888, height: 520, show: false, @@ -24,53 +27,154 @@ function createWindow() { nodeIntegration: true } }) + const loginURL = is.dev ? `http://localhost:5173/#/login` : `file://${__dirname}/index.html/login` + loginWindow.loadURL(loginURL) + + loginWindow.once('ready-to-show', () => { + loginWindow.show() + }) + + loginWindow.on('closed', () => { + loginWindow = null + }) +} +//主窗口 +function createMainWindow() { + mainWindow = new BrowserWindow({ + width: 1200, + height: 700, + show: false, + frame: false, + autoHideMenuBar: true, + ...(process.platform === 'linux' ? { icon } : {}), + webPreferences: { + preload: join(__dirname, '../preload/index.js'), + sandbox: false, + nodeIntegration: true + } + }) mainWindow.on('ready-to-show', () => { mainWindow.show() }) - - - mainWindow.webContents.setWindowOpenHandler((details) => { shell.openExternal(details.url) return { action: 'deny' } }) mainWindow.webContents.openDevTools() - // HMR for renderer base on electron-vite cli. - // Load the remote URL for development or the local html file for production. + if (is.dev && process.env['ELECTRON_RENDERER_URL']) { mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL']) - - // mainWindow.loadURL('https://file.ysaix.com:7868/') - } else { - // mainWindow.loadURL('https://file.ysaix.com:7868/') mainWindow.loadFile(join(__dirname, '../renderer/index.html')) } } -// This method will be called when Electron has finished -// initialization and is ready to create browser windows. -// Some APIs can only be used after this event occurs. -app.whenReady().then(() => { - // Set app user model id for windows +// 作业窗口相关-开发中 +let workWindow +function createWork(data) { + if (workWindow) return + workWindow = new BrowserWindow({ + width: 650, + height: 500, + show: false, + frame: true, + + autoHideMenuBar: true, + ...(process.platform === 'linux' ? { icon } : {}), + webPreferences: { + sandbox: false, + nodeIntegration: true + } + }) + + workWindow.webContents.session.cookies.set( + { + url: 'https://file.ysaix.com:7868', + name: 'Admin-Token', + value: data + }, + function (error) { + if (error) { + console.error('Set cookie failed:', error) + } else { + console.log('Cookie set successfully.') + } + } + ) + workWindow.loadURL( + 'https://file.ysaix.com:7868/teaching/classtaskassign?titleName=%E4%BD%9C%E4%B8%9A%E5%B8%83%E7%BD%AE' + ) + + workWindow.once('ready-to-show', () => { + workWindow.show() + }) + workWindow.on('closed', () => { + workWindow = null + }) +} + +// 初始化完成 +app.on('ready', () => { + // 设置应用程序用户模型标识符 electronApp.setAppUserModelId('com.electron') - // Default open or close DevTools by F12 in development - // and ignore CommandOrControl + R in production. - // see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils + //一个新的browserWindow 被创建时触发 app.on('browser-window-created', (_, window) => { optimizer.watchWindowShortcuts(window) }) + //窗口 最大、最小、关闭 + ipcMain.on('minimize-window', () => { + if (loginWindow) { + loginWindow.minimize() + } + if (mainWindow) { + mainWindow.minimize() + } + }) + ipcMain.on('maximize-window', () => { + mainWindow.isMaximized() ? mainWindow.unmaximize() : mainWindow.maximize() + }) - createWindow() + ipcMain.on('close-window', () => { + if (loginWindow) { + loginWindow.destroy() + } + if (mainWindow) { + mainWindow.destroy() + } + }) + // 打开主窗口 + ipcMain.on('openMainWindow', () => { + if (!mainWindow) { + createMainWindow() + } + + loginWindow.destroy() + loginWindow = null + }) + // 打开登录窗口 + ipcMain.on('openLoginWindow', () => { + if (!loginWindow) { + createLoginWindow() + } + mainWindow.destroy() + loginWindow.show() + loginWindow.focus() + }) + + //打开作业窗口 + ipcMain.on('openWork', (e, data) => { + createWork(data) + }) + // zdg: 创建工具窗口-如 悬浮球 + // Tool(app, shell, BrowserWindow, ipcMain) + createLoginWindow() app.on('activate', function () { - // On macOS it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. - if (BrowserWindow.getAllWindows().length === 0) createWindow() + if (BrowserWindow.getAllWindows().length === 0) createLoginWindow() }) }) @@ -82,35 +186,3 @@ app.on('window-all-closed', () => { app.quit() } }) - -ipcMain.on('toggle-top', (event) => { - const win = BrowserWindow.getFocusedWindow(); - const isAlwaysOnTop = win.isAlwaysOnTop(); - win.setAlwaysOnTop(!isAlwaysOnTop); - event.sender.send('top-status-changed', !isAlwaysOnTop); -}) - - -ipcMain.on('minimize-window', () => { - const win = BrowserWindow.getFocusedWindow(); - win.minimize(); -}); - -ipcMain.on('maximize-window', () => { - const win = BrowserWindow.getFocusedWindow(); - if (win.isMaximized()) { - win.unmaximize(); - } else { - win.maximize(); - } -}); - -ipcMain.on('close-window', () => { - const win = BrowserWindow.getFocusedWindow(); - win.close(); -}); -ipcMain.on('set-winsize', (e, {x, y})=>{ - const win = BrowserWindow.getFocusedWindow(); - win.setSize(x,y); - win.center() -}) diff --git a/src/renderer/src/components/window-tools/index.vue b/src/renderer/src/components/window-tools/index.vue new file mode 100644 index 0000000..f32fe27 --- /dev/null +++ b/src/renderer/src/components/window-tools/index.vue @@ -0,0 +1,61 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/src/layout/components/Header.vue b/src/renderer/src/layout/components/Header.vue index 4e4b31b..9bdb708 100644 --- a/src/renderer/src/layout/components/Header.vue +++ b/src/renderer/src/layout/components/Header.vue @@ -14,12 +14,7 @@
-
- - {{ isMaxSize ? '' : - '' }} - -
+
@@ -46,11 +41,11 @@ import { ref, watch } from 'vue' import { useRouter } from 'vue-router' import { ElMessageBox } from 'element-plus' +import WindowTools from '@/components/window-tools/index.vue' import useUserStore from '@/store/modules/user' -const userStore = useUserStore() const { ipcRenderer } = window.electron || {} -const isMaxSize = ref(false) +const userStore = useUserStore() const router = useRouter() const currentRoute = ref('') @@ -81,19 +76,6 @@ watch( { immediate: true } ) -// 最小化 -const minimizeWindow = () => { - ipcRenderer.send('minimize-window') -} -//最大化 -const maximizeWindow = () => { - ipcRenderer?.send('maximize-window') - isMaxSize.value = !isMaxSize.value -} -//关闭 -const closeWindow = () => { - ipcRenderer.send('close-window') -} const changePage = (url) => { router.push(url) @@ -118,11 +100,11 @@ function logout() { type: 'warning' }).then(() => { userStore.logOut().then(() => { - // location.href = '/index#/login'; - router.replace('/login') + // router.replace('/login') + ipcRenderer && ipcRenderer.send('openLoginWindow') }).catch(()=>{ - router.replace('/login') - // location.href = '/index#/login'; + // router.replace('/login') + ipcRenderer && ipcRenderer.send('openLoginWindow') }) }).catch(() => { }); } @@ -213,25 +195,6 @@ watch(()=> userStore.avatar,() => { padding-bottom: 5px; flex-direction: column; - .header-tool { - -webkit-app-region: no-drag; - span { - border-radius: 3px; - cursor: pointer; - padding: 2px 10px; - &:hover { - background-color: #c4c4c4; - } - } - .close{ - &:hover{ - background-color: #fb4a3e; - .iconfont{ - color: #fff; - } - } - } - } .user { .user-info { diff --git a/src/renderer/src/layout/index.vue b/src/renderer/src/layout/index.vue index 3f2af4d..fc79a0c 100644 --- a/src/renderer/src/layout/index.vue +++ b/src/renderer/src/layout/index.vue @@ -18,8 +18,6 @@ import uploaderState from '@/store/modules/uploader' import { ref } from 'vue' let uploaderStore = ref(uploaderState()) -const { ipcRenderer } = window.electron || {} -ipcRenderer ? ipcRenderer .send('set-winsize', { x: 1200, y: 700 }) : ''