Navbar.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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. tenantId: undefined,
  73. companyName: undefined,
  74. tenantList: []
  75. }
  76. },
  77. components: {
  78. Breadcrumb,
  79. TopNav,
  80. Hamburger,
  81. Screenfull,
  82. SizeSelect,
  83. Search,
  84. RuoYiGit,
  85. RuoYiDoc
  86. },
  87. computed: {
  88. ...mapGetters([
  89. 'sidebar',
  90. 'avatar',
  91. 'device'
  92. ]),
  93. setting: {
  94. get() {
  95. return this.$store.state.settings.showSettings
  96. },
  97. set(val) {
  98. this.$store.dispatch('settings/changeSetting', {
  99. key: 'showSettings',
  100. value: val
  101. })
  102. }
  103. },
  104. topNav: {
  105. get() {
  106. return this.$store.state.settings.topNav
  107. }
  108. }
  109. },
  110. methods: {
  111. // 动态切换
  112. dynamicTenantEvent(tenantId) {
  113. if (this.companyName != null && this.companyName !== '') {
  114. dynamicTenant(tenantId).then(res => {
  115. this.$tab.closeAllPage()
  116. this.$router.push('/')
  117. });
  118. }
  119. },
  120. dynamicClearEvent() {
  121. dynamicClear().then(res => {
  122. this.$tab.closeAllPage()
  123. this.$router.push('/')
  124. });
  125. },
  126. // 租户列表
  127. getTenantList() {
  128. tenantList().then(res => {
  129. this.tenantList = res.data;
  130. });
  131. },
  132. toggleSideBar() {
  133. this.$store.dispatch('app/toggleSideBar')
  134. },
  135. async logout() {
  136. this.$confirm('确定注销并退出系统吗?', '提示', {
  137. confirmButtonText: '确定',
  138. cancelButtonText: '取消',
  139. type: 'warning'
  140. }).then(() => {
  141. this.$store.dispatch('LogOut').then(() => {
  142. location.href = process.env.VUE_APP_CONTEXT_PATH + "index";
  143. })
  144. }).catch(() => {});
  145. }
  146. }
  147. }
  148. </script>
  149. <style lang="scss" scoped>
  150. .flex {
  151. display: flex;
  152. }
  153. .align-center {
  154. align-items: center;
  155. }
  156. .navbar {
  157. height: 50px;
  158. overflow: hidden;
  159. position: relative;
  160. background: #fff;
  161. box-shadow: 0 1px 4px rgba(0,21,41,.08);
  162. .hamburger-container {
  163. line-height: 46px;
  164. height: 100%;
  165. float: left;
  166. cursor: pointer;
  167. transition: background .3s;
  168. -webkit-tap-highlight-color:transparent;
  169. &:hover {
  170. background: rgba(0, 0, 0, .025)
  171. }
  172. }
  173. .breadcrumb-container {
  174. float: left;
  175. }
  176. .topmenu-container {
  177. position: absolute;
  178. left: 50px;
  179. }
  180. .errLog-container {
  181. display: inline-block;
  182. vertical-align: top;
  183. }
  184. .right-menu {
  185. float: right;
  186. height: 100%;
  187. line-height: 50px;
  188. &:focus {
  189. outline: none;
  190. }
  191. .right-menu-item {
  192. display: inline-block;
  193. padding: 0 8px;
  194. height: 100%;
  195. font-size: 18px;
  196. color: #5a5e66;
  197. vertical-align: text-bottom;
  198. &.hover-effect {
  199. cursor: pointer;
  200. transition: background .3s;
  201. &:hover {
  202. background: rgba(0, 0, 0, .025)
  203. }
  204. }
  205. }
  206. .avatar-container {
  207. margin-right: 30px;
  208. .avatar-wrapper {
  209. margin-top: 5px;
  210. position: relative;
  211. .user-avatar {
  212. cursor: pointer;
  213. width: 40px;
  214. height: 40px;
  215. border-radius: 10px;
  216. }
  217. .el-icon-caret-bottom {
  218. cursor: pointer;
  219. position: absolute;
  220. right: -20px;
  221. top: 25px;
  222. font-size: 12px;
  223. }
  224. }
  225. }
  226. }
  227. }
  228. </style>