一、前言
網上很多後臺管理系統都是pc網頁端,手機端的後臺系統相對比較少。而跨端的移動端後臺管理模板少之又少。於是自己就使用uniapp+uview-ui+uni-ui
搗鼓了一個跨裝置後臺管理系統uniapp-uadmin專案。
uni-uAdmin專案是一款基於uniapp+vue.js+uView-ui+uni-ui+mock.js
等技術開發的跨端後臺管理系統模板專案。
二、技術框架
- 編輯器:HbuilderX3.3.5
- 使用技術:vue+uniapp+uViewUI+mockjs
- 彈窗元件:ua-popup(基於uni-app跨端彈框元件)
- 表格元件:ua-table(基於uni-app封裝的多功能表格)
- 自定義元件:uaDock全新的dock風格tabbar元件
- 圖表元件:u-charts圖表庫
- 模擬資料:mock.js
全新的毛玻璃視覺UI質感,使用了圖表、自定義表格、表單、瀑布流及圖文編輯器
等業務模組,動態許可權管理,錯誤頁處理,可編譯至H5+小程式+APP端
三、專案結構目錄
四、公共模板
頁面整體分為頂部自定義導航條+內容區域+底部dock選單三大部分。
<!-- 公共頁面模板 -->
<template>
<view class="ua__pageview flexbox flex-col" :style="{'--SKIN': $store.state.skin, 'background': bgcolor, 'color': color}">
<slot name="header" />
<!-- //主容器 -->
<view class="ua__scrollview flex1">
<slot />
</view>
<!-- //底部 -->
<slot name="footer" />
<!-- //dock選單 -->
<ua-dock v-if="dock && dock != 'false'" @click="handleDockClick" />
<!-- //函式式彈框 -->![
<ua-popup ref="uapopup" />](/img/bVcXG8X)
<!-- //換膚彈框模板 -->
<ua-popup v-model="isVisibleSkin" position="right">
<Skin />
</ua-popup>
</view>
</template>
支援動態元件式控制許可權及錯誤頁自動跳轉提示。
專案中比較創新的一個部分就是底部dock選單,可以和uniapp原生tabbar切換一樣,可以左右滑動切換,可以自定義圖示及標題文字。
<!-- //底部dock選單 -->
<template>
<view class="ua__dockbar">
<scroll-view class="ua__dock-scroll ua__filter" :class="platform" scroll-x :style="{'background': bgcolor}">
<view class="ua__dock-wrap">
<!-- Tab選單項 -->
<block v-for="(item, index) in menu" :key="index">
<view v-if="item.type == 'divider'" class="ua__dock-divider"></view>
<view v-else class="ua__dock-item" :class="currentTabIndex == index ? 'cur' : ''" @click="switchTab(index, item)">
<text v-if="item.icon" class="iconfont nvuefont" :class="item.icon">{{item.icon}}</text>
<image v-if="item.img" :src="item.img" class="iconimg" :style="{'font-size': item.iconSize}" />
<text v-if="item.badge" class="ua__badge ua__dock-badge">{{item.badge}}</text>
<text v-if="item.dot" class="ua__badge-dot ua__dock-badgeDot"></text>
</view>
</block>
</view>
</scroll-view>
</view>
</template>
選單的props選項可傳入如下引數配置。
props: {
// 當前索引
current: { type: [Number, String], default: 0 },
// 背景色
bgcolor: { type: String, default: null },
/**
* [ 選單選項 ]
type 選單型別 type: 'tab'支援uni.switchTab切換 type: 'divider'分割線
path 選單頁面地址
icon 選單圖示-iconfont圖示
img 選單圖片
color 選單圖示顏色
title 標題
badge 圓點數字
dot 小紅點
*/
menu: {
type: Array,
default: () => [
/* Tab選單 */
{
type: 'tab',
path: '/pages/index/index',
icon: `\ue619`,
color: '#2979ff',
title: '首頁',
},
{
type: 'tab',
path: '/pages/component/index',
icon: 'icon-component',
color: '#17c956',
title: '元件',
badge: 5,
},
{
type: 'tab',
path: '/pages/permission/index',
icon: 'icon-auth',
color: '#f44336',
title: '許可權管理',
},
{
type: 'tab',
path: '/pages/setting/index',
icon: 'icon-wo',
color: '#8d1cff',
title: '設定',
dot: true,
},
{
path: '/pages/error/404',
img: require('@/static/mac/keychain.png'),
title: '錯誤頁面',
},
{ type: 'divider' },
/* Nav選單 */
{
img: require('@/static/logo.png'),
title: 'github',
},
{
img: 'https://www.uviewui.com/common/logo.png',
title: 'gitee',
},
{
img: require('@/static/mac/colorsync.png'),
title: '皮膚',
},
{
img: require('@/static/mac/info.png'),
title: '關於',
},
{ type: 'divider' },
{
img: require('@/static/mac/bin.png'),
title: '回收站',
badge: 12,
},
]
},
},
// Tab切換
switchTab(index, item) {
if(item.path) {
let type = item.type == 'tab' ? 'switchTab' : 'navigateTo'
uni[type]({
url: item.path,
})
}else {
if(item.type == 'tab') {
this.currentTabIndex = index
}
}
this.$emit('click', index)
}
另外專案中使用的表格元件也是自己研發的一款uniapp表格元件外掛。
ua-table 支援多行、多列,表頭固定,自定義slot插槽內容,點選行列返回資料等功能。
使用非常簡單,如下,建立一個簡單表格。
<ua-table
:columns="columns"
headerBgColor="#eee"
:headerBold="true"
stripe
padding="5px 0"
:data="data.list"
height="450rpx"
>
</ua-table>
<script>
import Mock from 'mockjs'
export default {
data() {
return {
columns: [
{type: 'index', align: 'center', width: 100, fixed: true}, // 索引序號
{prop: 'title', label: '標題', align: 'left', width: '350'},
{prop: 'num', label: '搜尋量', align: 'center', width: 120},
],
data: Mock.mock({
total: 100,
page: 1,
pagesize: 10,
'list|10': [
{
id: '@id()',
title: '@ctitle(10, 20)',
num: '@integer(1000,10000)'
}
]
}),
}
}
}
</script>
表格還支援類似餓了麼元件庫固定表頭及自定義內容。
<ua-table
:columns="columns"
headerBgColor="#eee"
:headerBold="true"
:stripe="true"
:data="data.list"
@row-click="handleRowClick"
@select="handleCheck"
height="750rpx"
style="border:1px solid #eee"
>
<template #default="{row, col, index}">
<block v-if="col.slot == 'image'">
<u-image :src="row.image" :lazy-load="true" height="100rpx" width="100rpx" @click="previewImage(row.image)" />
</block>
<block v-if="col.slot == 'switch'">
<u-switch v-model="row.switch" inactive-color="#fff" :size="36"></u-switch>
</block>
<block v-if="col.slot == 'tags'">
<u-tag :text="row.tags" bg-color="#607d8b" color="#fff" mode="dark" size="mini" />
</block>
<block v-if="col.slot == 'progress'">
<u-line-progress active-color="#1fb925" :percent="row.progress" :show-percent="false" :height="16"></u-line-progress>
</block>
<block v-if="col.slot == 'btns'">
<view class="ua__link success" @click.stop="handleFormEdit(row)">編輯</view>
<view class="ua__link error" @click.stop="handleDel(row, index)">刪除</view>
</block>
</template>
</ua-table>
<script>
/**
* uniapp自定義表格
* @author XY Q:282310962
*/
import Mock from 'mockjs'
export default {
data() {
return {
columns: [
{type: 'selection', align: 'center', width: 80, fixed: true}, // 多選
{type: 'index', align: 'center', width: 80, fixed: true}, // 索引序號
{prop: 'author', label: '作者', align: 'center', width: 120},
{prop: 'title', label: '標題', align: 'left', width: 350},
{slot: 'image', label: '圖片', align: 'center', width: 120},
{slot: 'switch', label: '推薦', align: 'center', width: 100},
{slot: 'tags', label: '標籤', align: 'center', width: 100},
{slot: 'progress', label: '熱度', align: 'center', width: 150},
{prop: 'date', label: '釋出時間', align: 'left', width: 300}, // 時間
{slot: 'btns', label: '操作', align: 'center', width: 150, fixed: 'right'}, // 操作
],
data: Mock.mock({
total: 100,
page: 1,
pagesize: 10,
'list|30': [
{
id: '@id()',
author: '@cname()',
title: '@ctitle(10, 20)',
image: 'https://picsum.photos/400/400?random=' + '@guid()',
switch: '@boolean()',
'tags|1': ['admin', 'test', 'dev'],
progress: '@integer(30, 90)',
date: '@datetime()'
}
]
}),
}
}
}
</script>
不過需要注意,uniapp多個v-for編譯到小程式,自定義插槽會失效,需要自己特殊處理一下。
OK,基於uniapp開發後臺系統的分享就到這裡,希望對大家有些幫助哈~~
最後附上一個uniapp短視訊專案
https://segmentfault.com/a/11...