gin-vue-admin/web/src/view/layout/header/index.vue

141 lines
4.3 KiB
Vue

<!--
@auther: bypanghu<bypanghu@163.com>
@date: 2024/5/7
!-->
<template>
<div class="flex justify-between fixed top-0 left-0 right-0 z-10 h-16 bg-white text-slate-700 dark:text-slate-300 dark:bg-slate-900 shadow dark:shadow-gray-700 flex items-center px-2">
<div
class="flex items-center cursor-pointer flex-1"
>
<div class="flex items-center cursor-pointer" @click="router.push({ path: '/' })">
<img
alt
class="h-12 bg-white rounded-full"
:src="$GIN_VUE_ADMIN.appLogo"
>
<div
v-if="!isMobile"
class="inline-flex font-bold text-2xl ml-2"
: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
class="cursor-pointer flex justify-center items-center text-black dark:text-gray-100"
>
<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"
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>