UserDropdown.tsx 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. // login out
  22. function handleLoginOut() {
  23. userStore.confirmLoginOut();
  24. }
  25. // open doc
  26. function openDoc() {
  27. window.open(DOC_URL, '__blank');
  28. }
  29. function handleMenuClick(e: any) {
  30. if (e.key === 'loginOut') {
  31. handleLoginOut();
  32. }
  33. if (e.key === 'doc') {
  34. openDoc();
  35. }
  36. }
  37. function renderItem({ icon, text, key }: { icon: string; text: string; key: string }) {
  38. return (
  39. <Menu.Item key={key}>
  40. {() => (
  41. <span class="flex items-center">
  42. <Icon icon={icon} class="mr-1" />
  43. <span>{text}</span>
  44. </span>
  45. )}
  46. </Menu.Item>
  47. );
  48. }
  49. return () => {
  50. const { realName } = unref(getUserInfo);
  51. const {
  52. headerSetting: { showDoc },
  53. } = unref(getProjectConfigRef);
  54. return (
  55. <Dropdown placement="bottomLeft">
  56. {{
  57. default: () => (
  58. <section class={prefixCls}>
  59. <img class={`${prefixCls}__header`} src={headerImg} />
  60. <section class={`${prefixCls}__info`}>
  61. <section class={`${prefixCls}__name`}>{realName}</section>
  62. </section>
  63. </section>
  64. ),
  65. overlay: () => (
  66. <Menu slot="overlay" onClick={handleMenuClick}>
  67. {() => (
  68. <>
  69. {showDoc && renderItem({ key: 'doc', text: '文档', icon: 'gg:loadbar-doc' })}
  70. {showDoc && <Divider />}
  71. {renderItem({
  72. key: 'loginOut',
  73. text: '退出系统',
  74. icon: 'ant-design:poweroff-outlined',
  75. })}
  76. </>
  77. )}
  78. </Menu>
  79. ),
  80. }}
  81. </Dropdown>
  82. );
  83. };
  84. },
  85. });