index.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <template>
  2. <n-dropdown
  3. trigger="hover"
  4. @select="handleSelect"
  5. :show-arrow="true"
  6. :options="options"
  7. >
  8. <div class="user-info-box">
  9. <person-icon v-if="fallback"></person-icon>
  10. <n-avatar
  11. v-if="!fallback"
  12. round
  13. object-fit="cover"
  14. size="medium"
  15. :src="Person"
  16. @error="errorHandle"
  17. ></n-avatar>
  18. </div>
  19. </n-dropdown>
  20. <!-- 系统设置 model -->
  21. <go-system-set v-model:modelShow="modelShow"></go-system-set>
  22. </template>
  23. <script lang="ts" setup>
  24. import { h, ref } from 'vue'
  25. import { NAvatar, NText } from 'naive-ui'
  26. import { renderIcon } from '@/utils'
  27. import { openDoc, logout, renderLang } from '@/utils'
  28. import { GoSystemSet } from '@/components/GoSystemSet/index'
  29. import Person from './person.png'
  30. import { icon } from '@/plugins'
  31. const {
  32. DocumentTextIcon,
  33. ChatboxEllipsesIcon,
  34. PersonIcon,
  35. LogOutOutlineIcon,
  36. SettingsSharpIcon
  37. } = icon.ionicons5
  38. const t = window['$t']
  39. const modelShow = ref(false)
  40. // 是否失败
  41. const fallback = ref(false)
  42. // 用户图标渲染
  43. const renderUserInfo = () => {
  44. return h(
  45. 'div',
  46. {
  47. style: 'display: flex; align-items: center; padding: 8px 12px;'
  48. },
  49. [
  50. h(NAvatar, {
  51. round: true,
  52. style: 'margin-right: 12px;',
  53. src: Person
  54. }),
  55. h('div', null, [
  56. h('div', null, [
  57. h(NText, { depth: 2 }, { default: () => '奔跑的面条' })
  58. ])
  59. ])
  60. ]
  61. )
  62. }
  63. const options = ref([
  64. {
  65. label: '我的信息',
  66. key: 'info',
  67. type: 'render',
  68. render: renderUserInfo
  69. },
  70. {
  71. type: 'divider',
  72. key: 'd1'
  73. },
  74. {
  75. label: renderLang('global.doc'),
  76. key: 'doc',
  77. icon: renderIcon(DocumentTextIcon)
  78. },
  79. {
  80. label: renderLang('global.contact'),
  81. key: 'contact',
  82. icon: renderIcon(ChatboxEllipsesIcon)
  83. },
  84. {
  85. label: renderLang('global.sys_set'),
  86. key: 'sysSet',
  87. icon: renderIcon(SettingsSharpIcon)
  88. },
  89. {
  90. type: 'divider',
  91. key: 'd3'
  92. },
  93. {
  94. label: renderLang('global.logout'),
  95. key: 'logout',
  96. icon: renderIcon(LogOutOutlineIcon)
  97. }
  98. ])
  99. // 图片渲染错误
  100. const errorHandle = (e: Event) => {
  101. fallback.value = true
  102. }
  103. // 系统设置
  104. const sysSetHandle = () => {
  105. modelShow.value = true
  106. }
  107. const handleSelect = (key: string) => {
  108. switch (key) {
  109. case 'doc':
  110. openDoc()
  111. break
  112. case 'contact':
  113. openDoc()
  114. break
  115. case 'sysSet':
  116. sysSetHandle()
  117. break
  118. case 'logout':
  119. logout()
  120. break
  121. }
  122. }
  123. </script>
  124. <style lang="scss" scoped>
  125. .user-info-box {
  126. cursor: pointer;
  127. transform: scale(0.7);
  128. }
  129. </style>