vite2-electron-vadmin 一款清爽UI中後臺許可權管理系統|Electron-Vue3後臺

xiaoyan2015發表於2021-05-18

一、專案概述

基於vite.js、vue3、electron開發後臺管理框架系統ElectronVueAdmin。內建 i18n 國際化解決方案,動態許可權路由,許可權驗證,整合了典型的表格/表單等業務模組功能。

二、運用技術

  • 編輯器:vscode
  • vue3技術:vitejs+vue3.0+vuex4+vue-router@4
  • 跨端框架:electron^12.0.4
  • UI元件庫:element-plus^1.0.2 (餓了麼vue3元件庫)
  • 表格拖拽:sortablejs^1.13.0
  • 圖表元件:echarts^5.1.1
  • 國際化:vue-i18n^9.1.6
  • 模擬請求:mockjs^1.1.0
  • 打包工具:vue-cli-plugin-electron-builder

三、特性

  • 支援響應式適配桌面端和平板端
  • 最新前端技術Vite2、Vue3、Electron12、Element Plus、Vue-i18n、Echarts5.x
  • 支援元件式/指令式許可權認證方式
  • 支援中英文/繁體國際化方案
  • 支援表格拖拽排序、樹形表格等功能
  • 支援多主題換膚切換

四、專案目錄結構

五、一覽效果

vue3桌面端元件庫

專案中使用的UI元件庫是餓了麼推出的vue3 pc端元件庫element-plus

vite2-electron-vadmin 一款清爽UI中後臺許可權管理系統|Electron-Vue3後臺

大家如果感興趣可以去看看,在vue3版本中已經列出了el-scrollbar滾動條元件。
element-plus.gitee.io/

主入口main.js

/**
 * 渲染程式主入口
 * @author XiaoYan
 */
import { createApp } from 'vue'
import App from './App.vue'
import Router from './router'
import Store from './store'

// 引入公共配置
import gPlugins from './plugins'
import { winCfg, loadWin } from './windows/actions'

loadWin().then(config => {
    winCfg.window = config
    createApp(App).use(Router).use(Store).use(gPlugins).mount('#app')
})

引入公共元件配置

在根目錄新建一個plugins.js用來配置一些公共元件。

/**
 * 公共元件/外掛配置檔案
 * @author XiaoYan
 */

// 引入公共樣式
import "@/assets/fonts/iconfont.css"
import "@/assets/css/common.scss"

// 引入elementPlus元件庫
import ELPlus from "element-plus"

// 引入國際化配置
import VueI18n, { elPlusLang, getLang } from './i18n'

// 引入vue3自定義元件
import V3Layer from '@/components/v3layer'
import V3Scroll from '@/components/v3scroll'

// 引入公共元件模板
import WinBar from '@/components/winbar'
import WinBtn from '@/components/winbar/winbtn.vue'
import MacBtn from '@/components/winbar/macbtn.vue'
import Icon from '@/components/Icon'

import Utils from '@/utils'
import ElUtil from './elUtil'

const gPlugins = (app) => {
    app.use(ELPlus, {
        size: 'small',
        locale: elPlusLang[getLang()]
    })
    app.use(VueI18n)

    app.use(V3Layer)
    app.use(V3Scroll)

    // 註冊公共元件
    app.component('WinBar', WinBar)
    app.component('WinBtn', WinBtn)
    app.component('MacBtn', MacBtn)
    app.component('Icon', Icon)

    // 注入全域性依賴
    app.provide('utils', Utils)
    app.provide('elUtil', ElUtil)
}

Electron無邊框導航欄

專案頂部導航欄類似Mac效果,通過css3漸變即可實現。

<template>
    <WinBar zIndex="1000">
        <template #wbtn>
            <MsgMenu />
            <Lang />
            <a class="wbtn" title="換膚" @click="handleSkinWin"><i class="iconfont icon-huanfu"></i></a>
            <Setting />
            <a class="wbtn" title="重新整理" @click="handleRefresh"><i class="iconfont el-icon-refresh"></i></a>
            <a class="wbtn" :class="{'on': isAlwaysOnTop}" :title="isAlwaysOnTop ? '取消置頂' : '置頂'" @click="handleAlwaysTop"><i class="iconfont icon-ding"></i></a>
            <Avatar @logout="handleLogout" />
        </template>
    </WinBar>
</template>

至於簡體的實現方式這裡就不詳細介紹了,之前有過相關分享文章。

國際化語言配置

專案中使用vue-i18n來處理國際化解決方案。目前支援中文、英文及繁體三種語言。

/**
 * 國際化配置 VueI18n util
 * @author XiaoYan  Q:282310962
 */

import { createI18n } from "vue-i18n"
import Storage from "@/utils/storage"

// 預設值
export const langKey = 'lang'
export const langVal = 'zh-CN'

/* elementPlus國際化配置 */
import enUS from "element-plus/lib/locale/lang/en"
import zhCN from "element-plus/lib/locale/lang/zh-cn"
import zhTW from "element-plus/lib/locale/lang/zh-tw"
export const elPlusLang = {
    'en-US': enUS,
    'zh-CN': zhCN,
    'zh-TW': zhTW,
}

/* 初始化多語言 */
export const $messages = importAllLang()
export const $lang = getLang()
const i18n = createI18n({
    legacy: false,
    locale: $lang,
    messages: $messages
})

/* 獲取語言 */
export function getLang() {
    const lang = Storage.get(langKey)
    return lang || langVal
}

/**
 * 持久化儲存
 * @param lang 語言型別 zh-CN / zh-TW / en-US
 */
export function setLang(lang, reload = false) {
    if(getLang() !== lang) {
        Storage.set(langKey, lang || '')
        // 設定全域性語言
        // i18n.global.locale.value = lang

        // 過載頁面
        if(reload) {
            window.location.reload()
        }
    }
}

/**
 * 自動化匯入本地locale目錄下語言配置
 */
export function importAllLang() {
    const langModule = {}
    try {
        const localeCtx = require.context('@/locale', true, /([a-z]{2})-?([A-Z]{2})?\.js$/)
        localeCtx.keys().map(path => {
            const pathCtx = localeCtx(path)
            if(pathCtx.default) {
                const pathName = path.replace(/(.*\/)*([^.]+).*/ig, '$2')
                if(langModule[pathName]) {
                    langModule[pathName] = {
                        ...langModule[pathName], ...pathCtx.default
                    }
                }else {
                    langModule[pathName] = pathCtx.default
                }
            }
        })
    } catch (error) {
        console.log(error)
    }
    return langModule
}

專案佈局模板

專案分為Auth和Main兩個佈局模板,auth模板是處理一些登入、註冊頁面。main模板則是處理頁面元件功能。

vite2-electron-vadmin 一款清爽UI中後臺許可權管理系統|Electron-Vue3後臺
auth模板

<template>
    <div class="vadmin__wrapper">
        <router-view class="vadmin__layouts-auth"></router-view>
    </div>
</template>

<script>
import { useRoute } from "vue-router"
import useTitle from '@/hooks/useTitle'

export default {
    components: {},
    setup() {
        const route = useRoute()

        // 設定標題
        useTitle(route)
    }
}
</script>

main模板

<template>
    <div class="vadmin__wrapper" :style="{'--themeSkin': store.state.skin}">
        <div v-if="!route.meta.isNewin" class="vadmin__layouts-main flexbox flex-col">
            <!-- 頂部導航 -->
            <div class="layout__topbar">
                <TopNav />
            </div>

            <div class="layout__workpanel flex1 flexbox">
                <!-- 側邊欄 -->
                <div v-show="rootRouteEnable" class="panel__leftlayer">
                    <SideMenu :routes="mainRoutes" :rootRoute="rootRoute" />
                </div>

                <!-- 中間欄 -->
                <div class="panel__middlelayer" :class="{'collapsed': collapsed}">
                    <RouteMenu 
                        :routes="getAllRoutes" 
                        :rootRoute="rootRoute" 
                        :defaultActive="defaultActive" 
                        :rootRouteEnable="rootRouteEnable" 
                    />
                </div>

                <!-- //右邊欄 -->
                <div class="panel__rightlayer flex1 flexbox flex-col">
                    <!-- 麵包屑 -->
                    <BreadCrumb />

                    <v3-scroll autohide>
                        <div class="lay__container">
                            <permission :roles="route.meta.roles">
                                <template #tooltips>
                                    <Forbidden />
                                </template>
                                <router-view></router-view>
                            </permission>
                        </div>
                    </v3-scroll>
                </div>
            </div>
        </div>
        <router-view v-else class="vadmin__layouts-main flexbox flex-col"></router-view>
    </div>
</template>

Vue3 Echarts圖表hook

專案中多個地方使用到圖表,於是封裝一個圖表hook。

import { onMounted, onBeforeUnmount, ref } from "vue"
import * as echarts from "echarts"
import elementResizeDetectorMaker from "element-resize-detector"
import utils from "@/utils"

export default function useChart(refs, options) {
    let chartInst
    let chartRef = ref(null)
    let erd = elementResizeDetectorMaker()

    const handleResize = utils.debounce(() => {
        chartInst.resize()
    }, 100)

    onMounted(() => {
        if(refs.value) {
            chartInst = echarts.init(refs.value)
            chartInst.setOption(options)
            chartRef.value = chartInst
        }
        erd.listenTo(refs.value, handleResize)
    })

    onBeforeUnmount(() => {
        chartInst.dispose()
        erd.removeListener(refs.value, handleResize)
    })

    return chartRef
}

Okey,使用vite+electron+element-plus開發後臺系統就先分享到這裡。後續還會陸續分享一些例項專案。
Electron高仿抖音短視訊|vue3+electron桌面端直播/小視訊

本作品採用《CC 協議》,轉載必須註明作者和本文連結
本文為原創文章,未經作者允許不得轉載,歡迎大家一起交流 QQ(282310962) wx(xy190310)

相關文章