index.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <template>
  2. <el-drawer v-model="drawerVisible" title="布局设置" size="290px">
  3. <!-- 布局样式 -->
  4. <el-divider class="divider" content-position="center">
  5. <el-icon><Notification /></el-icon>
  6. 布局样式
  7. </el-divider>
  8. <div class="layout-box">
  9. <el-tooltip effect="dark" content="纵向" placement="top" :show-after="200">
  10. <div :class="['layout-item layout-vertical', { 'is-active': layout == 'vertical' }]" @click="setLayout('vertical')">
  11. <div class="layout-dark"></div>
  12. <div class="layout-container">
  13. <div class="layout-light"></div>
  14. <div class="layout-content"></div>
  15. </div>
  16. <el-icon v-if="layout == 'vertical'">
  17. <CircleCheckFilled />
  18. </el-icon>
  19. </div>
  20. </el-tooltip>
  21. <el-tooltip effect="dark" content="经典" placement="top" :show-after="200">
  22. <div :class="['layout-item layout-classic', { 'is-active': layout == 'classic' }]" @click="setLayout('classic')">
  23. <div class="layout-dark"></div>
  24. <div class="layout-container">
  25. <div class="layout-light"></div>
  26. <div class="layout-content"></div>
  27. </div>
  28. <el-icon v-if="layout == 'classic'">
  29. <CircleCheckFilled />
  30. </el-icon>
  31. </div>
  32. </el-tooltip>
  33. <el-tooltip effect="dark" content="横向" placement="top" :show-after="200">
  34. <div :class="['layout-item layout-transverse', { 'is-active': layout == 'transverse' }]" @click="setLayout('transverse')">
  35. <div class="layout-dark"></div>
  36. <div class="layout-content"></div>
  37. <el-icon v-if="layout == 'transverse'">
  38. <CircleCheckFilled />
  39. </el-icon>
  40. </div>
  41. </el-tooltip>
  42. <el-tooltip effect="dark" content="分栏" placement="top" :show-after="200">
  43. <div :class="['layout-item layout-columns', { 'is-active': layout == 'columns' }]" @click="setLayout('columns')">
  44. <div class="layout-dark"></div>
  45. <div class="layout-light"></div>
  46. <div class="layout-content"></div>
  47. <el-icon v-if="layout == 'columns'">
  48. <CircleCheckFilled />
  49. </el-icon>
  50. </div>
  51. </el-tooltip>
  52. </div>
  53. <div class="theme-item">
  54. <span>
  55. 侧边栏反转色
  56. <el-tooltip effect="dark" content="侧边栏颜色变为深色模式" placement="top">
  57. <el-icon><QuestionFilled /></el-icon>
  58. </el-tooltip>
  59. </span>
  60. <el-switch v-model="asideInverted" @change="setAsideTheme" />
  61. </div>
  62. <div class="theme-item mb50">
  63. <span>
  64. 头部反转色
  65. <el-tooltip effect="dark" content="头部颜色变为深色模式" placement="top">
  66. <el-icon><QuestionFilled /></el-icon>
  67. </el-tooltip>
  68. </span>
  69. <el-switch v-model="headerInverted" @change="setHeaderTheme" />
  70. </div>
  71. <!-- 全局主题 -->
  72. <el-divider class="divider" content-position="center">
  73. <el-icon><ColdDrink /></el-icon>
  74. 全局主题
  75. </el-divider>
  76. <div class="theme-item">
  77. <span>主题颜色</span>
  78. <el-color-picker v-model="primary" :predefine="colorList" @change="changePrimary" />
  79. </div>
  80. <div class="theme-item">
  81. <span>暗黑模式</span>
  82. <SwitchDark />
  83. </div>
  84. <div class="theme-item">
  85. <span>灰色模式</span>
  86. <el-switch v-model="isGrey" @change="changeGreyOrWeak('grey', !!$event)" />
  87. </div>
  88. <div class="theme-item mb40">
  89. <span>色弱模式</span>
  90. <el-switch v-model="isWeak" @change="changeGreyOrWeak('weak', !!$event)" />
  91. </div>
  92. <!-- 界面设置 -->
  93. <el-divider class="divider" content-position="center">
  94. <el-icon><Setting /></el-icon>
  95. 界面设置
  96. </el-divider>
  97. <div class="theme-item">
  98. <span>菜单折叠</span>
  99. <el-switch v-model="isCollapse" />
  100. </div>
  101. <div class="theme-item">
  102. <span>菜单手风琴</span>
  103. <el-switch v-model="accordion" />
  104. </div>
  105. <div class="theme-item">
  106. <span>面包屑</span>
  107. <el-switch v-model="breadcrumb" />
  108. </div>
  109. <!-- <div class="theme-item">
  110. <span>面包屑图标</span>
  111. <el-switch v-model="breadcrumbIcon" />
  112. </div> -->
  113. <div class="theme-item">
  114. <span>标签栏</span>
  115. <el-switch v-model="tabs" />
  116. </div>
  117. <div class="theme-item">
  118. <span>标签栏图标</span>
  119. <el-switch v-model="tabsIcon" />
  120. </div>
  121. <div class="theme-item">
  122. <span>页脚</span>
  123. <el-switch v-model="footer" />
  124. </div>
  125. </el-drawer>
  126. </template>
  127. <script setup lang="ts">
  128. import { ref } from 'vue'
  129. import { storeToRefs } from 'pinia'
  130. import { useTheme } from '@/hooks/useTheme'
  131. import { useGlobalStore } from '@/stores/modules/global'
  132. import { LayoutType } from '@/stores/interface'
  133. import { DEFAULT_PRIMARY } from '@/config'
  134. import mittBus from '@/utils/mittBus'
  135. import SwitchDark from '@/components/SwitchDark/index.vue'
  136. const { changePrimary, changeGreyOrWeak, setAsideTheme, setHeaderTheme } = useTheme()
  137. const globalStore = useGlobalStore()
  138. const { layout, primary, isGrey, isWeak, asideInverted, headerInverted, isCollapse, accordion, breadcrumb, tabs, tabsIcon, footer } =
  139. storeToRefs(globalStore)
  140. // 预定义主题颜色
  141. const colorList = [DEFAULT_PRIMARY, '#daa96e', '#0c819f', '#409eff', '#27ae60', '#ff5c93', '#e74c3c', '#fd726d', '#f39c12', '#9b59b6']
  142. // 设置布局方式
  143. const setLayout = (val: LayoutType) => {
  144. globalStore.setGlobalState('layout', val)
  145. setAsideTheme()
  146. }
  147. // 打开主题设置
  148. const drawerVisible = ref(false)
  149. mittBus.on('openThemeDrawer', () => (drawerVisible.value = true))
  150. </script>
  151. <style scoped lang="scss">
  152. @import './index.scss';
  153. </style>