1
lzhe
2024-06-05 fc15f2e904fade9e1505bad70b29829d7d99c124
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
<template>
    <div ref="" class="mobile-nav-button" @click="showMobileNav($event)" v-drag draggable="false"><el-icon><el-icon-menu /></el-icon></div>
 
    <el-drawer ref="mobileNavBox" title="移动端菜单" :size="240" v-model="nav" direction="ltr" :with-header="false" destroy-on-close>
        <el-container class="mobile-nav">
            <el-header>
                <div class="logo-bar"><img class="logo" src="img/logo.png"><span>{{ $CONFIG.APP_NAME }}</span></div>
            </el-header>
            <el-main>
                <el-scrollbar>
                    <el-menu :default-active="$route.meta.active || $route.fullPath" @select="select" router background-color="#212d3d" text-color="#fff" active-text-color="#409EFF">
                        <NavMenu :navMenus="menu"></NavMenu>
                    </el-menu>
                </el-scrollbar>
            </el-main>
        </el-container>
    </el-drawer>
 
</template>
 
<script>
    import NavMenu from './NavMenu.vue';
 
    export default {
        components: {
            NavMenu
        },
        data() {
            return {
                nav: false,
                menu: []
            }
        },
        computed:{
 
        },
        created() {
            var menu = this.$router.sc_getMenu()
            this.menu = this.filterUrl(menu)
        },
 
        watch: {
 
        },
        methods: {
            showMobileNav(e){
                var isdrag = e.currentTarget.getAttribute('drag-flag')
                if (isdrag == 'true') {
                    return false;
                }else{
                    this.nav = true;
                }
 
            },
            select(){
                this.$refs.mobileNavBox.handleClose()
            },
            //转换外部链接的路由
            filterUrl(map){
                var newMap = []
                map && map.forEach(item => {
                    item.meta = item.meta?item.meta:{};
                    //处理隐藏
                    if(item.meta.hidden || item.meta.type=="button"){
                        return false
                    }
                    //处理http
                    if(item.meta.type=='iframe'){
                        item.path = `/i/${item.name}`;
                    }
                    //递归循环
                    if(item.children&&item.children.length > 0){
                        item.children = this.filterUrl(item.children);
                    }
                    newMap.push(item)
                })
                return newMap;
            }
        },
        directives: {
            drag(el){
                let oDiv = el; //当前元素
                let firstTime='',lastTime='';
                //禁止选择网页上的文字
                // document.onselectstart = function() {
                //     return false;
                // };
                oDiv.onmousedown = function(e){
                    //鼠标按下,计算当前元素距离可视区的距离
                    let disX = e.clientX - oDiv.offsetLeft;
                    let disY = e.clientY - oDiv.offsetTop;
                    document.onmousemove = function(e){
                        oDiv.setAttribute('drag-flag', true);
                        firstTime = new Date().getTime();
                        //通过事件委托,计算移动的距离
                        let l = e.clientX - disX;
                        let t = e.clientY - disY;
 
                        //移动当前元素
 
                        if(t > 0 && t < document.body.clientHeight - 50){
                            oDiv.style.top = t + "px";
                        }
                        if(l > 0 && l < document.body.clientWidth - 50){
                            oDiv.style.left = l + "px";
                        }
 
 
                    }
                    document.onmouseup = function(){
                        lastTime = new Date().getTime();
                        if( (lastTime - firstTime)>200 ){
                            oDiv.setAttribute('drag-flag', false);
                        }
                        document.onmousemove = null;
                        document.onmouseup = null;
                    };
                    //return false不加的话可能导致黏连,就是拖到一个地方时div粘在鼠标上不下来,相当于onmouseup失效
                    return false;
                };
            }
        }
    }
</script>
 
<style scoped>
    .mobile-nav-button {position: fixed;bottom:10px;left:10px;z-index: 10;width: 50px;height: 50px;background: #409EFF;box-shadow: 0 2px 12px 0 rgba(64, 158, 255, 1);border-radius: 50%;display: flex;align-items: center;justify-content: center;}
    .mobile-nav-button i {color: #fff;font-size: 20px;}
 
    .mobile-nav {background: #212d3d;}
    .mobile-nav .el-header {background: transparent;border: 0;}
    .mobile-nav .el-main {padding:0;}
    .mobile-nav .logo-bar {display: flex;align-items: center;font-weight: bold;font-size: 20px;color: #fff;}
    .mobile-nav .logo-bar img {width: 30px;margin-right: 10px;}
    .mobile-nav .el-submenu__title:hover {background: #fff!important;}
</style>