index.vue 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <template>
  2. <el-dropdown @command="handleCommand" @visible-change="handleVisibleChange">
  3. <span class="avatar-dropdown">
  4. <el-avatar class="user-avatar" :src="avatar" />
  5. <div class="user-name">
  6. <span class="hidden-xs-only">{{ nickName }}</span>
  7. <vab-icon class="vab-dropdown" :class="{ 'vab-dropdown-active': active }" icon="arrow-down-s-line" />
  8. </div>
  9. </span>
  10. <template #dropdown>
  11. <el-dropdown-menu>
  12. <!--用户重置密码-->
  13. <user-rest-pwd ref="userRestPwd" @fetch-data="logout" />
  14. <el-dropdown-item command="logout">
  15. <vab-icon icon="logout-circle-r-line" />
  16. {{ translateTitle('退出登录') }}
  17. </el-dropdown-item>
  18. </el-dropdown-menu>
  19. </template>
  20. </el-dropdown>
  21. </template>
  22. <script>
  23. import { translateTitle } from '@/utils/i18n'
  24. import { mapActions, mapGetters } from 'vuex'
  25. import { toLoginRoute } from '@/utils/routes'
  26. import UserRestPwd from '@/views/system/user/components/UserRestPwd'
  27. export default {
  28. name: 'VabAvatar',
  29. components: { UserRestPwd },
  30. data() {
  31. return {
  32. active: false,
  33. }
  34. },
  35. computed: {
  36. ...mapGetters({
  37. avatar: 'user/avatar',
  38. username: 'user/username',
  39. nickName: 'user/nickName',
  40. }),
  41. },
  42. methods: {
  43. translateTitle,
  44. ...mapActions({
  45. _logout: 'user/logout',
  46. }),
  47. handleCommand(command) {
  48. switch (command) {
  49. case 'logout':
  50. this.logout()
  51. break
  52. case 'userRestPwd':
  53. this.$refs['userRestPwd'].showEdit()
  54. break
  55. }
  56. },
  57. handleVisibleChange(val) {
  58. this.active = val
  59. },
  60. async logout() {
  61. await this._logout()
  62. await this.$router.push(toLoginRoute(this.$route.fullPath))
  63. },
  64. },
  65. }
  66. </script>
  67. <style lang="scss" scoped>
  68. .avatar-dropdown {
  69. display: flex;
  70. align-content: center;
  71. align-items: center;
  72. justify-content: center;
  73. justify-items: center;
  74. .user-avatar {
  75. width: 40px;
  76. height: 40px;
  77. margin-left: 15px;
  78. cursor: pointer;
  79. border-radius: 50%;
  80. }
  81. .user-name {
  82. position: relative;
  83. display: flex;
  84. align-content: center;
  85. align-items: center;
  86. height: 40px;
  87. margin-left: 6px;
  88. line-height: 40px;
  89. cursor: pointer;
  90. [class*='ri-'] {
  91. margin-left: 0 !important;
  92. }
  93. }
  94. }
  95. </style>