zsy-recycling-supervision-a.../src/pages/main-zone/header-bar/UserPanel.vue

236 lines
5.8 KiB
Vue

<template>
<IxDropdown :trigger="currentTab==='1'?'hover':'click'" placement="bottom">
<div class="user-info-container">
<div>
<div>{{ appUserStore.nickname }}</div>
<div v-if="tenantName">{{ tenantName }}</div>
</div>
<IxAvatar :src="avatar" class="avatar"/>
</div>
<template #overlay>
<div class="opt-panel ix-global-hghjyn">
<div>
<div>{{ appUserStore.nickname }}</div>
<div v-if="tenantName">{{ tenantName }}</div>
</div>
<IxTabs v-model:selectedKey="currentTab" :dataSource="tabsDtaSource" :forceRender="false" type="segment">
<template #content="{ key }">
<IxEmpty v-if="key === '1' && appSettingStore.collectedMenus.length === 0"/>
<IxList v-else-if="key === '1' && appSettingStore.collectedMenus.length > 0">
<IxListItem v-for="item in appSettingStore.collectedMenus">
<IxButton mode="text" @click="openMenuHandler(item)">
{{ item.title }}
<IxIcon name="jumpz"/>
</IxButton>
<IxIcon class="menu-bookmarked" name="bookmark" @click.stop="bookmarkHandler(item)"/>
</IxListItem>
</IxList>
<UserInfo v-else-if="key === '2'"/>
<ModifyPwdForm v-else-if="key === '3'"/>
<Settings v-else-if="key === '4'"/>
</template>
</IxTabs>
<IxButton @click="logoutHandler">退</IxButton>
</div>
</template>
</IxDropdown>
</template>
<script lang="ts" setup>
import { useAppUserStore } from '@/common/app/app-user-store.ts'
import Strings from '@/common/utils/strings.ts'
import defaultAvatar from '@/assets/images/avatar.png'
import LoginApi from '@/pages/login/login-api.ts'
import Evt from '@/common/utils/evt.ts'
import { useAppSettingStore } from '@/common/app/app-setting-store.ts'
import Settings from '@/pages/main-zone/header-bar/Settings.vue'
import ModifyPwdForm from '@/pages/main-zone/header-bar/ModifyPwdForm.vue'
import UserInfo from '@/pages/main-zone/header-bar/UserInfo.vue'
import { VKey } from '@idux/cdk'
import Nav from '@/common/router/nav.ts'
import { downloadBaseUrl } from '@/common'
import MenuPanelApi from '@/pages/main-zone/menu-panel/menu-panel-api.ts'
import Toast from '@/components/toast'
import { reloadUserInfo } from '@/common/app'
const appSettingStore = useAppSettingStore()
const appUserStore = useAppUserStore()
const currentTab = ref<VKey>('1')
const tabsDtaSource = [
{key: '1', title: '我的收藏'},
{key: '2', title: '基本资料'},
{key: '3', title: '修改密码'},
{key: '4', title: '系统设置'},
]
const avatar = computed(() => {
return Strings.isBlank(appUserStore.avatar) ? defaultAvatar : downloadBaseUrl + appUserStore.avatar!
})
const tenantName = computed(() => {
return appUserStore.tenantName
})
function logoutHandler() {
LoginApi.logout()
.finally(() => {
Evt.emit('logout')
})
}
function openMenuHandler(data: AppTypes.Menu) {
Nav.open(data.routeName)
}
function bookmarkHandler(data: AppTypes.Menu) {
MenuPanelApi.bookmark(data.id, false)
.then(() => {
Toast.success('已取消')
reloadUserInfo()
})
}
onUnmounted(() => {
Evt.off('logout')
})
</script>
<style lang="stylus" scoped>
.user-info-container {
display: flex;
margin: 0 1rem;
cursor: pointer;
height: 100%;
& > div:first-child {
text-align: right;
display: flex;
flex-direction: column;
justify-content: space-around;
margin-right: 1rem;
}
.avatar {
display block
margin auto
}
}
.menu-bookmarked {
color: var(--ix-color-warning)
}
:deep(.ix-list-item-content) {
display: flex
justify-content: space-between;
align-items: center;
}
.opt-panel {
box-shadow: var(--ix-box-shadow-md);
border-radius: 0.4rem;
display: flex;
flex-direction: column;
align-items: center;
& > div:first-child {
width 100%
display: flex;
flex-direction: column;
justify-content: space-around;
border-bottom: 1px solid var(--ix-color-border);
background-color: rgba(0, 46, 70, 0.04);
padding: 1rem;
}
:deep(.ix-tabs) {
width 100%
height 26rem
border-bottom: 1px solid var(--ix-color-border);
}
:deep(.ix-tabs .ix-tabs-nav-wrapper) {
height: calc(var(--ix-tabs-nav-font-size-md) * 3);
}
:deep(.ix-tabs .ix-tabs-pane-wrapper) {
height: calc(100% - var(--ix-tabs-nav-font-size-md) * 3);
padding 0
}
:deep(.ix-tabs .ix-tabs-pane-wrapper .ix-tabs-pane) {
height: 100%;
overflow-y auto
}
& > button:nth-child(3) {
display flex
width 20rem
margin: .6rem 0;
}
/*
& > div:nth-child(2) {
display: flex;
height: 3rem;
justify-content: space-around;
align-items: center;
border-bottom: 1px solid var(--ix-color-border);
& > div {
cursor: pointer;
flex: 1;
height: 100%;
text-align: center;
line-height: 3rem;
&::selection {
background-color: transparent;
}
}
& > div:nth-child(2) {
border-left: 1px solid var(--ix-color-border);
border-right: 1px solid var(--ix-color-border);
}
}
& > div:nth-child(3) {
height: 20rem;
width: 35rem;
display: flex;
flex-direction: column;
overflow-y: auto;
padding: 1rem;
& > div {
height: 3rem;
padding: 1rem;
cursor: pointer;
}
& > div:hover {
border-bottom: 1px solid var(--ix-color-border);
color: var(--wh-primary-color);
}
}
& > div:nth-child(4) {
display: flex;
justify-content: center;
align-items: center;
height: 4rem;
border-top: 1px solid var(--ix-color-border);
& > button {
width: 20rem;
}
}*/
}
</style>