header-tools.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <!-- 顶栏右侧区域 -->
  2. <template>
  3. <div class="ele-admin-header-tool">
  4. <!-- 全屏切换 -->
  5. <div
  6. class="ele-admin-header-tool-item hidden-xs-only"
  7. @click="toggleFullscreen"
  8. >
  9. <i v-if="fullscreen" class="el-icon-_screen-restore"></i>
  10. <i v-else class="el-icon-_screen-full"></i>
  11. </div>
  12. <!-- 语言切换 -->
  13. <div class="ele-admin-header-tool-item">
  14. <i18n-icon />
  15. </div>
  16. <div class="ele-admin-header-tool-item">
  17. <el-select v-model="groupId" @change="groupIdChange">
  18. <el-option
  19. v-for="item in loginChangeGroupVOList"
  20. :key="item.groupId"
  21. :label="item.groupName"
  22. :value="item.groupId"
  23. >
  24. </el-option>
  25. </el-select>
  26. </div>
  27. <div class="ele-admin-header-tool-item">
  28. <el-select v-model="roleId" @change="roleChange">
  29. <el-option
  30. v-for="item in loginChangeRoleVOList"
  31. :key="item.roleId"
  32. :label="item.roleName"
  33. :value="item.roleId"
  34. >
  35. </el-option>
  36. </el-select>
  37. </div>
  38. <!-- 消息通知 -->
  39. <div class="ele-admin-header-tool-item">
  40. <header-notice />
  41. </div>
  42. <!-- 用户信息 -->
  43. <div class="ele-admin-header-tool-item">
  44. <el-dropdown @command="onUserDropClick">
  45. <div class="ele-admin-header-avatar">
  46. <el-avatar
  47. :src="loginUser && loginUser.avatar ? loginUser.avatar : ''"
  48. />
  49. <!-- <el-avatar
  50. :src="
  51. loginUser && loginUser.avatar
  52. ? Array.isArray(loginUser.avatar)
  53. ? loginUser.avatar[0]
  54. : loginUser.avatar
  55. : ''
  56. "
  57. /> -->
  58. <span class="hidden-xs-only">{{
  59. loginUser && loginUser.nickname ? loginUser.nickname : ''
  60. }}</span>
  61. <i class="el-icon-arrow-down"></i>
  62. </div>
  63. <template v-slot:dropdown>
  64. <el-dropdown-menu>
  65. <el-dropdown-item command="profile" icon="el-icon-user">
  66. {{ $t('layout.header.profile') }}
  67. </el-dropdown-item>
  68. <el-dropdown-item command="password" icon="el-icon-key">
  69. {{ $t('layout.header.password') }}
  70. </el-dropdown-item>
  71. <el-dropdown-item
  72. command="logout"
  73. icon="el-icon-switch-button"
  74. divided
  75. >
  76. {{ $t('layout.header.logout') }}
  77. </el-dropdown-item>
  78. </el-dropdown-menu>
  79. </template>
  80. </el-dropdown>
  81. </div>
  82. <!-- 主题设置 -->
  83. <div class="ele-admin-header-tool-item" @click="openSetting">
  84. <i class="el-icon-_more"></i>
  85. </div>
  86. <!-- 修改密码弹窗 -->
  87. <password-modal :visible.sync="passwordVisible" />
  88. <!-- 主题设置抽屉 -->
  89. <setting-drawer :visible.sync="settingVisible" />
  90. </div>
  91. </template>
  92. <script>
  93. import HeaderNotice from './header-notice.vue';
  94. import PasswordModal from './password-modal.vue';
  95. import SettingDrawer from './setting-drawer.vue';
  96. import I18nIcon from './i18n-icon.vue';
  97. import { logout } from '@/utils/page-tab-util';
  98. import { userLogout } from '@/api/system/user';
  99. import { SYSTEM_NAME } from '@/config/setting';
  100. import router from '@/router/index';
  101. import { getCurrentUser,setCurrentUser } from '@/utils/token-util';
  102. export default {
  103. components: { HeaderNotice, PasswordModal, SettingDrawer, I18nIcon },
  104. props: {
  105. // 是否是全屏
  106. fullscreen: Boolean
  107. },
  108. data() {
  109. return {
  110. // 是否显示修改密码弹窗
  111. passwordVisible: false,
  112. // 是否显示主题设置抽屉
  113. settingVisible: false,
  114. groupId: '',
  115. roleId: '',
  116. currentUser: {
  117. currentGroupId: '',
  118. currentRoleId: ''
  119. }
  120. };
  121. },
  122. created() {
  123. this.currentUser = getCurrentUser()
  124. this.groupId = this.currentUser.currentGroupId;
  125. this.roleId = this.currentUser.currentRoleId;
  126. },
  127. computed: {
  128. // 当前用户信息
  129. loginUser() {
  130. return this.$store.state.user.info;
  131. },
  132. // 部门下拉
  133. loginChangeGroupVOList() {
  134. return this.$store.state.user?.info?.loginChangeGroupVOList;
  135. },
  136. // 角色下拉
  137. loginChangeRoleVOList() {
  138. return this.$store.state.user?.info?.loginChangeGroupVOList.find(
  139. (item) => item.groupId == this.groupId
  140. )?.loginChangeRoleVOList;
  141. }
  142. },
  143. methods: {
  144. groupIdChange(val) {
  145. this.roleChange(this.loginChangeRoleVOList[0].roleId);
  146. },
  147. roleChange(val) {
  148. this.roleId = val;
  149. this.currentUser.currentGroupId = this.groupId;
  150. this.currentUser.currentRoleId = val;
  151. setCurrentUser(this.currentUser)
  152. this.$store
  153. .dispatch('user/fetchUserInfo')
  154. .then(({ menus, homePath, authoritiesRouter }) => {
  155. router.roleChange({ menus, homePath, authoritiesRouter });
  156. });
  157. },
  158. /* 用户信息下拉点击事件 */
  159. onUserDropClick(command) {
  160. if (command === 'password') {
  161. this.passwordVisible = true;
  162. } else if (command === 'profile') {
  163. if (this.$route.fullPath !== '/user/profile') {
  164. this.$router.push('/user/profile');
  165. }
  166. } else if (command === 'logout') {
  167. // 退出登录
  168. this.$confirm(
  169. this.$t('layout.logout.message'),
  170. this.$t('layout.logout.title'),
  171. { type: 'warning' }
  172. )
  173. .then(() => {
  174. userLogout().then((res) => {
  175. console.log(res);
  176. localStorage.removeItem(`userId-${SYSTEM_NAME}`);
  177. logout();
  178. });
  179. })
  180. .catch(() => {});
  181. }
  182. },
  183. /* 全屏切换 */
  184. toggleFullscreen() {
  185. this.$emit('fullscreen');
  186. },
  187. /* 打开设置抽屉 */
  188. openSetting() {
  189. this.settingVisible = true;
  190. }
  191. }
  192. };
  193. </script>