vue Electron ArcGis 桌面应用 Sqllite3 node-grp:老旧项目的起死回生

最近接收了一个三四年前做的项目。主要技术栈就是vue2+electron+sqllite3+node-gyp。看到这个技术栈,基本可以知道感知这个项目的关键词:vue、Gis地图、本地数据库、桌面客户端。顿时深感亚历山大。

不多说,开干。

第一步,查看项目

 我一般喜欢直接看一个项目用了哪些东西。然后再慢慢去看具体细节。以上就是这个项目的用到的依赖。首先我们需要下载下来,安装依赖看看。

第二步,升级项目

之前项目用的node 10。而且脚手架和很多依赖版本太低。所以需要对项目做个整容手术。

我的node环境是14。版本不算高。因为公司大多项目很老,贸然升级,下力不讨好。

直接install。

果然不出所料,直接报错。

报错卡在了sqllite3、node-gyp的安装上,大概意思就是没有VC++环境。

行吧,既然这样我在电脑上开始安装VC。

地址:Visual Studio 2022 IDE - 适用于软件开发人员的编程工具

需注意:下载的时候,需要勾选C++客户端开发这个包,否则就白瞎了。

安装成功后,当然还是不行。还要安装python(python安装很简单,自行搜索)。

再次install,终于报错了!!!

electron相关的包完全拉不下来(外网禁止访问)。真是心累。

这里配置electron优点繁琐。有需要可以参考我的另外一篇文章。

vuecli4 electron13.3.0 创建客户端应用以及安装、打包时候遇到的问题_win.loadurl('app://./index.html')_屋昂仼的博客-CSDN博客

索性,我把之前的electron的项目拿过来。两者node_moudules已合并,就齐活了。

npm run electron:dev。

终于又报错了!!

因为之前的项目用的electron的配置文件版本低,有些不适合。所以我再src下直接新建一个background.js, 重新将配置写了一份,并且添加了退出、进入全屏,配置IP端口、打开开发者工具等跨界键和出发事件,整体代码如下:

// background.js
// electron 配置文件

import {
    app,
    BrowserWindow,
    Menu,
    MenuItem,
    ipcMain,
    globalShortcut
} from 'electron'
import {
    appMenuTemplate
} from './electron_app/appmenu.js'
import {
    createProtocol
} from 'vue-cli-plugin-electron-builder/lib'

/**
 * Set `__static` path to static files in production
 * https://simulatedgreg.gitbooks.io/electron-vue/content/en/using-static-assets.html
 */
if (process.env.NODE_ENV !== 'development') {
    global.__static = require('path').join(__dirname, '/static').replace(/\\/g, '\\\\')
}
let path = require('path');

let mainWindow
// http://localhost:9080
// const winURL = process.env.NODE_ENV === 'development' ?
//     `http://localhost:9080` :
//     `file://${__dirname}/index.html`

async function createWindow() {
    /**
     * Initial window options
     */
    mainWindow = 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
            // process.env.ELECTRON_NODE_INTEGRATION
            nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
            contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION,
            preload: path.join(__dirname, './preload.js')
        },
    })
    // BrowserWindow.addDevToolsExtension('F:/SC/vue/vue-devtools-5.0.0-beta.3/shells/chrome')
    //mainWindow.loadURL(winURL)
    mainWindow.on('closed', () => {
        mainWindow = null
    })
    // 渲染以及控制 web 页面
    // 屏蔽拖入文件浏览器自动打开事件
    mainWindow.webContents.on('will-navigate', function (event) {
        event.preventDefault()
    })
    /**
     * 菜单
     */
    console.info(appMenuTemplate)
    // 增加主菜单(在开发测试时会有一个默认菜单,但打包后这个菜单是没有的,需要自己增加)
    const menu = Menu.buildFromTemplate(appMenuTemplate)
    // 从模板创建主菜单
    // 在File菜单下添加名为New的子菜单
    menu.items[0].submenu.append(new MenuItem({ // menu.items获取是的主菜单一级菜单的菜单数组,menu.items[0]在这里就是第1个File菜单对象,在其子菜单submenu中添加新的子菜单
        label: 'Open Data',
        click() {
            mainWindow.webContents.send('action', 'openkml') // 点击后向主页渲染进程发送“新建文件”的命令
        },
        accelerator: 'CmdOrCtrl+N' // 快捷键:Ctrl+N
    }))
    menu.items[0].submenu.append(new MenuItem({
        role: 'quit'
    }))
    Menu.setApplicationMenu(menu) // 注意:这个代码要放到菜单添加完成之后,否则会造成新增菜单的快捷键无效
    if (process.env.WEBPACK_DEV_SERVER_URL) {
        // Load the url of the dev server if in development mode
        await mainWindow.loadURL(process.env.WEBPACK_DEV_SERVER_URL)
        if (!process.env.IS_TEST) mainWindow.webContents.openDevTools()
    } else {
        createProtocol('app')
        // Load the index.html when not in development
        // win.loadURL('app://./index.html');
        mainWindow.loadURL(path.join(__dirname, './index.html'));
        //mainWindow.webContents.openDevTools()

    }

    //进入软件即开启全屏
    mainWindow.setFullScreen(true);

    // 最大化
    mainWindow.maximize();


    //配置ESC键退出全屏
    globalShortcut.register('ESC', () => {
        mainWindow.setFullScreen(false);
    })

    // ctrl_alt_S 打开地图服务设置
    globalShortcut.register('Alt+CommandOrControl+S', () => {
        mainWindow.webContents.send("asynchronous-message", "123");
    })

    // ctrl_alt_f 打开全屏设置
    globalShortcut.register('Alt+CommandOrControl+F', () => {
        mainWindow.setFullScreen(true);
    })

    // 主进程缩小窗口
    ipcMain.on('window-min', function () { // 收到渲染进程的窗口最小化操作的通知,并调用窗口最小化函数,执行该操作
        mainWindow.minimize();
    })

    // 手动打开开发者工具
    ipcMain.on('open-dev', function () { // 收到渲染进程的窗口最小化操作的通知,并调用窗口最小化函数,执行该操作
        mainWindow.webContents.openDevTools({
            mode: 'bottom'
        })
    })

    // 清楚缓存刷新
    ipcMain.on('force-refresh', function () { // 收到渲染进程的窗口最小化操作的通知,并调用窗口最小化函数,执行该操作
        mainWindow.webContents.reloadIgnoringCache()
    })

}

app.on('ready', createWindow)
app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') {
        app.quit()
    }
})

app.on('activate', () => {
    if (mainWindow === null) {
        createWindow()
    }
})

// 监听与渲染进程的通信(暂时无用)
ipcMain.on('reqaction', (event, arg) => {
    switch (arg) {
        case 'exit':
            // 做点其它操作:比如记录窗口大小、位置等,下次启动时自动使用这些设置;不过因为这里(主进程)无法访问localStorage,这些数据需要使用其它的方式来保存和加载,这里就不作演示了。这里推荐一个相关的工具类库,可以使用它在主进程中保存加载配置数据:https://github.com/sindresorhus/electron-store
            // ...
            app.quit() // 退出程序
            break
    }
})



/**
 * Auto Updater
 *
 * Uncomment the following code below and install `electron-updater` to
 * support auto updating. Code Signing with a valid certificate is required.
 * https://simulatedgreg.gitbooks.io/electron-vue/content/en/using-electron-builder.html#auto-updating
 */

/*
import { autoUpdater } from 'electron-updater'

autoUpdater.on('update-downloaded', () => {
  autoUpdater.quitAndInstall()
})

app.on('ready', () => {
  if (process.env.NODE_ENV === 'production') autoUpdater.checkForUpdates()
})
 */

如上,齐活。

这还不够,需要在vue.config.js中配置相关的打包机制。代码如下:

// vue.config.js
// 配置electron打包
// 注意 我只写electron打包的部分  其他的和vue开发相同,不在赘述


// ....

// 添加electron - app -icon
    pluginOptions: {
        electronBuilder: {
            builderOptions: {
                productName: 'aaaa', //项目名,也是生成的安装文件名
                //copyright: "Copyright © 2023",//版权信息
                win: {
                    icon: './public/aaa.ico',
                    target: [{
                        target: "nsis", //利用nsis制作安装程序
                        arch: [
                            "x64", //64位
                        ]
                    }]
                },
                nsis: {
                    oneClick: false, // 是否一键安装
                    allowElevation: true, // 允许请求提升。 如果为false,则用户必须使用提升的权限重新启动安装程序。
                    allowToChangeInstallationDirectory: true, // 允许修改安装目录
                    installerIcon: "./public/aaa.ico", // 安装图标
                    uninstallerIcon: "./public/aaa.ico", //卸载图标
                    installerHeaderIcon: "./public/aaa.ico", // 安装时头部图标
                    createDesktopShortcut: true, // 创建桌面图标
                    createStartMenuShortcut: true, // 创建开始菜单图标
                    shortcutName: "aaa", // 图标名称
                },
                directories: {
                    output: "./aaa" //输出文件路径
                },
                // 自动更新目录
                publish: [{
                    provider: "generic",
                    url: "http://192.0.xx.xx:8080/", //隐藏版本服务器地址
                }],
            },
            externals: ['clipboard'],
            nodeIntegration: true
        }
    },

这下终于放心了。

开始启动 npm run electron:dev。

终于成功。一切竟是如此美妙。

第三步,改造项目

里边用到了Arcgis。所以需要使用arcgis的地图服务,包含瓦片、影像、航拍服务等。

这里的地址直接去arcgis里边配置就可以,arcgis是收费软件,所以做的也很傻瓜。

这里需要注意就是我们需要动态配置地图服务。

在backgroundjs中我们加了一个快捷键叫 ctrl+alt+s。 这是用来打开地图IP配置界面的。相应的我们在前端也要写一个配置窗口,界面如下:

界面启动之后,按下CTRL+ALT+S就可以开启。

这个配置界面的代码如下:

// vue 配置窗口文件

<!-- 设置地图服务IP -->
    <el-dialog
    :close-on-click-modal="false"
    title="设置"
    :visible.sync="setVisible"
    append-to-body>
        <el-form>
            <el-form-item label="ArcGis的IP和端口, 比如 http://172.17.11.124:8080 ">
                <el-input
                clearable 
                v-model="ARC_URL" 
                placeholder="请输入ArcGis的IP和端口">
                </el-input>
            </el-form-item>
            <el-form-item label="影像地址">
                <el-input
                clearable 
                v-model="YX_URL" 
                placeholder="请输入影像地址">
                </el-input>
            </el-form-item>
            <el-form-item label="航拍地址">
                <el-input
                clearable 
                v-model="HP_URL" 
                placeholder="请输入航拍地址">
                </el-input>
            </el-form-item>
        </el-form>
        <!-- 确定按钮 -->
        <span slot="footer" class="dialog-footer">
            <el-button
            type="success"
            @click="openDevTools"
            >打开开发者工具</el-button>
            <el-button
            type="primary"
            @click="handleClick"
            >保存设置</el-button>
            <el-button @click="handleConcel">取消</el-button>
        </span>
    </el-dialog>

 对应的方法和数据自行去写,不再赘述。

这里再写一下vue内部和electron之间的通信,比如打开开发者工具和保存设置刷新界面都需要通知electron采取相应的动作:

// vue 中打开开发者工具 和 刷新界面 
// 通过 ipcrender 通知electron

 // 打开开发者工具
    openDevTools () {
        ipcRenderer.send('open-dev');
        this.setVisible = false;
    },

// 刷新界面 
reloadPage () {
    ipcRenderer.send('force-refresh');
}




// background js
// electron 中接收这个信号
// 手动打开开发者工具
    ipcMain.on('open-dev', function () { // 收到渲染进程的窗口最小化操作的通知,并调用窗口最小化函数,执行该操作
        mainWindow.webContents.openDevTools({
            mode: 'bottom'
        })
    })

    // 清楚缓存刷新
    ipcMain.on('force-refresh', function () { // 收到渲染进程的窗口最小化操作的通知,并调用窗口最小化函数,执行该操作
        mainWindow.webContents.reloadIgnoringCache()
    })

 一发一收,很方便。

最后,有问题有报错不要怕,一步一步去解决就好。在此,强烈推荐bing搜索,真心好用(google用不了,退而求其次)。

就这样,结束。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

商家必备!餐饮外卖回评话术

我认识过很多做餐饮外卖的商家&#xff0c;他们总是有相同苦恼的问题&#xff0c;尤其是回复食客们的评价&#xff0c;尤其是差评。小编在这里就为各位商家提供了一些餐饮外卖回评的话术&#xff0c;希望能给有需要的小伙伴们提供帮助哦~ 一、好评回复模板 1.叮~您的好评我们已…

什么是大数据,常见的大数据应用领域?

现在大数据发展的如火如荼&#xff0c;也有不少小伙伴对于什么是大数据比较感兴趣&#xff0c;那么大数据在比较官方的定义是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力…

Linux -- 用户和组

目录 一、root用户&#xff08;超级管理员&#xff09; 1.1 切换用户命令&#xff1a;su 和 exit 命令 1.2 sudo命令 二、用户、用户组 2.1 用户组管理 2.1.1 创建用户组 2.1.2 删除用户组 2.2 用户管理 2.2.1 创建用户 2.2.2 删除用户 2.2.3 查看用户所属组 2.2.…

ReentrantLock实现原理-条件锁

在前两篇文章中&#xff0c;我们了解了ReentrantLock内部公平锁和非公平锁的实现原理&#xff0c;可以知道其底层基于AQS&#xff0c;使用双向链表实现&#xff0c;同时在线程间通信方式(2)中我们了解到ReentrantLock也是支持条件锁的&#xff0c;接下来我们来看下&#xff0c;…

安卓期末考试知识总结(2)

文章目录 第四章&#xff1a;程序活动单元Activity四大组件Activity生命周期Activity的启动模式standardsingleTopsingleInstancesingleTask IntentIntentFilterActivity之间的数据传递putExtra()方法传递数据Bundle类传递数据Activity之间的数据回传 练习总结 第四章&#xff…

如何管理与改进低质供应商?帮助供应商提升自身质量能力?

管理和改进低质量的供应商可能是一项具有挑战性的任务&#xff0c;但与他们合作以提高他们的能力是可能的。可以采取一些步骤来管理和帮助提高供应商的质量&#xff1a; 确定根本原因&#xff1a;了解供应商产品或服务质量低下的原因。对他们的流程、资源和能力进行全面评估&am…

EFDC建模方法及在地表水环境评价、水源地划分、排污口论证应用

目录 专题一、软件安装 专题二、EFDC模型讲解 专题三、一维河流模拟实操 专题四、建模前处理 专题五、EFDC网格剖分介绍 专题六、EFDC二维湖库水动力模拟/非保守染色剂模拟 专题七、EFDC水质模型参数及原理介绍 专题八、EFDC一、二、三维湖库水质模拟 专题九、基于EFD…

window下安装docker并运行angular项目

window下安装docker并运行angular项目 1、使用场景 本地有一个node项目&#xff0c;node 版本是 v16.13.2&#xff0c;在本地安装的angular 是 15.2.4 但是测试服上面的node 版本是 14.19.3&#xff0c;angular 是1.0.0-beta.28.3 &#xff0c;会导致angular项目的 ng build …

Submit的使用,程序中调用其他报表

Submit的使用 项目需求&#xff1a;编写一个程序能够将实时的物料库存数据通过发送邮件的形式发送到对应的邮件。现有标准的事务码MB5B来查看对应的库存数据。可以在程序中使用submit将参数传递到MB5B中&#xff0c;然后将获取的数据返回到程序中&#xff0c;然后在执行发送邮件…

线程的生命周期

我是一个线程 第一回 初生牛犊 我是一个线程&#xff0c;我一出生就被编了个号: 0x3704&#xff0c;然后被领到一个昏暗的屋子里&#xff0c;在这里我发现了很多和我一模一样的同伴。 我身边…

计算机视觉 | 语义分割与Segmentation

前 言 「MMSegmentation」 是一个基于 PyTorch 的语义分割开源工具箱。它是 OpenMMLab 项目的一部分。 MMSegmentation v1.x 在 0.x 版本的基础上有了显著的提升&#xff0c;提供了更加灵活和功能丰富的体验。 主要特性 统一的基准平台 我们将各种各样的语义分割算法集成到了…

文件系统原理

文件及硬盘管理是计算机操作系统的重要组成部分&#xff0c;让微软走上成功之路的正是微软最早推出的个人电脑PC操作系统&#xff0c;这个操作系统就叫DOS&#xff0c;即Disk Operating System&#xff0c;硬盘操作系统。我们每天使用电脑都离不开硬盘&#xff0c;硬盘既有大小…

谷歌的passkey是什么?

谷歌的passkey是什么&#xff1f; 谷歌正在研发一种名为“Passkey”的新技术&#xff0c;它将用于用户身份验证。Passkey不同于传统的密码&#xff0c;它采用了硬件加密密钥&#xff08;如安全密钥或生物识别方式&#xff09;以及双因素身份验证等技术&#xff0c;可以更好地保…

OpenCV项目开发实战--对图像种的对象进行无缝克隆-附Python、C++的代码实现

文末附基于Python和C++两种方式实现的测试代码下载链接 图 1:无缝克隆示例:一架飞机被克隆到傍晚天空的图片中。 OpenCV 3 中引入的令人兴奋的新功能之一称为无缝克隆。有了这个新功能,您可以从一个图像中复制一个对象,然后将其粘贴到另一个图像中,从而使构图看起来无缝…

做完瑞吉外卖项目的一点笔记和源码

源码在 https://gitee.com/pluto8/take-out 一、软件开发整体介绍 1、软件开发流程 需求分析 &#xff1a;产品原型&#xff0c;需求规格说明书&#xff08;文档形式&#xff09;设计&#xff1a;产品文档、UI界面设计、概要设计、详细设计、数据库设计编码&#xff1a;项目…

怎么在eclipse中创建python项目

目录 方法一&#xff1a;借助Eclipse Marketplace安装PyDev插件 方法二&#xff1a;到官网下载手动安装插件 参考文件 方法一&#xff1a;借助Eclipse Marketplace安装PyDev插件 这可以通过Eclipse Marketplace完成。打开Eclipse&#xff0c;然后选择“Help” > “Eclips…

强光LED手电筒方案开发设计

在户外活动中&#xff0c;不管是徒步还是露营&#xff0c;经常需要使用多功能强光手电筒。宇凡微推出的多功能战术强光LED手电筒方案&#xff0c;具有十多年LED灯项目研发经验&#xff0c;方案成熟&#xff0c;支持定制开发。 一、战术强光LED手电筒方案功能介绍 户外使用的LED…

OceanBase 安全审计之身份鉴别

本文主要以 MySQL 和 OceanBase 对比的方式&#xff0c;来介绍 OceanBase&#xff08;MySQL 模式&#xff09;安全体系中关于身份鉴别的相关内容&#xff0c;包括身份鉴别机制、用户名组成、密码复杂度、密码过期策略等。 作者&#xff1a;金长龙 爱可生测试工程师&#xff0c;…

Linux环境变量配合权限维持手法

前言&#xff1a; 权限维持的时候有其中有两种&#xff0c;一种是alias别名、第二种是prompt_command&#xff0c;这里我们可以将其添加到环境变量中&#xff0c;每次运行的时候都可以使用&#xff0c;从而达到权限控制的效果&#xff0c;而不是临时执行的效果。 环境变量&am…

(一)初识 Kafka

文章目录 1.发布与订阅消息系统&#xff08;1&#xff09;什么是发布与订阅消息系统&#xff08;2&#xff09;为什么 Kafka 是数据驱动型应用程序的关键组件 2. Kafka 介绍&#xff08;1&#xff09;消息和批次&#xff08;2&#xff09;消息模式&#xff08;3&#xff09;主题…