新星计划 Electron+vue2 桌面应用 2 项目编写

news2025/5/25 0:24:11

练手的项目,需求简单,打算做平面设计社交类的软件。

一、需求

练手用,简单处理,写个简单的记事本,本地保存txt,能导出为其他格式的文件。

获取用户的网卡地址用于数据加密,本地保存加密后的文件,导出为明文数据。

可以选择系统样式、自定义日志路径,可见软件信息(版本等)。

二、涉及vue插件

vue 使用版本2;vue-router 使用 3;vuex 使用 3.6.2。

npm install vue-router@4
npm install vuex@3.6.2

npm view 名字 versions --json //查看版本
npm view 名字 version --json //查看最新版本

npm install vue2-editor //富文本框
npm install vant@latest-v2//vant

三、涉及api使用

果然呀,不出bug都没啥可写的。前端基础不好,有bug要调好久……

1、工具栏菜单

这个按照官网写就好,网址:Menu | Electron

不会报啥错,但是项目结果可以改下。

项目结构:

-dist  //编译后的vue文件
-electron //electron相关文件
    menu.js //菜单设置 electron的main.js 引入
-src  //vue文件
    -static //存放静态文件
        electron_common.js //vue中关于electron的js 
        //这文件中不要引入electron 有可能报错 反正我是不会改……
        main.js //vue入口文件
preload.js //主线程和渲染线程桥接文件
mian.js //electron入口文件 

//electron main.js
const { app,BrowserWindow,ipcMain,Menu, ipcRenderer } = require('electron');


const path = require('path');
const url = require('url');

//引入主进程操作js
require('./electron/menu')//工具栏菜单


let mainWindow;
function createWindow() {
    ……
}
//menu.js 菜单模板官网上有
const { Menu } = require('electron');
//设置菜单
const template =[
    ……
];
const menu = Menu.buildFromTemplate(template);
Menu.setApplicationMenu(menu);

2、右键菜单

这菜单调了好久……但道理其实挺简单。

先说官网:Menu | Electron

 按照官网这个教程,联系它的前后文,renderer是被index.html调用,在vue2项目中应该是引入到app中的,在public/index.html中引入不知是否可行,没试过。

在我这个例子中相当于./src/static/electron_common.js,在vue的main.js中应该是./static/electron_common.js,/src/main.js中"./"指的是"/src/"。

使用ipcRenderer需要引入electron,vue编译的时候回报“fs”找不到,查了下原因,大概是node的问题,需要再做配置。试了几个,都是各种报错。我一个主要写后端的……前端基础不好真心头大。

然后根据electron最基础的教程中俩线程的交互,设置main.js监听,终于正常使用,代码如下。

//./src/static/electron_common.js
export const rightclick = async () => {
    window.addEventListener('contextmenu', (e) => {
        e.preventDefault()
        window.electronAPI.rightclick()
    })
}
//./src/main.js
import Vue from 'vue'
import App from './App.vue'
import VueEditor from 'vue2-editor';
import { rightclick } from "./static/electron_common" //加载

rightclick()//运行

Vue.config.productionTip = false
Vue.use(VueEditor);

new Vue({
  render: h => h(App),
}).$mount('#app')


//./preload.js
const { contextBridge, ipcRenderer } = require('electron')

contextBridge.exposeInMainWorld('electronAPI', {
    //test: () => ipcRenderer.invoke('test'),
    rightclick: () => ipcRenderer.invoke('right_click')
})

//./main.js
const { app,BrowserWindow,ipcMain,Menu, ipcRenderer } = require('electron');


const path = require('path');
const url = require('url');

//引入主进程操作js
require('./electron/menu')//工具栏菜单


let mainWindow;
function createWindow() {
    // 创建一个窗口,大小 800 * 600
    mainWindow = new BrowserWindow({
        width: 800, 
        height: 600,
        webPreferences:{
            nodeIntergration:true,
            preload:path.join(app.getAppPath(),"preload.js")
        }
    });
    //ipcMain.handle('test', () => "qweqwe")
    mainWindow.loadFile('index.html')

    mainWindow.loadURL(url.format({
        pathname: path.join(app.getAppPath(),'dist/index.html'),
        protocol: 'file:',//协议
        slashes: true//slashes属性为布尔值,如果协议protocol冒号后根的是两个斜杠(/),那么值为true
    }));
 
    // 自动打开调试台
    mainWindow.webContents.openDevTools({detach: true });   
    mainWindow.on("closed",function(){
        mainWindow = null;
    })
}
//监听
ipcMain.handle('right_click', (event) => {
    const template = [
        {
            label:"复制",
            click:()=>{

            }
        },
        {
            label:"粘贴",
            click:()=>{
                    
            }
        }
    ]
    const menu = Menu.buildFromTemplate(template)
    menu.popup(BrowserWindow.fromWebContents(event.sender))
})
//启动应用加载
app.on('ready', createWindow);    
app.on('window-all-closed', function () {
    if (process.platform !== 'darwin') {
        app.quit();
    }
})
app.on('activate', function () {
        if (mainWindow === null) createWindow();
});

然后每次改完 都要先编译(npm run build)在运行(npm run start),有点麻烦

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

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

相关文章

想变身“科技型”企业?掌汇云数字化服务平台为工业升级加分

40万亿元!占GDP比重达到33.2%,这就是国新办公布的2022年数据,中国工业可以说是当之无愧的支柱产业。 中国工业规模大、覆盖面广,企业员工众多,项目遍及海内外。但由于科技欠发达、信息不流通等因素,近些年…

IDEA中 lombok不生效解决方法

目录 前言: springboot启动的时候报错, 说没有lombok编译器 第一步: 检查插件lombok是否存在 第二步: 查看springboot 官方推荐的lombok版本 -> 2.1 第一步 找到这个parent ctrl点进去 -> 2.2 在点红框位置 进去 -> 2.3 ctrlf 搜索一下 lombok.version 复制这个…

[论文评析]mixup: B EYOND E MPIRICAL R ISK M INIMIZATION, ICLR 2018,

mixup: B EYOND E MPIRICAL R ISK M INIMIZATION 介绍MixupMixup的提出动机Mixup与常规数据增广方法的区别References 介绍 采用ERM训练的模型往往存在泛化能力差的情形-可能是在简单的记忆样本, 对于噪声干扰的鲁棒性很差. 这篇论文提出了一种新的数据增广方法-Mixup, 这里主…

【ChatGPT】不会用ChatGPT?这几个镜像网站解决你的烦恼。

个人主页:【😊个人主页】 文章目录 前言ChatGPT介绍WoChatA TalkChatGPT Next WebAI EDUCHATGPTSITES 前言 还在为需要魔法才能与ChatGPT见上一面而叹息吗,今我就为大家汇总了国内能使用ChatGPT的方法。 也就是用国内的镜像网站玩ChatGPT&…

javaWeb 酒店民宿预定信息管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh酒店民宿预定信息管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为T…

2023阿里云学生服务器权益,含Clouder认证:云服务器ECS答案

文章目录 阿里云学生权益(服务器使用7个月)1、高校计划续费任务 - 飞天加速计划3.0(2个任务)2、任务1:完成实验《ECS云服务器新手上路》2.2: 续费6个月 3、任务2:Apsara Clouder云计算专项技能认…

【多线程】线程的可见性

目录 一、什么是线程的可见性二、可见性问题示例2.1 代码2.2 截图 三、解决可见性问题3.1 volatile关键字3.2 synchronized关键字 四、用volatile关键字解决可见性问题示例4.1 代码4.2 截图 五、用synchronized关键字解决可见性问题示例5.1 代码5.2 截图 六、可见性与原子性 一…

( 数组) 59. 螺旋矩阵 II ——【Leetcode每日一题】

❓59. 螺旋矩阵 II 难度:中等 给你一个正整数 n ,生成一个包含 1 到 n 2 n^2 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入:n 3 输出:[[1,2,3],[8,9,4],[7,6,5…

如何动态显示物品提示?

UE5 插件开发指南 前言0 提示信息窗口类前言 为了使物品的排列简洁,各种游戏里的物品信息都是以提示的形式展示出来,而不是整个铺排陈列,只需要玩家鼠标悬停在物品上就自动显示出提示窗口,如下图所示: 这些提示信息在物品定义数据资产中已经定义了,所以这里要做的只是将…

大数据赋能商业地产研策

商业地产是城市经济的重要支柱,也是城市形象的重要名片。在消费者需求日益多元和个性化的背景下,商业地产面临着激烈的市场竞争和运营效率的挑战。如何在复杂多变的市场环境中,做出科学合理的投资决策和运营策略,是商业地产企业的…

Emacs之高效切换窗口(九十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

软件测试:功能测试----测试范围和测试策略

一、前言 什么是软件测试?测试能够给我们带来什么?对于企业有什么好处? 软件测试,说的直白就是找bug,而针对的就是我们使用的一些app,网页,系统等等。与之而来的还有硬件测试,这里…

【自动化测试】Java+Selenium自动化测试环境搭建

本主要介绍以Java为基础,搭建Selenium自动化测试环境,并且实现代码编写的过程。 1.Selenium介绍 Selenium 1.0 包含 core、IDE、RC、grid 四部分,selenium 2.0 则是在两位大牛偶遇相互沟通决定把面向对象结构化(OOPP&#xff09…

微软 Build 2023:人工智能重新定义软件开发与工作的未来

2023年5月23日,美国华盛顿州西雅图 —— 微软年度开发者大会Build 2023在西雅图开幕,面对当今由AI引领的技术趋势,微软向超过20万名注册参会的开发者集中展示人工智能如何给软件开发的对象、过程和工具带来巨大变革,并重新定义工作…

MVC框架实现用户登录注册功能(连接数据库)

目录 一、简单理解MVC框架 二、项目结构 三、项目源码 3.1 User 3.2 UserDao 3.3 RegisterDao 3.4 servletControll 3.5 servletControllRegister 3.6 web.xml 3.7 login.jsp 3.8 register.jsp 3.9 success.jsp 3.10 failure.jsp 四、实现效果 总结 前言 本篇文…

vue 3 第二十六章:样式(scoped及样式穿透)

文章目录 1. 介绍2. 基本使用3. scoped原理4. 穿透选择器修改全局样式 1. 介绍 在 Vue 中&#xff0c;我们可以使用 scoped 特性来给组件的样式添加作用域。通过为组件的 <style> 标签添加 scoped 特性&#xff0c;我们可以确保组件的样式仅应用于该组件的模板中&#x…

第56章:socket介绍

socket允许位于同一主机&#xff08;计算机&#xff09;或使用网络连接起来的不同主机上的应用程序之间交换数据 概述 在一个典型的客户端/服务器场景中&#xff0c;应用程序使用socket 进行通信的方式如下&#xff1a; 各个应用程序创建一个socket。socket 是一个允许通信的…

项目压测相关

几个重要指标的关系 QPS 并发数/平均响应时间 并发数 QPS*平均响应时间 也就是说&#xff0c;并发连接数代表服务器抗压能力&#xff0c;接收连接的能力。qps代表在相同的并发数下&#xff0c;服务器处理的速度&#xff0c;响应时间越短&#xff0c;那么qps就越大。 不是说并发…

Unity Lightmapping Setting

如下图&#xff1a; Lightmapper: 使用什么硬件或算法渲染 Progressive CPU、Progressive GPU、Enlighten(新的算放目前用的比较少) 此数值会被用于分别乘以Direct Samples&#xff0c;Indirect Samples和Environment Samples这三个数值。这三个数值会被应用于…

【Netty】Netty 如何实现零拷贝(八)

文章目录 前言一、Java 实现零拷贝1.1 Java提供 mmap/write 方式1.2 Java 提供 sendfile 方式 二、Netty 实现零拷贝2.1 CompositeByteBuf 方式2.1 wrap 方式2.3 slice 方式2.4 FileRegion 方式 总结 前言 回顾Netty系列文章&#xff1a; Netty 概述&#xff08;一&#xff0…