vue2-client 1.18.39 → 1.18.40

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 (102) hide show
  1. package/.eslintrc.js +90 -90
  2. package/Components.md +60 -60
  3. package/docs/index.md +30 -30
  4. package/docs//350/257/267/346/261/202/345/267/245/345/205/267/344/275/277/347/224/250/350/257/264/346/230/216.md +353 -0
  5. package/index.js +31 -31
  6. package/jest-transform-stub.js +8 -8
  7. package/jest.setup.js +7 -7
  8. package/package.json +1 -1
  9. package/src/assets/img/querySlotDemo.svg +15 -15
  10. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  11. package/src/base-client/components/common/CitySelect/index.js +3 -3
  12. package/src/base-client/components/common/CitySelect/index.md +109 -109
  13. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  14. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  15. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  16. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  17. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  18. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  19. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  20. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  21. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  22. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  23. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  24. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  25. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  26. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  27. package/src/base-client/components/common/Tree/index.js +2 -2
  28. package/src/base-client/components/common/Upload/index.js +3 -3
  29. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  30. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  31. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  32. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  33. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  34. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  35. package/src/base-client/components/common/XDescriptions/index.md +322 -322
  36. package/src/base-client/components/common/XForm/index.md +178 -178
  37. package/src/base-client/components/common/XFormTable/demo.vue +2 -4
  38. package/src/base-client/components/common/XReport/print.js +186 -186
  39. package/src/base-client/components/common/XReportGrid/XReportTrGroup.vue +1 -1
  40. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  41. package/src/base-client/components/common/XStepView/index.js +3 -3
  42. package/src/base-client/components/common/XStepView/index.md +31 -31
  43. package/src/base-client/components/common/XTable/XTable.vue +1715 -1715
  44. package/src/base-client/components/common/XTable/XTableWrapper.vue +786 -769
  45. package/src/base-client/components/common/XTable/index.md +255 -255
  46. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  47. package/src/base-client/plugins/Config.js +19 -19
  48. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  49. package/src/components/Charts/Bar.vue +62 -62
  50. package/src/components/Charts/ChartCard.vue +134 -134
  51. package/src/components/Charts/Liquid.vue +67 -67
  52. package/src/components/Charts/MiniArea.vue +39 -39
  53. package/src/components/Charts/MiniBar.vue +39 -39
  54. package/src/components/Charts/MiniProgress.vue +75 -75
  55. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  56. package/src/components/Charts/Radar.vue +68 -68
  57. package/src/components/Charts/RankList.vue +77 -77
  58. package/src/components/Charts/TagCloud.vue +113 -113
  59. package/src/components/Charts/TransferBar.vue +64 -64
  60. package/src/components/Charts/Trend.vue +82 -82
  61. package/src/components/Charts/chart.less +12 -12
  62. package/src/components/Charts/smooth.area.less +13 -13
  63. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  64. package/src/components/NumberInfo/index.js +3 -3
  65. package/src/components/NumberInfo/index.less +54 -54
  66. package/src/components/NumberInfo/index.md +43 -43
  67. package/src/components/card/ChartCard.vue +79 -79
  68. package/src/components/chart/Bar.vue +60 -60
  69. package/src/components/chart/MiniArea.vue +67 -67
  70. package/src/components/chart/MiniBar.vue +59 -59
  71. package/src/components/chart/MiniProgress.vue +57 -57
  72. package/src/components/chart/Radar.vue +80 -80
  73. package/src/components/chart/RankingList.vue +60 -60
  74. package/src/components/chart/Trend.vue +79 -79
  75. package/src/components/chart/index.less +9 -9
  76. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  77. package/src/components/input/IInput.vue +66 -66
  78. package/src/components/menu/SideMenu.vue +75 -75
  79. package/src/components/menu/menu.js +273 -273
  80. package/src/components/tool/AStepItem.vue +60 -60
  81. package/src/composables/demo/UseRequestDemo.vue +175 -0
  82. package/src/composables/index.js +6 -0
  83. package/src/composables/useGlobalLoading.js +206 -0
  84. package/src/composables/usePost.js +221 -0
  85. package/src/layouts/CommonLayout.vue +56 -56
  86. package/src/layouts/header/HeaderNotice.vue +177 -177
  87. package/src/lib.js +1 -1
  88. package/src/mock/extend/index.js +84 -84
  89. package/src/mock/goods/index.js +108 -108
  90. package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
  91. package/src/pages/system/dictionary/index.vue +44 -44
  92. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  93. package/src/pages/system/monitor/operLog/index.vue +37 -37
  94. package/src/services/api/cas.js +79 -79
  95. package/src/services/api/restTools.js +34 -46
  96. package/src/store/modules/setting.js +119 -119
  97. package/src/utils/authority-utils.js +85 -85
  98. package/src/utils/errorCode.js +6 -6
  99. package/src/utils/map-utils.js +47 -47
  100. package/src/utils/request.js +103 -0
  101. package/vue.config.js +9 -4
  102. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
@@ -1,232 +1,232 @@
1
- <template>
2
- <a-drawer
3
- title="字典详情"
4
- placement="right"
5
- :width="isMobile ? screenWidth : screenWidth * 0.85"
6
- :visible="visible"
7
- @close="onClose"
8
- >
9
- <a-spin :spinning="loadDetails">
10
- <a-page-header
11
- :title="'字典名称:' + details.f_name"
12
- >
13
- <div class="row">
14
- <div class="content">
15
- <a-descriptions size="small" :column="isMobile ? 1 : 2">
16
- <a-descriptions-item label="字典编号">{{ details.id }}</a-descriptions-item>
17
- <a-descriptions-item label="字典键">{{ details.f_key }}</a-descriptions-item>
18
- <a-descriptions-item label="备注">{{ details.f_remark }}</a-descriptions-item>
19
- <a-descriptions-item label="创建时间">{{ format(details.f_input_date) }}</a-descriptions-item>
20
- </a-descriptions>
21
- </div>
22
- <div class="extra">
23
- <a-row class="status-list">
24
- <a-col :xs="12" :sm="24">
25
- </a-col>
26
- </a-row>
27
- </div>
28
- </div>
29
- <!-- actions -->
30
- <template #extra>
31
- <a-button-group style="margin-right: 4px;">
32
- <a-button type="dashed" @click="initView" :loading="loadDetails">刷新</a-button>
33
- </a-button-group>
34
- </template>
35
- <template slot="footer">
36
- <a-tabs :default-active-key="tabActiveKey" :activeKey="tabActiveKey" @change="handleTabChange" style="margin-bottom: 23px;">
37
- <template v-for="value in tabList">
38
- <a-tab-pane :key="value.key" :tab="value.tab"/>
39
- </template>
40
- </a-tabs>
41
- <div v-if="!loadDetails">
42
- <template v-if="tabActiveKey === '1'">
43
- <x-form-table
44
- title="字典数据配置"
45
- :fixed-add-form="fixedAddForm"
46
- :fixed-query-form="fixedQueryForm"
47
- serviceName="af-system"
48
- queryParamsName="crud_dictionary_value_manage"
49
- @afterSubmit="afterSubmit"
50
- >
51
- </x-form-table>
52
- </template>
53
- </div>
54
- </template>
55
- </a-page-header>
56
- </a-spin>
57
- </a-drawer>
58
- </template>
59
-
60
- <script>
61
- import { DictionaryDetailsViewApi, post } from '@vue2-client/services/api'
62
- import { mapState } from 'vuex'
63
- import { formatDate } from '@vue2-client/utils/util'
64
- import XFormTable from '@vue2-client/base-client/components/common/XFormTable/XFormTable'
65
-
66
- export default {
67
- name: 'DictionaryDetailsView',
68
- components: {
69
- XFormTable
70
- },
71
- data () {
72
- return {
73
- // 页面宽度
74
- screenWidth: document.documentElement.clientWidth,
75
- // Tab页签
76
- tabActiveKey: '1',
77
- // 字典详情
78
- details: {
79
- id: 0,
80
- f_name: '',
81
- f_key: '',
82
- f_remark: '',
83
- f_input_date: '',
84
- f_state: 0
85
- },
86
- tabList: [
87
- { key: '1', tab: '字典数据' }
88
- ],
89
- // 固定新增数据
90
- fixedAddForm: {},
91
- // 固定查询数据
92
- fixedQueryForm: {},
93
- // 详情加载
94
- loadDetails: true
95
- }
96
- },
97
- mounted () {
98
- this.initView()
99
- },
100
- computed: {
101
- ...mapState('account', { currUser: 'user' }),
102
- ...mapState('setting', ['isMobile'])
103
- },
104
- props: {
105
- id: {
106
- type: String,
107
- required: true
108
- },
109
- visible: {
110
- type: Boolean,
111
- default: false
112
- }
113
- },
114
- methods: {
115
- // 初始化组件
116
- initView () {
117
- this.tabActiveKey = '1'
118
- this.fixedQueryForm.v_f_dictionary_id = this.id
119
- this.fixedAddForm.v_f_dictionary_id = this.id
120
- this.getDetails(this.id)
121
- },
122
- onClose () {
123
- this.$emit('update:visible', false)
124
- },
125
- // 获取详情信息
126
- getDetails (userId) {
127
- this.loadDetails = true
128
- return post(DictionaryDetailsViewApi.getDictionaryDetails, {
129
- id: userId
130
- })
131
- .then(res => {
132
- this.details = res
133
- this.loadDetails = false
134
- }, err => {
135
- this.loadDetails = false
136
- console.error(err)
137
- })
138
- },
139
- // Tab切换
140
- handleTabChange (key) {
141
- this.tabActiveKey = key
142
- },
143
- // 日期格式化
144
- format (date, format) {
145
- return formatDate(date, format)
146
- },
147
- afterSubmit () {
148
- this.$appdata.load()
149
- }
150
- },
151
- watch: {
152
- 'visible' (val) {
153
- if (val) {
154
- this.initView()
155
- }
156
- }
157
- }
158
- }
159
- </script>
160
-
161
- <style lang="less" scoped>
162
- .business {
163
- color: #ffffff;
164
- }
165
- .business:enabled:hover {
166
- background-color: #85CE61 !important;
167
- border-color: #85CE61 !important;
168
- }
169
- .business:enabled {
170
- background-color: #67c23a;
171
- border-color: #67c23a;
172
- }
173
- .business:disabled {
174
- color: rgba(0, 0, 0, 0.25);
175
- }
176
- .detail-layout {
177
- margin-left: 44px;
178
- }
179
- .text {
180
- color: rgba(0, 0, 0, .45);
181
- }
182
-
183
- .heading {
184
- color: rgba(0, 0, 0, .85);
185
- font-size: 20px;
186
- }
187
-
188
- .no-data {
189
- color: rgba(0, 0, 0, .25);
190
- text-align: center;
191
- line-height: 64px;
192
- font-size: 16px;
193
-
194
- i {
195
- font-size: 24px;
196
- margin-right: 16px;
197
- position: relative;
198
- top: 3px;
199
- }
200
- }
201
-
202
- .mobile {
203
- .detail-layout {
204
- margin-left: unset;
205
- }
206
- .text {
207
-
208
- }
209
- .status-list {
210
- text-align: left;
211
- }
212
- }
213
-
214
- .row {
215
- display: flex;
216
-
217
- .content {
218
- -webkit-box-flex: 1;
219
- flex: auto;
220
- -ms-flex: auto;
221
- }
222
-
223
- .extra {
224
- flex: 0 1 auto;
225
- -webkit-box-flex: 0;
226
- -ms-flex: 0 1 auto;
227
- min-width: 242px;
228
- margin-left: 88px;
229
- text-align: right;
230
- }
231
- }
232
- </style>
1
+ <template>
2
+ <a-drawer
3
+ title="字典详情"
4
+ placement="right"
5
+ :width="isMobile ? screenWidth : screenWidth * 0.85"
6
+ :visible="visible"
7
+ @close="onClose"
8
+ >
9
+ <a-spin :spinning="loadDetails">
10
+ <a-page-header
11
+ :title="'字典名称:' + details.f_name"
12
+ >
13
+ <div class="row">
14
+ <div class="content">
15
+ <a-descriptions size="small" :column="isMobile ? 1 : 2">
16
+ <a-descriptions-item label="字典编号">{{ details.id }}</a-descriptions-item>
17
+ <a-descriptions-item label="字典键">{{ details.f_key }}</a-descriptions-item>
18
+ <a-descriptions-item label="备注">{{ details.f_remark }}</a-descriptions-item>
19
+ <a-descriptions-item label="创建时间">{{ format(details.f_input_date) }}</a-descriptions-item>
20
+ </a-descriptions>
21
+ </div>
22
+ <div class="extra">
23
+ <a-row class="status-list">
24
+ <a-col :xs="12" :sm="24">
25
+ </a-col>
26
+ </a-row>
27
+ </div>
28
+ </div>
29
+ <!-- actions -->
30
+ <template #extra>
31
+ <a-button-group style="margin-right: 4px;">
32
+ <a-button type="dashed" @click="initView" :loading="loadDetails">刷新</a-button>
33
+ </a-button-group>
34
+ </template>
35
+ <template slot="footer">
36
+ <a-tabs :default-active-key="tabActiveKey" :activeKey="tabActiveKey" @change="handleTabChange" style="margin-bottom: 23px;">
37
+ <template v-for="value in tabList">
38
+ <a-tab-pane :key="value.key" :tab="value.tab"/>
39
+ </template>
40
+ </a-tabs>
41
+ <div v-if="!loadDetails">
42
+ <template v-if="tabActiveKey === '1'">
43
+ <x-form-table
44
+ title="字典数据配置"
45
+ :fixed-add-form="fixedAddForm"
46
+ :fixed-query-form="fixedQueryForm"
47
+ serviceName="af-system"
48
+ queryParamsName="crud_dictionary_value_manage"
49
+ @afterSubmit="afterSubmit"
50
+ >
51
+ </x-form-table>
52
+ </template>
53
+ </div>
54
+ </template>
55
+ </a-page-header>
56
+ </a-spin>
57
+ </a-drawer>
58
+ </template>
59
+
60
+ <script>
61
+ import { DictionaryDetailsViewApi, post } from '@vue2-client/services/api'
62
+ import { mapState } from 'vuex'
63
+ import { formatDate } from '@vue2-client/utils/util'
64
+ import XFormTable from '@vue2-client/base-client/components/common/XFormTable/XFormTable'
65
+
66
+ export default {
67
+ name: 'DictionaryDetailsView',
68
+ components: {
69
+ XFormTable
70
+ },
71
+ data () {
72
+ return {
73
+ // 页面宽度
74
+ screenWidth: document.documentElement.clientWidth,
75
+ // Tab页签
76
+ tabActiveKey: '1',
77
+ // 字典详情
78
+ details: {
79
+ id: 0,
80
+ f_name: '',
81
+ f_key: '',
82
+ f_remark: '',
83
+ f_input_date: '',
84
+ f_state: 0
85
+ },
86
+ tabList: [
87
+ { key: '1', tab: '字典数据' }
88
+ ],
89
+ // 固定新增数据
90
+ fixedAddForm: {},
91
+ // 固定查询数据
92
+ fixedQueryForm: {},
93
+ // 详情加载
94
+ loadDetails: true
95
+ }
96
+ },
97
+ mounted () {
98
+ this.initView()
99
+ },
100
+ computed: {
101
+ ...mapState('account', { currUser: 'user' }),
102
+ ...mapState('setting', ['isMobile'])
103
+ },
104
+ props: {
105
+ id: {
106
+ type: String,
107
+ required: true
108
+ },
109
+ visible: {
110
+ type: Boolean,
111
+ default: false
112
+ }
113
+ },
114
+ methods: {
115
+ // 初始化组件
116
+ initView () {
117
+ this.tabActiveKey = '1'
118
+ this.fixedQueryForm.v_f_dictionary_id = this.id
119
+ this.fixedAddForm.v_f_dictionary_id = this.id
120
+ this.getDetails(this.id)
121
+ },
122
+ onClose () {
123
+ this.$emit('update:visible', false)
124
+ },
125
+ // 获取详情信息
126
+ getDetails (userId) {
127
+ this.loadDetails = true
128
+ return post(DictionaryDetailsViewApi.getDictionaryDetails, {
129
+ id: userId
130
+ })
131
+ .then(res => {
132
+ this.details = res
133
+ this.loadDetails = false
134
+ }, err => {
135
+ this.loadDetails = false
136
+ console.error(err)
137
+ })
138
+ },
139
+ // Tab切换
140
+ handleTabChange (key) {
141
+ this.tabActiveKey = key
142
+ },
143
+ // 日期格式化
144
+ format (date, format) {
145
+ return formatDate(date, format)
146
+ },
147
+ afterSubmit () {
148
+ this.$appdata.load()
149
+ }
150
+ },
151
+ watch: {
152
+ 'visible' (val) {
153
+ if (val) {
154
+ this.initView()
155
+ }
156
+ }
157
+ }
158
+ }
159
+ </script>
160
+
161
+ <style lang="less" scoped>
162
+ .business {
163
+ color: #ffffff;
164
+ }
165
+ .business:enabled:hover {
166
+ background-color: #85CE61 !important;
167
+ border-color: #85CE61 !important;
168
+ }
169
+ .business:enabled {
170
+ background-color: #67c23a;
171
+ border-color: #67c23a;
172
+ }
173
+ .business:disabled {
174
+ color: rgba(0, 0, 0, 0.25);
175
+ }
176
+ .detail-layout {
177
+ margin-left: 44px;
178
+ }
179
+ .text {
180
+ color: rgba(0, 0, 0, .45);
181
+ }
182
+
183
+ .heading {
184
+ color: rgba(0, 0, 0, .85);
185
+ font-size: 20px;
186
+ }
187
+
188
+ .no-data {
189
+ color: rgba(0, 0, 0, .25);
190
+ text-align: center;
191
+ line-height: 64px;
192
+ font-size: 16px;
193
+
194
+ i {
195
+ font-size: 24px;
196
+ margin-right: 16px;
197
+ position: relative;
198
+ top: 3px;
199
+ }
200
+ }
201
+
202
+ .mobile {
203
+ .detail-layout {
204
+ margin-left: unset;
205
+ }
206
+ .text {
207
+
208
+ }
209
+ .status-list {
210
+ text-align: left;
211
+ }
212
+ }
213
+
214
+ .row {
215
+ display: flex;
216
+
217
+ .content {
218
+ -webkit-box-flex: 1;
219
+ flex: auto;
220
+ -ms-flex: auto;
221
+ }
222
+
223
+ .extra {
224
+ flex: 0 1 auto;
225
+ -webkit-box-flex: 0;
226
+ -ms-flex: 0 1 auto;
227
+ min-width: 242px;
228
+ margin-left: 88px;
229
+ text-align: right;
230
+ }
231
+ }
232
+ </style>
@@ -1,19 +1,19 @@
1
- const asyncReady = async function (vm, name) {
2
- // 获取配置信息
3
- try {
4
- const res = await vm.$resetget('/rs/vue/' + name + '.json', { resolveMsg: null, rejectMsg: null })
5
- Object.assign(vm.config, res)
6
- } catch (error) {
7
- // 忽略704,文件找不到异常
8
- if (error.status !== 704) {
9
- throw error
10
- }
11
- }
12
- }
13
- export default {
14
- install (Vue) {
15
- Vue.getConfig = Vue.prototype.$getConfig = function (vm, name) {
16
- return asyncReady(vm, name)
17
- }
18
- }
19
- }
1
+ const asyncReady = async function (vm, name) {
2
+ // 获取配置信息
3
+ try {
4
+ const res = await vm.$resetget('/rs/vue/' + name + '.json', { resolveMsg: null, rejectMsg: null })
5
+ Object.assign(vm.config, res)
6
+ } catch (error) {
7
+ // 忽略704,文件找不到异常
8
+ if (error.status !== 704) {
9
+ throw error
10
+ }
11
+ }
12
+ }
13
+ export default {
14
+ install (Vue) {
15
+ Vue.getConfig = Vue.prototype.$getConfig = function (vm, name) {
16
+ return asyncReady(vm, name)
17
+ }
18
+ }
19
+ }
@@ -1,39 +1,39 @@
1
- const TabsPagePlugin = {
2
- install (Vue) {
3
- Vue.mixin({
4
- methods: {
5
- $closePage (closeRoute, nextRoute) {
6
- const event = new CustomEvent('page:close', { detail: { closeRoute, nextRoute } })
7
- window.dispatchEvent(event)
8
- },
9
- $refreshPage (route) {
10
- const path = typeof route === 'object' ? route.path : route
11
- const event = new CustomEvent('page:refresh', { detail: { pageKey: path } })
12
- window.dispatchEvent(event)
13
- },
14
- $openPage (route, title) {
15
- this.$setPageTitle(route, title)
16
- this.$router.push(route)
17
- },
18
- $setPageTitle (route, title) {
19
- if (title) {
20
- // let path = typeof route === 'object' ? route.path : route
21
- // path = path && path.split('?')[0]
22
- const path = typeof route === 'object' ? this.$router.resolve(route).route.fullPath : route
23
- this.$store.commit('setting/setCustomTitle', { path, title })
24
- }
25
- }
26
- },
27
- computed: {
28
- customTitle () {
29
- const customTitles = this.$store.state.setting.customTitles
30
- // const path = this.$route.path.split('?')[0]
31
- const custom = customTitles.find(item => item.path === this.$route.fullPath)
32
- return custom && custom.title
33
- }
34
- }
35
- })
36
- }
37
- }
38
-
39
- export default TabsPagePlugin
1
+ const TabsPagePlugin = {
2
+ install (Vue) {
3
+ Vue.mixin({
4
+ methods: {
5
+ $closePage (closeRoute, nextRoute) {
6
+ const event = new CustomEvent('page:close', { detail: { closeRoute, nextRoute } })
7
+ window.dispatchEvent(event)
8
+ },
9
+ $refreshPage (route) {
10
+ const path = typeof route === 'object' ? route.path : route
11
+ const event = new CustomEvent('page:refresh', { detail: { pageKey: path } })
12
+ window.dispatchEvent(event)
13
+ },
14
+ $openPage (route, title) {
15
+ this.$setPageTitle(route, title)
16
+ this.$router.push(route)
17
+ },
18
+ $setPageTitle (route, title) {
19
+ if (title) {
20
+ // let path = typeof route === 'object' ? route.path : route
21
+ // path = path && path.split('?')[0]
22
+ const path = typeof route === 'object' ? this.$router.resolve(route).route.fullPath : route
23
+ this.$store.commit('setting/setCustomTitle', { path, title })
24
+ }
25
+ }
26
+ },
27
+ computed: {
28
+ customTitle () {
29
+ const customTitles = this.$store.state.setting.customTitles
30
+ // const path = this.$route.path.split('?')[0]
31
+ const custom = customTitles.find(item => item.path === this.$route.fullPath)
32
+ return custom && custom.title
33
+ }
34
+ }
35
+ })
36
+ }
37
+ }
38
+
39
+ export default TabsPagePlugin