header.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <template>
  2. <div class="header">
  3. <!-- 折叠按钮 -->
  4. <div class="header-left">
  5. <img class="logo" src="../assets/img/logo.svg" alt="" />
  6. <div class="web-title">{{ $t('kingCasino') }}</div>
  7. <div class="collapse-btn" @click="collapseChage">
  8. <el-icon v-if="sidebar.collapse">
  9. <Expand />
  10. </el-icon>
  11. <el-icon v-else>
  12. <Fold />
  13. </el-icon>
  14. </div>
  15. </div>
  16. <div class="header-right">
  17. <div class="header-user-con">
  18. <!-- <div class="btn-icon" @click="router.push('/theme')">
  19. <i class="el-icon-lx-skin"></i>
  20. </div> -->
  21. <!-- <div class="btn-icon" @click="router.push('/ucenter')">
  22. <el-tooltip
  23. effect="dark"
  24. :content="message ? `有${message}条未读消息` : `消息中心`"
  25. placement="bottom"
  26. >
  27. <i class="el-icon-lx-notice"></i>
  28. </el-tooltip>
  29. <span class="btn-bell-badge" v-if="message"></span>
  30. </div> -->
  31. <div class="btn-icon" @click="setFullScreen">
  32. <i class="el-icon-lx-full"></i>
  33. </div>
  34. <div class="btn-icon" @click="setLanguage">
  35. <img src="../assets/img/lang.svg" style="width: 20px;"/>
  36. </div>
  37. <!-- 用户头像 -->
  38. <el-avatar class="user-avator" :size="30" :src="userInfo.icon || imgurl" />
  39. <!-- 用户名下拉菜单 -->
  40. <el-dropdown class="user-name" trigger="click" @command="handleCommand">
  41. <span class="el-dropdown-link">
  42. {{ userInfo.nickName}}
  43. <el-icon class="el-icon--right">
  44. <arrow-down />
  45. </el-icon>
  46. </span>
  47. <template #dropdown>
  48. <el-dropdown-menu>
  49. <el-dropdown-item command="password">{{$t('passwordSetting')}}</el-dropdown-item>
  50. <el-dropdown-item divided command="loginout">{{$t('loginout')}}</el-dropdown-item>
  51. </el-dropdown-menu>
  52. </template>
  53. </el-dropdown>
  54. </div>
  55. </div>
  56. </div>
  57. </template>
  58. <script setup>
  59. import { onMounted, ref } from 'vue';
  60. import { useSidebarStore } from '../store/sidebar';
  61. import { useRouter } from 'vue-router';
  62. import imgurl from '../assets/img/logo.svg';
  63. import request from '@/utils/request';
  64. import { userInfoStore } from '../store/userInfo';
  65. import { useI18n } from 'vue-i18n';
  66. const { locale } = useI18n()
  67. const currentLang = ref(locale.value);
  68. const userStore = userInfoStore();
  69. const userInfo = ref({})
  70. const sidebar = useSidebarStore();
  71. // 侧边栏折叠
  72. const collapseChage = () => {
  73. sidebar.handleCollapse();
  74. };
  75. onMounted(() => {
  76. if (localStorage.getItem('userInfo')) {
  77. userInfo.value = JSON.parse(localStorage.getItem('userInfo'))
  78. }
  79. if (document.body.clientWidth < 1500) {
  80. collapseChage();
  81. }
  82. });
  83. // 用户名下拉菜单选择事件
  84. const router = useRouter();
  85. const loginout = async () => {
  86. console.log(userInfo.value.nickName, 'userInfo');
  87. const res = await request('post', 'admin/user/logout',{username:userInfo.value.nickName})
  88. if (res.code === 200) {
  89. userStore.clearUserInfo();
  90. router.push('/login');
  91. }
  92. };
  93. const handleCommand = (command) => {
  94. if (command == 'loginout') {
  95. loginout();
  96. } else if (command == 'password') {
  97. router.push('/password');
  98. }
  99. };
  100. const setFullScreen = () => {
  101. if (document.fullscreenElement) {
  102. document.exitFullscreen();
  103. } else {
  104. document.body.requestFullscreen.call(document.body);
  105. }
  106. };
  107. const setLanguage = () => {
  108. console.log(currentLang.value, 'currentLang');
  109. console.log(document.title, 'document.title');
  110. const newLang = currentLang.value === 'es' ? 'en' : 'es';
  111. locale.value = newLang;
  112. currentLang.value = newLang;
  113. };
  114. </script>
  115. <style scoped>
  116. .header {
  117. display: flex;
  118. justify-content: space-between;
  119. align-items: center;
  120. box-sizing: border-box;
  121. width: 100%;
  122. height: 70px;
  123. color: var(--header-text-color);
  124. background-color: var(--header-bg-color);
  125. border-bottom: 1px solid #ddd;
  126. }
  127. .header-left {
  128. display: flex;
  129. align-items: center;
  130. padding-left: 20px;
  131. height: 100%;
  132. }
  133. .logo {
  134. width: 35px;
  135. }
  136. .web-title {
  137. margin: 0 40px 0 10px;
  138. font-size: 22px;
  139. }
  140. .collapse-btn {
  141. display: flex;
  142. justify-content: center;
  143. align-items: center;
  144. height: 100%;
  145. padding: 0 10px;
  146. cursor: pointer;
  147. opacity: 0.8;
  148. font-size: 22px;
  149. }
  150. .collapse-btn:hover {
  151. opacity: 1;
  152. }
  153. .header-right {
  154. float: right;
  155. padding-right: 50px;
  156. }
  157. .header-user-con {
  158. display: flex;
  159. height: 70px;
  160. align-items: center;
  161. }
  162. .btn-fullscreen {
  163. transform: rotate(45deg);
  164. margin-right: 5px;
  165. font-size: 24px;
  166. }
  167. .btn-icon {
  168. position: relative;
  169. width: 30px;
  170. height: 30px;
  171. text-align: center;
  172. cursor: pointer;
  173. display: flex;
  174. align-items: center;
  175. color: var(--header-text-color);
  176. margin: 0 5px;
  177. font-size: 20px;
  178. }
  179. .btn-bell-badge {
  180. position: absolute;
  181. right: 4px;
  182. top: 0px;
  183. width: 8px;
  184. height: 8px;
  185. border-radius: 4px;
  186. background: #f56c6c;
  187. color: var(--header-text-color);
  188. }
  189. .user-avator {
  190. margin: 0 10px 0 20px;
  191. }
  192. .el-dropdown-link {
  193. color: var(--header-text-color);
  194. cursor: pointer;
  195. display: flex;
  196. align-items: center;
  197. }
  198. .el-dropdown-menu__item {
  199. text-align: center;
  200. }
  201. </style>