Electron 41.2 + Vite 8 + Vue3 + ElementPlus重写桌面端后台系统

2026/11最新重构electron41+vite8+pinia4客户端管理系统ElectronAdmin。

💥 告别卡顿!Electron 41.2 全新重构,Vite 8 + Vue3 深度集成,Pinia4状态配置,ElementPlus组件库,极致搭建跨平台客户端中后台管理系统。支持亮色+深色主题、4种通用布局模板,涵盖图表、表格、表单、列表、编辑器、错误处理等页面。

360截图20261112110730487

360截图20261112114308259

技术栈

  • 编辑器:vscode
  • 跨平台框架:Electron41.2
  • 前端技术框架:vite^8.3.6+vue^3.5.45+vue-router^5.4.0
  • 组件库:element-plus^2.14.8
  • 状态管理:pinia^4.1.0
  • 国际化方案:vue-i18n^11.4.18
  • 图表插件:echarts^6.1.0
  • markdown组件:md-editor-v3^7.1.0
  • 富文本组件:@vueup/vue-quill^1.5.5
  • 数据模拟:mockjs^1.1.0
  • 打包构建:electron-builder26.18.0

p1-1

p2

项目特征

🚀 前沿技术栈:基于 Electron 41.2、Vite 8、Vue 3​、Pinia 4 构建,享受极速开发体验。
🌍 国际化支持:集成 Vue-I18n,支持中文、英文、繁体三种语言无缝切换。
🎨 多布局模板:支持 4种​ 通用布局模板(经典、分栏、纵向、横向),满足不同业务布局需求。
🧭 智能路由:支持动态路由权限、面包屑导航及快捷路由标签栏,操作更流畅。
🖥️ 多窗口管理:深度封装 Electron 多开窗口管理,轻松应对桌面多开窗口交互场景。
📊 丰富业务场景:内置 Echarts 图表、复杂表格、表单、列表、富文本编辑器及全局错误处理页面。
💅 UI 组件:基于 Element Plus​ 组件库,风格统一,组件丰富。

p3

项目目录结构

electron-admin使用最新跨平台框架 Electron41+Vite8 创建项目模板。

360截图20261112115038734

360截图20261112155157008

Electron41-Vite8Admin桌面版后台管理系统已经发布到我的原创作品小店。

Electron41+Vue3+ElementPlus桌面端后台管理系统

p4

入口配置main.js

import { createApp } from 'vue'
import './style.scss'
import App from './App.vue'

import { launchApp } from '@/windows/actions'

// 引入状态和路由配置
import Pinia from './pinia'
import Router from './router'

// 引入插件配置
import Plugins from './plugins'

launchApp().then(config => {
  if(config) {
    window.config = config
  }

  // 初始化app程序实例
  createApp(App)
  .use(Pinia)
  .use(Router)
  .use(Plugins)
  .mount('#app')
})

App.vue模板

<script setup>
  import { onMounted, computed } from 'vue'
  import { useRouter } from 'vue-router'

  import { appState } from '@/pinia/modules/app'
  import { Loaded } from '@/plugins/loaded'

  // 引入组件库国际化
  import zhCN from 'element-plus/es/locale/lang/zh-cn'
  import zhTW from 'element-plus/es/locale/lang/zh-tw'
  import enUS from 'element-plus/es/locale/lang/en'

  const locales = {
    'zh-CN': zhCN,
    'zh-TW': zhTW,
    'en': enUS,
  }

  const router = useRouter()
  const appstate = appState()

  const locale = computed(() => locales[appstate.lang] ?? zhCN)

  appstate.changeTheme()

  Loaded()

  onMounted(async() => {
    // 确保初始导航就绪
    await router.isReady()
    // 通知主进程当前窗口已渲染就绪,显示窗口
    window.electron.send('win-ready')
  })
</script>

<template>
  <el-config-provider :locale="locale">
    <router-view />
  </el-config-provider>
</template>

360截图20261112115329311

360截图20261112133106227

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'] = true

const 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()
})

360截图20261112114008404

Electron-ViteAdmin后台布局模板

内置4种通用布局模板,可自行扩展布局结构。

image

image

<script setup>
  import { computed } from 'vue'
  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 LayoutComponent = computed(() => {
    switch (appstate.config.layout) {
      case 'classic':
        return Classic
      case 'columns':
        return Columns
      case 'vertical':
        return Vertical
      case 'horizontal':
        return Horizontal
      default:
        return Classic
    }
  })
</script>

<template>
  <div class="vuadmin__container" :style="{'--themeSkin': appstate.config.skin}">
    <component :is="LayoutComponent" />
  </div>
</template>

360截图20261112111139749

image

image

image

image

electron+vite实现无边框拖拽窗口/导航标题

image

image

image

image

image

image

<script setup>
  import { ref, h } from 'vue'
  import { ElMessageBox, ElSpace, ElButton } from 'element-plus'

  import { authState } from '@/pinia/modules/auth'
  import { isTrue } from '@/utils'

  import { winSet } from '@/windows/actions'

  const props = defineProps({
    color: String,
    // 窗口是否可最小化
    minimizable: {type: [Boolean, String], default: true},
    // 窗口是否可最大化
    maximizable: {type: [Boolean, String], default: true},
    // 窗口是否可关闭
    closable: {type: [Boolean, String], default: true},
    // 层级
    zIndex: {type: [Number, String], default: 2026},
  })

  const authstate = authState()
  
  const hasMaximized = ref(false)
  const isResizable = ref(true)
  const isMaximizable = ref(true)

  // 用户是否可以手动调整窗口大小
  window.electron.invoke('win-isResizable').then(res => {
    isResizable.value = res
  })
  // 窗口是否可以最大化
  window.electron.invoke('win-isMaximizable').then(res => {
    isMaximizable.value = res
  })
  
  // 初始监听窗口是否最大化
  window.electron.invoke('win-isMaximized').then(res => {
    hasMaximized.value = res
  })
  // 实时监听窗口是否最大化
  window.electron.on('win-maximized', (e, data) => {
    hasMaximized.value = data
  })

  // 最小化
  const handleWinMin = () => {
    window.electron.invoke('win-min')
  }
  // 最大化/还原
  const handleWinToggle = () => {
    window.electron.invoke('win-toggle').then(res => {
      hasMaximized.value = res
    })
  }
  // 关闭
  const handleWinClose = () => {
    if(window.config.isMajor) {
      ElMessageBox.confirm(
        ({ confirm, cancel, close }) => {
          return h('div', {style: 'width: 320px;'}, [
            h('p', { style: 'margin-bottom: 30px' }, '是否最小化到系统托盘,不退出系统程序?'),
            h('div', {class: 'flex-r'}, [
              h(ElSpace, {size: 10}, () => [
                h(
                  ElButton,
                  {
                    round: true,
                    type: 'primary',
                    text: true,
                    onClick: () => {
                      cancel()
                    },
                  },
                  () => '最小化到托盘'
                ),
                h(
                  ElButton,
                  {
                    round: true,
                    type: 'danger',
                    onClick: () => {
                      confirm()
                    },
                  },
                  () => '确认退出'
                ),
              ])
            ])
          ])
        },
        {
          title: '确认退出',
          showConfirmButton: false,
          showCancelButton: false,
          draggable: true,
          autofocus: false,
          distinguishCancelAndClose: true,
          customStyle: {'padding': '15px', 'width': 'auto'},
        }
      ).then((action) => {
        authstate.logout()
        winSet('close')
      }).catch((e) => {
        if(e ==='cancel') {
          setTimeout(() => {
            winSet('hide', window.config.id)
          }, 250)
        }
      })
    }else {
      winSet('close', window.config.id)
    }
  }
</script>

<template>
  <div class="ev__winbtns flexbox flex-alignc vu__undrag" :style="{'z-index': zIndex}">
    <div class="ev__winbtns-actions flexbox flex-alignc" :style="{'color': color}">
      <a v-if="isTrue(minimizable)" class="wbtn min" title="最小化" @click="handleWinMin"><i class="wicon iconfont elec-icon-min"></i></a>
      <a v-if="isTrue(maximizable) && isResizable && isMaximizable" class="wbtn toggle" :title="hasMaximized ? '向下还原' : '最大化'" @click="handleWinToggle">
        <i class="wicon iconfont" :class="hasMaximized ? 'elec-icon-restore' : 'elec-icon-max'"></i>
      </a>
      <a v-if="isTrue(closable)" class="wbtn close" title="关闭" @click="handleWinClose"><i class="wicon iconfont elec-icon-quit"></i></a>
    </div>
  </div>
</template>

image

360截图20261112111434561

image

image

image

image

360截图20261112111847791

360截图20261112111946838

360截图20261112112013572

image

360截图20261112112126375

360截图20261112112207858

360截图20261112112226975

360截图20261112112306198

360截图20261112112526345

360截图20261112112550287

360截图20261112112655122

360截图20261112112745729

360截图20261112112923753

360截图20261112113044035

360截图20261112113230046

image

国际化配置

image

b7f8727919eba475592b23709f4cbea0_1289798-20251101001819230-43678967

/**
 * 国际化配置
 * @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 || langVal
  appstate.setLang(lang)

  const i18n = createI18n({
    legacy: false,
    locale: lang,
    messages: {
      'en': enUS,
      'zh-CN': zhCN,
      'zh-TW': zhTW
    }
  })
  
  app.use(i18n)
}

实现自定义面包屑导航、路由tab标签栏。

image

自定义动态echarts图表

image

image

整个项目拆解下来知识点密度挺高的,整理出来希望对正在做类似项目的你有点参考价值~🙌

后面还会持续更新更多原创实战项目,进阶作品小店也欢迎来逛👇

a88e58ebeaaf5f5a09a52686a388ed71_1289798-20251223105825806-389288273

最新版Electron41+Vite8+Vue3+ElementPlus重构客户端仿微信聊天Exe

仅15MB!Tauri2.12+Vite8+Vue3+ArcoDesign重写桌面OS系统

最新版Tauri 2.12+Vite8+Vue3+Element Plus重构桌面端后台管理系统

全新升级tauri2.12+vite8+vue3+pinia4+elementPlus仿微信/QQ聊天软件

最新版Flutter3.41+Dart3.11仿写抖音APP直播+短视频+聊天应用程序

Electron38-Wechat电脑端聊天|vite7+electron38仿微信桌面端聊天系统

Electron38-Vue3OS客户端OS系统|vite7+electron38+arco桌面os后台管理

electron38-admin桌面端后台|Electron38+Vue3+ElementPlus管理系统

vite8-webos网页版os管理|Vue3+Vite8.0+ArcoDesign搭建pc端os桌面系统

Vite8+DeepSeek-V4.1网页版AI助手|vue3+arco手搓web版ai流式问答系统

uniapp+deepseek-v4.1-flash+vue3跨端流式ai应用【h5+小程序+app端】

最新版uni-app+vue3+uv-ui跨三端仿微信app聊天应用【h5+小程序+app端】

Flutter3-MacOS桌面OS系统|flutter3.41+window_manager客户端OS模板

最新版Flutter3.41+Dart3.11跨平台仿微信app聊天界面|朋友圈

最新版uni-app+vue3+uv-ui跨端仿携程酒店预订模板【H5+小程序+App端】

20160819150003341be

 

posted @ 2026-11-12 16:52  xiaoyan2017  阅读(14)  评论(0)    收藏  举报
友情链接: UP主小店B站