UserDropdown.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // components
  2. import { Dropdown, Menu, Divider } from 'ant-design-vue';
  3. import { defineComponent, computed, unref } from 'vue';
  4. // res
  5. import headerImg from '/@/assets/images/header.jpg';
  6. import Icon from '/@/components/Icon/index';
  7. import { userStore } from '/@/store/modules/user';
  8. import { DOC_URL } from '/@/settings/siteSetting';
  9. import { appStore } from '/@/store/modules/app';
  10. const prefixCls = 'user-dropdown';
  11. export default defineComponent({
  12. name: 'UserDropdown',
  13. setup() {
  14. const getProjectConfigRef = computed(() => {
  15. return appStore.getProjectConfig;
  16. });
  17. const getUserInfo = computed(() => {
  18. const { realName = '', desc } = userStore.getUserInfoState || {};
  19. return { realName, desc };
  20. });
  21. /**
  22. * @description: 退出登录
  23. */
  24. function handleLoginOut() {
  25. userStore.confirmLoginOut();
  26. }
  27. // 打开文档
  28. function openDoc() {
  29. window.open(DOC_URL, '__blank');
  30. }
  31. function handleMenuClick(e: any) {
  32. if (e.key === 'loginOut') {
  33. handleLoginOut();
  34. }
  35. if (e.key === 'doc') {
  36. openDoc();
  37. }
  38. }
  39. function renderItem({ icon, text, key }: { icon: string; text: string; key: string }) {
  40. return (
  41. <Menu.Item key={key}>
  42. {() => (
  43. <span class="flex items-center">
  44. <Icon icon={icon} class="mr-1" />
  45. <span>{text}</span>
  46. </span>
  47. )}
  48. </Menu.Item>
  49. );
  50. }
  51. return () => {
  52. const { realName } = unref(getUserInfo);
  53. const {
  54. headerSetting: { showDoc },
  55. } = unref(getProjectConfigRef);
  56. return (
  57. <Dropdown placement="bottomLeft">
  58. {{
  59. default: () => (
  60. <section class={prefixCls}>
  61. <img class={`${prefixCls}__header`} src={headerImg} />
  62. <section class={`${prefixCls}__info`}>
  63. <section class={`${prefixCls}__name`}>{realName}</section>
  64. </section>
  65. </section>
  66. ),
  67. overlay: () => (
  68. <Menu slot="overlay" onClick={handleMenuClick}>
  69. {() => (
  70. <>
  71. {showDoc && renderItem({ key: 'doc', text: '文档', icon: 'gg:loadbar-doc' })}
  72. {showDoc && <Divider />}
  73. {renderItem({
  74. key: 'loginOut',
  75. text: '退出系统',
  76. icon: 'ant-design:poweroff-outlined',
  77. })}
  78. </>
  79. )}
  80. </Menu>
  81. ),
  82. }}
  83. </Dropdown>
  84. );
  85. };
  86. },
  87. });