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

news2024/11/27 19:37:12

最近接收了一个三四年前做的项目。主要技术栈就是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用不了,退而求其次)。

就这样,结束。

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

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

相关文章

Qemu搭建ARM Vexpress开发环境

Qemu搭建ARM Vexpress开发环境 文章目录 Qemu搭建ARM Vexpress开发环境Qemu简介QEMU安装前的准备工作QEMU 安装的两种方式通过网络在线安装源码编译安装源码获取QEMU依赖库安装编译安装 命令选项qemu的标准选项qemu显示选项网络属性相关选项kvm的网络模型 Ubuntu 双网卡&#x…

阿里高级工程师纯手打造的Spring Cloud Alibaba微服务全彩手册,限时分享

Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案&#xff0c;是阿里巴巴开源中间件与 Spring Cloud 体系的融合。 Springcloud 和 Srpingcloud Alibaba 区别&#xff1f; SpringCloud&#xff1a; 部分组件停止维护和更新&#xff0c;给开发带来不便;SpringC…

msvcr120.dll丢失怎样修复,快速修复msvcr120.dll的方法分享

msvcr120.dll是Microsoft Visual C Redistributable for Visual Studio 2013的一个组件&#xff0c;是一个动态链接库文件。它包含了许多函数和程序&#xff0c;可以被其他程序调用&#xff0c;这些程序使用了Visual C 2013运行时库。在Windows操作系统中&#xff0c;许多软件和…

vxe-table 列表过滤踩坑

vxet-table 官网给的案例&#xff1a;https://vxetable.cn/#/table/base/filter 通过设置 filters 属性和 filter-method 方法可以开启列筛选功能&#xff0c;通过 filter-multiplefalse 设置为单选 如果是服务端筛选&#xff0c;只需加上 filter-config{remote: true} 和 fi…

vue页面缓存失效问题解决

文章目录 一、问题背景二、问题排查三、问题解决 一、问题背景 前端技术栈用的是vue&#xff0c;然后用keep-alive组件进行缓存页面【切换页面不进行刷新页面&#xff0c;保留之前的查询条件及状态等等】 测试提bug&#xff1a;部分页面突然缓存失效了&#xff0c;每次切换都…

易基因:全基因组DNA甲基化和小RNA分析揭示甘蓝型油菜种子的基因组不对称性 | 植物发育

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 多倍体是被子植物基因组进化中的一种持续现象&#xff0c;有助于现存开花植物的多样性。甘蓝型油菜&#xff08;Brassica napus&#xff09;是世界上最重要的被子植物油料作物品种之一&a…

2023年系统分析师上午题

全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试 2023年上半年 系统分析师 上午试卷 &#xff08;考试时间 9 : 00&#xff5e;11 : 30 共 150 分钟&#xff09; 1. 在答题卡的指定位置上正确写入你的姓名和准考证号&#xff0c;并用正规 2B 铅笔在你写入…

重命名文件名也可以很优雅,看看这些技巧

文件重命名对于许多工作场景来说是非常重要的。比如&#xff0c;当你需要整理大量文件时&#xff0c;一个好的文件命名系统可以帮助你更轻松地管理和查找文件。但是&#xff0c;当需要重命名大量文件时&#xff0c;逐个重命名显然是非常耗时和繁琐的。这时&#xff0c;批量重命…

mysql-8.0.32 数据库的安装 (Linux)

Linux 中 mysql-8.0.32 数据库的安装 缘步骤常见问题解决方案问题一. mysql: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory解决方案&#xff1a;方案一&#xff08;推荐&#xff09;&#xff1a;方案二&a…

【6 微信小程序学习 - 小程序的组件化开发,通信】

1 小程序组件化开发 2 创建一个组件 1 创建 1,在根目录创建components文件夹,自定义组件都放在此处 2,右键新建component,输入名称后悔创建四个文件 3.其中.json中的"component": true,表示这是一个组件 4,编写代码,和其他代码逻辑相同 2 使用 1,要使用组件的父组…

1:操作系统导论

1.1操作系统的定义 •Anoperatingsystemactsanintermediarybetweenuserofacomputerandthecomputer hardware. ◦ 操作系统充当计算机⽤⼾和计算机硬件之间的中介 •Thepurposeofanoperatingsystemistoprovideanenvironmentinwhichausercanexecute programsinaconvenientandeff…

小红书平台,“松弛感”生活十大趋势报告出炉

放眼时尚、教育、情感、职场等各大领域&#xff0c;继氛围感、仪式感、精致感后&#xff0c;今年都在谈论一个词——松弛感。包括现下轻户外、轻运动、轻解压等风口&#xff0c;也都呼应着年轻人对松弛感的追求。 千瓜数据显示&#xff0c;2023年1月-5月&#xff0c;“松弛感”…

Vue全局事件总线简明笔记

1、作用&#xff1a; 全局事件总线是一种组件间通信的方式&#xff0c;并不是插件&#xff0c;适用于任意组件间通信、实现组件间的通信。 让所有的组件都能访问得到全局事件总线&#xff0c;那么创建的思路就是&#xff0c;全局事件总线一定要让VC或者VM访问得到。 结合组件的…

leetcode24. 两两交换链表中的节点(java)

两两交换链表中的节点 leetcode24. 两两交换链表中的节点題目描述 迭代法.解题思路代码演示 递归法解题思路代码演示 二叉树专题 leetcode24. 两两交换链表中的节点 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/swap-…

全志V3S嵌入式驱动开发(看门狗驱动)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 大家如果做过工业级别的嵌入式设备&#xff0c;那么对看门狗应该不陌生。很多工业级的设备&#xff0c;其应用环境很多时候是非常糟糕的&#xff0…

抖音seo矩阵系统源码开发及部署配置文档分享

一、开发要求及实现流程 &#xff1a;Scope: video.create 需要申请权限 需要用户授权 该接口用于上传视频文件到文件服务器&#xff0c;获取视频文件video_id&#xff08;该 ID 为加密后的 ID&#xff09;。该接口适用于抖音。 注意&#xff1a; 抖音的OAuth API以https://…

阿里云弹性公网ip(EIP)是什么?eip详细介绍

阿里云eip是什么&#xff1f;阿里云百科分享弹性公网IP详细介绍&#xff0c;阿里云弹性公网EIP是什么意思&#xff1f;EIP是可以独立持有的公网IP地址&#xff0c;EIP可以和阿里云专有网络VPC类型的云服务器ECS、NAT网关、ENI网卡、私网负载均衡SLB等绑定&#xff0c;通过EIP可…

chatgpt赋能python:Python是什么

Python是什么 Python是一门高级编程语言&#xff0c;由Guido van Rossum于1991年发明并开发。它具有简单易学、可读性强、跨平台等特点&#xff0c;在Web开发、数据分析、机器学习等领域广泛应用。 Python的文档 Python的文档非常全面&#xff0c;包括官方文档、第三方文档、…

SimSwap复现指引及代码分析【2023有更新】

SimSwap复现指引及代码分析【2023有更新】 0、前言1、复现指引环境配置指引Inference for image or video face swappingInference参数解析Inference用法示例图像视频 2、结果分析3、代码分析 0、前言 论文讲解在&#xff1a;https://blog.csdn.net/qq_45934285/article/detail…

33、js - 事件循环 微任务 宏任务

1、事件循环♻️&#xff08;EventLoop&#xff09; js是单线程语言&#xff0c;也就是某一刻只能执行一行代码&#xff0c;为了让耗时代码不阻塞其他代码运行&#xff0c;设计了事件循环模型。 事件循环是一个并发模型&#xff0c;负责执行代码、收集异步任务的模型&#xff0…