TheUserAvatar.vue 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <script lang="jsx">
  2. import { defineComponent } from 'vue';
  3. import { useRouter } from 'vue-router';
  4. import { NPopover } from 'naive-ui';
  5. import { userApi } from '@/api/user';
  6. import { useUserStore } from '@/stores/modules/userStore'
  7. const RenderUserAvatar = ({ store }) => {
  8. const router = useRouter();
  9. const user = store.userInfo;
  10. const clearLoginStatus = async () => {
  11. await userApi.postLogout();
  12. store.clearUserInfo();
  13. router.push("/login");
  14. }
  15. const userMenuOptions = [
  16. {
  17. label: '个人中心',
  18. key: "/user"
  19. },
  20. {
  21. label: '修改密码',
  22. key: "edit"
  23. },
  24. {
  25. label: '退出登录',
  26. key: "logout"
  27. },
  28. ]
  29. const handleUserMenuOptions = async ({ key }) => {
  30. switch (key) {
  31. case '/user':
  32. router.push(key)
  33. return
  34. case 'edit':
  35. const userStore = useUserStore();
  36. userStore.setDialogStatus(true)
  37. return
  38. case 'logout':
  39. clearLoginStatus();
  40. }
  41. }
  42. const slots = {
  43. default: () => (
  44. <ul class="
  45. w-[120px] px-[10px] py-[10px]
  46. rounded-[4px] bg-white
  47. text-[12px] text-[#272D35] leading-[30px] text-center
  48. ">
  49. {
  50. userMenuOptions.map(item => (
  51. <li
  52. class="h-[30px] rounded-[4px] hover:bg-[#F4F6F8] hover:text-[#2454FF] cursor-pointer"
  53. key={item.key}
  54. onClick={() => handleUserMenuOptions(item)}
  55. >
  56. {item.label}
  57. </li>
  58. ))
  59. }
  60. </ul>
  61. ),
  62. trigger: () => (
  63. <div class="flex items-center cursor-pointer">
  64. <img src={user.avatar} alt="" class="w-[32px] h-[32px] mr-[10px] rounded-[50%]" />
  65. <span class="text-[#272D35] text-[12px]">{user.nickName}</span>
  66. </div>
  67. )
  68. };
  69. return (
  70. <NPopover
  71. v-slots={slots}
  72. trigger="hover"
  73. raw={true}
  74. show-arrow={false}
  75. style="box-shadow: 0px 10px 31px 0px #B1B6B933"
  76. ></NPopover>
  77. )
  78. }
  79. export default defineComponent({
  80. setup () {
  81. const userStore = useUserStore();
  82. return () => (
  83. <div >{<RenderUserAvatar store={userStore} />}</div>
  84. );
  85. },
  86. });
  87. </script>