Files
safePower/src/view/layout/header/index.vue

139 lines
4.2 KiB
Vue
Raw Normal View History

2026-04-29 09:15:49 +08:00
<!--
@auther: bypanghu<bypanghu@163.com>
@date: 2024/5/7
!-->
<template>
<div
2026-06-11 18:45:44 +08:00
class="gva-tech-header flex justify-between fixed top-0 left-0 right-0 z-10 h-16 items-center px-2"
2026-04-29 09:15:49 +08:00
>
<div class="flex items-center cursor-pointer flex-1">
<div
class="flex items-center justify-center cursor-pointer"
:class="isMobile ? '' : 'min-w-48'"
@click="router.push({ path: '/' })"
>
<Logo />
<div
v-if="!isMobile"
2026-06-11 18:45:44 +08:00
class="gva-tech-brand inline-flex font-bold text-2xl ml-2"
2026-04-29 09:15:49 +08:00
:class="
(config.side_mode === 'head' ||
config.side_mode === 'combination') &&
'min-w-fit'
"
>
{{ $GIN_VUE_ADMIN.appName }}
</div>
</div>
<el-breadcrumb
v-show="!isMobile"
v-if="config.side_mode !== 'head' && config.side_mode !== 'combination'"
class="ml-4"
>
<el-breadcrumb-item
v-for="item in matched.slice(1, matched.length)"
:key="item.path"
>
{{ fmtTitle(item.meta.title, route) }}
</el-breadcrumb-item>
</el-breadcrumb>
<gva-aside
v-if="config.side_mode === 'head' && !isMobile"
class="flex-1"
/>
<gva-aside
v-if="config.side_mode === 'combination' && !isMobile"
mode="head"
class="flex-1"
/>
</div>
<div class="ml-2 flex items-center">
<tools />
<el-dropdown>
<div class="flex justify-center items-center h-full w-full">
<span
2026-06-11 18:45:44 +08:00
class="cursor-pointer flex justify-center items-center text-cyan-50"
2026-04-29 09:15:49 +08:00
>
<CustomPic />
<span v-show="!isMobile" class="w-16">{{
userStore.userInfo.nickName
}}</span>
<el-icon>
<arrow-down />
</el-icon>
</span>
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>
<span class="font-bold">
当前角色{{ userStore.userInfo.authority.authorityName }}
</span>
</el-dropdown-item>
<template v-if="userStore.userInfo.authorities">
<el-dropdown-item
v-for="item in userStore.userInfo.authorities.filter(
(i) => i.authorityId !== userStore.userInfo.authorityId
)"
:key="item.authorityId"
@click="changeUserAuth(item.authorityId)"
>
<span> 切换为{{ item.authorityName }} </span>
</el-dropdown-item>
</template>
<el-dropdown-item icon="avatar" @click="toPerson">
个人信息
</el-dropdown-item>
<el-dropdown-item icon="reading-lamp" @click="userStore.LoginOut">
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</div>
</template>
<script setup>
import tools from './tools.vue'
import CustomPic from '@/components/customPic/index.vue'
import { useUserStore } from '@/pinia/modules/user'
import { useRoute, useRouter } from 'vue-router'
import { useAppStore } from '@/pinia'
import { storeToRefs } from 'pinia'
import { computed } from 'vue'
import { setUserAuthority } from '@/api/user'
import { fmtTitle } from '@/utils/fmtRouterTitle'
import gvaAside from '@/view/layout/aside/index.vue'
import Logo from '@/components/logo/index.vue'
const userStore = useUserStore()
const router = useRouter()
const route = useRoute()
const appStore = useAppStore()
const { device, config } = storeToRefs(appStore)
const isMobile = computed(() => {
return device.value === 'mobile'
})
const toPerson = () => {
router.push({ name: 'person' })
}
const matched = computed(() => route.meta.matched)
const changeUserAuth = async (id) => {
const res = await setUserAuthority({
authorityId: id
})
if (res.code === 0) {
window.sessionStorage.setItem('needCloseAll', 'true')
window.sessionStorage.setItem('needToHome', 'true')
window.location.reload()
}
}
</script>
<style scoped lang="scss"></style>