使用Electron包装ruoyi-ui/ruoyi-vue实践总结

news2024/10/4 0:20:41

背景:最近公司新起的项目,由于工期、资源等原因,采用ruoyi框架快速实现开发,由于需要构建客户端,所以借助electron来实现。

electron 是使用javascript html css来构建跨平台的桌面应用程序。

官网地址:简介 | Electron

查了很多资料,好像后台管理做成客户端的很少很少,主要参考这篇文章:

ruoyi-vue | electron打包教程(超详细)_ruoyi 打包_七维大脑的博客-CSDN博客

加上自己的实践,在这里记录一下过程以及踩过的坑。

一、基础环境说明

node:16.14.2 && 20.3.1 推荐nvm来管理切换

ruoyi-ui: 3.8.3

java:20

mysql:8.0

经过个人实践,主要就是node的版本比较重要,其他的不管是ruoyi-ui 还是ruoyi-vue,后端的java及mysq版本就更是毫无关系了。

二、ruoyi前端工程的改造

1.依赖安装

# electron
npm install electron

# 在 Electron 应用程序中安装和管理开发者工具
npm install electron-devtools-installer

# 简单的持久化数据存储库
npm install electron-store

# 在 Vue CLI 项目中集成 Electron 打包和构建
npm install vue-cli-plugin-electron-builder

如果安装错误的话,可以改一下安装源 npm install --registry=https://registry.npmmirror.com

是不是发现报错了呢?

 问题就出在,直接安装electron,没有指定版本,存在与node的兼容问题。官网可是说了

没问题,切换到最新的node版本, nvm use 20.3.1,成功安装,继续。。。

2.修改配置

.env.production 生产环境配置
# 若依管理系统/生产环境
VUE_APP_BASE_API = '/prod-api'


# 这里先改成后端服务地址:
VUE_APP_BASE_API = 'http://localhost:8080'

这里说明一下,生产环境涉及到打包部署,所以说

# 如果项目web前端没有部署改为线上后端地址:
VUE_APP_BASE_API = 'http://localhost:8080'


# 如果项目web前端已经部署可写改为:
VUE_APP_BASE_API = 'http://IP/prod-api'
clipboard

解决clipboard报错问题

老哥推荐,暴力注释全部代码:src/directive/module/clipboard.js

vue.config.js
# 修改静态资源路径
publicPath: './',
 
# 修改为实际接口地址
target: `http://localhost:8080`

module.exports中新增下面配置,与 devServer 同级

  pluginOptions: {
    electronBuilder: {
      // preload: 'src/preload.js',
      nodeIntegration: true,
      contextIsolation: false,
      enableRemoteModule: true,
      publish: [{
        "provider": "xxxx有限公司",
        "url": "http://xxxxx/"
      }],
      "copyright": "Copyright © 2022",
      builderOptions:{
        appId: 'com.ruoyi',
        productName: 'ruoyi',
        nsis:{
          "oneClick": false,
          "guid": "idea",
          "perMachine": true,
          "allowElevation": true,
          "allowToChangeInstallationDirectory": true,
          "installerIcon": "build/app.ico",
          "uninstallerIcon": "build/app.ico",
          "installerHeaderIcon": "build/app.ico",
          "createDesktopShortcut": true,
          "createStartMenuShortcut": true,
          "shortcutName": "若依管理系統"
        },
        win: {
          "icon": "build/app.ico",
          "target": [
            {
              "target": "nsis",			//使用nsis打成安装包,"portable"打包成免安装版
              "arch": [
                "ia32",				//32位
                "x64" 				//64位
              ]
            }
          ]
        },
      },
      // preload: path.join(__dirname, "/dist_electron/preload.js"),
    },
  },

路由文件 src/router/index.js,改为 hash 模式

解决菜单栏跳转404,部分无法跳转问题

 全局修改
全局搜索Cookies.get并替换为localStorage.getItem

全局搜索Cookies.set并替换为localStorage.setItem

全局搜索Cookies.remove并替换为localStorage.removeItem


// src/views/login.vue 去掉过期时间
localStorage.setItem("username", this.loginForm.username);
localStorage.setItem("password", encrypt(this.loginForm.password));
localStorage.setItem('rememberMe', this.loginForm.rememberMe);
// 为了解决菜单栏跳转为404的问题

// electron中的路由跳转路径解析path.resolve结果与在浏览器中的web项目解析结果不一致

// path 模块的默认操作会因 Node.js 应用程序运行所在的操作系统而异。 具体来说,当在 Windows 操作系统上运行时, path模块会假定正被使用的是 Windows 风格的路径。

// path.posix 属性提供对 path 方法的 POSIX 特定实现的访问。(意思就是无视操作系统的不同,统一为 POSIX方式,这样可以确保在任何系统上结果保持一致)

全局修改path.resolve为path.posix.resolve

但是要注意,使用path.posix.resolve,会造成npm run dev 的时候报错,记得切换修改

修复无法登出问题,也就是退出后的跳转页面 
   async logout() {
      this.$confirm('确定注销并退出系统吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        this.$store.dispatch('LogOut').then(() => {
          this.$router.push('/login')
        })
      }).catch(() => {});
    }

3.新增electron的相关配置

src根目录下新建background.js文件

'use strict'

import { app, protocol, BrowserWindow, ipcMain } from 'electron'
import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'
import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'
const isDevelopment = process.env.NODE_ENV !== 'production'
const Store = require('electron-store');

// Scheme must be registered before the app is ready
protocol.registerSchemesAsPrivileged([
  { scheme: 'app', privileges: { secure: true, standard: true } }
])

async function createWindow() {
  // Create the browser window.
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      // Use pluginOptions.nodeIntegration, leave this alone
      // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info
      contextIsolation:false,     //上下文隔离
      enableRemoteModule: true,   //启用远程模块
      nodeIntegration: true, //开启自带node环境
      webviewTag: true,     //开启webview
      webSecurity: false,
      allowDisplayingInsecureContent: true,
      allowRunningInsecureContent: true
    }
  })
  win.maximize()
  win.show()
  win.webContents.openDevTools()
  ipcMain.on('getPrinterList', (event) => {
    //主线程获取打印机列表
    win.webContents.getPrintersAsync().then(data=>{
      win.webContents.send('getPrinterList', data);
    });
    //通过webContents发送事件到渲染线程,同时将打印机列表也传过去

  });

  if (process.env.WEBPACK_DEV_SERVER_URL) {
    // Load the url of the dev server if in development mode
    await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL)
    if (!process.env.IS_TEST) win.webContents.openDevTools()
  } else {
    createProtocol('app')
    // Load the index.html when not in development
    win.loadURL('app://./index.html')


  }
}

// Quit when all windows are closed.
app.on('window-all-closed', () => {
  // On macOS it is common for applications and their menu bar
  // to stay active until the user quits explicitly with Cmd + Q
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', () => {
  // 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()
})

// 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.on('ready', async () => {
  Store.initRenderer();
  if (isDevelopment && !process.env.IS_TEST) {
    // Install Vue Devtools
    try {
      await installExtension(VUEJS_DEVTOOLS)
    } catch (e) {
      console.error('Vue Devtools failed to install:', e.toString())
    }
  }
  createWindow()
})

// Exit cleanly on request from parent process in development mode.
if (isDevelopment) {

  if (process.platform === 'win32') {
    process.on('message', (data) => {
      if (data === 'graceful-exit') {
        app.quit()
      }
    })
  } else {
    process.on('SIGTERM', () => {
      app.quit()
    })
  }
}

package.json中新增指令、引入electron配置文件

 4.测试打包

npm run electron:build

项目会新增文件夹,dist_electron,先把它加入.gitignore中,进入文件夹:

exe文件就是应用程序,收工...

补一张最后的成果图

 

接下来,会继续单开一篇文章,学习记录一下electron的打包配置,bye~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/769726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ModelWhale 基于 AI for Science 助力航遥中心基础设施建设

2023 年 3 月,科技部会同自然科学基金委启动“人工智能驱动的科学研究(AI for Science)”专项部署工作。科技部新一代人工智能发展研究中心主任赵志耘认为,AI for Science 将突破传统科学研究能力瓶颈,成为全球科研新范…

【2023-07-18】jsvmp逆向profileData

加密逻辑 注册gid需要用到profileData,profileData的加密逻辑是将一个46对键值对的json经过bas64编码后进行des加密,这46对键值对都是环境和设备相关的一些参数,要完整还原profileData还需要将这些参数的生成逻辑进行还原。 变量名说明key…

Python开发项目基于卷积神经网络的车牌识别仿真软件设计与实现

博主介绍:擅长Java、微信小程序、Python、Android等,专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 Java项目精品实战案例…

ICASSP2023论文解读|如何检测会议记录中的待办事项?

得益于语音识别技术的发展,人工智能可以帮助人们记录会议,自动检测与会后行动项关联的会议内容,并进行总结。 行动项识别对于管理会后待办任务至关重要。 针对对于行动项识别任务,相关数据集稀缺且规模小。因此,达摩…

酷炫无敌!10分钟学会制作3D园区大屏,职场新人也能秒变大神!

近年来随着大数据的飞速发展,各大行业都进行了一定的产业革新,智慧园区也逐渐进入企业视野并成为主流,不论大小企业,领导老板都要求员工制作出智慧园区的酷炫大屏,不顾及其中的技术难度,只想看到最终成果&a…

2023隐私计算大会亮点前瞻:《隐私计算应用 面向政务场景的应用要求》标准解读预告

7月26日,2023隐私计算大会将于青岛正式扬帆,本次大会将齐聚业内专家大咖共论行业最新进展,洞察未来发展趋势,共同推进隐私计算行业蓬勃发展。 本次大会将正式公开发布《隐私计算应用研究报告(2023)》、“隐…

J2EEJSP自定义标签库01out标签if标签

目录 一.什么是标签 二.JSP自定义标签库 2.1 JSP标签库是什么 2.2 处理流程 2.3 如何自定义标签 2.4 标签类型 三.开发示例 3.1 out标签 1.创建助手类 2.编写tld(标签库的描述)文件,(必须放在WEB-INF目录或其目录下&a…

LCD—STM32液晶显示(3.NOR FLASH时序结构体)

目录 LCD结构体配置 NOR FLASH时序结构体 FSMC的NOR FLASH初始化结构体 LCD结构体配置 NOR FLASH时序结构体 与控制SRAM时一样,控制FSMC使用NOR FLASH存储器时主要是配置时序寄存器以及控制寄存器,利用ST标准库的时序结构体以及初始化结构体可以很方便地…

第六章:string类

系列文章目录 文章目录 系列文章目录前言为什么学习string类C语言中的字符串ASCIIUnicode**UTF-8**UTF-16UTF-32 GBK 标准库中的string类string类总结 string类的常用接口说明1. string类对象的常见构造2. string类对象的容量操作3. string类对象的访问及遍历操作4. string类对…

亚马逊云科技十年出海经验,为中国企业提供跨越式发展

对于一座优秀的港口而言,不仅要求其所在的地理位置得天独厚以及拥有庞大的货运船舶吞吐量,能否为地区带来良好的发展生态,提供和创造新的就业机会也是重要的考量。对于很多中小企业而言,他们不具备大型企业的体量,在海…

vscode(Better Comments插件)在vue文件中不显示相对应的颜色

解决办法: 1、在.vscode文件下找到 aaron-bond.better-comments-3.0.2 (我的路径:C:\Users\cown\.vscode\extensions\aaron-bond.better-comments-3.0.2),后面版本不唯一,根据自身情况辨别 2、进入文件路…

HTTPS概念wireshark分析

目录 密钥&加密算法CA & 数字证书https流程连接流程springboot项目启动httpswireshark分析https流程 密钥&加密算法 密钥:通常是一个字符串或数字,进行加密/解密算法时使用。公钥和私钥都是密钥,只不过一般公钥是对外开放的&…

如何在 Endless OS 上安装 ONLYOFFICE 桌面编辑器

ONLYOFFICE 桌面编辑器是一款基于依据 AGPL v.3 许可进行分发的开源办公套件。使用这款应用,您无需保持网络连接状态即可处理存储在计算机上的文档。本指南会向您介绍,如何在 Endless OS 上安装 ONLYOFFICE 桌面编辑器。 ONLYOFFICE 桌面版是什么 ONLYO…

Sencha ExtJS v1.0.4 扩展不能“转到定义“的解决办法

VSCode 的 Sencha 扩展自动更新到了 1.0.4,去除激活提示的方法和以前一样。 但是有扩展bug,就是无法转到定义,打开 VSCode 的开发者工具,由一堆报错。 解决办法:要修改下文件 C:\Users\xxx\.vscode\extensions\sench…

谷歌黑客语法与漏洞寻找

谷歌黑客语法与漏洞寻找 一、常见的搜索引擎二、Google部分语法三、通配符四、FOFA五、Shodan六、例子:常见的后台地址 一、常见的搜索引擎 浏览器 浏览器是用来检索、展示以及传递Web信息资源的应用程序。 搜索引擎 所谓搜索引擎,就是根据用户需求与一…

惊艳!AI创意字体真绝了;6道AIGC高频面试题与解答;为啥语音助手还没集成LLM;深度学习算法红宝书 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 惊艳!手把手教你使用 Stable Diffusion 制作AI创意字体 最近AI创意字体刷爆了 ShowMeAI 社群!伙伴们纷纷惊叹这…

OJ练习第139题——模拟行走机器人

模拟行走机器人 力扣链接:874. 模拟行走机器人 题目描述 机器人在一个无限大小的 XY 网格平面上行走,从点 (0, 0) 处开始出发,面向北方。该机器人可以接收以下三种类型的命令 commands : -2 :向左转 90 度 -1 &…

Pytorch:搭建卷积神经网络完成MNIST分类任务

2023.7.18 MNIST百科: MNIST数据集简介与使用_bwqiang的博客-CSDN博客 数据集官网:MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burges MNIST数据集获取并转换成图片格式: 数据集将按以图片和文件夹名为标签的…

青岛大学_王卓老师【数据结构与算法】Week05_13_队列的顺序表示和实现1_学习笔记

本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享, 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础…

DeepSpeed系列篇1:零门槛上手DeepSpeed实战(服务器部署及训练过程详解SFT)

1、建立虚拟环境 conda create -n dsnew python3.10 2、安装pytorch conda install pytorch torchvision torchaudio pytorch-cuda11.7 -c pytorch -c nvidia 3、安装deepspeed pip install deepspeed 4、下载DeepSpeedExamples并安装依赖 https://github.com/microsof…