若依前后端分離版使用Electron打包前端Vue為Exe文件

1.前言

本文詳細介紹如何使用electron將若依框架前后端分離版的前端Vue頁面打包為Exe文件,并且包括如何實現應用更新。使用若依基礎代碼體現不出打包功能,因此我使用開發的文件管理系統,介紹上述過程,具體可以查看我的文章《若依前后端分離版實現文件管理》。雖然沒有使用若依基礎代碼,但是打包過程是完全一樣的。本文章完全免費,使用若依版本為3.8.9。打包之前,復制一份前端代碼進行,不要在原來前端代碼基礎上打包,因為exe打包修改的配置會影響原來PC端的功能。

2.安裝插件

1.在終端執行下面代碼,查看當前鏡像庫。

npm get registry 

2.如果當前鏡像不是上面地址,執行下面代碼,將鏡像設置淘寶鏡像。再次執行上面代碼,查看鏡像庫是否正確。

npm config set registry https://registry.npmmirror.com/

3.在終端依次執行下面代碼,安裝這個5個插件到ruoyi-ui。

npm install electron
npm install electron-devtools-installer
npm install electron-store
npm install vue-cli-plugin-electron-builder
npm install electron-updater

4.如果安裝失敗,請使用科學上網的方式進行安裝,具體如何科學上網,這里就不介紹了。如果使用科學上網的方式還是安裝失敗,可以在科學上網的前提下依次執行下面代碼。此種方式,應該能夠解決大部分問題,不行就多嘗試幾次。如果還是不行,只能自己想辦法安裝這幾個插件了。


npm install electron --registry=https://registry.npmmirror.com --disturl=https://npmmirror.com/mirrors/electron/
npm install electron-devtools-installer --registry=https://registry.npmmirror.com --disturl=https://npmmirror.com/mirrors/electron/
npm install electron-store --registry=https://registry.npmmirror.com --disturl=https://npmmirror.com/mirrors/electron/
npm install vue-cli-plugin-electron-builder --registry=https://registry.npmmirror.com --disturl=https://npmmirror.com/mirrors/electron/
npm install electron-updater --registry=https://registry.npmmirror.com --disturl=https://npmmirror.com/mirrors/electron/

5.在IDEA終端執行下面代碼,進入ruoyi-ui文件夾(如果沒有IDEA在cmd界面執行一樣。)。

cd ruoyi-ui

5.在IDEA終端執行下面代碼,查看vue版本。

vue --version

6.如果提醒“ 'vue' 不是內部或外部命令,也不是可運行的程序或批處理文件。 ”繼續在IDEA終端中執行下面代碼。先不要關閉窗口,

npm root -g

7.Win + R 輸入 sysdm.cpl,按回車或點擊“確定”按鈕,打開環境變量設置。

8.選擇“高級”,點擊“環境變量”。

9.選擇系統變量下面的Path選項,點擊“編輯”按鈕。

10.復制第6步的值,不要全部復制,復制到node_global路徑即可。比如:我的第6步顯示:D:\work\nodejs\node_global\node_modules,我需要復制D:\work\nodejs\node_global。

點擊“新建”按鈕,將復制的路徑,加入到最后。添加完成后,點擊“確定”按鈕。

11.再次點擊“確定”按鈕。之后,再此打開環境變量,找到剛才位置,確認下是否保存成功。

12.環境變量重新保存的前提下,關閉IDEA,再次打開。如果使用cmd,請關閉后,再打開。如果執行下面代碼,顯示版本號了,就代表配置成功了。如果關閉后再打開不生效,請重啟下電腦。

vue --version

13.在IDEA終端執行下面代碼,會提示選擇版本,選擇最新版,然后回車。等待添加完成后,打開前端文件,如果再src文件夾下多了個backgroud.js文件,代表添加成功。

 vue add electron-builder

如果卡住了,不用關,只要前端成功添加了backgroud.js文件即可。

等待backgroud.js文件添加成功,通過Ctrl+C兩次,強制停止IDEA終端。不然后面打包時,會出現異常。

一定不要在vs終端執行上面代碼,會報錯。

14.打開package.json文件,由于我安裝的nodejs版本較高,將electron:build和electron:serve添加以下前綴。并不是所有人都需要添加此配置,如果原來代碼,再不添加的前提下可以運行,就不用添加。

SET NODE_OPTIONS=--openssl-legacy-provider && 

3.修改原文件

1.打開router/index.js,將路由模式改為hash。如果不修改,打包后直接無法顯示頁面。

2.通過Vs的全局搜索功能,1. 將所有文件中的Cookies.get替換為localStorage.getItem,將Cookies.set全部替換為localStorage.setItem,Cookies.remove全部替換為localStorage.removeItem。如果不修改,使用Cookies的地方都報錯。比如:點擊“登錄”按鈕后無反應,因為登錄頁面就使用了Cookies。

3. 打開src/layout/components/Navbar文件,設置退出后,跳轉到登錄頁。如果不設置,退出后,顯示空白頁。

this.$router.push('/login');

4.打開src\utils\request.js文件,修改登錄超時頁面跳轉。導入路由插件,實現路由調轉。

import router from '@/router'
router.push('/login');

4.配置Electron

1.打開vue.config.js文件,在module.exports中,增加Electron配置,配置代碼如下。下面配置上都有說明,就不一一介紹了,主要介紹下容易出錯的配置。

// electron配置pluginOptions: {electronBuilder: {nodeIntegration: false, //禁止 Node.js 直接運行,提升安全性contextIsolation: true, //使 `preload.js` 安全地暴露 APIenableRemoteModule: false, // 禁止 `remote`,避免被攻擊builderOptions: {appId: 'com.py',  // appidproductName: 'py', // 生產名稱copyright: "Copyright ? 2018-2025",asar: true, //啟用 asar 打包,防止文件被篡改directories: {output: "dist_electron", //指定打包后的文件夾buildResources: "src/assets" //資源文件路徑(圖標等)},nsis: {oneClick: false, // 允許用戶自定義安裝路徑allowToChangeInstallationDirectory: true, // 允許用戶修改安裝路徑perMachine: true, // 所有用戶都可安裝(系統級安裝)allowElevation: true, // 允許以管理員權限運行createDesktopShortcut: true, // 創建桌面快捷方式createStartMenuShortcut: true, // 創建開始菜單快捷方式shortcutName: "若依管理系統", // 自定義快捷方式名稱installerIcon: "src/assets/logo/piaoyi_stall.ico", // 安裝程序圖標uninstallerIcon: "src/assets/logo/piaoyi_stall.ico", // 卸載程序圖標installerHeaderIcon: "src/assets/logo/piaoyi_stall.ico", // 安裝界面標題圖標},win: {// 下方任務欄圖標icon: "src/assets/logo/piaoyi.ico",target: [{target: "nsis", //生成 Windows 安裝包arch: ["ia32", "x64"] // 32 位 & 64 位兼容}],// 安裝包文件名artifactName: "py_${version}.${ext}"},publish: [{provider: "generic", // 允許手動配置更新服務器url: "http://localhost:8080/profile/" // 更新服務器地址}],// 額外打包資源,會打包到resources文件夾,使用時加上此文件夾路徑extraResources: [// 打包應用左上角圖標{from: "src/assets/logo/piaoyi_stall.ico",to: "logo/logo.ico",}]}}}

注意:

1.上面的所有圖標必須要求為.ico格式,并且最小為256*256。icon格式轉換后的圖片有可能無法識別,導致報錯。我使用的wps,如果關于圖標報錯,一定按照上面要求,如果還是不行,就得換個轉換軟件了。

2.publish.url為更新文件的地址,需要為一個后端映射的文件夾,我使用了若依文件后端映射文件夾的根路徑。需要更新文件時,將打包后的exe文件和latest.yml文件上傳到這個文件夾,應用會自動更新。

3.extraResources配置項導出到打包文件,能夠和public文件夾下的文件類似,我這將一個icon導出到了打包文件夾。需要注意的是,會將文件導出到resources文件夾下,因此使用文件時,需要加上此文件夾前綴,具體可以看backgroud.js文件中icon配置。

2.打開.env.production文件,將VUE_APP_BASE_API改為后端地址。因為electron自動讀取這個文件中的配置,一定不要和vue一樣加上訪問前綴。真正發布時,后端地址肯定需要映射到外網,就和小程序或者APP的后端類似。

3.打開src\background.js文件,用以下代碼替換。一般根據實際情況修改icon即可,如果調試階段可以win.webContents.openDevTools()代碼注釋去掉,會顯示一個類似于web調試的框。

'use strict'import { app, protocol, BrowserWindow, Menu, dialog } from 'electron'
import { autoUpdater } from 'electron-updater'
import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'
import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'
//手動配置當前環境
const isDevelopment = process.env.NODE_ENV !== 'production'// Scheme must be registered before the app is ready
protocol.registerSchemesAsPrivileged([{ scheme: 'app', privileges: { secure: true, standard: true } }
])async function createWindow() {// 關閉頂部導航菜單欄Menu.setApplicationMenu(null)// Create the browser window.const win = new BrowserWindow({width: 1000,height: 800,// 應用左上角圖標icon: "resources/logo/logo.ico",webPreferences: {// Use pluginOptions.nodeIntegration, leave this alone// See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more infonodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION}})// 啟動自動更新檢查checkForUpdates();//打開調試框// win.webContents.openDevTools()if (process.env.WEBPACK_DEV_SERVER_URL) {// Load the url of the dev server if in development modeawait 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 developmentwin.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 + Qif (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 () => {if (isDevelopment && !process.env.IS_TEST) {// Install Vue Devtoolstry {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()})}
}// 自動更新邏輯
function checkForUpdates() {autoUpdater.autoDownload = false; // 禁止自動下載,讓用戶手動確認autoUpdater.checkForUpdates();// 有新版本可用autoUpdater.on('update-available', (info) => {dialog.showMessageBox({type: 'info',title: '更新可用',message: `發現新版本 ${info.version},是否立即更新?`,buttons: ['是', '否']}).then((result) => {if (result.response === 0) {autoUpdater.downloadUpdate();}});});// 更新下載完成autoUpdater.on('update-downloaded', () => {dialog.showMessageBox({type: 'info',title: '更新完成',message: '更新下載完成,是否立即安裝?',buttons: ['立即安裝', '稍后']}).then((result) => {if (result.response === 0) {autoUpdater.quitAndInstall();}});});// 更新錯誤autoUpdater.on('error', (error) => {dialog.showErrorBox('更新錯誤', error == null ? "未知錯誤" : error.toString());});
}

4.上面設置了很多東西,就是沒有應用版本號。應用版本號對更新很重要,會自動讀取package.json文件中的version,可以根據實際情況修改。我這里修改成1.0.0,方便以后的更新測試。

5.復制icon到文件夾,請根據實際情況修改icon相關代碼。

5.打包與更新

1.執行下面代碼,進行打包。

npm run electron:build

2.以為要成功了,結果插件報錯了,只能重新安裝下。先要強制結束下2.13步驟中,IDEA終端中的命令,不然會顯示electron占用。重新安裝下還是不行,直接刪除node_modules文件夾下所有內容,并且刪除了 package-lock.json文件。然后再執行npm install安裝所有插件命令,終于可以打包了。

3.第一次打包需要從github上下載相關依賴,如果速度很慢,可以強制停止了這個程序,然后使用了科學上網的方式,再次打包。以后打包,不刪除win-相關的文件夾,就不用使用科學上網的方式進行打包了。通過不斷嘗試,終于打包成功了,一般出問題就是插件原因,這也是沒辦法,只能不斷下載。

4.將py_1.0.0.exe和latest.yml文件,復制到若依后端映射文件夾根目錄下。

5.執行py_1.0.0.exe文件,根據步驟選擇安裝路徑,進行安裝。

6.成功啟動,登錄后,測試功能正常。

文件預覽功能也能正常使用,其他功能也能正常,其他功能不一一測試了。需要注意點是web新開網頁,在應用中會新打開個窗口。

7.打開package.json文件,修改version為1.0.1,然后重新打包。

8.等待打包成功,將最新打包的exe文件和latest.yml文件,復制到若依后端映射文件夾根目錄下。

9.關閉剛才的應用,然后重新打開。會提醒更新消息,點擊“是”。

10.點擊“立即安裝”按鈕。

11.自動安裝,會顯示安裝進度,由于截圖有點慢,更新完了。

6.總結

electron打包還是比較簡單的,只要復制我上面的配置文件,并且按照我的過程修改原文件就能使用。很多坑我都給踩了,超時或退出登錄白屏問題等問題,但是那個插件安裝容易出錯問題,我真的無能為力,大家只能多嘗試幾次了,要敢于嘗試,代碼一般不會出問題的。

如果本文章對您有幫助的話,并且條件允許的話,可以給我打賞下。不打賞也沒關系,您可以給我點贊支持下,您的支持就是我最大的動力。關注我的小伙伴應該發現了,我寫文章過程會非常具體,希望每個小伙伴都能夠跟著文章完成操作。我會不定時發布一些關于若依框架、java、Vue、uniapp等方面的內容,如果感興趣的話,可以關注我。如果您需要前后端分離版的文件預覽系統、流程管理系統或其他以上四方面涉及的內容,查看我的主頁一定不后悔。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71478.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71478.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71478.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux——Docker容器內MySQL密碼忘記了如何查看

目錄 查看正在運行的MySQL的容器ID 方法一:查看MySQL容器的日志里的密碼 方法二:通過環境變量密碼登錄 方法三:修改密碼 查看正在運行的MySQL的容器ID docker ps 方法一:查看MySQL容器的日志里的密碼 docker logs [MySQL的容器…

康謀分享 | 3DGS:革新自動駕駛仿真場景重建的關鍵技術

隨著自動駕駛技術的迅猛發展,構建高保真、動態的仿真場景成為了行業的迫切需求。傳統的三維重建方法在處理復雜場景時常常面臨效率和精度的挑戰。在此背景下,3D高斯點陣渲染(3DGS)技術應運而生,成為自動駕駛仿真場景重…

大模型架構記錄2

一 應用場景 1.1 prompt 示例 1.2 自己搭建一個UI界面,調用接口 可以選用不同的模型,需要對應的API KEY 二 Agent 使用 2.1 構建GPT

【C++】二叉樹相關算法題

一、根據二叉樹創建字符串 題目描述: 給你二叉樹的根節點 root ,請你采用前序遍歷的方式,將二叉樹轉化為一個由括號和整數組成的字符串,返回構造出的字符串。 空節點使用一對空括號對 “()” 表示,轉化后需要省略所有…

【機械視覺】C#+visionPro聯合編程———【一、C# + VisionPro 聯合編程詳解以及如何將visionPro工具加載到winform】

機械視覺與 C# VisionPro 聯合編程詳解 目錄 機械視覺與 C# VisionPro 聯合編程詳解 概念 應用場景 1. 工業檢測與質量控制缺陷檢測 2. 定位與機器人引導 3. 識別與分類 4. 復雜流程控制 將visionPro工具加載到winform 環境準備 一、創建winform項目 二、打開窗體…

修改hosts文件,修改安全屬性,建立自己的DNS

初級代碼游戲的專欄介紹與文章目錄-CSDN博客 我的github:codetoys,所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。 這些代碼大部分以Linux為目標但部分代碼是純C的,可以在任何平臺上使用。 源碼指引:github源…

對NXP提供的BSP里邊所使用的u-boot的環境變量`bootcmd`的解析

為什么我們要解析環境變量bootcmd? 承接博文 https://blog.csdn.net/wenhao_ir/article/details/145902134 繼續解析u-boot的環境變量bootcmd。 為什么要解析u-boot的這個環境變量bootcmd?因為如果u-boot在倒計時完后,首先執行的是就是下面這條命令&am…

NSSCTF [SWPUCTF 2024 秋季新生賽]金絲雀

5948.[SWPUCTF 2024 秋季新生賽]金絲雀 canary繞過和64位的ret2libc(格式化字符串泄露) (1) motalymotaly-VMware-Virtual-Platform:~/桌面$ file xn xn: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.…

神經網絡中梯度計算求和公式求導問題

以下是公式一推導出公式二的過程。 表達式一 ? E ? w j k ? 2 ( t k ? o k ) ? sigmoid ( ∑ j w j k ? o j ) ? ( 1 ? sigmoid ( ∑ j w j k ? o j ) ) ? ? ? w j k ( ∑ j w j k ? o j ) \frac{\partial E}{\partial w_{jk}} -2(t_k - o_k) \cdot \text{sigm…

koa-session設置Cookie后獲取不到

在谷歌瀏覽器中請求獲取不到cookie問題之一(谷歌安全策略) 場景 前端使用 axios 請求,項目地址:http://192.168.8.1:5173 import axios from axiosconst request axios.create({baseURL: http://127.0.0.1:3001/,timeout: 60000,…

單元測試與仿真程序之間的選擇

為什么寫這篇文章 現在的工作需求,讓我有必要總結和整理一下。 凡事都有適用的場景。首先這里我需要提示一下,這里的信息,可能并不普適。 但是可以肯定一點的是,有些人,不論做事還是寫書,上下文還沒有交待…

如何在Android中實現圖片加載和緩存

在Android中實現圖片加載和緩存是提升應用性能和用戶體驗的關鍵環節。高效的圖片加載和緩存策略能夠減少內存占用、避免應用卡頓,并快速響應用戶的圖片查看需求。以下是在Android中實現圖片加載和緩存的幾種常見方法: 一、使用第三方圖片加載庫 1. Gli…

FusionInsight MRS云原生數據湖

FusionInsight MRS云原生數據湖 1、FusionInsight MRS概述2、FusionInsight MRS解決方案3、FusionInsight MRS優勢4、FusionInsight MRS功能 1、FusionInsight MRS概述 1.1、數據湖概述 數據湖是一個集中式存儲庫,允許以任意規模存儲所有結構化和非結構化數據。可以…

推薦幾款優秀的PDF轉電子畫冊的軟件

當然可以!以下是幾款優秀的PDF轉電子畫冊的軟件推薦,內容簡潔易懂,這些軟件都具有易用性和互動性,適合不同需求的用戶使用。? ? FLBOOK|在線創作平臺 支持PDF直接導入生成仿真翻頁電子書。提供15主題模板與字體庫&a…

【GoTeams】-2:項目基礎搭建(下)

本文目錄 1. 回顧2. Zap日志3. 配置4. 引入gprc梳理gRPC思路優雅關閉gRPC 1. 回顧 上篇文章我們進行了路由搭建,引入了redis,現在來看看對應的效果。 首先先把前端跑起來,然后點擊注冊獲取驗證碼。 再看看控制臺輸出和redis是否已經有記錄&…

深度學習反向傳播

一、白話解釋 梯度其實就是導數,除了用符號求導也可以用近似求導: 然后更新ww-學習率*導數 反向傳播就是鏈式求導 向前計算:對每個節點求偏導 在前向傳播的時候,進行一次前向計算的時候就可以把每一條線的偏導數都知道 前向傳…

JavaWeb-HttpServletRequest請求域接口

文章目錄 HttpServletRequest請求域接口HttpServletRequest請求域接口簡介關于請求域和應用域的區別 請求域接口中的相關方法獲取前端請求參數(getParameter系列方法)存儲請求域名參數(Attribute系列方法)獲取客戶端的相關地址信息獲取項目的根路徑 關于轉發和重定向的細致剖析…

deepseek在pycharm 中的配置和簡單應用

對于最常用的調試python腳本開發環境pycharm,如何接入deepseek是我們窺探ai代碼編寫的第一步,熟悉起來總沒壞處。 1、官網安裝pycharm社區版(免費),如果需要安裝專業版,需要另外找破解碼。 2、安裝Ollama…

AAA協議:從零認識網絡的“身份管家”

AAA(Authentication, Authorization, Accounting,認證、授權和計費)是網絡世界的“身份管理員”,負責確認“你是誰”、決定“你能干啥”、記錄“你干了啥”。如果你用過華三的交換機或路由器,可能在配置用戶管理時見過…

動態規劃01背包問題系列一>最后一塊石頭的重量II

這里寫目錄標題 題目分析:狀態表示:狀態轉移方程:初始化:填表順序:返回值:代碼呈現:優化版本:代碼呈現: 題目分析: 狀態表示: 狀態轉移方程&#…