index.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <template>
  2. <div :class="classObj" class="app-wrapper">
  3. <sidebar class="sidebar-container" />
  4. <navbar @initMessage="initMessage" />
  5. <div :class="{hasTagsView:needTagsView}" class="main-container">
  6. <div :class="{'fixed-header':fixedHeader}">
  7. <!-- <navbar @initMessage="initMessage" /> -->
  8. <tags-view v-if="needTagsView" />
  9. </div>
  10. <app-main ref="main-container" />
  11. <right-panel v-if="showSettings">
  12. <settings />
  13. </right-panel>
  14. </div>
  15. </div>
  16. </template>
  17. <script>
  18. import RightPanel from '@/components/RightPanel'
  19. import { AppMain, Navbar, Sidebar, TagsView, Settings } from './components'
  20. import ResizeMixin from './mixin/ResizeHandler'
  21. import { mapState, mapGetters } from 'vuex'
  22. export default {
  23. name: 'Layout',
  24. components: {
  25. AppMain,
  26. Navbar,
  27. Sidebar,
  28. TagsView,
  29. Settings,
  30. RightPanel
  31. },
  32. mixins: [ResizeMixin],
  33. computed: {
  34. ...mapState({
  35. sidebar: state => state.app.sidebar,
  36. device: state => state.app.device,
  37. showSettings: state => state.settings.showSettings,
  38. needTagsView: state => state.settings.tagsView,
  39. fixedHeader: state => state.settings.fixedHeader
  40. }),
  41. ...mapGetters([
  42. 'permission_routes'
  43. ]),
  44. classObj() {
  45. return {
  46. hideSidebar: !this.sidebar.opened,
  47. openSidebar: this.sidebar.opened,
  48. withoutAnimation: this.sidebar.withoutAnimation,
  49. mobile: this.device === 'mobile',
  50. withoutMenu: this.withoutMenu()
  51. }
  52. }
  53. },
  54. methods: {
  55. handleClickOutside() {
  56. this.$store.dispatch('app/closeSideBar', { withoutAnimation: false })
  57. },
  58. initMessage() {
  59. this.$nextTick(() => {
  60. this.$refs['main-container'].showMessage()
  61. })
  62. },
  63. withoutMenu() {
  64. const routes = this.permission_routes.filter(item => !item.hidden)
  65. const len = this.permission_routes.filter(item => !item.hidden).length
  66. if (len > 1) return false
  67. if (len === 1) {
  68. return routes[0].children.filter(item => !item.hidden).length <= 1
  69. }
  70. return true
  71. }
  72. }
  73. }
  74. </script>
  75. <style lang="scss" scoped>
  76. @import "~@/styles/mixin.scss";
  77. @import "~@/styles/variables.scss";
  78. .app-wrapper {
  79. @include clearfix;
  80. position: relative;
  81. height: 100%;
  82. width: 100%;
  83. background-image: url("../assets/images/login/login_background.jpg");
  84. background-repeat: no-repeat;
  85. background-color: #071A29;
  86. &.mobile.openSidebar {
  87. position: fixed;
  88. top: 0;
  89. }
  90. }
  91. .drawer-bg {
  92. background: #000;
  93. opacity: 0.3;
  94. width: 100%;
  95. top: 0;
  96. height: 100%;
  97. position: absolute;
  98. z-index: 999;
  99. }
  100. .fixed-header {
  101. position: fixed;
  102. top: 0;
  103. right: 0;
  104. z-index: 9;
  105. width: calc(100% - #{$sideBarWidth});
  106. transition: width 0.28s;
  107. }
  108. .hideSidebar .fixed-header {
  109. width: calc(100% - 54px)
  110. }
  111. .mobile .fixed-header {
  112. width: 100%;
  113. }
  114. #app{
  115. .withoutMenu {
  116. .sidebar-container{
  117. display: none;
  118. }
  119. .main-container{
  120. margin-left: 0;
  121. }
  122. }
  123. }
  124. </style>