Navbar.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. <template>
  2. <div class="navbar">
  3. <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
  4. <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/>
  5. <top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/>
  6. <div class="right-menu flex align-center">
  7. <template v-if="device!=='mobile' ">
  8. <el-select v-model="companyName"
  9. clearable
  10. filterable
  11. reserve-keyword
  12. placeholder="请选择租户"
  13. v-if="userId === 1"
  14. @change="dynamicTenantEvent"
  15. @clear="dynamicClearEvent">
  16. <el-option
  17. v-for="item in tenantList"
  18. :key="item.tenantId"
  19. :label="item.companyName"
  20. :value="item.tenantId">
  21. </el-option>
  22. <svg-icon slot="prefix" icon-class="company" class="el-input__icon input-icon" />
  23. </el-select>
  24. <search id="header-search" class="right-menu-item" />
  25. <el-tooltip content="源码地址" effect="dark" placement="bottom">
  26. <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />
  27. </el-tooltip>
  28. <el-tooltip content="文档地址" effect="dark" placement="bottom">
  29. <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />
  30. </el-tooltip>
  31. <screenfull id="screenfull" class="right-menu-item hover-effect" />
  32. <el-tooltip content="布局大小" effect="dark" placement="bottom">
  33. <size-select id="size-select" class="right-menu-item hover-effect" />
  34. </el-tooltip>
  35. </template>
  36. <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
  37. <div class="avatar-wrapper">
  38. <img :src="avatar" class="user-avatar">
  39. <i class="el-icon-caret-bottom" />
  40. </div>
  41. <el-dropdown-menu slot="dropdown">
  42. <router-link to="/user/profile">
  43. <el-dropdown-item>个人中心</el-dropdown-item>
  44. </router-link>
  45. <el-dropdown-item @click.native="setting = true">
  46. <span>布局设置</span>
  47. </el-dropdown-item>
  48. <el-dropdown-item divided @click.native="logout">
  49. <span>退出登录</span>
  50. </el-dropdown-item>
  51. </el-dropdown-menu>
  52. </el-dropdown>
  53. </div>
  54. </div>
  55. </template>
  56. <script>
  57. import { mapGetters } from 'vuex'
  58. import Breadcrumb from '@/components/Breadcrumb'
  59. import TopNav from '@/components/TopNav'
  60. import Hamburger from '@/components/Hamburger'
  61. import Screenfull from '@/components/Screenfull'
  62. import SizeSelect from '@/components/SizeSelect'
  63. import Search from '@/components/HeaderSearch'
  64. import RuoYiGit from '@/components/RuoYi/Git'
  65. import RuoYiDoc from '@/components/RuoYi/Doc'
  66. import { tenantList } from "@/api/login";
  67. import { dynamicClear, dynamicTenant } from "@/api/system/tenant";
  68. export default {
  69. data() {
  70. return {
  71. userId: this.$store.getters.userId,
  72. companyName: undefined,
  73. tenantList: [],
  74. // 是否切换了租户
  75. dynamic: false
  76. }
  77. },
  78. components: {
  79. Breadcrumb,
  80. TopNav,
  81. Hamburger,
  82. Screenfull,
  83. SizeSelect,
  84. Search,
  85. RuoYiGit,
  86. RuoYiDoc
  87. },
  88. computed: {
  89. ...mapGetters([
  90. 'sidebar',
  91. 'avatar',
  92. 'device'
  93. ]),
  94. setting: {
  95. get() {
  96. return this.$store.state.settings.showSettings
  97. },
  98. set(val) {
  99. this.$store.dispatch('settings/changeSetting', {
  100. key: 'showSettings',
  101. value: val
  102. })
  103. }
  104. },
  105. topNav: {
  106. get() {
  107. return this.$store.state.settings.topNav
  108. }
  109. }
  110. },
  111. methods: {
  112. // 动态切换
  113. dynamicTenantEvent(tenantId) {
  114. if (this.companyName != null && this.companyName !== '') {
  115. dynamicTenant(tenantId).then(res => {
  116. this.dynamic = true;
  117. this.$tab.closeAllPage()
  118. this.$router.push('/')
  119. });
  120. }
  121. },
  122. dynamicClearEvent() {
  123. dynamicClear().then(res => {
  124. this.dynamic = false;
  125. this.$tab.closeAllPage()
  126. this.$router.push('/')
  127. });
  128. },
  129. // 租户列表
  130. getTenantList() {
  131. tenantList().then(res => {
  132. this.tenantList = res.data;
  133. });
  134. },
  135. toggleSideBar() {
  136. this.$store.dispatch('app/toggleSideBar')
  137. },
  138. async logout() {
  139. this.$confirm('确定注销并退出系统吗?', '提示', {
  140. confirmButtonText: '确定',
  141. cancelButtonText: '取消',
  142. type: 'warning'
  143. }).then(() => {
  144. this.$store.dispatch('LogOut').then(() => {
  145. location.href = process.env.VUE_APP_CONTEXT_PATH + "index";
  146. })
  147. }).catch(() => {});
  148. }
  149. }
  150. }
  151. </script>
  152. <style lang="scss" scoped>
  153. .flex {
  154. display: flex;
  155. }
  156. .align-center {
  157. align-items: center;
  158. }
  159. .navbar {
  160. height: 50px;
  161. overflow: hidden;
  162. position: relative;
  163. background: #fff;
  164. box-shadow: 0 1px 4px rgba(0,21,41,.08);
  165. .hamburger-container {
  166. line-height: 46px;
  167. height: 100%;
  168. float: left;
  169. cursor: pointer;
  170. transition: background .3s;
  171. -webkit-tap-highlight-color:transparent;
  172. &:hover {
  173. background: rgba(0, 0, 0, .025)
  174. }
  175. }
  176. .breadcrumb-container {
  177. float: left;
  178. }
  179. .topmenu-container {
  180. position: absolute;
  181. left: 50px;
  182. }
  183. .errLog-container {
  184. display: inline-block;
  185. vertical-align: top;
  186. }
  187. .right-menu {
  188. float: right;
  189. height: 100%;
  190. line-height: 50px;
  191. &:focus {
  192. outline: none;
  193. }
  194. .right-menu-item {
  195. display: inline-block;
  196. padding: 0 8px;
  197. height: 100%;
  198. font-size: 18px;
  199. color: #5a5e66;
  200. vertical-align: text-bottom;
  201. &.hover-effect {
  202. cursor: pointer;
  203. transition: background .3s;
  204. &:hover {
  205. background: rgba(0, 0, 0, .025)
  206. }
  207. }
  208. }
  209. .avatar-container {
  210. margin-right: 30px;
  211. .avatar-wrapper {
  212. margin-top: 5px;
  213. position: relative;
  214. .user-avatar {
  215. cursor: pointer;
  216. width: 40px;
  217. height: 40px;
  218. border-radius: 10px;
  219. }
  220. .el-icon-caret-bottom {
  221. cursor: pointer;
  222. position: absolute;
  223. right: -20px;
  224. top: 25px;
  225. font-size: 12px;
  226. }
  227. }
  228. }
  229. }
  230. }
  231. </style>