index.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. <template>
  2. <div class="ibps-header-setting">
  3. <el-tooltip
  4. :content="$t('navbar.setting')"
  5. effect="dark"
  6. placement="bottom"
  7. >
  8. <el-button class="btn-text can-hover" type="text" @click="handleClick">
  9. <ibps-icon name="cogs" size="14" />
  10. </el-button>
  11. </el-tooltip>
  12. <el-drawer
  13. class="ibps-header-setting-drawer"
  14. :visible.sync="settingVisible"
  15. :title="$t('navbar.setting')"
  16. width="30%"
  17. >
  18. <el-scrollbar
  19. style="height: 100%;width:100%;"
  20. wrap-class="ibps-header-setting-wrapper ibps-scrollbar-wrapper"
  21. >
  22. <div class="panel panel-info">
  23. <div class="panel-heading">{{ $t('navbar.theme') }}</div>
  24. <div class="panel-body">
  25. <el-table :data="themeList" :show-header="false" border>
  26. <el-table-column width="120">
  27. <template slot-scope="scope">{{ $t('layout.header-aside.header-setting.theme.'+scope.row.name) }}</template>
  28. </el-table-column>
  29. <el-table-column width="100">
  30. <div
  31. slot-scope="scope"
  32. :style="{'backgroundImage': `url(${$baseUrl}${scope.row.preview})`}"
  33. class="theme-preview"
  34. />
  35. </el-table-column>
  36. <el-table-column prop="address" align="center">
  37. <template slot-scope="scope">
  38. <el-button
  39. v-if="activeThemeName === scope.row.name"
  40. type="success"
  41. icon="el-icon-check"
  42. round
  43. >{{ $t('layout.header-aside.header-setting.theme.status.activate') }}</el-button>
  44. <el-button
  45. v-else
  46. round
  47. @click="handleSelectTheme(scope.row.name)"
  48. >{{ $t('layout.header-aside.header-setting.theme.status.select') }}</el-button>
  49. </template>
  50. </el-table-column>
  51. </el-table>
  52. </div>
  53. </div>
  54. <div class="panel panel-info">
  55. <div class="panel-heading">
  56. {{ $t('navbar.color') }}
  57. </div>
  58. <div class="panel-body">
  59. <el-color-picker
  60. v-model="color"
  61. :predefine="predefine"
  62. size="mini"
  63. @change="handleColorChange"
  64. />
  65. </div>
  66. </div>
  67. <div class="panel panel-info">
  68. <div class="panel-heading">{{ $t('navbar.language') }}</div>
  69. <div class="panel-body">
  70. <el-radio-group v-model="language">
  71. <el-radio
  72. v-for="item in languageList"
  73. :key="item.value"
  74. :label="item.value"
  75. >{{ item.label }}</el-radio>
  76. </el-radio-group>
  77. </div>
  78. </div>
  79. <div class="panel panel-info">
  80. <div class="panel-heading">{{ $t('navbar.size') }}</div>
  81. <div class="panel-body">
  82. <el-radio-group v-model="size">
  83. <el-radio
  84. v-for="item in sizes"
  85. :key="item"
  86. :label="item"
  87. >
  88. {{ $t('layout.header-aside.header-setting.size.'+item) }}
  89. </el-radio>
  90. </el-radio-group>
  91. </div>
  92. </div>
  93. </el-scrollbar>
  94. </el-drawer>
  95. </div>
  96. </template>
  97. <script>
  98. import { mapState, mapMutations, mapActions } from 'vuex'
  99. import { ELEMENT_COLOR } from '@/constant'
  100. import setting from '@/setting.js'
  101. export default {
  102. data () {
  103. return {
  104. settingVisible: false,
  105. themeDialogVisible: false,
  106. languageList: setting.system.languageList,
  107. sizes: [
  108. 'default',
  109. 'medium',
  110. 'small',
  111. 'mini'
  112. ],
  113. predefine: setting.color.predefine
  114. }
  115. },
  116. computed: {
  117. ...mapState({
  118. themeList: state => state.ibps.theme.list,
  119. activeThemeName: state => state.ibps.theme.activeName,
  120. sizeValue: state => state.ibps.size.value,
  121. languageValue: state => state.ibps.language.value,
  122. colorValue: state => state.ibps.color.value
  123. }),
  124. language: {
  125. get () {
  126. return this.languageValue || 'zh-CN'
  127. },
  128. set (value) {
  129. this.handleLanguageChange(value)
  130. }
  131. },
  132. size: {
  133. get () {
  134. return this.sizeValue || this.$ELEMENT.size
  135. },
  136. set (value) {
  137. this.handleSizeChange(value)
  138. }
  139. },
  140. color: {
  141. get () {
  142. return this.colorValue || ELEMENT_COLOR
  143. },
  144. set (value) {
  145. this.handleColorChange(value)
  146. }
  147. }
  148. },
  149. watch: {
  150. // // 注意 这里是关键
  151. // // 因为需要访问 this.$ELEMENT 所以只能在这里使用这种方式
  152. // sizeValue: {
  153. // handler(val, oldVal) {
  154. // if (val === '') {
  155. // return this.handleSizeChange(this.$ELEMENT.size || setting.system.size)
  156. // }
  157. // if (oldVal) {
  158. // // 这个情况在已经加载完页面 用户改变了尺寸时触发
  159. // this.$ELEMENT.size = val
  160. // // 由于已经加载过设置 需要清空缓存设置
  161. // this.pageKeepAliveClean()
  162. // // 由于已经加载过设置 需要刷新此页面
  163. // this.$router.replace('/refresh')
  164. // } else {
  165. // // 这个情况在刷新页面时触发
  166. // this.$ELEMENT.size = val
  167. // }
  168. // },
  169. // immediate: true
  170. // },
  171. // 因为需要访问 this.$i18n 所以只能在这里使用这种方式
  172. languageValue: {
  173. handler (val, oldVal) {
  174. if (val === '') {
  175. return this.handleLanguageChange(this.$i18n.locale || setting.system.language)
  176. }
  177. if (oldVal) {
  178. // 这个情况在已经加载完页面 用户改变了国际化时触发
  179. this.$i18n.locale = val
  180. // 由于已经加载过设置 需要清空缓存设置
  181. this.pageKeepAliveClean()
  182. // 由于已经加载过设置 需要刷新此页面
  183. this.$router.replace('/refresh')
  184. } else {
  185. // 这个情况在刷新页面时触发
  186. this.$i18n.locale = val
  187. }
  188. },
  189. immediate: true
  190. },
  191. //
  192. colorValue: {
  193. handler (val, oldVal) {
  194. if (val === '') {
  195. this.handleColorChange(val)
  196. }
  197. },
  198. immediate: true
  199. }
  200. },
  201. methods: {
  202. ...mapMutations({
  203. pageKeepAliveClean: 'ibps/page/keepAliveClean'
  204. }),
  205. ...mapActions({
  206. themeSet: 'ibps/theme/set',
  207. sizeSet: 'ibps/size/set',
  208. languageSet: 'ibps/language/set',
  209. colorSet: 'ibps/color/set'
  210. }),
  211. handleClick () {
  212. this.settingVisible = true
  213. // this.$refs.setting.$el.blur()
  214. },
  215. // -----------------主题---------------
  216. handleSelectTheme (value) {
  217. this.themeSet(value)
  218. },
  219. // -----------------尺寸---------------
  220. handleSizeChange (value) {
  221. this.sizeSet(value)
  222. },
  223. // -----------------语言---------------
  224. handleLanguageChange (value) {
  225. this.languageSet(value)
  226. },
  227. // -----------------颜色---------------
  228. handleColorChange (value) {
  229. this.colorSet(value)
  230. }
  231. }
  232. }
  233. </script>
  234. <style lang="scss" scoped>
  235. @import '~@/assets/styles/public.scss';
  236. .theme-preview {
  237. height: 40px;
  238. width: 80px;
  239. border-radius: 4px;
  240. background-size: cover;
  241. border: 1px solid $color-border-1;
  242. }
  243. </style>
  244. <style lang="scss">
  245. .ibps-header-setting-drawer{
  246. .el-drawer__header{
  247. margin-bottom: 10px;
  248. padding-bottom: 10px;
  249. border-bottom: 1px solid #dcdfe6;
  250. }
  251. .el-drawer__body{
  252. padding:5px;
  253. }
  254. .ibps-header-setting-wrapper{
  255. height: calc(100vh - 65px) !important;
  256. .panel{
  257. border: 1px solid #dde7ee
  258. }
  259. }
  260. }
  261. </style>