用electron开发桌面端的个人总结

1,550 阅读2分钟

项目介绍

登录图

界面图

项目的初衷:

公司内部员工,获取解决问题,发布员工租房,二手物品出售等交易信息和咨询问题,可以清楚的了解公司组织架构以及企业文化

公司行政人事,发布公司规章制度和企业最新公告的OA平台

electron项目有哪些有意思的功能:

  1. 下载文件到指定目录(1颗星)

    渲染进程代码   
     // 下载附件    
    downloadFile(val) {      
    const url = `http://office.xmhaini.com/api/public/uploads/admin/noticeFile/${val}`      
    // this.$electron.shell.openExternal(url)      
    this.$electron.remote.dialog.showOpenDialog({ 
     properties: ['openDirectory'], // 选择操作,此处是打开文件夹        
    filters: [{ name: 'All', extensions: ['*'] }]  // 过滤条件,默认全部文件      
    }, res => {        // 回调函数内容,此处是将路径内容显示在input框内        
    if (res) {          // 渲染器进程代码          
    const downloadAddress = res[0]
     //此处与主进程通信,将下载文件地址与存放地址传给主进程          
    this.$electron.ipcRenderer.send('download', downloadAddress + '+' + url)        
    } else {          
    this.$message.warning('请先选择文件目录')        
        }      
      })   
    },
    主进程代码:
    //引入ipcMain,监听渲染进程  
    const { ipcMain, BrowserWindow, app } = require('electron')  
    // 下载文件  ipcMain.on('download', (evt, args) => {    
    const arr = args.split('+')    
    downloadpath = arr[0] // 文件要存放的本地地址    
    const folderpath = arr[1] // 文件的链接    
    mainWindow.webContents.downloadURL(folderpath)  })  
    // 监听文件下载事件  mainWindow.webContents.session.on('will-download', (event, item, webContents) => {    
    item.setSavePath(downloadpath + `\\${item.getFilename()}`)    // 设置文件存放位置    
    item.once('done', (event, state) => {      if (state === 'completed') {        
    mainWindow.webContents.send('success-down', state)      } 
    else {        mainWindow.webContents.send('error-down')      }    })  })
    
  2. 消息通知时, 闪烁任务栏的图标(2颗星)

    主要实现思路是,与服务器建立websocket连接,当接收到新消息通知,就给主进程发送广播,主进程监听到广播,调用闪烁函数
    渲染进程代码:
        semdNotify() {      createSocket(this.token) // 创建      // 监听ws数据响应      const getDataFunc = e => {        const data = e.detail.data.data        if (data === '200') {          this.$store.dispatch('GetUnReadNum')          this.$electron.ipcRenderer.send('shan-shuo')          if (this.systemSettingObj.soundChoice) { // 新消息提示音            this.$refs.sound.play()          }        }      }      window.addEventListener('onmessageWS', getDataFunc)    }
    主进程代码:
    ipcMain.on('shan-shuo', e => {  if (currentShan) { // 节流阀    // 闪烁图标    timer = setInterval(function() {      count++      if (count % 2 === 0) {        tray.setImage(path.join(__static, 'empty.ico'))      } else {        tray.setImage(path.join(__static, 'favicon-active.ico'))      }      currentShan = false    }, 500)  }})
    
  3. 获取服务器上最新版本,自动更新(3颗星)

    思路是通过electron提供的autoUpdater方法,首先设置远端存放更新包服务器路径,然后依次监听更新,整个更新生命周期包括,error监听错误,
    checking-for-update监听到有差异文件,update-available,更新开始,download-progress更新进度,update-downloaded
    更新完成,退出并自动安装更新。
    // 执行自动更新检查autoUpdater.checkForUpdates()
    //退出并安装更新
      autoUpdater.quitAndInstall()
    
    
  4. 开机自启动(1颗星)

    const ex = process.execPath  // 获取可执行文件位置  ipcMain.on('openAutoStart', () => {    app.setLoginItemSettings({      openAtLogin: true,      path: ex,      args: []    })  })  // 关闭 开机自启动  ipcMain.on('closeAutoStart', () => {    app.setLoginItemSettings({      openAtLogin: false,      path: ex,      args: []    })  })
    
  5. 快捷键唤出应用(1颗星)

    import { globalShortcut } from 'electron'
    
      const ret = globalShortcut.register('ctrl+h+n', function() {    mainWindow.show()  })
    
  6. 自定义顶部操作栏,放大缩小,关闭应用(2颗星)

    最大化:mainWindow.maximize()
    最小化: mainWindow.minimize()
    还原:mainWindow.restore()
    最大化和还原难点在于监听,双击窗口顶部,还原,避免最大化还原按钮未随窗口改变而改变
    mounted中监听原型链上的unmaximize方法:
        remote.getCurrentWindow().addListener('unmaximize', _ => {      this.$nextTick(_ => {        this.isMax = false      })    })
    
  7. 打开外部浏览器到指定网址(1颗星)

    this.$electron.shell.openExternal(linkUrl) // linkUrl为网页地址
    
  8. 天气预报(2颗星)

    https://v0.yiketianqi.com/api?version=v9&appid=61281254&appsecret=xXGs7BhV&city=${this.currentCity}&vue=1`
    

#初始化项目

1.安装vue/cli-init

cnpm i -g @vue/cli-init, 因为electron目前是基于vue-cli2.x的

2.使用创建项目

vue init simulatedgreg/electron-vue my-vue-app // 本项目使用的electron-vue,是一个结合 vue-cli 与 electron 的项目,主要避免了使用 vue 手动建立起 electron 应用程序,很方便。

3.创建好项目后如下图,这时候就开始写项目了,main主进程中,主要是使用electron提供的api,控制窗口,与系统之间的联系和逻辑,如创建窗口,托盘,监听服务器差异文件用来提示更新等,reneder渲染进程主要负责样式结构编写。

初始化项目图

目录结构

#项目打包

  1. 项目第一次打包,需要四个依赖文件,提示下载。

    坑点:使用了npm下载的还是有文件未找到,然后nrm ls看了一眼,发现还是淘宝镜像,nrm use npm 后重新下载node_models,重新下载还是报错, Error !include: could not find: ****StdUtils.nsh",这个原因是文件夹路径有中文!!总结就是,依赖必须用npm下载,项目路径不可包含中文。

总结:

本项目功能相对简单,基本上都能在文档中找到想要实现的功能,我的第一个桌面应用,总体来说还比较满意,学到了很多新知识,没有想象中难,而且做完后,感觉比web项目有成就感,可能是比较新奇,最后附上文档地址,以便有缘人开启新世界electron文档地址二,。