From ee64cf554acddbb0d82b11936e6a55a60d72eb26 Mon Sep 17 00:00:00 2001 From: purocean Date: Tue, 6 Aug 2019 14:49:16 +0800 Subject: [PATCH] electron --- app/package.json | 3 +- app/src/app.ts | 71 ++++++++++++++++++++++++++++++---------- app/src/assets/icon.png | Bin 0 -> 7559 bytes 3 files changed, 55 insertions(+), 19 deletions(-) create mode 100644 app/src/assets/icon.png diff --git a/app/package.json b/app/package.json index b7adc5cb..ec54d04e 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,7 @@ { "scripts": { - "build": "tsc", + "copy-assets": "cp ./src/assets ./dist/ -r", + "build": "tsc && npm run copy-assets", "serve": "ts-node src/server/main.ts", "start": "npm run build && electron ./dist/app.js" }, diff --git a/app/src/app.ts b/app/src/app.ts index c8d2c3d5..43c7a285 100644 --- a/app/src/app.ts +++ b/app/src/app.ts @@ -1,6 +1,11 @@ -import { app, BrowserWindow } from 'electron' +import { app, BrowserWindow, Menu, Tray } from 'electron' +import * as path from 'path' import server from './server/main' import { dialog } from 'electron' +const opn = require('opn') + +const port = 3044 +const url = `http://localhost:${port}` let win: BrowserWindow | null = null @@ -16,14 +21,9 @@ const createWindow = () => { // 加载index.html文件 // win.loadFile('../../static/index.html') - // 打开后端服务器 - server(3044) - // 加载页面 - setTimeout(() => { - win.loadURL('http://localhost:3044') - win.maximize() - }, 1000) + win.loadURL(url) + // win.maximize() // 打开开发者工具 win.webContents.openDevTools() @@ -61,18 +61,9 @@ const createWindow = () => { }) } -// Electron 会在初始化后并准备 -// 创建浏览器窗口时,调用这个函数。 -// 部分 API 在 ready 事件触发后才能使用。 -app.on('ready', createWindow) - // 当全部窗口关闭时退出。 app.on('window-all-closed', () => { - // 在 macOS 上,除非用户用 Cmd + Q 确定地退出, - // 否则绝大部分应用及其菜单栏会保持激活。 - if (process.platform !== 'darwin') { - app.quit() - } + // 不处理,点击托盘退出 }) app.on('activate', () => { @@ -82,3 +73,47 @@ app.on('activate', () => { createWindow() } }) + +const showWindow = () => { + if (win) { + win.show() + } else { + createWindow() + } +} + +// 系统托盘 +let tray = null +app.on('ready', () => { + // 打开后端服务器 + server(port) + + const contextMenu = Menu.buildFromTemplate([ + { + type: 'normal', + label: '打开主界面', + click: () => { + showWindow() + } + }, + { + type: 'normal', + label: '浏览器中打开', + click: () => { + opn(url) + } + }, + { + type: 'normal', + label: '退出', + click: () => { + app.exit() + } + }, + ]) + + tray = new Tray(path.join(__dirname, './assets/icon.png')) + tray.setToolTip('Yank-Note') + tray.on('click', showWindow) + tray.setContextMenu(contextMenu) +}) diff --git a/app/src/assets/icon.png b/app/src/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9dae4ddafc5b16520952997ff1ce4c0f22dda9e0 GIT binary patch literal 7559 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