BasicLayout.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <template>
  2. <pro-layout
  3. :title="title"
  4. :menus="menus"
  5. :collapsed="collapsed"
  6. :mediaQuery="query"
  7. :isMobile="isMobile"
  8. :handleMediaQuery="handleMediaQuery"
  9. :handleCollapse="handleCollapse"
  10. :logo="logoRender"
  11. :i18nRender="i18nRender"
  12. v-bind="settings"
  13. >
  14. <!-- Ads begin
  15. 广告代码 真实项目中请移除
  16. production remove this Ads
  17. -->
  18. <ads v-if="isProPreviewSite"/>
  19. <!-- Ads end -->
  20. <setting-drawer :settings="settings" @change="handleSettingChange" />
  21. <template v-slot:rightContentRender>
  22. <right-content :top-menu="settings.layout === 'topmenu'" :is-mobile="isMobile" :theme="settings.theme" />
  23. </template>
  24. <template v-slot:footerRender>
  25. <global-footer />
  26. </template>
  27. <router-view />
  28. </pro-layout>
  29. </template>
  30. <script>
  31. import { SettingDrawer, updateTheme } from '@ant-design-vue/pro-layout'
  32. import { i18nRender } from '@/locales'
  33. import { mapState } from 'vuex'
  34. import { SIDEBAR_TYPE, TOGGLE_MOBILE_TYPE } from '@/store/mutation-types'
  35. import defaultSettings from '@/config/defaultSettings'
  36. import RightContent from '@/components/GlobalHeader/RightContent'
  37. import GlobalFooter from '@/components/GlobalFooter'
  38. import Ads from '@/components/Other/CarbonAds'
  39. import LogoSvg from '../assets/logo.svg?inline'
  40. export default {
  41. name: 'BasicLayout',
  42. components: {
  43. SettingDrawer,
  44. RightContent,
  45. GlobalFooter,
  46. Ads
  47. },
  48. data () {
  49. return {
  50. // preview.pro.antdv.com only use.
  51. isProPreviewSite: process.env.VUE_APP_PREVIEW === 'true',
  52. // end
  53. // base
  54. menus: [],
  55. // 侧栏收起状态
  56. collapsed: false,
  57. title: defaultSettings.title,
  58. settings: {
  59. // 布局类型
  60. layout: defaultSettings.layout, // 'sidemenu', 'topmenu'
  61. // 定宽: true / 流式: false
  62. contentWidth: defaultSettings.layout === 'sidemenu' ? false : defaultSettings.contentWidth === 'Fixed',
  63. // 主题 'dark' | 'light'
  64. theme: defaultSettings.navTheme,
  65. // 主色调
  66. primaryColor: defaultSettings.primaryColor,
  67. fixedHeader: defaultSettings.fixedHeader,
  68. fixSiderbar: defaultSettings.fixSiderbar,
  69. colorWeak: defaultSettings.colorWeak,
  70. hideHintAlert: false,
  71. hideCopyButton: false
  72. },
  73. // 媒体查询
  74. query: {},
  75. // 是否手机模式
  76. isMobile: false
  77. }
  78. },
  79. computed: {
  80. ...mapState({
  81. // 动态主路由
  82. mainMenu: state => state.permission.addRouters
  83. })
  84. },
  85. created () {
  86. const routes = this.mainMenu.find(item => item.path === '/')
  87. this.menus = (routes && routes.children) || []
  88. // 处理侧栏收起状态
  89. this.$watch('collapsed', () => {
  90. this.$store.commit(SIDEBAR_TYPE, this.collapsed)
  91. })
  92. this.$watch('isMobile', () => {
  93. this.$store.commit(TOGGLE_MOBILE_TYPE, this.isMobile)
  94. })
  95. },
  96. mounted () {
  97. const userAgent = navigator.userAgent
  98. if (userAgent.indexOf('Edge') > -1) {
  99. this.$nextTick(() => {
  100. this.collapsed = !this.collapsed
  101. setTimeout(() => {
  102. this.collapsed = !this.collapsed
  103. }, 16)
  104. })
  105. }
  106. // first update color
  107. updateTheme(this.settings.primaryColor)
  108. },
  109. methods: {
  110. i18nRender,
  111. handleMediaQuery (val) {
  112. this.query = val
  113. if (this.isMobile && !val['screen-xs']) {
  114. this.isMobile = false
  115. return
  116. }
  117. if (!this.isMobile && val['screen-xs']) {
  118. this.isMobile = true
  119. this.collapsed = false
  120. this.settings.contentWidth = false
  121. // this.settings.fixSiderbar = false
  122. }
  123. },
  124. handleCollapse (val) {
  125. this.collapsed = val
  126. },
  127. handleSettingChange ({ type, value }) {
  128. console.log('type', type, value)
  129. type && (this.settings[type] = value)
  130. switch (type) {
  131. case 'contentWidth':
  132. this.settings[type] = value === 'Fixed'
  133. break
  134. case 'layout':
  135. if (value === 'sidemenu') {
  136. this.settings.contentWidth = false
  137. } else {
  138. this.settings.fixSiderbar = false
  139. this.settings.contentWidth = true
  140. }
  141. break
  142. }
  143. },
  144. logoRender () {
  145. return <LogoSvg />
  146. }
  147. }
  148. }
  149. </script>
  150. <style lang="less">
  151. @import "./BasicLayout.less";
  152. </style>