前几天有给大家分享一个 svelte-ui 桌面pc组件库。今天再来分享一个基于svelte ui 开发的中后台管理前端解决方案。
svelte-ui-admin 一款基于最新前端技术栈svelte3.x svelte-ui vite3 echarts
等技术构建的pc端后台管理系统。
SvelteAdmin包含常用的表格/表单/图表/弹窗提示及权限控制/错误处理等功能。
使用技术
- 编码工具:Vscode
- 框架技术:svelte3.x svelteKit vite3
- UI组件库:svelte-ui (基于svelte自定义pc端UI组件库)
- 样式处理:sass^1.54.4
- 图表组件:echarts^5.3.3
- 编辑器组件:wangeditor^4.7.15
- 国际化方案:svelte-i18n^3.4.0
- 数据模拟:mockjs^1.1.0
项目结构
演示图
项目整体风格和svelte-ui保持一致,界面比较清晰友好,操作流畅。
页面布局分为顶部导航条 一二级路由菜单 右侧面包屑导航和主体内容。
代码语言:javascript复制<div class="svadmin__container" style="--themeSkin: {$skin}">
<div class="svadmin__wrapper-layout flexbox flex-col">
<div class="sv__layout-header">
<Header />
</div>
<div class="sv__layout-body flex1 flexbox">
<!-- //侧边栏 -->
{#if rootRouteEnable}
<div class="sv__bd-sidebar">
<SideMenu routes={mainRoutes} {activeRoute} />
</div>
{/if}
{#if (rootRouteEnable && route != '/') || !rootRouteEnable}
<div class="sv__bd-menus" class:collapsed={collapsed&&!rootRouteEnable}>
<RouteMenu
routes={getAllRoutes}
{activeRoute}
{activeRootRoute}
{rootRouteEnable}
{collapsed}
/>
</div>
{/if}
<div class="sv__bd-main flex1 flexbox flex-col">
<!-- 面包屑导航 -->
<BreadCrumb routes={getAllRoutes} {activeRoute} {activeRootRoute} />
<!-- 主内容区 -->
<Scrollbar autohide gap={2}>
<div class="sv__main-wrapper">
<slot />
</div>
</Scrollbar>
</div>
</div>
</div>
</div>
新建 error.svelte为公共错误页。
代码语言:javascript复制<script>
import { page } from '$app/stores'
import { goto } from '$app/navigation'
import { Button } from '$lib/svelte-ui'
function goHome() {
goto('/home/index')
}
</script>
<svelte:head>
<title>{$page.status} Error!</title>
</svelte:head>
<div class="svadmin__pageErr flexbox flex-col flex-alignc flex-justifyc">
<div class="svadmin__pageErr-img"><i class="sv-icon-round_close_fill_light"></i></div>
<div class="svadmin__pageErr-content">
<div class="c-red fs-18">┗| {$page.status} |┛ Page Error~~</div>
<div class="c-999 mt-10 mb-10">{$page.error.message}</div>
<Button size="small" on:click={goHome}>Go Home</Button>
</div>
</div>
svelte-i18n国际化
通过svelte-i18n插件实现国际化多语言配置。支持中文、英文、繁体三种语言。
代码语言:javascript复制npm i svelte-i18n
代码语言:javascript复制/**
* 国际化语言配置
* @author YXY
*/
import { addMessages, init, getLocaleFromNavigator } from 'svelte-i18n'
import { browser } from '$app/env'
import Storage from '@/utils/storage'
// 引入语言配置
import cn from '@/locale/zh-CN'
import tw from '@/locale/zh-TW'
import en from '@/locale/en-US'
export const langKey = 'lang'
export const langVal = 'cn'
addMessages('cn', cn)
addMessages('tw', tw)
addMessages('en', en)
const lang = getLang()
console.log('当前国际化:', lang)
init({
fallbackLocale: lang,
initialLocale: getLocaleFromNavigator()
})
setHtmlLang(lang)
/* 获取语言 */
export function getLang() {
const lang = Storage.get(langKey)
return lang || langVal
}
/* 持久化存储 */
export function setLang(lang, reload = false) {
if(lang != getLang()) {
Storage.set(langKey, lang || '')
setHtmlLang(lang)
// 重载页面
if(reload) {
window.location.reload()
}
}
}
svelte-admin动态图表
在svelte.js中使用Echarts来实现动态图表功能。
代码语言:javascript复制/**
* @title 动态图表Hooks
* @author YXY
*/
import * as echarts from 'echarts'
import elementResizeDetector from "element-resize-detector"
import utils from '@/utils'
export const useCharts = async(node, options) => {
let chartInstance
let chartNode = null
let erd = elementResizeDetector()
const resizeFn = utils.debounce(() => {
chartInstance.resize()
}, 100)
if(node) {
chartInstance = echarts.init(node)
chartInstance.setOption(options)
chartNode = chartInstance
}
erd.listenTo(node, resizeFn)
}