houzhongjian
2024-12-05 2717813966ced88c6a1635663dd01b502158a1b8
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
<script lang="ts" setup>
import { computed, onMounted, ref, unref, watch } from 'vue'
import { useAppStore } from '@/store/modules/app'
import { useUserStoreWithOut } from '@/store/modules/user'
import { usePermissionStoreWithOut } from '@/store/modules/permission'
import { useDesign } from '@/hooks/web/useDesign'
import {isRelogin} from "@/config/axios/service";
import router from "@/router";
import type {RouteRecordRaw} from "vue-router";
import {CACHE_KEY, useCache, useSessionCache} from "@/hooks/web/useCache";
import {getAccessToken} from "@/utils/auth";
import {getInfo} from "@/api/login";
const { wsCache } = useCache()
const { wsSessionCache } = useSessionCache()
 
defineOptions({ name: 'Logo' })
 
const { getPrefixCls } = useDesign()
 
const prefixCls = getPrefixCls('logo')
 
const appStore = useAppStore()
 
const show = ref(true)
 
const homePath = ref('/index')
 
const title = computed(() => appStore.getTitle)
 
const layout = computed(() => appStore.getLayout)
 
const collapse = computed(() => appStore.getCollapse)
 
homePath.value = '/index'
 
onMounted(() => {
  if (unref(collapse)) show.value = false
})
 
watch(
  () => collapse.value,
  (collapse: boolean) => {
    if (unref(layout) === 'topLeft' || unref(layout) === 'cutMenu') {
      show.value = true
      return
    }
    if (!collapse) {
      setTimeout(() => {
        show.value = !collapse
      }, 400)
    } else {
      show.value = !collapse
    }
  }
)
 
watch(
  () => layout.value,
  (layout) => {
    if (layout === 'top' || layout === 'cutMenu') {
      show.value = true
    } else {
      if (unref(collapse)) {
        show.value = false
      } else {
        show.value = true
      }
    }
  }
)
 
/** 刷新所有菜单权限 */
const gotoHome = async () => {
  const permissionStore = usePermissionStoreWithOut()
  isRelogin.show = true
  let userInfo = await getInfo()
  wsCache.set(CACHE_KEY.USER, userInfo)
  wsSessionCache.set(CACHE_KEY.ROLE_ROUTERS, userInfo.menus)
  isRelogin.show = false
  // 后端过滤菜单
  await permissionStore.generateRoutes()
  permissionStore.getAddRouters.forEach((route) => {
    router.addRoute(route as unknown as RouteRecordRaw) // 动态添加可访问路由表
  })
}
 
</script>
 
<template>
  <div>
    <router-link
      :class="[
        prefixCls,
        layout !== 'classic' ? `${prefixCls}__Top` : '',
        'flex !h-[var(--logo-height)] items-center cursor-pointer pl-8px relative decoration-none overflow-hidden'
      ]"
      @click="gotoHome"
      :to="homePath"
    >
      <img
        class="h-[calc(var(--logo-height)-10px)] w-[calc(var(--logo-height)-10px)]"
        src="@/assets/imgs/logo.png"
      />
      <div
        v-if="show"
        :class="[
          'ml-10px text-16px font-700',
          {
            'text-[var(--logo-title-text-color)]': layout === 'classic',
            'text-[var(--top-header-text-color)]':
              layout === 'topLeft' || layout === 'top' || layout === 'cutMenu'
          }
        ]"
      >
        {{ title }}
      </div>
    </router-link>
  </div>
</template>