网站首页 > 博客文章 正文
之前有给大家分享一个electron跨平台短视频项目。今天再分享一个最新研发的vite2+electron桌面端后台管理系统框架ElectronViteVadmin。
Electron12仿抖音|vite2+electron直播
项目介绍
electron-vite2-vadmin 一款整合vite2和electron技术的跨端管理系统。支持动态路由配置、国际化语言、权限控制、主题换肤、错误页提示等功能。
运用技术
- 编码工具:vscode
- 构建工具:vite2+vue-cli-plugin-electron-builder
- vue3技术: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
实现了仿mac顶部导航栏效果,整合了多功能表格/表单功能,支持中英文/繁体语言。
项目结构目录
采用标准的分层目录形式,目录结构清晰。
所有的页面组件均是使用vue3最新语法编码实现。样式是基于Sass的css预处理语言。
公共组件|插件配置
新建一个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)
}
国际化Vue-I18n
新建一个i18n.js引入多语言配置。
/**
* 国际化配置 VueI18n util
* @author XiaoYan
*/
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
}
Vue3自定义hooks
- 动态化标题hook
/**
* 动态化标题
* @author XiaoYan
*/
import { onMounted, watchEffect } from "vue"
import { useI18n } from "vue-i18n"
import store from "@/store"
export default function useTitle(route) {
if(!route.meta) return
const { t } = useI18n()
const defaultTitle = 'Electron-Vue3-Vadmin'
const Title = async () => {
if(route.meta.title) {
document.title = `${t(route.meta.title)} - ${defaultTitle}`
}else {
document.title = defaultTitle
}
}
watchEffect(Title)
onMounted(() => {
Title()
})
}
- 自定义图表hook
图表能够根据视图dom的改变而更新尺寸,使用了element-resize-detector组件。
/**
* 动态化图表Hook
* @author XiaoYan
*/
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
}
Ok,今天的分享就暂时先到这里,后面还会分享一些技术知识。
如果小伙伴们有其它的建议想法,欢迎一起交流分享哈!
猜你喜欢
- 2024-12-07 vue3+vite4+element-plus企业级前端框架分享
- 2024-12-07 vue shop vite:一个基于vite4+vue3+element-plus的前端开发平台
- 2024-12-07 利用json-server搭建本地数据接口
- 2024-12-07 【总结】1727- 前端开发中如何高效地模拟数据?
- 2024-12-07 webpack-dev-server介绍及使用详解
- 2024-12-07 在线编辑excel功能一次完整体验历程,以及可以避免的坑
- 2024-12-07 HTTP客户端库Axios详细介绍及使用
- 2024-12-07 高配 vue3 setup + vite4 + pinia2 后台管理框架Vite4Admin
- 2024-12-07 手摸手,带你用vue撸后台 系列四(vueAdmin 极简的后台基础模板)
- 2024-12-07 Github标星超200K,这10个可视化面板你知道几个
你 发表评论:
欢迎- 最近发表
-
- 比GoPro 13更强的大疆Action 5 Pro,到底强在哪里?
- 信号和槽(信号和槽的实现原理)
- 在响应式项目中连接设计与开发(请简述实现响应式设计包括哪些技术点)
- 【C#】委托、Action、Func 和 Event 之间的关系
- 如何使用JavaScript实现Prompt弹窗?
- 谷歌Magic Actions功能曝光:AI革新安卓16通知交互
- 基于目标TPS的性能测试,如何通过手动设置场景进行测试?
- IOS基础学习之输出口和动作(io口输入输出实验总结及体会)
- 《Java语言程序设计》期末考试模拟试题——判断题和问答题
- Android学习之Touch事件的处理(android触摸事件实例)
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)