electron.vite 项目创建以及better-sqlite3数据库使用
1.安装electron.vite
npm create @quick-start/electron@latest
中文官网:https://cn.electron-vite.org/
2. 安装项目依赖
npm i
3.修改 electron-builder 配置文件
appId: com.electron.app
productName: text33
directories:buildResources: build
files:- '!**/.vscode/*'- '!src/*'- '!electron.vite.config.{js,ts,mjs,cjs}'- '!{.eslintignore,.eslintrc.cjs,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}'- '!{.env,.env.*,.npmrc,pnpm-lock.yaml}'- '!{tsconfig.json,tsconfig.node.json,tsconfig.web.json}'
asarUnpack:- resources/**
win:icon: build/icon.ico# 配置文件示例,包含输入验证和异常处理逻辑target:- target: "nsis" # 目标名称,必须为字符串arch: ["x64"] # 架构列表,必须为非空列表executableName: text33
nsis:artifactName: ${name}-${version}-setup.${ext}shortcutName: ${productName}uninstallDisplayName: ${productName}createDesktopShortcut: alwaysoneClick: false # 设置为 false 以提供安装类型选择界面,允许用户选择是否创建桌面图标,允许用户选择安装路径perMachine: true # 设置为 true 将使安装程序默认为所有用户安装应用,这需要管理员权限allowToChangeInstallationDirectory: true # 如果设置为 true,安装程序将允许用户更改安装目录allowElevation: true # 一般情况下,此字段不会被直接使用,权限提升主要依赖于 perMachine 的设定。当perMachine为true,安装程序会请求管理员权限deleteAppDataOnUninstall: true # 如果设置为 true,卸载程序将删除AppData中的所有程序数据createStartMenuShortcut: true # 如果设置为 true,安装程序将在开始菜单中创建程序快捷方式
mac:entitlementsInherit: build/entitlements.mac.plistextendInfo:- NSCameraUsageDescription: Application requests access to the device's camera.- NSMicrophoneUsageDescription: Application requests access to the device's microphone.- NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder.- NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder.notarize: false
dmg:artifactName: ${name}-${version}.${ext}
linux:target:- AppImage- snap- debmaintainer: electronjs.orgcategory: Utility
appImage:artifactName: ${name}-${version}.${ext}
npmRebuild: false
publish:provider: genericurl: https://example.com/auto-updates
electronDownload:mirror: https://npmmirror.com/mirrors/electron/
4.修改启动文件package.json
"scripts": {"format": "prettier --write .","lint": "eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts,.vue --fix","typecheck:node": "tsc --noEmit -p tsconfig.node.json --composite false","typecheck:web": "vue-tsc --noEmit -p tsconfig.web.json --composite false","typecheck": "npm run typecheck:node && npm run typecheck:web","start": "electron-vite preview","dev": "electron-vite dev","postinstall": "electron-builder install-app-deps", "build": "npm run typecheck && electron-vite build","build:unpack": "npm run build && electron-builder --dir","build:win": "npm run build && electron-builder --win","build:mac": "npm run build && electron-builder --mac","build:linux": "npm run build && electron-builder --linux"},
5.安装better-sqlite3数据库
npm i better-sqlite3 -S
数据库可视化 SQLiteStudio 下载地址 https://github.com/pawelsalawa/sqlitestudio/releases
better-sqlite3 https://www.npmjs.com/package/better-sqlite3
{"scripts": {"postinstall": "npx electron-rebuild -f", "postinstall_backup": "electron-builder install-app-deps", "rebuild-sqlite": "electron-rebuild -f -w better-sqlite3"// ...},"dependencies": {"@electron-toolkit/preload": "^3.0.1","@electron-toolkit/utils": "^3.0.0","better-sqlite3": "^11.8.1"}// ....
}
6.修改 electron-builder 配置文件
files:- '!**/.vscode/*'- '!src/*'- '!electron.vite.config.{js,ts,mjs,cjs}'- '!{.eslintignore,.eslintrc.cjs,.prettierignore,.prettierrc.yaml,dev-app-update.yml,CHANGELOG.md,README.md}'- '!{.env,.env.*,.npmrc,pnpm-lock.yaml}'- '!{tsconfig.json,tsconfig.node.json,tsconfig.web.json}'- '!**/better-sqlite3/{deps/**/*,src/**/*}'
7.better-sqlite3使用
新建src/main/database/index.js文件
import Database from "better-sqlite3"; // 用于操作 SQLite 数据库的库
import { app, ipcMain } from "electron"; // 用于 Electron 应用的全局功能
import path from "path"; // 用于处理和操作文件路径的模块
import fs from "fs";
let db; // 声明一个变量用来存储数据库实例// 数据库版本
const DB_VERSION = 1; // 当前数据库版本
// 初始化数据库的函数
export function initDatabase() {// 判断当前环境是否是开发环境let databasePath = path.join(app.getPath("userData"), "database");console.log(databasePath);// 确保数据库文件夹存在,如果不存在则创建它if (!fs.existsSync(databasePath)) {fs.mkdirSync(databasePath, { recursive: true });}// 初始化数据库并创建或打开指定路径的 SQLite 数据库文件db = new Database(path.join(databasePath, "uploadfile.db"), {verbose: console.log,});// 设置数据库的日志模式为 WAL(写时日志)模式,提高性能db.pragma("journal_mode = WAL");// 创建版本表createVersionTable();// 获取当前数据库版本const currentVersion = getCurrentDatabaseVersion();// 如果数据库版本不匹配,执行数据库更新if (currentVersion !== DB_VERSION) {updateDatabase(currentVersion);}// 创建表,如果表不存在则创建createTable();// 在 Electron 的主进程中注册一个 IPC 事件处理器ipcMain.handle("db_query", async (_, query, params=[]) => {const stmt = db.prepare(query); // 准备 SQL 查询return stmt.all(...params); // 执行查询并返回结果});// 在应用退出时关闭数据库连接app.on("quit", () => {db.close(); // 关闭数据库连接});
}// 创建版本表
function createVersionTable() {const createVersionTableQuery = `CREATE TABLE IF NOT EXISTS version (id INTEGER PRIMARY KEY AUTOINCREMENT,version INTEGER NOT NULL);`;db.prepare(createVersionTableQuery).run();// 检查是否有版本记录,若没有,则插入默认版本 1const currentVersion = getCurrentDatabaseVersion();if (!currentVersion) {const insertVersionQuery = `INSERT INTO version (version) VALUES (?);`;const stmt = db.prepare(insertVersionQuery);stmt.run(1); // 默认插入版本 1}
}// 更新数据库
function updateDatabase(currentVersion) {console.log(`Updating database from version ${currentVersion} to ${DB_VERSION}`);if (currentVersion === 1) {// 执行 1 -> 2 的更新操作updateToVersion2();}// 更新数据库版本记录const updateVersionQuery = `INSERT INTO version (version) VALUES (?);`;const stmt = db.prepare(updateVersionQuery);stmt.run(DB_VERSION);console.log(`Database updated to version ${DB_VERSION}`);
}// 创建任务列表表
function createTable() {const createTableQuery = `CREATE TABLE IF NOT EXISTS todo_list (user_id_role TEXT,todo_id TEXT UNIQUE,task_title TEXT,task_description TEXT,priority INTEGER,due_date TEXT,status TEXT,created_at INTEGER,updated_at INTEGER,id INTEGER PRIMARY KEY AUTOINCREMENT);`;// 执行创建表的 SQL 语句db.prepare(createTableQuery).run();
}
@src/main/index.ts文件修改
import { initDatabase } from "./database/index";
// 在启动项目里面使用
app.whenReady().then(() => { // 初始化数据库ipcMain.on("initDatabase", () => {// 初始化数据库initDatabase();});
}
页面可以直接调用
// 初始化数据库const initDatabase = () => {window.electron.ipcRenderer.send('initDatabase');}
// 获取数据库中的所有待办事项
const getTodoList = () => {// 获取数据库数据window.ipcRenderer.invoke("db_query", "SELECT * FROM todo_list;").then((res)=>{console.log('getTodoList', res);getTodoListData.value = res;}).catch((err)=>{})};
on对应send,不返回
handle对应invoke,返回
8.多窗口使用
// 创建新窗口ipcMain.on('create-new-window', () => { if (newWindow) {// 是否是最小化if (newWindow.isMinimized()) {newWindow.restore()};newWindow.focus() // 存在 则聚焦return}newWindow = new BrowserWindow({width: 312,height: 422,show: false,autoHideMenuBar: true,...(process.platform === "linux" ? { icon } : {}),webPreferences: {preload: join(__dirname, "../preload/about.js"),sandbox: false,},});newWindow.webContents.setWindowOpenHandler((details) => {shell.openExternal(details.url);return { action: "deny" };});newWindow.on("ready-to-show", () => {newWindow.show();});// 关闭清理newWindow.on('closed', () => {newWindow = null});// HMR for renderer base on electron-vite cli.// Load the remote URL for development or the local html file for production.if (is.dev && process.env["ELECTRON_RENDERER_URL"]) {console.log("process.env['ELECTRON_RENDERER_URL']",process.env["ELECTRON_RENDERER_URL"] + "/about.html");newWindow.loadURL(process.env["ELECTRON_RENDERER_URL"] + "/about.html");} else {newWindow.loadFile(join(__dirname, "../renderer/about.html"));}});
…/preload/about.js 文件内容
import { contextBridge } from "electron";
import { electronAPI } from "@electron-toolkit/preload";// Custom APIs for renderer
const api = {};// Use `contextBridge` APIs to expose Electron APIs to
// renderer only if context isolation is enabled, otherwise
// just add to the DOM global.
if (process.contextIsolated) {try {contextBridge.exposeInMainWorld("electron", electronAPI);contextBridge.exposeInMainWorld("api", api);} catch (error) {console.error(error);}
} else {// @ts-ignore (define in dts)window.electron = electronAPI// @ts-ignore (define in dts)window.api = api
}
遇到问题
mac在打包win,安装完成会出现以下错误属于系统编辑问题,请使用win系统进行对应打包
npm i 安装不上,网络正常情况
npm config set registry https://registry.npmmirror.com
淘宝镜像可能会出现问题
win在打包是否出现的权限问题需要开启管理员权限
如遇到其他问题可以沟通
相关文章:

electron.vite 项目创建以及better-sqlite3数据库使用
1.安装electron.vite npm create quick-start/electronlatest中文官网:https://cn.electron-vite.org/ 2. 安装项目依赖 npm i3.修改 electron-builder 配置文件 appId: com.electron.app productName: text33 directories:buildResources: build files:- !**/.v…...

【新品解读】AI 应用场景全覆盖!解码超高端 VU+ FPGA 开发平台 AXVU13F
「AXVU13F」Virtex UltraScale XCVU13P Jetson Orin NX 继发布 AMD Virtex UltraScale FPGA PCIE3.0 开发平台 AXVU13P 后,ALINX 进一步研究尖端应用市场,面向 AI 场景进行优化设计,推出 AXVU13F。 AXVU13F 和 AXVU13P 采用相同的 AMD Vir…...

Proxmox VE 8.3 qm 方式导入ESXi Linux OVA UEFI模式虚拟机
前言 实现esxi ova uefi 虚拟机导入到pve,Linux UEFI 都支持 创建一个105虚拟机 qm 参数使用参考,以下可以根据自己的实际情况执行调整 esxi 导出虚拟机参考 #vmid (100 - 999999999) vmid=105# qm vm name...

OpenAI 放王炸,将发布整合多项技术的 GPT-5,并免费无限使用,该模型有哪些技术亮点
对于 ChatGPT 的免费用户,将可以无限制地访问 GPT-5,但仅限于标准的智能级别。该级别会设定滥用限制,以防止不当使用(意思就是你得付费嘛)。 OpenAI CEO Sam Altman 今天在 X 上透露了 GPT-4.5 和 GPT-5 的最新发展计划。 OpenAI 将发布代…...
【前端框架与库】「深入理解 Vue 插槽」:类型、用法与实际场景解析,增强组件复用性的利器
深入理解 Vue 插槽 [TOC](深入理解 Vue 插槽) 前言一、插槽的几种类型1. 默认插槽(Default Slot)2. 具名插槽(Named Slot)3. 作用域插槽(Scoped Slot) 二、插槽的作用与实际使用场景三、延伸知识总结 前言 …...

对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 与基于 openEuler 构建 LVS-DR 群集
一、 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 NAT 模式 部署简单:NAT 模式下,所有的服务器节点只需要连接到同一个局域网内,通过负载均衡器进行网络地址转换,就可以实现负载均衡功能。不需要对…...

matplotlib绘制频率分布直方图
1.给了数据,让统计这些数据的分布 from matplotlib import pyplot as plt from matplotlib import rcParams import random as r# 直方图用来统计每个区间数量多少rcParams[font.sans-serif] [SimHei] rcParams[axes.unicode_minus] Falseplt.figure(figsize(20,8), dpi80)#…...

相得益彰,Mendix AI connector 秒连DeepSeek ,实现研发制造域场景
在当今快速发展的科技领域,低代码一体化平台已成为企业数字化转型的关键工具,同时,大型语言模型(LLM)如 DeepSeek 在自动生成代码和提供智能建议方面表现出色。 Mendix 于近期发布的 GenAI 万能连接器,目前…...
shell脚本自动安装MySQL8
环境:centos7版本:8.0.28安装包:mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz 二进制包要求:安装包和shell脚本在同一目录下执行方式:sudo ./install_mysql8.sh #!/bin/bash# 定义MySQL安装目录和压缩包名称MYSQL_DIR…...

Git | 相关命令
相关资料 官网Git 学习教程Git 入门指南Git 的奇技淫巧Git Extras git 命令行扩展工具配置 Git 处理行结束符Git 配置多个 SSH-Key下载相关 Windows 版下载镜像使用 jsdelivr 加速 Github 仓库资源 commit 常用的 type 常用 Git 命令 [xxx] 均为可选参数 git clone # 拷贝一…...

RealClip正式发布:重新定义轻量化数字内容交互体验
在移动互联网流量红利逐渐见顶的当下,用户对即时性、碎片化娱乐与交互体验的需求持续攀升。轻量化小游戏、VR互动、数字孪生、工业仿真等内容形态迅速崛起,但开发者却面临两大核心矛盾:如何将高性能互动内容轻量化嵌入现有应用中?…...
Linux内核 - 非仿生机器人之感知主控系统(协议栈)
Linux内核 - 非仿生机器人之感知主控系统(协议栈) 注:该项目为18年实习期间,参与非仿生六足机器人(Linux方案)的个人理解和积累。时至今日,再看其实仅为一套系统编程相关框架,一直为…...

CZML 格式详解,javascript加载导出CZML文件示例
示例地址:https://dajianshi.blog.csdn.net/article/details/145573994 CZML 格式详解 1. 什么是 CZML? CZML(Cesium Zipped Markup Language)是一种基于 JSON 的文件格式,用于描述地理空间数据和时间动态场景。它专…...

【gRPC-gateway】auth-通过拦截器从上下文中提取元数据用于认证,与从http header转发待认证数据到上下文进行验证,go案例
从grpc上下文中提取元数据用于认证 案例 interceptor.go package serverimport ("context""errors""google.golang.org/grpc""google.golang.org/grpc/metadata""strings" )// UnaryInterceptor 是一个 unary RPC 的拦截器…...
Sass基础知识以及常用知识整理
Sass基础知识以及常用知识整理 一、CSS 功能拓展 注意:>、 、和~的区分 1.1 嵌套规则 Sass 允许将一套 CSS 样式嵌套进另一套样式中,内层的样式将它外层的选择器作为父选择器,例如: #main p {color: #00ff00;width: 97%;…...
Redis 内存回收机制
Redis 是一个基于内存的键值存储系统,为了避免内存耗尽,Redis 提供了多种内存回收机制。以下是 Redis 内存回收的主要方式: 1. 过期键删除 Redis 支持为键设置过期时间,过期后会自动删除键以释放内存。 1.1 设置过期时间 SET key…...
docker安装mongo,导入、导出数据
1、docker安装mongo docker pull mongo docker run -d -p 27017:27017 --name mongodb mongodocker update mongodb --restartalways ## 开机自启动-d:表示以后台模式运行容器。 -p 27017:27017:将容器内部的 MongoDB 默认端口 27017 映射到宿主机的 27…...

Excel常用操作
Excel常用操作 学习资源 37_电子表格处理考点精讲_设置数据格式_哔哩哔哩_bilibili 快速输入数据与编辑数据 一个工作簿可以包含多个工作表 特殊数据的添加格式 输入负数, 例如-3、-5 常规输入, 直接输入-3、-5;使用(), 例如在单元格中输入(3)回车即可变为-3;上述括号不区分中…...

嵌入式EasyRTC实时通话支持海思hi3516cv610,编译器arm-v01c02-linux-musleabi-gcc
EasyRTC已经完美支持海思hi3516cv610,编译器arm-v01c02-linux-musleabi-gcc,总体SDK大小控制在680K以内(预计还能压缩100K上下): EasyRTC在hi3516cv610芯片上能双向通话、发送文字以及二进制指令,总体运行…...
在freertos中,中断优先级和任务优先级之间的关系和使用方法
中断优先级和任务优先级如何匹配?任务优先级不同任务之间该用多高的优先级?中断优先级不同中断中该用多高的优先级?中断优先级和任务优先级设置时,怎样设置可以让任务在调度时屏蔽中断?怎样设置可以让任务在调度时&…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...

Qt的学习(一)
1.什么是Qt Qt特指用来进行桌面应用开发(电脑上写的程序)涉及到的一套技术Qt无法开发网页前端,也不能开发移动应用。 客户端开发的重要任务:编写和用户交互的界面。一般来说和用户交互的界面,有两种典型风格&…...