index.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. <template>
  2. <el-drawer size="280px" :visible="visible" :with-header="false" :append-to-body="true" :show-close="false">
  3. <div class="drawer-container">
  4. <div>
  5. <div class="setting-drawer-content">
  6. <div class="setting-drawer-title">
  7. <h3 class="drawer-title">主题风格设置</h3>
  8. </div>
  9. <div class="setting-drawer-block-checbox">
  10. <div class="setting-drawer-block-checbox-item" @click="handleTheme('theme-dark')">
  11. <img src="@/assets/images/dark.svg" alt="dark">
  12. <div v-if="sideTheme === 'theme-dark'" class="setting-drawer-block-checbox-selectIcon" style="display: block;">
  13. <i aria-label="图标: check" class="anticon anticon-check">
  14. <svg viewBox="64 64 896 896" data-icon="check" width="1em" height="1em" :fill="theme" aria-hidden="true" focusable="false" class="">
  15. <path d="M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z"/>
  16. </svg>
  17. </i>
  18. </div>
  19. </div>
  20. <div class="setting-drawer-block-checbox-item" @click="handleTheme('theme-light')">
  21. <img src="@/assets/images/light.svg" alt="light">
  22. <div v-if="sideTheme === 'theme-light'" class="setting-drawer-block-checbox-selectIcon" style="display: block;">
  23. <i aria-label="图标: check" class="anticon anticon-check">
  24. <svg viewBox="64 64 896 896" data-icon="check" width="1em" height="1em" :fill="theme" aria-hidden="true" focusable="false" class="">
  25. <path d="M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z"/>
  26. </svg>
  27. </i>
  28. </div>
  29. </div>
  30. </div>
  31. <div class="drawer-item">
  32. <span>主题颜色</span>
  33. <theme-picker style="float: right;height: 26px;margin: -3px 8px 0 0;" @change="themeChange" />
  34. </div>
  35. </div>
  36. <el-divider/>
  37. <h3 class="drawer-title">系统布局配置</h3>
  38. <div class="drawer-item">
  39. <span>开启 TopNav</span>
  40. <el-switch v-model="topNav" class="drawer-switch" />
  41. </div>
  42. <div class="drawer-item">
  43. <span>开启 Tags-Views</span>
  44. <el-switch v-model="tagsView" class="drawer-switch" />
  45. </div>
  46. <div class="drawer-item">
  47. <span>固定 Header</span>
  48. <el-switch v-model="fixedHeader" class="drawer-switch" />
  49. </div>
  50. <div class="drawer-item">
  51. <span>显示 Logo</span>
  52. <el-switch v-model="sidebarLogo" class="drawer-switch" />
  53. </div>
  54. <div class="drawer-item">
  55. <span>动态标题</span>
  56. <el-switch v-model="dynamicTitle" class="drawer-switch" />
  57. </div>
  58. <el-divider/>
  59. <el-button size="small" type="primary" plain icon="el-icon-document-add" @click="saveSetting">保存配置</el-button>
  60. <el-button size="small" plain icon="el-icon-refresh" @click="resetSetting">重置配置</el-button>
  61. </div>
  62. </div>
  63. </el-drawer>
  64. </template>
  65. <script>
  66. import ThemePicker from '@/components/ThemePicker'
  67. export default {
  68. components: { ThemePicker },
  69. data() {
  70. return {
  71. theme: this.$store.state.settings.theme,
  72. sideTheme: this.$store.state.settings.sideTheme
  73. };
  74. },
  75. computed: {
  76. visible: {
  77. get() {
  78. return this.$store.state.settings.showSettings
  79. }
  80. },
  81. fixedHeader: {
  82. get() {
  83. return this.$store.state.settings.fixedHeader
  84. },
  85. set(val) {
  86. this.$store.dispatch('settings/changeSetting', {
  87. key: 'fixedHeader',
  88. value: val
  89. })
  90. }
  91. },
  92. topNav: {
  93. get() {
  94. return this.$store.state.settings.topNav
  95. },
  96. set(val) {
  97. this.$store.dispatch('settings/changeSetting', {
  98. key: 'topNav',
  99. value: val
  100. })
  101. if (!val) {
  102. this.$store.dispatch('app/toggleSideBarHide', false);
  103. this.$store.commit("SET_SIDEBAR_ROUTERS", this.$store.state.permission.defaultRoutes);
  104. }
  105. }
  106. },
  107. tagsView: {
  108. get() {
  109. return this.$store.state.settings.tagsView
  110. },
  111. set(val) {
  112. this.$store.dispatch('settings/changeSetting', {
  113. key: 'tagsView',
  114. value: val
  115. })
  116. }
  117. },
  118. sidebarLogo: {
  119. get() {
  120. return this.$store.state.settings.sidebarLogo
  121. },
  122. set(val) {
  123. this.$store.dispatch('settings/changeSetting', {
  124. key: 'sidebarLogo',
  125. value: val
  126. })
  127. }
  128. },
  129. dynamicTitle: {
  130. get() {
  131. return this.$store.state.settings.dynamicTitle
  132. },
  133. set(val) {
  134. this.$store.dispatch('settings/changeSetting', {
  135. key: 'dynamicTitle',
  136. value: val
  137. })
  138. }
  139. },
  140. },
  141. methods: {
  142. themeChange(val) {
  143. this.$store.dispatch('settings/changeSetting', {
  144. key: 'theme',
  145. value: val
  146. })
  147. this.theme = val;
  148. },
  149. handleTheme(val) {
  150. this.$store.dispatch('settings/changeSetting', {
  151. key: 'sideTheme',
  152. value: val
  153. })
  154. this.sideTheme = val;
  155. },
  156. saveSetting() {
  157. this.$modal.loading("正在保存到本地,请稍候...");
  158. this.$cache.local.set(
  159. "layout-setting",
  160. `{
  161. "topNav":${this.topNav},
  162. "tagsView":${this.tagsView},
  163. "fixedHeader":${this.fixedHeader},
  164. "sidebarLogo":${this.sidebarLogo},
  165. "dynamicTitle":${this.dynamicTitle},
  166. "sideTheme":"${this.sideTheme}",
  167. "theme":"${this.theme}"
  168. }`
  169. );
  170. setTimeout(this.$modal.closeLoading(), 1000)
  171. },
  172. resetSetting() {
  173. this.$modal.loading("正在清除设置缓存并刷新,请稍候...");
  174. this.$cache.local.remove("layout-setting")
  175. setTimeout("window.location.reload()", 1000)
  176. }
  177. }
  178. }
  179. </script>
  180. <style lang="scss" scoped>
  181. .setting-drawer-content {
  182. .setting-drawer-title {
  183. margin-bottom: 12px;
  184. color: rgba(0, 0, 0, .85);
  185. font-size: 14px;
  186. line-height: 22px;
  187. font-weight: bold;
  188. }
  189. .setting-drawer-block-checbox {
  190. display: flex;
  191. justify-content: flex-start;
  192. align-items: center;
  193. margin-top: 10px;
  194. margin-bottom: 20px;
  195. .setting-drawer-block-checbox-item {
  196. position: relative;
  197. margin-right: 16px;
  198. border-radius: 2px;
  199. cursor: pointer;
  200. img {
  201. width: 48px;
  202. height: 48px;
  203. }
  204. .setting-drawer-block-checbox-selectIcon {
  205. position: absolute;
  206. top: 0;
  207. right: 0;
  208. width: 100%;
  209. height: 100%;
  210. padding-top: 15px;
  211. padding-left: 24px;
  212. color: #1890ff;
  213. font-weight: 700;
  214. font-size: 14px;
  215. }
  216. }
  217. }
  218. }
  219. .drawer-container {
  220. padding: 20px;
  221. font-size: 14px;
  222. line-height: 1.5;
  223. word-wrap: break-word;
  224. .drawer-title {
  225. margin-bottom: 12px;
  226. color: rgba(0, 0, 0, .85);
  227. font-size: 14px;
  228. line-height: 22px;
  229. }
  230. .drawer-item {
  231. color: rgba(0, 0, 0, .65);
  232. font-size: 14px;
  233. padding: 12px 0;
  234. }
  235. .drawer-switch {
  236. float: right
  237. }
  238. }
  239. </style>