鸿蒙智能电子锁前端项目
he wei
2025-03-19 9b3d984360975e5dbae89ec6233e7a893e9217b9
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
<template>
  <div :class="classObj" class="app-wrapper">
    <div v-if="device === 'mobile' && sidebar.opened" class="drawer-bg" @click="handleClickOutside" />
    <!--    <sidebar class="sidebar-container" />-->
    <div :class="{ hasTagsView: needTagsView }" class="main-container">
      <div :class="{ 'fixed-header': fixedHeader }">
        <navbar />
        <tags-view v-if="needTagsView" />
      </div>
      <app-main />
      <right-panel v-if="showSettings">
        <settings />
      </right-panel>
    </div>
  </div>
  <el-drawer v-model="isCollapseM" title="I am the title" direction="ltr" size="300px" :with-header="false"
    :before-close="handleClose">
    <sidebar class="sidebar-container" />
  </el-drawer>
</template>
 
<script>
    import RightPanel from "@/components/RightPanel";
    import { AppMain, Navbar, Settings, TagsView, Sidebar } from "./components";
    import ResizeMixin from "./mixin/ResizeHandler";
    import { mapState } from "pinia";
    import store from "@/store";
    import { defineComponent } from "vue";
    import changeTheme from "@/utils/changeTheme.js";
    import { throttle } from "@/utils/throttle.js";
    import { pingpong } from "@/api/user";
    import config from '@/utils/config.js';
    const { ukey, face } = config;
 
    const throttleConect = throttle(pingpong, 1000);
 
    export default defineComponent({
        name: "LayoutIndex",
        components: {
            AppMain,
            Navbar,
            RightPanel,
            Settings,
            TagsView,
            Sidebar,
        },
        watch: {
            theme() {
                changeTheme(this.theme);
            },
            isCollapse: {
                handler(val) {
                    this.isCollapseM = val;
                },
                immediate: true,
            },
            isIn: {
                async handler(val) {
                    if (ukey && !val) {
                        await store.user().logout();
                        // console.log('logout', '=============');
 
                        router.push(`/login?redirect=${route.fullPath}`);
                    }
                },
                immediate: true
            }
        },
        mixins: [ResizeMixin],
        computed: {
            ...mapState(store.app, ["sidebar"]),
            ...mapState(store.app, ["sidebar", "device"]),
            ...mapState(store.ukey, ["isIn"]),
            ...mapState(store.settings, {
                theme: "theme",
                showSettings: "showSettings",
                needTagsView: "tagsView",
                fixedHeader: "fixedHeader",
                secondMenuPopup: "secondMenuPopup",
            }),
            ...mapState(store.user, ['name', 'sessionid']),
            classObj() {
                return {
                    hideSidebar: !this.sidebar.opened,
                    openSidebar: this.sidebar.opened,
                    withoutAnimation: this.sidebar.withoutAnimation,
                    mobile: this.device === "mobile",
                };
            },
            isCollapse() {
                if (this.secondMenuPopup) {
                    return true;
                }
                return !this.sidebar.opened;
            },
        },
        data() {
            return {
                isCollapseM: false,
            };
        },
        methods: {
            handleClickOutside() {
                store.app().closeSidebar({ withoutAnimation: false });
            },
            handleClose() {
                store.app().toggleSidebar();
            },
        },
        beforeMount() {
            changeTheme(this.theme);
        },
        mounted() {
            document.addEventListener("click", () => throttleConect(this.sessionid, this.name));
            document.addEventListener("mousemove", () => throttleConect(this.sessionid, this.name));
            document.addEventListener("keydown", () => throttleConect(this.sessionid, this.name));
        },
        unMounted() {
            document.removeEventListener("click", () => throttleConect(this.sessionid, this.name));
            document.removeEventListener("mousemove", () => throttleConect(this.sessionid, this.name));
            document.removeEventListener("keydown", () => throttleConect(this.sessionid, this.name));
        },
    });
</script>
 
<style lang="scss" scoped>
@use "@/styles/mixin.scss";
 
.app-wrapper {
  // @include clearfix;
  position: relative;
  height: 100%;
  width: 100%;
 
  &.mobile.openSidebar {
    position: fixed;
    top: 0;
  }
}
 
.drawer-bg {
  background: #000;
  opacity: 0.3;
  width: 100%;
  top: 0;
  height: 100%;
  position: absolute;
  z-index: 999;
}
 
.fixed-header {
  position: fixed;
  top: 0;
  right: 0;
  z-index: 9;
  width: calc(100%);
  transition: width 0.28s;
}
 
.hideSidebar .fixed-header {
  width: calc(100%);
}
 
.mobile .fixed-header {
  width: 100%;
}
</style>