Electron31-ViteAdmin桌面端后台|vite5.x+electron31+element-plus管理系统Exe
原创自研Vue3+Electron31+ElementPlus桌面端轻量级后台管理Exe系统。
基于最新前端技术栈
Vite5.x、Vue3、Electron31、ElementPlus、Vue-I18n、Echarts实战开发桌面端高颜值后台管理模板。内置4种布局模板,支持i18n国际化、动态权限路由,实现了表格、表单、图表、列表、编辑器等常见的业务模块。


electron-viteadmin封装了多窗口管理,支持同时开启多个窗体。

运用技术
- 编辑器:vscode
- 框架技术:vite5.3+vue3.4+vue-router^4.4
- 跨平台框架:electron^31.3
- 组件库:element-plus^2.7.8
- 状态管理:pinia^2.2.0
- 国际化方案:vue-i18n@9
- 图表组件:echarts^5.5.1
- markdown编辑器:md-editor-v3^4.18.0
- 模拟数据:mockjs^1.1.0
- 打包工具:electron-builder^24.13.3


项目框架结构
electron-vue3admin 整合vite5+electron技术,采用vue3 setup语法编码。


目前electron-vue3admin已经同步到我的原创作品集,欢迎下载使用。
自研Electron31+Vue3+ElementPlus桌面端后台管理系统

特性
- 最新前端技术栈electron31、vite5、vue3、elementPlus、vue-i18n、echarts
- 支持中英文/繁体国际化解决方案
- 支持动态权限路由、多页签缓存路由
- 封装多窗口管理器,内置4种通用布局模板、自由切换风格
- 整合通用的表格、表单、列表、图表、编辑器、错误处理等模块
- 高颜值UI界面、轻量级模块化、高定制性

electron主进程配置
import { app, BrowserWindow } from 'electron'import { WindowManager } from '../src/windows/index.js'// 忽略安全警告提示 Electron Security Warning (Insecure Content-Security-Policy)
process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = trueconst createWindow = () => {let win = new WindowManager()win.create({isMajor: true})// 系统托盘管理win.trayManager()// 监听ipcMain事件win.ipcManager()
}app.whenReady().then(() => {createWindow()app.on('activate', () => {if(BrowserWindow.getAllWindows().length === 0) createWindow()})
})app.on('window-all-closed', () => {if(process.platform !== 'darwin') app.quit()
})
vue3入口文件main.js
import { createApp } from 'vue'
import './style.scss'
import App from './App.vue'import { launchApp } from '@/windows/actions'// 引入路由和状态配置
import Router from './router'
import Pinia from './pinia'// 引入插件配置
import Plugins from './plugins'launchApp().then(config => {if(config) {console.log('窗口参数:', config)console.log('窗口id:', config?.id)// 全局存储窗口配置window.config = config}// 初始化app应用实例createApp(App).use(Router).use(Pinia).use(Plugins).mount('#app')
})



























electron31-admin布局模板

提供了4种常用的布局模板。也可以根据需求定制化模板。

/*** 通用布局模板* @author Andy Q:282310962
*/<script setup>import { appState } from '@/pinia/modules/app'// 引入布局模板import Classic from './template/classic/index.vue'import Columns from './template/columns/index.vue'import Vertical from './template/vertical/index.vue'import Horizontal from './template/horizontal/index.vue'const appstate = appState()const LayoutMap = {'classic': Classic,'columns': Columns,'vertical': Vertical,'horizontal': Horizontal}
</script><template><div class="vuadmin__container" :style="{'--themeSkin': appstate.config.skin}"><component :is="LayoutMap[appstate.config.layout]" /></div>
</template>
electron+vue3国际化解决方案

采用vue-i18n国际化方案,支持中文/英文/繁体三种语言。

/*** 国际化配置* @author YXY*/import { createI18n } from 'vue-i18n'
import { appState } from '@/pinia/modules/app'// 引入语言配置
import enUS from './en-US'
import zhCN from './zh-CN'
import zhTW from './zh-TW'// 默认语言
export const langVal = 'zh-CN'export default async (app) => {const appstate = appState()const lang = appstate.lang || langValappstate.setLang(lang)const i18n = createI18n({legacy: false,locale: lang,messages: {'en': enUS,'zh-CN': zhCN,'zh-TW': zhTW}})app.use(i18n)
}
electron+vue3封装图表



/*** 动态图表Hook*/import { onMounted, onBeforeUnmount, ref } from 'vue'
import * as echarts from 'echarts'
import elementResizeDetectorMaker from 'element-resize-detector'export function useEcharts(el, options) {let chartEllet chartRef = ref(null)let erd = elementResizeDetectorMaker()const resizeHandle = () => {chartEl && chartEl.resize()}onMounted(() => {if(el?.value) {chartEl = echarts.init(el.value)chartEl.setOption(options)chartRef.value = chartEl}erd.listenTo(el.value, resizeHandle)})onBeforeUnmount(() => {chartEl.dispose()erd.removeListener(el.value, resizeHandle)})return chartRef
}
vue3封装路由菜单




内置的4种布局模板,提供了4种不同形式的路由菜单。
<Menus :rootRouteEnable="false" /><Menus rootRouteEnable :dark="true" /><Menus mode="horizontal" :dark="true" />
<script setup>import { ref, computed } from 'vue'import { isObject, isArray, isImg } from '@/utils'import { appState } from '@/pinia/modules/app'import { useRoutes } from '@/hooks/useRoutes'const props = defineProps({// 菜单模式(vertical|horizontal)mode: { type: String, default: 'vertical' },// 是否开启一级路由菜单rootRouteEnable: { type: Boolean, default: true },// 是否暗黑模式dark: { type: Boolean }})import Submenu from './submenu.vue'// 引入主路由表import routes from '@/router/modules/main.js'const appstate = appState()const { route, getActiveRoute, getCurrentRootRoute, getTreeRoutes } = useRoutes()const activeRoute = computed(() => getActiveRoute(route))const rootRoute = computed(() => getCurrentRootRoute(route))const treeRoutes = computed(() => getTreeRoutes(routes))const filterRoutes = computed(() => {if(props.rootRouteEnable) {return treeRoutes.value}// 过滤一级路由菜单return treeRoutes.value.find(item => item.path === rootRoute.value && item.children)?.children})
</script><template><div class="vu__menubar" :class="{'is-dark': dark, 'is-collapsed': mode == 'vertical' && appstate.config.collapsed}"><el-menu class="vu__menus" :default-active="activeRoute" :mode="mode" :collapse="appstate.config.collapsed"><Submenuv-for="route in filterRoutes":key="route.path":item="route":rootRoute="rootRoute":rootRouteEnable="rootRouteEnable"/></el-menu></div>
</template>
vue3自定义多标签tab路由

<template><div class="vu__tabview"><el-tabsv-model="activeTab"class="vu__tabview-tabs"@tab-change="changeTabs"@tab-remove="removeTab"><el-tab-panev-for="(item, index) in tabList":key="index":name="item.path":closable="!item?.meta?.isAffix"><template #label><el-dropdown ref="dropdownRef" trigger="contextmenu" :id="item.path" @visible-change="handleDropdownChange($event, item.path)" @command="handleDropdownCommand($event, item)"><span class="vu__tabview-tabs__label"><span>{{$t(item?.meta?.title)}}</span></span><template #dropdown><el-dropdown-menu><el-dropdown-item command="refresh" :icon="Refresh">{{$t('tabview__contextmenu-refresh')}}</el-dropdown-item><el-dropdown-item command="close" :icon="Close" :disabled="item.meta.isAffix">{{$t('tabview__contextmenu-close')}}</el-dropdown-item><el-dropdown-item command="closeOther" :icon="Switch">{{$t('tabview__contextmenu-closeother')}}</el-dropdown-item><el-dropdown-item command="closeLeft" :icon="DArrowLeft">{{$t('tabview__contextmenu-closeleft')}}</el-dropdown-item><el-dropdown-item command="closeRight" :icon="DArrowRight">{{$t('tabview__contextmenu-closeright')}}</el-dropdown-item><el-dropdown-item command="closeAll" :icon="CircleCloseFilled">{{$t('tabview__contextmenu-closeall')}}</el-dropdown-item></el-dropdown-menu></template></el-dropdown></template></el-tab-pane></el-tabs></div>
</template><script setup>import { onMounted, ref, computed, watch, nextTick } from 'vue'import { useRouter, useRoute } from 'vue-router'import { useI18n } from 'vue-i18n'import { Refresh, Close, Switch, DArrowLeft, DArrowRight, CircleCloseFilled } from '@element-plus/icons-vue'import { isObject, isImg } from '@/utils'import { useLink } from '@/hooks/useLink'import { appState } from '@/pinia/modules/app'const router = useRouter()const route = useRoute()const { jump } = useLink()const { locale } = useI18n()let { config: { keepAlive, tabRoutes, cacheRoutes }, updateConfig } = appState()const dropdownRef = ref()const activeTab = ref(route.path)const tabList = ref(tabRoutes)// 新增选项卡const addTab = () => {const index = tabList.value.findIndex(item => item?.path === activeTab.value)if(index == -1) {tabList.value.push({path: route?.path,name: route?.name,meta: {...route?.meta,}})}updateConfig('tabRoutes', tabList.value)updateCacheRoutes()}// 删除选项卡const removeTab = (path) => {const index = tabList.value.findIndex(item => item?.path === path)if(index > -1) {tabList.value.splice(index, 1)updateTabs(tabList.value)}}// 删除左侧选项卡const removeLeftTab = (path) => {const index = tabList.value.findIndex(item => item?.path === path)if(index > -1) {tabList.value = tabList.value.filter((item, i) => item?.meta?.isAffix || i >= index)updateTabs(tabList.value)}}// 删除右侧选项卡const removeRightTab = (path) => {const index = tabList.value.findIndex(item => item?.path === path)if(index > -1) {tabList.value = tabList.value.filter((item, i) => item?.meta?.isAffix || i <= index)updateTabs(tabList.value)}}// 删除其它选项卡const removeOtherTab = (path) => {tabList.value = tabList.value.filter(item => item?.meta?.isAffix || item?.path === path)updateTabs(tabList.value)}// 删除全部const removeAllTab = (path) => {tabList.value = tabList.value.filter(item => item?.meta?.isAffix)updateTabs(tabList.value)}// 更新选项卡const updateTabs = (tabs) => {updateConfig('tabRoutes', tabs)updateCacheRoutes()const nextTab = tabs[tabs.length + 1] || tabs[tabs.length - 1]if(!nextTab) returnjump(nextTab?.path)}// 更新keep-alive缓存const updateCacheRoutes = () => {let caches = tabList.value.filter(item => keepAlive || item?.meta?.isKeepAlive).map(item => item.name)updateConfig('cacheRoutes', caches)}// 清空keep-alive缓存const clearCacheRoutes = () => {updateConfig('cacheRoutes', [])}// 点击选项卡const changeTabs = (path) => {jump(path)}// 右键菜单更新const handleDropdownChange = (visible, name) => {// 控制每次只显示一个右键菜单if(!visible) returndropdownRef.value.forEach(item => {if(item.id === name) returnitem.handleClose()})}// 右键菜单命令const handleDropdownCommand = (cmd, item) => {const path = item?.pathswitch(cmd) {case 'refresh':router.go(0)breakcase 'close':removeTab(path)breakcase 'closeLeft':removeLeftTab(path)breakcase 'closeRight':removeRightTab(path)breakcase 'closeOther':removeOtherTab(path)breakcase 'closeAll':removeAllTab()break}}watch(() => route.path, () => {activeTab.value = route.pathaddTab()}, {immediate: true})
</script>
以上就是Electron31+vue3 setup+elementPlus开发桌面端中后台管理系统的一些知识分享,整个项目涉及到的知识点还是蛮多的,限于篇幅就先分享到这里。
https://blog.csdn.net/yanxinyun1990/article/details/140701208
https://blog.csdn.net/yanxinyun1990/article/details/140284304
https://blog.csdn.net/yanxinyun1990/article/details/138317354

相关文章:
Electron31-ViteAdmin桌面端后台|vite5.x+electron31+element-plus管理系统Exe
原创自研Vue3Electron31ElementPlus桌面端轻量级后台管理Exe系统。 基于最新前端技术栈Vite5.x、Vue3、Electron31、ElementPlus、Vue-I18n、Echarts实战开发桌面端高颜值后台管理模板。内置4种布局模板,支持i18n国际化、动态权限路由,实现了表格、表单、…...
鸿蒙HarmonyOS实战:创建NDK工程、毕昇编译器
NDK适用场景 适合使用NDK的场景:应用涉及如下场景时,适合采用NDK开发 性能敏感的场景,如游戏、物理模拟等计算密集型场景。 需要复用已有C或C库的场景。 需要针对CPU特性进行专项定制库的场景,如Neon加速。 不建议使用NDK的场…...
网络安全-防火墙初步认识。
文章目录 1. 防火墙是什么?2. 防火墙的工作原理是什么?3. 防火墙的分类有哪些?4. 实战4.1 防火墙管理和实验介绍4.2 防火墙命令行初体验实验目标:实验步骤: 4.3 防火墙Web初体验实验目标:实验步骤ÿ…...
golang channel什么情况main会deadlock?主协程是什么?
在 Go 语言中,main 函数是程序的入口点,它运行在主协程(也称为主 goroutine)中。主协程是程序启动后自动创建的第一个 goroutine。当 main 函数执行完毕后,整个 Go 程序就会退出,无论其他 goroutine 是否仍…...
Redis之快速入门
目录 简介 什么是Redis 特点 优势 数据库对比 应用场景 安装与配置 下载 上传解压 安装gcc 编译 查看安装目录 后端启动 测试 系统服务配置 Redis数据类型 通过命令操作Redis String(字符串) Hash(哈希) List…...
mac 安装Arthas
mac安装有两种方式 1.第一步安装Arthas 第一种: curl -L https://arthas.aliyun.com/install.sh | sh 第二种jar包形式 curl -O https://arthas.aliyun.com/arthas-boot.jar个人比较推荐第一种因为运行测试成功了 第一种安装后可能会出现一些命令不符合 需…...
创客匠人老蒋:流量是个伪命题,做好这件事是打造IP最好避坑方式
怎么样做好一个创始人的IP?流量低是否可以与创客合作陪跑服务? 在老蒋创客圈第63期对话标杆直播连麦中,老蒋与受邀嘉宾【惢众身心成长家园平台】创办人王辉老师进行了一场深度且具有启发性的交流。 老蒋指出,打造IP不仅要“做自己…...
销售预测数据挖掘实战V2.0
1、概述 沃尔玛全年都会举办几次促销减价活动。这些减价活动都是在重要节假日之前进行的,其中最大的四个节假日是超级碗、劳动节、感恩节和圣诞节。包括这些节假日在内的几周在评估中的权重是非节假日周的五倍。在缺乏完整/理想历史数据的情况下,对这些…...
【K8s】Java项目部署时为什么要用k8s?
目录 重要意义一、高可用性与弹性伸缩二、简化部署与管理三、资源隔离与安全四、容器编排与服务发现 部署步骤准备工作创建 Docker 镜像将镜像推送到镜像仓库创建 Kubernetes 资源对象部署到 Kubernetes 集群 常见问题 在 Java 项目部署中使用 Kubernetes(k8s&#…...
【Python】AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘
【Python】成功解决AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘ 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博…...
SQL注入(cookie、base64、dnslog外带、搜索型注入)
目录 COOKIE注入 BASE64注入 DNSLOG注入—注入判断 什么是泛解析? UNC路径 网上邻居 LOAD_FILE函数 搜索型注入—注入判断 本文所使用的sql注入靶场为sqli-labs-master,靶场资源文件已上传,如有需要请前往主页或以下链接下载 信安必备…...
GPT-4:揭秘人工智能新纪元
GPT-4,是OpenAI推出的最新一代语言模型,它的出现不仅在AI技术领域引起了广泛关注,更是在全球范围内掀起了一场关于人工智能未 来的热烈讨论。本文将详细探讨GPT-4的技术突破、应用前景,以及它对社会和科技发展的深远影响。 GPT-4…...
Taro 框架 React Native 开发
1、生命周期 参考:React Native组件(一)组件的生命周期_reactnative constructor介绍-CSDN博客 1.1构造函数(constructor) 1、第一个语句必须是super(props)。 2、contructor将在任意一个RN组件被加载之前优先调用,并且只会调…...
学会平衡日常编码工作与提升学习
文章目录 一、前言二、平衡工作和学习的方法和技巧2.1 设定明确的学习目标2.2 制定合理的学习计划2.3 高效工作1. 代码复用2. 模块化设计3. 单元测试与自动化测试4. 代码审查与反馈 2.4 利用碎片时间2.5 利用在线资源2.6 保持好奇心和持续学习的心态2.7 定期评估和调整2.8 保持…...
navicate premium16破解
下载链接:https://pan.baidu.com/s/1BWowOJLYchFcRMgIn-j97A?pwdvmfu 双击安装navicat160_premium_cs_x64.exe,安装完不要打开 然后断网打开NavicatCracker.exe 打开如果报病毒按照下面方法处理: 记得一定要断网,不断网…...
Kafka运行机制(一):Kafka集群启动,controller选举,生产消费流程
前置知识 Kafka基本概念https://blog.csdn.net/dxh9231028/article/details/141270920?spm1001.2014.3001.5501 1. Kafka集群启动 Kafka在启动集群中的各个broker时,broker会向controller注册自己,并且从controller节点同步集群元数据。 broker是Kaf…...
安徽医科大学:利用UKB数据库和孟德尔随机化,研究发表更轻松!
UKB数据库联合孟德尔随机化 睡眠质量和肾功能竟然与一种严重的肝病密切相关!今天,和大家分享一篇文章,这篇文章深入探讨了睡眠参数和肾功能在新发严重代谢功能障碍相关脂肪性肝病(MASLD)中的机制作用。 通过这篇文章&…...
Ubuntu安装gdb出现错误的问题解决,DNS解析错误导致的安装失败
目录 一、问题 1、错误现象 2、初步分析 二、问题分析和处理 1、进一步确定问题 2、解决dns问题 (1)查看 dns解析文件 (2)修改namesever (3)测试系统 三、问题解决 1、问题进一步分析 …...
【Redis】解析Redisson 限流器源码
Redisson 一、注解AOP 代码部分提取二、设置限流器的失效时间 一、注解AOP 代码部分提取 // 调用Reids工具类的rateLimiter 方法long number RedisUtils.rateLimiter(combineKey, rateType, count, time);redis 工具类 public class RedisUtils {private static final Redis…...
docker-harbor 私有仓库部署和管理
harbor 开源的企业级的docker仓库软件。 仓库:私有仓库(用的最多) 公有仓库。 harnor是有图形化的,页面UI展示的一个工具。操作起来很直观。 harnor每个组件都是由容器构建的,所以安装harbor必须要有docker。 doc…...
从 Agent 到 Skill:揭秘 AI 产品经理进阶的真正关键!
文章深入探讨了 AI 产品经理应如何理解和应用 Agent 与 Skill。文章指出,当前许多 AI 产品经理将注意力过度集中于 Agent,而忽略了 Skill 的重要性。实际上,Skill 是定义 Agent 在具体任务中行为、标准和质量的关键。文章详细阐述了 Skill 的…...
PADS VX2.8 极坐标布局技巧:圆形灯板LED高效排列指南
1. 极坐标布局在圆形灯板设计中的核心价值 第一次接触圆形LED灯板设计时,我被密密麻麻的元件排列搞得头晕眼花。传统直角坐标系下,要精确控制每个LED灯珠的间距和角度,需要反复计算XY坐标,效率极低。直到发现PADS VX2.8的极坐标功…...
2026年免费PDF转Word在线工具横评与选型指南
核心观点摘要 行业趋势显示,在线PDF转Word工具正向免安装、跨设备、隐私安全方向发展,用户对无广告与无使用次数限制的需求显著提升。选型关键维度包括转换质量、隐私机制、操作门槛、可用性与隐性成本,其中轻量化在线平台在易用性与速度上优…...
OpenClaw核心:上下文工程如何让AI更懂你?(万字源码深度解析)
我们之前说过除了记忆系统,Agent 是没什么技术难度的。 比如你自己做了个 Agent,如果只是想用他去装载几个 skill,去完成日常自媒体的选题、或者去小红书等平台上自动发发文章,那是比较简单的。 但,如果你想让这个 Age…...
联络中心支付软件市场最新数据披露:规模达41.37亿元,行业格局加速显现
在全球企业数字化转型浪潮汹涌以及客户对便捷支付体验需求日益增长的背景下,联络中心支付软件市场正迎来前所未有的发展机遇。据恒州诚思调研统计,2025年全球联络中心支付软件市场规模约41.37亿元,预计未来将持续保持平稳增长态势,…...
Python数据标准化全攻略:从原理到实践
在机器学习和数据分析领域,数据标准化是一项至关重要的预处理步骤。它能够将不同尺度的特征统一到相同的范围内,帮助模型更好地学习数据特征,提高训练效率和模型性能。本文将详细介绍数据标准化的概念、常用方法以及在Python中的实现方式。一…...
终极指南:如何快速构建企业级Vue3后台管理系统
终极指南:如何快速构建企业级Vue3后台管理系统 【免费下载链接】vue3-element-admin 🔥基于 Vue 3 Vite 7 TypeScript element-plus 构建的后台管理前端模板(配套后端源码),vue-element-admin 的 vue3 版本。 项目…...
基于Matlab的卷积稀疏形态成分分析实现医学图像融合
基于matlab的卷积稀疏的形态成分分析的医学图像融合,基于卷积稀疏性的形态分量分析 (CS-MCA) 的稀疏表示 (SR) 模型,用于像素级医学图像融合 通过 CS-MCA 模型使用预先学习的字典获得其卡通和纹理组件的 CSR 然后,合并所有源图像的稀疏系数&a…...
【NotebookLM 使用教程】 Slides 指令库:11套通用PPT风格Prompt(含中英文对照)
前言适合谁:不想从零写提示词,想直接套用成熟的 PPT 风格结构。你会获得什么:11 套通用风格指令(英文为主,含中文备用),可直接粘贴到 NotebookLM Slides 的描述/自定义。建议阅读顺序࿱…...
一键搞定完整网页截图:Chrome扩展终极解决方案
一键搞定完整网页截图:Chrome扩展终极解决方案 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-extension …...
