vue2-client 1.2.0 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/README.md +65 -65
  2. package/babel.config.js +1 -0
  3. package/docs/notice.md +22 -0
  4. package/index.js +28 -28
  5. package/package.json +1 -1
  6. package/src/App.vue +93 -93
  7. package/src/assets/img/SunClientDownload.png +0 -0
  8. package/src/assets/img/SunClientManual/1.png +0 -0
  9. package/src/assets/img/SunClientManual/2.png +0 -0
  10. package/src/assets/img/SunClientManual/3.png +0 -0
  11. package/src/assets/img/SunClientManual/4.png +0 -0
  12. package/src/assets/img/ToDeskDownload.png +0 -0
  13. package/src/assets/img/ToDeskManual/1.png +0 -0
  14. package/src/assets/img/ToDeskManual/2.png +0 -0
  15. package/src/assets/img/ToDeskManual/3.png +0 -0
  16. package/src/assets/img/ToDeskManual/4.png +0 -0
  17. package/src/assets/sound/newNote.mp3 +0 -0
  18. package/src/base-client/all.js +57 -57
  19. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +1157 -1159
  20. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  21. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +540 -540
  22. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  23. package/src/base-client/components/common/CustomColumnsDrawer/index.md +46 -46
  24. package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +150 -150
  25. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  26. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  27. package/src/base-client/components/common/XAddForm/XAddForm.vue +323 -323
  28. package/src/base-client/components/common/XAddForm/index.md +60 -60
  29. package/src/base-client/components/common/XBadge/index.md +39 -39
  30. package/src/base-client/components/common/XCard/index.md +43 -43
  31. package/src/base-client/components/common/XForm/XForm.vue +275 -275
  32. package/src/base-client/components/common/XForm/XFormItem.vue +217 -217
  33. package/src/base-client/components/common/XForm/index.md +196 -196
  34. package/src/base-client/components/common/XFormCol/index.md +35 -35
  35. package/src/base-client/components/common/XFormTable/XFormTable.vue +407 -405
  36. package/src/base-client/components/common/XFormTable/index.md +89 -89
  37. package/src/base-client/components/common/XTable/XTable.vue +262 -262
  38. package/src/base-client/components/common/XTable/index.md +255 -255
  39. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +105 -105
  40. package/src/base-client/components/iot/CustomerDetailsView/CustomerDetailsView.vue +226 -226
  41. package/src/base-client/components/iot/CustomerDetailsView/index.md +41 -41
  42. package/src/base-client/components/iot/DataAnalysisUser/DataAnalysisUser.vue +127 -127
  43. package/src/base-client/components/iot/DataAnalysisView/DataAnalysisView.vue +244 -250
  44. package/src/base-client/components/iot/DataAnalysisViewGD/DataAnalysisViewGD.vue +548 -548
  45. package/src/base-client/components/iot/DeviceBrandDetailsView/DeviceBrandDetailsView.vue +453 -453
  46. package/src/base-client/components/iot/DeviceDetailsView/DeviceDetailsView.vue +231 -231
  47. package/src/base-client/components/iot/DeviceDetailsView/index.md +43 -43
  48. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsCount.vue +330 -330
  49. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsException.vue +57 -57
  50. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsInstruct.vue +122 -122
  51. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsInstructOperate.vue +122 -122
  52. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsMain.vue +225 -225
  53. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsRead.vue +135 -135
  54. package/src/base-client/components/iot/DeviceTypeDetailsView/DeviceTypeDetailsView.vue +277 -277
  55. package/src/base-client/components/iot/InstructDetailsView/InstructDetailsView.vue +472 -472
  56. package/src/base-client/components/iot/InstructDetailsView/index.md +45 -45
  57. package/src/base-client/components/iot/LogDetailsView/LogDetailsView.vue +380 -380
  58. package/src/base-client/components/iot/LogDetailsView/index.md +43 -43
  59. package/src/base-client/components/iot/MeterDetailsView/MeterDetailsView.vue +360 -360
  60. package/src/base-client/components/iot/MeterDetailsView/index.md +43 -43
  61. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsCount.vue +335 -335
  62. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsException.vue +185 -185
  63. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsHandPlan.vue +292 -292
  64. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsInstruct.vue +237 -237
  65. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsMain.vue +257 -257
  66. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsSellGas.vue +190 -190
  67. package/src/base-client/components/iot/WebmeterAnalysisView/WebmeterAnalysisView.vue +723 -723
  68. package/src/base-client/components/iot/WebmeterAnalysisView/index.md +48 -48
  69. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  70. package/src/base-client/components/system/DictionaryDetailsView/index.md +41 -41
  71. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +248 -248
  72. package/src/base-client/components/ticket/EmployeeDetailsView/EmployeeDetailsView.vue +371 -406
  73. package/src/base-client/components/ticket/TicketDetailsView/TicketDetailsView.vue +838 -486
  74. package/src/base-client/components/ticket/TicketDetailsView/part/TicketDetailsFlow.vue +261 -184
  75. package/src/base-client/components/ticket/TicketSubmitSuccessView/TicketSubmitSuccessView.vue +528 -303
  76. package/src/base-client/plugins/AppData.js +69 -69
  77. package/src/base-client/plugins/GetLoginInfoService.js +221 -221
  78. package/src/base-client/plugins/index.js +21 -21
  79. package/src/bootstrap.js +27 -27
  80. package/src/components/Ellipsis/Ellipsis.vue +64 -64
  81. package/src/components/Ellipsis/index.md +38 -38
  82. package/src/components/NumberInfo/index.md +43 -43
  83. package/src/components/STable/README.md +341 -341
  84. package/src/components/Trend/index.md +45 -45
  85. package/src/components/cache/AKeepAlive.js +172 -172
  86. package/src/components/checkbox/index.js +7 -7
  87. package/src/components/index.js +36 -36
  88. package/src/components/menu/menu.js +273 -273
  89. package/src/components/setting/Setting.vue +237 -237
  90. package/src/components/table/advance/AdvanceTable.vue +275 -275
  91. package/src/components/transition/PageToggleTransition.vue +97 -97
  92. package/src/layouts/CommonLayout.vue +42 -42
  93. package/src/layouts/PageLayout.vue +151 -151
  94. package/src/layouts/SinglePageView.vue +74 -74
  95. package/src/layouts/header/AdminHeader.vue +109 -109
  96. package/src/layouts/header/HeaderAvatar.vue +60 -60
  97. package/src/layouts/header/HeaderNotice.vue +97 -97
  98. package/src/layouts/tabs/TabsHead.vue +190 -190
  99. package/src/layouts/tabs/TabsView.vue +355 -355
  100. package/src/main.js +20 -20
  101. package/src/mock/goods/index.js +108 -108
  102. package/src/mock/index.js +12 -12
  103. package/src/mock/project/index.js +17 -17
  104. package/src/mock/user/current.js +13 -13
  105. package/src/mock/user/login.js +39 -39
  106. package/src/mock/workplace/index.js +15 -15
  107. package/src/pages/exception/403.vue +25 -25
  108. package/src/pages/exception/404.vue +25 -25
  109. package/src/pages/exception/500.vue +25 -25
  110. package/src/pages/login/Login.vue +194 -194
  111. package/src/pages/report/ReportTableHome.vue +28 -28
  112. package/src/pages/resourceManage/resourceManageMain.vue +55 -55
  113. package/src/pages/system/applyInstallView/Core.vue +570 -570
  114. package/src/pages/system/applyInstallView/index.vue +34 -34
  115. package/src/pages/system/dictionary/index.vue +41 -41
  116. package/src/pages/system/queryParams/index.vue +41 -41
  117. package/src/router/async/config.async.js +25 -25
  118. package/src/router/async/router.map.js +59 -59
  119. package/src/router/guards.js +104 -104
  120. package/src/router/index.js +27 -27
  121. package/src/services/api/EmployeeDetailsViewApi.js +3 -1
  122. package/src/services/api/TicketDetailsViewApi.js +9 -1
  123. package/src/services/api/common.js +37 -39
  124. package/src/services/api/restTools.js +23 -23
  125. package/src/services/dataSource.js +12 -12
  126. package/src/services/user.js +34 -34
  127. package/src/store/modules/setting.js +114 -114
  128. package/src/utils/i18n.js +80 -80
  129. package/src/utils/indexedDB.js +146 -146
  130. package/src/utils/request.js +197 -197
  131. package/src/utils/routerUtil.js +15 -2
  132. package/tests/unit/ReportTable.spec.js +15 -15
  133. package/vue.config.js +153 -153
  134. package/webpack.config.js +12 -12
@@ -1,237 +1,237 @@
1
- <template>
2
- <div class="side-setting">
3
- <setting-item>
4
- <a-button @click="saveSetting" type="primary" icon="save">{{ $t('save') }}</a-button>
5
- <a-button @click="resetSetting" type="dashed" icon="redo" style="float: right">{{ $t('reset') }}</a-button>
6
- </setting-item>
7
- <setting-item :title="$t('theme.title')">
8
- <img-checkbox-group
9
- @change="values => setTheme({...theme, mode: values[0]})"
10
- :default-values="[theme.mode]"
11
- >
12
- <img-checkbox :title="$t('theme.dark')" img="https://gw.alipayobjects.com/zos/rmsportal/LCkqqYNmvBEbokSDscrm.svg" value="dark"/>
13
- <img-checkbox :title="$t('theme.light')" img="https://gw.alipayobjects.com/zos/rmsportal/jpRkZQMyYRryryPNtyIC.svg" value="light"/>
14
- <img-checkbox :title="$t('theme.night')" img="https://gw.alipayobjects.com/zos/antfincdn/hmKaLQvmY2/LCkqqYNmvBEbokSDscrm.svg" value="night"/>
15
- </img-checkbox-group>
16
- </setting-item>
17
- <setting-item :title="$t('theme.color')">
18
- <color-checkbox-group
19
- @change="(values, colors) => setTheme({...theme, color: colors[0]})"
20
- :defaultValues="[palettes.indexOf(theme.color)]"
21
- :multiple="false"
22
- >
23
- <color-checkbox v-for="(color, index) in palettes" :key="index" :color="color" :value="index" />
24
- </color-checkbox-group>
25
- </setting-item>
26
- <a-divider/>
27
- <setting-item :title="$t('navigate.title')">
28
- <img-checkbox-group
29
- @change="values => setLayout(values[0])"
30
- :default-values="[layout]"
31
- >
32
- <img-checkbox :title="$t('navigate.side')" img="https://gw.alipayobjects.com/zos/rmsportal/JopDzEhOqwOjeNTXkoje.svg" value="side"/>
33
- <img-checkbox :title="$t('navigate.head')" img="https://gw.alipayobjects.com/zos/rmsportal/KDNDBbriJhLwuqMoxcAr.svg" value="head"/>
34
- <img-checkbox :title="$t('navigate.mix')" img="https://gw.alipayobjects.com/zos/antfincdn/x8Ob%26B8cy8/LCkqqYNmvBEbokSDscrm.svg" value="mix"/>
35
- </img-checkbox-group>
36
- </setting-item>
37
- <setting-item>
38
- <a-list :split="false">
39
- <a-list-item>
40
- {{ $t('navigate.content.title') }}
41
- <a-select
42
- :getPopupContainer="getPopupContainer"
43
- :value="pageWidth"
44
- @change="setPageWidth"
45
- class="select-item"
46
- size="small"
47
- slot="actions"
48
- >
49
- <a-select-option value="fluid">{{ $t('navigate.content.fluid') }}</a-select-option>
50
- <a-select-option value="fixed">{{ $t('navigate.content.fixed') }}</a-select-option>
51
- </a-select>
52
- </a-list-item>
53
- <a-list-item>
54
- {{ $t('navigate.fixedHeader') }}
55
- <a-switch :checked="fixedHeader" slot="actions" size="small" @change="setFixedHeader" />
56
- </a-list-item>
57
- <a-list-item>
58
- {{ $t('navigate.fixedSideBar') }}
59
- <a-switch :checked="fixedSideBar" slot="actions" size="small" @change="setFixedSideBar" />
60
- </a-list-item>
61
- </a-list>
62
- </setting-item>
63
- <a-divider />
64
- <setting-item :title="$t('other.title')">
65
- <a-list :split="false">
66
- <a-list-item>
67
- {{ $t('other.weekMode') }}
68
- <a-switch :checked="weekMode" slot="actions" size="small" @change="setWeekMode" />
69
- </a-list-item>
70
- <a-list-item>
71
- {{ $t('other.multiPages') }}
72
- <a-switch :checked="multiPage" slot="actions" size="small" @change="setMultiPage" />
73
- </a-list-item>
74
- <a-list-item>
75
- {{ $t('other.hideSetting') }}
76
- <a-switch :checked="hideSetting" slot="actions" size="small" @change="setHideSetting" />
77
- </a-list-item>
78
- </a-list>
79
- </setting-item>
80
- <a-divider />
81
- <setting-item :title="$t('animate.title')">
82
- <a-list :split="false">
83
- <a-list-item>
84
- {{ $t('animate.disable') }}
85
- <a-switch :checked="animate.disabled" slot="actions" size="small" @change="val => setAnimate({...animate, disabled: val})" />
86
- </a-list-item>
87
- <a-list-item>
88
- {{ $t('animate.effect') }}
89
- <a-select
90
- :value="animate.name"
91
- :getPopupContainer="getPopupContainer"
92
- @change="val => setAnimate({...animate, name: val})"
93
- class="select-item"
94
- size="small"
95
- slot="actions"
96
- >
97
- <a-select-option :key="index" :value="item.name" v-for="(item, index) in animates">{{ item.alias }}</a-select-option>
98
- </a-select>
99
- </a-list-item>
100
- <a-list-item>
101
- {{ $t('animate.direction') }}
102
- <a-select
103
- :value="animate.direction"
104
- :getPopupContainer="getPopupContainer"
105
- @change="val => setAnimate({...animate, direction: val})"
106
- class="select-item"
107
- size="small"
108
- slot="actions"
109
- >
110
- <a-select-option :key="index" :value="item" v-for="(item, index) in directions">{{ item }}</a-select-option>
111
- </a-select>
112
- </a-list-item>
113
- </a-list>
114
- </setting-item>
115
- <a-alert
116
- v-if="isDev"
117
- style="max-width: 240px; margin: -16px 0 8px; word-break: break-all"
118
- type="warning"
119
- :message="$t('alert')"
120
- >
121
- </a-alert>
122
- <a-button
123
- v-if="isDev"
124
- id="copyBtn"
125
- :data-clipboard-text="copyConfig"
126
- @click="copyCode"
127
- style="width: 100%"
128
- icon="copy" >{{ $t('copy') }}</a-button>
129
- </div>
130
- </template>
131
-
132
- <script>
133
- import SettingItem from './SettingItem'
134
- import { ColorCheckbox, ImgCheckbox } from '@vue2-client/components/checkbox'
135
- import Clipboard from 'clipboard'
136
- import { mapState, mapMutations } from 'vuex'
137
- import { formatConfig } from '@vue2-client/utils/formatter'
138
- import { setting } from '@vue2-client/config/default'
139
- import sysConfig from '@vue2-client/config/config'
140
- import fastEqual from 'fast-deep-equal'
141
- import deepMerge from 'deepmerge'
142
-
143
- const ColorCheckboxGroup = ColorCheckbox.Group
144
- const ImgCheckboxGroup = ImgCheckbox.Group
145
- export default {
146
- name: 'Setting',
147
- i18n: require('./i18n'),
148
- components: { ImgCheckboxGroup, ImgCheckbox, ColorCheckboxGroup, ColorCheckbox, SettingItem },
149
- data () {
150
- return {
151
- copyConfig: 'Sorry, you have copied nothing O(∩_∩)O~',
152
- isDev: process.env.NODE_ENV === 'development'
153
- }
154
- },
155
- computed: {
156
- directions () {
157
- return this.animates.find(item => item.name == this.animate.name).directions
158
- },
159
- ...mapState('setting', ['theme', 'layout', 'animate', 'animates', 'palettes', 'multiPage', 'weekMode', 'fixedHeader', 'fixedSideBar', 'hideSetting', 'pageWidth'])
160
- },
161
- watch: {
162
- 'animate.name': function (val) {
163
- this.setAnimate({ name: val, direction: this.directions[0] })
164
- }
165
- },
166
- methods: {
167
- getPopupContainer () {
168
- return this.$el.parentNode
169
- },
170
- copyCode () {
171
- const config = this.extractConfig(false)
172
- this.copyConfig = `// 自定义配置,参考 ./default/setting.config.js,需要自定义的属性在这里配置即可
173
- module.exports = ${formatConfig(config)}
174
- `
175
- const clipboard = new Clipboard('#copyBtn')
176
- clipboard.on('success', () => {
177
- this.$message.success(`复制成功,覆盖文件 src/config/config.js 然后重启项目即可生效`).then(() => {
178
- const localConfig = localStorage.getItem(process.env.VUE_APP_SETTING_KEY)
179
- if (localConfig) {
180
- console.warn('检测到本地有历史保存的主题配置,想要要拷贝的配置代码生效,您可能需要先重置配置')
181
- this.$message.warn('检测到本地有历史保存的主题配置,想要要拷贝的配置代码生效,您可能需要先重置配置', 5)
182
- }
183
- })
184
- clipboard.destroy()
185
- })
186
- },
187
- saveSetting () {
188
- const closeMessage = this.$message.loading('正在保存到本地,请稍后...', 0)
189
- const config = this.extractConfig(true)
190
- localStorage.setItem(process.env.VUE_APP_SETTING_KEY, JSON.stringify(config))
191
- setTimeout(closeMessage, 800)
192
- },
193
- resetSetting () {
194
- this.$confirm({
195
- title: '重置主题会刷新页面,当前页面内容不会保留,确认重置?',
196
- onOk () {
197
- localStorage.removeItem(process.env.VUE_APP_SETTING_KEY)
198
- window.location.reload()
199
- }
200
- })
201
- },
202
- // 提取配置
203
- extractConfig (local = false) {
204
- const config = {}
205
- const mySetting = this.$store.state.setting
206
- const dftSetting = local ? deepMerge(setting, sysConfig) : setting
207
- Object.keys(mySetting).forEach(key => {
208
- const dftValue = dftSetting[key]; const myValue = mySetting[key]
209
- if (dftValue != undefined && !fastEqual(dftValue, myValue)) {
210
- config[key] = myValue
211
- }
212
- })
213
- return config
214
- },
215
- ...mapMutations('setting', ['setTheme', 'setLayout', 'setMultiPage', 'setWeekMode',
216
- 'setFixedSideBar', 'setFixedHeader', 'setAnimate', 'setHideSetting', 'setPageWidth'])
217
- }
218
- }
219
- </script>
220
-
221
- <style lang="less" scoped>
222
- .side-setting{
223
- min-height: 100%;
224
- background-color: @base-bg-color;
225
- padding: 24px;
226
- font-size: 14px;
227
- line-height: 1.5;
228
- word-wrap: break-word;
229
- position: relative;
230
- .flex{
231
- display: flex;
232
- }
233
- .select-item{
234
- width: 80px;
235
- }
236
- }
237
- </style>
1
+ <template>
2
+ <div class="side-setting">
3
+ <setting-item>
4
+ <a-button @click="saveSetting" type="primary" icon="save">{{ $t('save') }}</a-button>
5
+ <a-button @click="resetSetting" type="dashed" icon="redo" style="float: right">{{ $t('reset') }}</a-button>
6
+ </setting-item>
7
+ <setting-item :title="$t('theme.title')">
8
+ <img-checkbox-group
9
+ @change="values => setTheme({...theme, mode: values[0]})"
10
+ :default-values="[theme.mode]"
11
+ >
12
+ <img-checkbox :title="$t('theme.dark')" img="https://gw.alipayobjects.com/zos/rmsportal/LCkqqYNmvBEbokSDscrm.svg" value="dark"/>
13
+ <img-checkbox :title="$t('theme.light')" img="https://gw.alipayobjects.com/zos/rmsportal/jpRkZQMyYRryryPNtyIC.svg" value="light"/>
14
+ <img-checkbox :title="$t('theme.night')" img="https://gw.alipayobjects.com/zos/antfincdn/hmKaLQvmY2/LCkqqYNmvBEbokSDscrm.svg" value="night"/>
15
+ </img-checkbox-group>
16
+ </setting-item>
17
+ <setting-item :title="$t('theme.color')">
18
+ <color-checkbox-group
19
+ @change="(values, colors) => setTheme({...theme, color: colors[0]})"
20
+ :defaultValues="[palettes.indexOf(theme.color)]"
21
+ :multiple="false"
22
+ >
23
+ <color-checkbox v-for="(color, index) in palettes" :key="index" :color="color" :value="index" />
24
+ </color-checkbox-group>
25
+ </setting-item>
26
+ <a-divider/>
27
+ <setting-item :title="$t('navigate.title')">
28
+ <img-checkbox-group
29
+ @change="values => setLayout(values[0])"
30
+ :default-values="[layout]"
31
+ >
32
+ <img-checkbox :title="$t('navigate.side')" img="https://gw.alipayobjects.com/zos/rmsportal/JopDzEhOqwOjeNTXkoje.svg" value="side"/>
33
+ <img-checkbox :title="$t('navigate.head')" img="https://gw.alipayobjects.com/zos/rmsportal/KDNDBbriJhLwuqMoxcAr.svg" value="head"/>
34
+ <img-checkbox :title="$t('navigate.mix')" img="https://gw.alipayobjects.com/zos/antfincdn/x8Ob%26B8cy8/LCkqqYNmvBEbokSDscrm.svg" value="mix"/>
35
+ </img-checkbox-group>
36
+ </setting-item>
37
+ <setting-item>
38
+ <a-list :split="false">
39
+ <a-list-item>
40
+ {{ $t('navigate.content.title') }}
41
+ <a-select
42
+ :getPopupContainer="getPopupContainer"
43
+ :value="pageWidth"
44
+ @change="setPageWidth"
45
+ class="select-item"
46
+ size="small"
47
+ slot="actions"
48
+ >
49
+ <a-select-option value="fluid">{{ $t('navigate.content.fluid') }}</a-select-option>
50
+ <a-select-option value="fixed">{{ $t('navigate.content.fixed') }}</a-select-option>
51
+ </a-select>
52
+ </a-list-item>
53
+ <a-list-item>
54
+ {{ $t('navigate.fixedHeader') }}
55
+ <a-switch :checked="fixedHeader" slot="actions" size="small" @change="setFixedHeader" />
56
+ </a-list-item>
57
+ <a-list-item>
58
+ {{ $t('navigate.fixedSideBar') }}
59
+ <a-switch :checked="fixedSideBar" slot="actions" size="small" @change="setFixedSideBar" />
60
+ </a-list-item>
61
+ </a-list>
62
+ </setting-item>
63
+ <a-divider />
64
+ <setting-item :title="$t('other.title')">
65
+ <a-list :split="false">
66
+ <a-list-item>
67
+ {{ $t('other.weekMode') }}
68
+ <a-switch :checked="weekMode" slot="actions" size="small" @change="setWeekMode" />
69
+ </a-list-item>
70
+ <a-list-item>
71
+ {{ $t('other.multiPages') }}
72
+ <a-switch :checked="multiPage" slot="actions" size="small" @change="setMultiPage" />
73
+ </a-list-item>
74
+ <a-list-item>
75
+ {{ $t('other.hideSetting') }}
76
+ <a-switch :checked="hideSetting" slot="actions" size="small" @change="setHideSetting" />
77
+ </a-list-item>
78
+ </a-list>
79
+ </setting-item>
80
+ <a-divider />
81
+ <setting-item :title="$t('animate.title')">
82
+ <a-list :split="false">
83
+ <a-list-item>
84
+ {{ $t('animate.disable') }}
85
+ <a-switch :checked="animate.disabled" slot="actions" size="small" @change="val => setAnimate({...animate, disabled: val})" />
86
+ </a-list-item>
87
+ <a-list-item>
88
+ {{ $t('animate.effect') }}
89
+ <a-select
90
+ :value="animate.name"
91
+ :getPopupContainer="getPopupContainer"
92
+ @change="val => setAnimate({...animate, name: val})"
93
+ class="select-item"
94
+ size="small"
95
+ slot="actions"
96
+ >
97
+ <a-select-option :key="index" :value="item.name" v-for="(item, index) in animates">{{ item.alias }}</a-select-option>
98
+ </a-select>
99
+ </a-list-item>
100
+ <a-list-item>
101
+ {{ $t('animate.direction') }}
102
+ <a-select
103
+ :value="animate.direction"
104
+ :getPopupContainer="getPopupContainer"
105
+ @change="val => setAnimate({...animate, direction: val})"
106
+ class="select-item"
107
+ size="small"
108
+ slot="actions"
109
+ >
110
+ <a-select-option :key="index" :value="item" v-for="(item, index) in directions">{{ item }}</a-select-option>
111
+ </a-select>
112
+ </a-list-item>
113
+ </a-list>
114
+ </setting-item>
115
+ <a-alert
116
+ v-if="isDev"
117
+ style="max-width: 240px; margin: -16px 0 8px; word-break: break-all"
118
+ type="warning"
119
+ :message="$t('alert')"
120
+ >
121
+ </a-alert>
122
+ <a-button
123
+ v-if="isDev"
124
+ id="copyBtn"
125
+ :data-clipboard-text="copyConfig"
126
+ @click="copyCode"
127
+ style="width: 100%"
128
+ icon="copy" >{{ $t('copy') }}</a-button>
129
+ </div>
130
+ </template>
131
+
132
+ <script>
133
+ import SettingItem from './SettingItem'
134
+ import { ColorCheckbox, ImgCheckbox } from '@vue2-client/components/checkbox'
135
+ import Clipboard from 'clipboard'
136
+ import { mapState, mapMutations } from 'vuex'
137
+ import { formatConfig } from '@vue2-client/utils/formatter'
138
+ import { setting } from '@vue2-client/config/default'
139
+ import sysConfig from '@vue2-client/config/config'
140
+ import fastEqual from 'fast-deep-equal'
141
+ import deepMerge from 'deepmerge'
142
+
143
+ const ColorCheckboxGroup = ColorCheckbox.Group
144
+ const ImgCheckboxGroup = ImgCheckbox.Group
145
+ export default {
146
+ name: 'Setting',
147
+ i18n: require('./i18n'),
148
+ components: { ImgCheckboxGroup, ImgCheckbox, ColorCheckboxGroup, ColorCheckbox, SettingItem },
149
+ data () {
150
+ return {
151
+ copyConfig: 'Sorry, you have copied nothing O(∩_∩)O~',
152
+ isDev: process.env.NODE_ENV === 'development'
153
+ }
154
+ },
155
+ computed: {
156
+ directions () {
157
+ return this.animates.find(item => item.name == this.animate.name).directions
158
+ },
159
+ ...mapState('setting', ['theme', 'layout', 'animate', 'animates', 'palettes', 'multiPage', 'weekMode', 'fixedHeader', 'fixedSideBar', 'hideSetting', 'pageWidth'])
160
+ },
161
+ watch: {
162
+ 'animate.name': function (val) {
163
+ this.setAnimate({ name: val, direction: this.directions[0] })
164
+ }
165
+ },
166
+ methods: {
167
+ getPopupContainer () {
168
+ return this.$el.parentNode
169
+ },
170
+ copyCode () {
171
+ const config = this.extractConfig(false)
172
+ this.copyConfig = `// 自定义配置,参考 ./default/setting.config.js,需要自定义的属性在这里配置即可
173
+ module.exports = ${formatConfig(config)}
174
+ `
175
+ const clipboard = new Clipboard('#copyBtn')
176
+ clipboard.on('success', () => {
177
+ this.$message.success(`复制成功,覆盖文件 src/config/config.js 然后重启项目即可生效`).then(() => {
178
+ const localConfig = localStorage.getItem(process.env.VUE_APP_SETTING_KEY)
179
+ if (localConfig) {
180
+ console.warn('检测到本地有历史保存的主题配置,想要要拷贝的配置代码生效,您可能需要先重置配置')
181
+ this.$message.warn('检测到本地有历史保存的主题配置,想要要拷贝的配置代码生效,您可能需要先重置配置', 5)
182
+ }
183
+ })
184
+ clipboard.destroy()
185
+ })
186
+ },
187
+ saveSetting () {
188
+ const closeMessage = this.$message.loading('正在保存到本地,请稍后...', 0)
189
+ const config = this.extractConfig(true)
190
+ localStorage.setItem(process.env.VUE_APP_SETTING_KEY, JSON.stringify(config))
191
+ setTimeout(closeMessage, 800)
192
+ },
193
+ resetSetting () {
194
+ this.$confirm({
195
+ title: '重置主题会刷新页面,当前页面内容不会保留,确认重置?',
196
+ onOk () {
197
+ localStorage.removeItem(process.env.VUE_APP_SETTING_KEY)
198
+ window.location.reload()
199
+ }
200
+ })
201
+ },
202
+ // 提取配置
203
+ extractConfig (local = false) {
204
+ const config = {}
205
+ const mySetting = this.$store.state.setting
206
+ const dftSetting = local ? deepMerge(setting, sysConfig) : setting
207
+ Object.keys(mySetting).forEach(key => {
208
+ const dftValue = dftSetting[key]; const myValue = mySetting[key]
209
+ if (dftValue != undefined && !fastEqual(dftValue, myValue)) {
210
+ config[key] = myValue
211
+ }
212
+ })
213
+ return config
214
+ },
215
+ ...mapMutations('setting', ['setTheme', 'setLayout', 'setMultiPage', 'setWeekMode',
216
+ 'setFixedSideBar', 'setFixedHeader', 'setAnimate', 'setHideSetting', 'setPageWidth'])
217
+ }
218
+ }
219
+ </script>
220
+
221
+ <style lang="less" scoped>
222
+ .side-setting{
223
+ min-height: 100%;
224
+ background-color: @base-bg-color;
225
+ padding: 24px;
226
+ font-size: 14px;
227
+ line-height: 1.5;
228
+ word-wrap: break-word;
229
+ position: relative;
230
+ .flex{
231
+ display: flex;
232
+ }
233
+ .select-item{
234
+ width: 80px;
235
+ }
236
+ }
237
+ </style>