uni-uadmin后台管理系統|uniapp+uView跨端后台框架實例


基於uniapp+uview+uni-ui跨平台手機端后台管理系統UniappUAdmin

uniapp-uadmin 基於uni-app+uView+uniUI研發的跨端手機后台管理系統項目。全新的毛玻璃視覺UI界面,內置了圖表、自定義表格、表單、瀑布流及圖文編輯器等業務模塊,動態權限管理,錯誤頁處理,支持編譯至H5+小程序+APP端

如上圖:編譯到H5+APP+小程序端效果

◆ 技術棧

  • 編碼器:HbuilderX3.3.5
  • 框架技術:vue.js+uniapp+vuex+mockjs
  • UI組件庫:uView-ui+uni-ui
  • 彈窗組件:ua-popup(基於uni-app跨端彈框組件)
  • 表格組件:ua-table(基於uni-app封裝的多功能表格)
  • 自定義組件:uaDock全新的dock風格tabbar組件
  • 圖表組件:u-charts圖表庫
  • 模擬數據:mock.js

◆ 功能特色

✅ 全新替代tabbar動態毛玻璃菜單Dock
✅ 支持動態權限管理、錯誤頁處理
✅ 內置多圖表組件、表格、表單、瀑布流列表及富文本編輯器
✅ 支持編譯h5+APP+小程序端

◆ 目錄結構

整個項目采用標准的模糊化結構開發方式,所有表格數據使用mock.js模擬。

◆ 公共模板UAPage

<!-- 公共頁面模板 -->
<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" />
        
        <!-- //換膚彈框模板 -->
        <ua-popup v-model="isVisibleSkin" position="right">
            <Skin />
        </ua-popup>
    </view>
</template>

項目中頂部導航條及彈窗組件,使用自定義組件實現,之前有分享過相關的介紹文章。

https://www.cnblogs.com/xiaoyan2017/p/14978408.html

https://www.cnblogs.com/xiaoyan2017/p/14993445.html

◆ uniapp毛玻璃模糊視覺Dock

項目中的底部dock菜單采用了背景模糊化效果,替代了系統tabbar組件。可左右絲滑滾動,圖標支持iconfont和圖片,另外還支持badge圓點數字提示。選項支持切換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自定義表格組件

這一次項目一大亮點,uniapp多功能自定義表格組件。網上也有很多uniapp表格組件,比較簡陋、功能性並不好。於是就自研了這款ua-table表格組件。

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>
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>

注意:自定義插槽,需要將字段屬性改為slot: xxx

當初開發這款表格組件遇到最大的一個問題就是,在小程序端slot不支持動態:name,明明這樣就可以完美實現動態slot功能

 <slot :name="col.slot" :row="row" :col="col" :index="rIndex" /> 

在小程序端怎么都沒反應,還報錯一大推。萬般無奈,最后只能采用這種兼容寫法。

 <block v-if="col.slot"><slot :row="row" :col="col" :index="rIndex" /></block> 

如果大家有更好的解決方法,歡迎留言一起交流學習。

 

Okay,以上就是今天的分享,后續還會分享一些最新實例項目,希望可以喜歡哈~~

最后附上一個uniapp短視頻直播項目

uni-app+uviewUI仿抖音小視頻:https://www.cnblogs.com/xiaoyan2017/p/15312146.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM