restructure/src/layout/components/Logout/index.vue

109 lines
2.4 KiB
Vue

<template>
<n-dropdown trigger="hover" :options="options" @select="selectKey">
<div class="user_msg">
<n-image
class="user_avatar"
:src="userInfo.avatar"
preview-disabled
/>
<span class="user_name">{{ userInfo.realname }}</span>
</div>
</n-dropdown>
<!-- 修改密码 -->
<update-modal v-if="modalShow" v-modal:visible="modalShow" />
</template>
<script>
import { reactive, toRefs, h } from 'vue'
import { NIcon } from 'naive-ui'
import {
Pencil as EditIcon,
LogOutOutline as LogoutIcon
} from '@vicons/ionicons5'
import { useDialog } from 'naive-ui'
import { loginOut } from '@/api/login/index.js'
import { mapActions, mapState } from 'pinia'
import { useUserStore } from '@/store/modules/user.js'
import UpdateModal from './components/UpdateModal.vue'
export default {
name: 'LogOut',
components: { UpdateModal },
setup() {
const renderIcon = (icon) => {
return () => {
return h(NIcon, null, {
default: () => h(icon)
})
}
}
const data = reactive({
options: [
{
label: '修改密码',
key: 'edit',
icon: renderIcon(EditIcon)
},
{
label: '退出登录',
key: 'out',
icon: renderIcon(LogoutIcon)
}
],
modalShow: false
})
// 选中选项触发的回调
const dialog = useDialog()
return {
...toRefs(data),
dialog
}
},
computed: {
...mapState(useUserStore, {
userInfo: 'userInfo'
})
},
methods: {
...mapActions(useUserStore, ['logout']),
selectKey(key) {
console.log(key)
if (key === 'out') {
this.dialog.warning({
title: '提示',
content: '确定要退出登录吗?',
positiveText: '确定',
negativeText: '取消',
onPositiveClick: () => {
loginOut().then((res) => {
if (res.code === 0) {
this.$router.replace('/login')
this.logout()
$message.success(res.msg)
} else {
$message.error(res.msg)
}
})
}
})
} else if (key === 'edit') {
this.modalShow = true
}
}
}
}
</script>
<style scoped>
.user_msg {
display: flex;
justify-content: flex-end;
align-items: center;
}
.user_avatar {
width: 30px;
height: 30px;
margin-right: 10px;
}
</style>