uniapp-vue3-oadmin手機後臺例項|vite5.x+uniapp多端仿ios管理系統

xiaoyan2017發表於2024-05-21

原創vue3+uniapp+uni-ui跨端仿ios桌面後臺OA管理模板Uni-Vue3-WeOS

uniapp-vue3-os一款基於uni-app+vite5.x+pinia等技術開發的仿ios手機桌面OA管理系統。實現了自定義桌面柵格磁貼布局、多分屏滑動管理、自定義桌面小部件、輔助觸控懸浮球等功能。支援編譯到H5+小程式端+App端

預覽效果

執行到H5/小程式端/APP端效果。

原創自研手機OA磁貼柵格卡片佈局引擎。親測在h5+小程式+App端效果基本保持一致。

使用技術

  • 編輯器:HbuilderX 4.15
  • 技術框架:uniapp+vite5.x+vue3+pinia2
  • UI元件庫:uni-ui+uv-ui(uniapp vue3元件庫)
  • 彈框元件:uv3-popup(基於uniapp+vue3自定義彈框元件)
  • 表格元件:uv3-table(基於uniapp+vue3增強版表格)
  • 模擬資料:mockjs(用於自定義表格模擬資料)
  • 快取技術:pinia-plugin-unistorage
  • 支援編譯:h5+小程式端+app端

另外在PC端則以750px佈局顯示,表現依然perfect~~

uni-vue3-oadmin專案使用到的table表格元件uv3Table全新自研的一款跨多端(h5/小程式/App端)增強版自定義表格元件。

https://www.cnblogs.com/xiaoyan2017/p/18199130

專案結構

使用hbuilderx4.15編輯器,採用vue3 setup語法編碼開發。內建構建工具升級到了Vite5.2.8版本。

目前該專案已經上架到我的作品集,如果有需要的話,歡迎去下載使用。

https://gf.bilibili.com/item/detail/1105982011

公共佈局模板Layout

<script setup>
    import { ref } from 'vue'
    import { appStore } from '@/pinia/modules/app'
    
    const appState = appStore()
    
    // #ifdef MP-WEIXIN
    defineOptions({
        /**
         * 解決小程式class、id透傳問題(vue3寫法)
         * manifest.json中配置mergeVirtualHostAttributes: true, 在微信小程式平臺不生效,元件外部傳入的class沒有掛到元件根節點上
         * https://github.com/dcloudio/uni-ui/issues/753
         */
        options: { virtualHost: true }
    })
    // #endif
    const props = defineProps({
        showBackground: { type: [Boolean, String], default: true },
    })
    
    // 自定義變數(桌面圖示)
    const deskVariable = ref({
        '--icon-radius': '15px', // 圓角
        '--icon-size': '118rpx', // 圖示尺寸
        '--icon-gap-col': '25px', // 水平間距
        '--icon-gap-row': '45px', // 垂直間距
        '--icon-labelSize': '12px', // 標籤文字大小
        '--icon-labelColor': '#fff', // 標籤顏色
        '--icon-fit': 'contain', // 圖示自適應模式
    })
</script>

<template>
    <view class="uv3__container flexbox flex-col flex1" :style="deskVariable">
        <!-- 頂部插槽 -->
        <slot name="header" />
        
        <!-- 內容區 -->
        <view class="uv3__scrollview flex1">
            <slot />
        </view>
        
        <!-- 底部插槽 -->
        <slot name="footer" />
        
        <!-- 背景圖(修復小程式不支援background背景圖) -->
        <image v-if="showBackground" class="fixwxbg" :src="appState.config.skin || '/static/skin/theme.png'" mode="scaleToFill" />
    </view>
</template>

emmm,怎麼樣,是不是感覺還行~~ 哈哈,這也是經歷了無數個日夜的爆肝開發,目前該專案正式的完結了。

桌面佈局模板

<!-- 桌面模板 -->
<script setup>
    import { ref } from 'vue'
    
    import Desk from './components/desk.vue'
    import Dock from './components/dock.vue'
    import Touch from './components/touch.vue'
</script>

<template>
    <uv3-layout>
        <!-- 桌面選單 -->
        <Desk />
        
        <template #footer>
            <!-- 底部導航 -->
            <Dock />
        </template>
        <!-- 懸浮球(輔助觸控) -->
        <Touch />
    </uv3-layout>
</template>

桌面卡片式柵格磁貼模板

桌面os選單採用json配置

/**
 * label 圖示標題
 * imgico 圖示(本地或網路圖片) 當type: 'icon'則為uni-icons圖示名,當type: 'widget'則為自定義小部件標識名
 * type 圖示型別(icon | widget) icon為uni-icons圖示、widget為自定義小部件
 * path 跳轉路由頁面
 * link 跳轉外部連結
 * hideLabel 是否隱藏圖示標題
 * background 自定義圖示背景色
 * size 柵格磁貼布局(16種) 1x1 1x2 1x3 1x4、2x1 2x2 2x3 2x4、3x1 3x2 3x3 3x4、4x1 4x2 4x3 4x4
 * onClick 點選圖示回撥函式
* children 二級選單
*/

配置children引數,則以二級選單彈窗展示。

<template>
    <swiper
        class="uv3__deskmenu"
        :indicator-dots="true"
        indicator-color="rgba(255,255,255,.5)"
        indicator-active-color="#fff"
    >
        <swiper-item v-for="(mitem, mindex) in deskMenu" :key="mindex">
            <view class="uv3__gridwrap">
                <view v-for="(item, index) in mitem.list" :key="index" class="uv3__gridwrap-item" @click="handleClickDeskMenu(item)">
                    <!-- 圖示 -->
                    <view class="ico" :style="{'background': item.background}">
                        <!-- 二級選單 -->
                        <template v-if="Array.isArray(item.children)">
                            <view class="uv3__gridwrap-thumb">
                                ...
                            </view>
                        </template>
                        <template v-else>
                            <template v-if="item.type == 'widget'">
                                <!-- 自定義部件 -->
                                <component :is="item.imgico" />
                            </template>
                            <template v-else>
                                <!-- 自定義圖示 -->
                                ...
                            </template>
                        </template>
                    </view>
                    <!-- 標籤 -->
                    <view v-if="!item.hideLabel" class="label clamp2">{{item.label}}</view>
                </view>
            </view>
        </swiper-item>
    </swiper>
    
    <!-- 桌面二級選單彈窗 -->
    <Popup v-model="deskPopupVisible">
        <view class="uv3__deskpopup">
            ...
        </view>
    </Popup>

    ...
</template>

點選桌面選單,開啟連結地址、跳轉路由頁面、二級彈窗、自定義繫結事件等方式。當然也可以進行一些其它定製化邏輯處理。

const handleClickDeskMenu = (item) => {
    if(item.link) {
        // 連結
        openURL(item.link)
    }else if(item.path) {
        // 頁面路由地址
        uni.navigateTo({
            url: item.path.substr(0, 1) == '/' ? item.path : '/' + item.path
        })
    }else if(Array.isArray(item.children)) {
        // 二級選單
        deskPopupMenu.value = item
        deskPopupVisible.value = true
    }
    // 繫結點選事件
    typeof item.onClick === 'function' && item.onClick()
}

桌面選單JSON配置項示例

const deskMenu = ref([
    {
        pid: 20240507001,
        list: [
            {label: '今日', imgico: 'today', type: 'widget', hideLabel: true, size: '2x1'},
            {label: '天氣', imgico: 'weather', type: 'widget', hideLabel: true, size: '2x1'},
            {label: '日曆', imgico: 'fullcalendar', type: 'widget', path: 'pages/calendar/index', size: '4x2'},
            // {label: '日曆', imgico: 'date', type: 'widget', size: '2x2'},
            // {label: '備忘錄', imgico: 'note', type: 'widget', size: '2x2'},
            {label: 'audio', imgico: 'audio', type: 'widget', size: '2x1'},
            {
                label: '相簿', imgico: '/static/svg/huaban.svg', background: '#00aa7f',
                onClick: () => {
                    // ...
                }
            },
            ...
        ]
    },
    ...
    {
        pid: 20240510001,
        list: [
            {label: 'Github', imgico: '/static/svg/github.svg', background: '#607d8b', size: '3x1'},
            {label: '碼雲Gitee', imgico: '/static/svg/gitee.svg', background: '#bb2124',},
            {label: '抖音', imgico: '/static/svg/douyin.svg', background: '#1c0b1a', size: '1x2'},
            {label: 'ChatGPT', imgico: '/static/svg/chatgpt.svg', hideLabel: true, background: '#11b6a7', size: '3x2'},
            ...
        ]
    },
    {
        pid: 20240511003,
        list: [
            {label: 'uni-app', imgico: '/static/uni.png', link: 'https://uniapp.dcloud.net.cn/'},
            {label: 'vitejs官方文件', imgico: '/static/vite.png', link: 'https://vitejs.dev/'},
            {
                label: '主題桌布', imgico: 'color-filled', type: 'icon',
                onClick: () => {
                    // ...
                }
            },
            {label: '日曆', imgico: 'calendar', type: 'widget', path: 'pages/calendar/index', background: '#fff',},
            {label: '首頁', imgico: 'home', type: 'icon', path: 'pages/index/index'},
            {label: '工作臺', imgico: 'shop-filled', type: 'icon', path: 'pages/index/dashboard'},
            {
                label: '元件',
                'children': [
                    {label: '元件', imgico: '/static/svg/component.svg', path: 'pages/component/index'},
                    {label: '表格', imgico: '/static/svg/table.svg', path: 'pages/component/table'},
                    ...
                ]
            },
            ...
            {
                label: '關於', imgico: 'info-filled', type: 'icon',
                onClick: () => {
                    // ...
                }
            },
            {
                label: '公眾號', imgico: 'weixin', type: 'icon',
                onClick: () => {
                    // ...
                }
            },
        ]
    }
])

整個專案採用毛玻璃模糊化UI視覺效果。簡單的實現了表格、表單、編輯器、使用者管理/角色管理等常用業務功能。旨在探索uniapp全新的手機後臺管理系統方案,當然也可以在此基礎上做一些其它創新,加上一些定製化功能模組。

OK,以上就是uniapp+vue3開發手機OA管理管理系統的一些分享,希望對大家有些幫助哈!

最後附上兩個最新例項專案

https://www.cnblogs.com/xiaoyan2017/p/18165578

https://www.cnblogs.com/xiaoyan2017/p/18092224

相關文章