@tongfun/tf-widget 0.1.6 → 0.1.10

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 (80) hide show
  1. package/.browserslistrc +3 -3
  2. package/.editorconfig +5 -5
  3. package/.eslintrc.js +17 -17
  4. package/README.md +39 -8
  5. package/dist/css/chunk-9c7a8e06.920744ef.css +1 -0
  6. package/dist/css/chunk-vendors.de967301.css +1 -0
  7. package/dist/css/index.153bd82e.css +1 -0
  8. package/dist/fonts/element-icons.535877f5.woff +0 -0
  9. package/dist/fonts/element-icons.732389de.ttf +0 -0
  10. package/dist/js/chunk-9c7a8e06.ffff58b5.js +1 -0
  11. package/dist/js/chunk-vendors.45086d09.js +39 -0
  12. package/dist/js/index.52bcef0d.js +1 -0
  13. package/lib/css/1.920744ef.css +1 -0
  14. package/lib/tf-widget.common.1.js +387 -0
  15. package/lib/tf-widget.common.js +85007 -63712
  16. package/lib/tf-widget.css +1 -1
  17. package/lib/tf-widget.umd.1.js +387 -0
  18. package/lib/tf-widget.umd.js +85007 -63712
  19. package/lib/tf-widget.umd.min.1.js +1 -0
  20. package/lib/tf-widget.umd.min.js +10 -3
  21. package/package/t-data-list/index.js +6 -0
  22. package/package/t-data-list/main.vue +192 -0
  23. package/package/t-data-list/src/condition-input/basic.vue +31 -0
  24. package/package/t-data-list/src/condition-input/date.vue +106 -0
  25. package/package/t-data-list/src/condition-input/index.vue +100 -0
  26. package/package/t-data-list/src/condition-input/input.vue +31 -0
  27. package/package/t-data-list/src/condition-input/number.vue +115 -0
  28. package/package/t-data-list/src/condition-input/select.vue +86 -0
  29. package/package/t-data-list/src/js/fieldTypeEnum.js +10 -0
  30. package/package/t-data-list/src/js/operatorEnum.js +109 -0
  31. package/package/t-data-list/src/js/qureyParamsEnum.js +4 -0
  32. package/package/t-data-list/src/js/util.js +34 -0
  33. package/package/t-data-list/src/mixins/button-controll-mixin.js +77 -0
  34. package/package/t-data-list/src/pushdown/push-down.vue +158 -0
  35. package/package/t-data-list/src/t-list-search.vue +32 -0
  36. package/package/t-data-list/src/t-plan/condition-always-item.vue +143 -0
  37. package/package/t-data-list/src/t-plan/condition-mult-item.vue +222 -0
  38. package/package/t-data-list/src/t-plan/index.vue +190 -0
  39. package/package/t-data-list/src/t-plan/plan-content.vue +396 -0
  40. package/package/t-data-list/src/t-table/index.vue +120 -0
  41. package/package/t-data-list/src/t-table/table-group-item-edit.vue +238 -0
  42. package/package/t-data-list/src/t-table/table-group-item.vue +87 -0
  43. package/package/t-data-list/src/t-table/table-group.vue +179 -0
  44. package/package/t-data-list/src/t-table/table-records-header-popover.vue +250 -0
  45. package/package/t-data-list/src/t-table/table-records-selected.vue +159 -0
  46. package/package/t-data-list/src/t-table/table-records.vue +324 -0
  47. package/package/t-input/children/address.vue +101 -0
  48. package/package/t-input/children/basic-display.vue +41 -0
  49. package/package/t-input/children/basic.vue +251 -0
  50. package/package/t-input/children/date.vue +89 -0
  51. package/package/t-input/children/group-components/group-dialog.vue +350 -0
  52. package/package/t-input/children/group.vue +126 -0
  53. package/package/t-input/children/input.vue +72 -0
  54. package/package/t-input/children/number.vue +74 -0
  55. package/package/t-input/children/select.vue +89 -0
  56. package/package/t-input/children/tfile/fiile-enclosure.vue +233 -0
  57. package/package/t-input/children/tfile/file-img/comp.png +0 -0
  58. package/package/t-input/children/tfile/file-img/excel.png +0 -0
  59. package/package/t-input/children/tfile/file-img/img.png +0 -0
  60. package/package/t-input/children/tfile/file-img/pdf.png +0 -0
  61. package/package/t-input/children/tfile/file-img/word.png +0 -0
  62. package/package/t-input/index.js +7 -0
  63. package/package/t-input/index.vue +337 -0
  64. package/package/t-input/tInputCache.js +24 -0
  65. package/package/tf-layout/README.md +69 -0
  66. package/package/tf-layout/index.js +8 -0
  67. package/package/tf-layout/src/components/tf-labelbar.vue +376 -0
  68. package/package/tf-layout/src/components/tf-menu.vue +180 -0
  69. package/package/tf-layout/src/components/tf-right-menu.vue +89 -0
  70. package/package/tf-layout/src/components/tf-rotate-box.vue +50 -0
  71. package/package/tf-layout/src/tf-layout.vue +115 -0
  72. package/package/tf-widget/src/children/decimal.vue +15 -16
  73. package/package/tf-widget/src/children/integer.vue +15 -16
  74. package/package.json +4 -2
  75. package/postinstall.js +10 -10
  76. package/src/api/file-enclosure.js +26 -0
  77. package/src/api/push-down.js +19 -0
  78. package/src/api/tableV3.js +186 -0
  79. package/src/index.js +11 -3
  80. package/src/mixins/t-data-query-mixin.js +289 -0
@@ -0,0 +1,69 @@
1
+ # Layout 组件
2
+
3
+ ## 参数
4
+
5
+ 1. 菜单参数 (**:menusInfo**)
6
+
7
+ ``` javascript
8
+ {
9
+ path: '' // 路由path,
10
+ icon: '' // 菜单图标,
11
+ name: '' // 路由name,
12
+ title: '菜单名字',
13
+ childNode: [
14
+ {
15
+ path: '' // 路由path,
16
+ icon: '' // 菜单图标,
17
+ name: '' // 路由name,
18
+ title: '菜单名字',
19
+ }
20
+ ]
21
+ }
22
+ ```
23
+
24
+ 2. 三级缓存数组,通过事件@setThirdCache传递
25
+ 3. 例子:
26
+
27
+ ```javascript
28
+ <template>
29
+ <TfLayout
30
+ :menus-info="menuInfo"
31
+ @setThirdCache="setThirdCache"
32
+ />
33
+ </template>
34
+ <script>
35
+ export default {
36
+ name: 'Layout',
37
+
38
+ data() {
39
+ return {
40
+ menuInfo: this.$store.getters.menuInfo
41
+ }
42
+ },
43
+ methods: {
44
+ setThirdCache(value) {
45
+ this.$store.commit('routeCaching/setThirdCache', value)
46
+ }
47
+ }
48
+ }
49
+ </script>
50
+ ```
51
+
52
+ 4. 小标签栏禁止关闭
53
+
54
+ 需要在路由的meta属性新增 **defaultRoute: true**
55
+
56
+ ```javascript
57
+ // 例子:
58
+ {
59
+ path: '/',
60
+ component: () => import('@/views/home/tenan-management-home'),
61
+ name: 'TenantManagementHome',
62
+ icon: 'home',
63
+ meta: {
64
+ title: '主页',
65
+ defaultRoute: true
66
+ }
67
+ },
68
+ ```
69
+
@@ -0,0 +1,8 @@
1
+ import TfLayout from './src/tf-layout'
2
+
3
+ /* istanbul ignore next */
4
+ TfLayout.install = function (Vue) {
5
+ Vue.component(TfLayout.name, TfLayout)
6
+ }
7
+
8
+ export default TfLayout
@@ -0,0 +1,376 @@
1
+ <template>
2
+ <div class="tf-labelbar">
3
+ <div class="close-menu">
4
+ <div
5
+ :class="coloseMenu ? 'open-menu-icon': 'close-menu-icon'"
6
+ src=""
7
+ alt=""
8
+ title="隐藏列表"
9
+ @click="changeMenuState"
10
+ />
11
+ </div>
12
+ <ul ref="labelMenu">
13
+ <li
14
+ v-for="tagItem in tagList"
15
+ :key="tagItem.path"
16
+ :class="activePath === tagItem.path ? 'active-tag' : ''"
17
+ @click="routeJump(tagItem)"
18
+ @contextmenu.prevent.stop="rightClick(tagItem, $event)"
19
+ >
20
+ <span>{{ tagItem.title }}</span>
21
+ <i
22
+ v-show="!tagItem.notCloseTag"
23
+ class="el-icon-close close-icon"
24
+ @click.stop="closeTag(tagItem)"
25
+ />
26
+ </li>
27
+ </ul>
28
+ <div
29
+ class="scrollbar-icon left"
30
+ @click="handleScroll('left')"
31
+ />
32
+ <el-dropdown
33
+ class="right-menu"
34
+ trigger="click"
35
+ @command="dropdownCommand"
36
+ >
37
+ <span class="el-dropdown-link">
38
+ <TfRotateBox />
39
+ </span>
40
+ <el-dropdown-menu slot="dropdown">
41
+ <el-dropdown-item
42
+ icon="el-icon-back"
43
+ command="closeLeft"
44
+ >关闭左侧</el-dropdown-item>
45
+ <el-dropdown-item
46
+ icon="el-icon-right"
47
+ command="closeRight"
48
+ >关闭右侧</el-dropdown-item>
49
+ <el-dropdown-item
50
+ icon="el-icon-circle-close"
51
+ command="closeOther"
52
+ >关闭其他</el-dropdown-item>
53
+ <el-dropdown-item
54
+ icon="el-icon-circle-close"
55
+ command="closeAll"
56
+ >关闭全部</el-dropdown-item>
57
+ </el-dropdown-menu>
58
+ </el-dropdown>
59
+ <div
60
+ class="scrollbar-icon right"
61
+ @click="handleScroll('right')"
62
+ />
63
+ <TfRightMenu
64
+ :left="rightMenuLeft"
65
+ :top="rightMenuTop"
66
+ :show-menu="showRightMenu"
67
+ @rightMenuClick="dropdownCommand"
68
+ />
69
+ </div>
70
+ </template>
71
+
72
+ <script>
73
+ import TfRotateBox from './tf-rotate-box.vue'
74
+ import TfRightMenu from './tf-right-menu'
75
+ export default {
76
+ name: 'TfLaberBar',
77
+ components: {
78
+ TfRotateBox,
79
+ TfRightMenu
80
+ },
81
+ data () {
82
+ return {
83
+ coloseMenu: false,
84
+ activePath: '/',
85
+ tagList: [],
86
+ rightMenuLeft: 0,
87
+ rightMenuTop: 0,
88
+ showRightMenu: false
89
+ }
90
+ },
91
+ watch: {
92
+ $route: {
93
+ handler: function (newValue) {
94
+ if (newValue) {
95
+ const { meta, path, name, params, query } = newValue
96
+ if (!path) return
97
+ const obj = {
98
+ path,
99
+ name,
100
+ params,
101
+ query,
102
+ defaultRoute: meta.defaultRoute,
103
+ notCloseTag: meta.defaultRoute,
104
+ title: meta.title,
105
+ replace: meta.replace
106
+ }
107
+ if (!meta.noCache) {
108
+ const cacheArr = newValue.matched.map(item => item.name)
109
+ this.$emit('setCache', cacheArr)
110
+ obj.cacheArr = cacheArr
111
+ }
112
+ if (obj.defaultRoute) {
113
+ if (!this.checkMenu(obj.path)) this.tagList.unshift(obj)
114
+ } else {
115
+ if (!this.checkMenu(obj.path)) this.tagList.push(obj)
116
+ }
117
+ // todo: 增加页面缓存
118
+ this.activePath = path
119
+ }
120
+ },
121
+ deep: true,
122
+ immediate: true
123
+ }
124
+ },
125
+ created () {
126
+ window.addEventListener('click', () => {
127
+ this.showRightMenu = false
128
+ }, false)
129
+ },
130
+ methods: {
131
+ changeMenuState () {
132
+ this.coloseMenu = !this.coloseMenu
133
+ this.$emit('changeMenuState', this.coloseMenu)
134
+ },
135
+ /**
136
+ * @description tag右键点击事件
137
+ */
138
+ rightClick: function (tagItem, $event) {
139
+ this.routeJump(tagItem)
140
+ this.$nextTick(() => {
141
+ this.rightMenuTop = $event.clientY
142
+ this.rightMenuLeft = $event.clientX
143
+ this.showRightMenu = true
144
+ })
145
+ },
146
+
147
+ /**
148
+ * @member
149
+ * @description 右侧操作
150
+ * @param params: 操作指令: closeLeft => 关闭左侧, closeRight => 关闭右侧, closeAll => 关闭全部,
151
+ */
152
+ dropdownCommand: function (params) {
153
+ const activeNum = this.tagList.findIndex(
154
+ (item) => item.path === this.activePath
155
+ )
156
+ const pathMap = new Map()
157
+ const deleteArr = []
158
+ const pathArr = this.tagList.map((item) => {
159
+ pathMap.set(item.path, item)
160
+ return item.path
161
+ })
162
+ switch (params) {
163
+ case 'closeLeft':
164
+ deleteArr.push(...pathArr.slice(0, activeNum))
165
+ break
166
+ case 'closeRight':
167
+ deleteArr.push(...pathArr.slice(activeNum + 1, pathArr.length))
168
+ break
169
+ case 'closeOther':
170
+ deleteArr.push(...pathArr.slice(0, activeNum))
171
+ deleteArr.push(...pathArr.slice(activeNum + 1, pathArr.length))
172
+ break
173
+ default:
174
+ deleteArr.push(...pathArr)
175
+ break
176
+ }
177
+ const deleteCacheArr = []
178
+ deleteArr.forEach((item) => {
179
+ const tagItem = pathMap.get(item)
180
+ if (tagItem && tagItem.cacheArr) deleteCacheArr.push(tagItem.cacheArr)
181
+ if (tagItem && !tagItem.notCloseTag) {
182
+ const num = this.tagList.indexOf(tagItem)
183
+ this.tagList.splice(num, 1)
184
+ }
185
+ })
186
+
187
+ this.$emit('deleteCache', deleteCacheArr)
188
+ if (params === 'closeAll') this.routeJump(this.tagList[0])
189
+ },
190
+ /**
191
+ * @description 左右滑动
192
+ * @param direction: 滑动方向
193
+ */
194
+ handleScroll (direction) {
195
+ let rollNum = 0
196
+ rollNum = direction === 'right' ? rollNum + 50 : rollNum - 50
197
+ const dom = this.$refs.labelMenu
198
+ dom.scrollLeft += rollNum
199
+ },
200
+ /**
201
+ * @description 点击tag标签
202
+ * @param path: 每项Tag
203
+ */
204
+ checkMenu (path) {
205
+ if (this.tagList.find((item) => item.path === path)) return true
206
+ return false
207
+ },
208
+ /**
209
+ * @description 路由跳转
210
+ */
211
+ routeJump: function (value) {
212
+ if (value && value.path !== this.activePath) {
213
+ const { path, query, params, replace } = value
214
+ if (replace) {
215
+ this.$router.replace({
216
+ path,
217
+ query,
218
+ params
219
+ })
220
+ } else {
221
+ this.$router.push({
222
+ path,
223
+ query,
224
+ params
225
+ })
226
+ }
227
+ }
228
+ },
229
+ /**
230
+ * 关闭tag
231
+ */
232
+ closeTag: function (tagItem) {
233
+ if (tagItem.cacheArr) this.$emit('deleteCache', [tagItem.cacheArr])
234
+ const num = this.tagList.indexOf(tagItem)
235
+ if (tagItem) {
236
+ this.tagList.splice(num, 1)
237
+ this.routeJump(this.tagList[num - 1])
238
+ }
239
+ }
240
+ }
241
+ }
242
+ </script>
243
+ <style lang="less" scoped>
244
+ .tf-labelbar {
245
+ width: 100%;
246
+ height: 40px;
247
+ position: relative;
248
+ box-sizing: border-box;
249
+ padding: 0 73px;
250
+ .close-menu {
251
+ cursor: pointer;
252
+ position: absolute;
253
+ left:0;
254
+ height: 40px;
255
+ width: 40px;
256
+ display: flex;
257
+ align-items: center;
258
+ justify-content: center;
259
+ box-shadow: 0 -2px 4px 0 rgba(0,0,0,0.25);
260
+ .close-menu-icon {
261
+ height: 15px;
262
+ width: 15px;
263
+ background: #99999a;
264
+ mask: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAAAXNSR0IArs4c6QAAAdpJREFUOE+Nkz1rFUEUht8zs0kstBArBUst9C8oEv/DvYg7V+9soZWVJhoxsCJ+YCspFLyzYecSkosgElNYqAg22hhFwUII4g+wEnFn58jG3Xh39wpOM5/nmcN73kNB395l0Ns8CUforEmMujnGx6SzsXuS2n4hosduEF5E/CJAPOt27su91Klmpt0+UfcQxwJx7Ks3JKJ0UzA9dUZdrQHO3Z/Cg/OZjIZ9MBuAo9z0TDNLEtp+EIx1l6iFHUAVrO1ZAAmAXm6Ubf5eZNEGFKfxrJPRMASzBdOZPAlTdNamMepkNX1agO1H3V9SWwUgBXAqN2q1GTS+b2QQC7l1qAviFSZc8j5bwnSwF1nmMLWLkf2k7eBq7YIffwDAhjPqMvTKQYn8K4CiEsW8v1w3k2AAAuB3LQ3E1rd5IrrJxPMSeMaQe8j7v6UtUUwsHOh7HVCqL6J0kZjmBPHxbNDb/H8NCsCBw1xUIdD2BgPXSNAJ9zB8hQsbM9j3JsPHI4Sjn7iaJ/ugdGCg7S0GFsjjmFtWr//lg/cCWG85sYL07W0mXCGik25w+iXi61SzchANP4P9E2d6c/VeYEJnJIrmCqL0jmfKvFGLLStLbR8x4bkfqKWJ3dhonqagvwFo3iEkt6LFjgAAAABJRU5ErkJggg==);
265
+ &:hover {
266
+ background: #07579a;
267
+ }
268
+ }
269
+ .open-menu-icon {
270
+ height: 15px;
271
+ width: 15px;
272
+ background: #99999a;
273
+ mask: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAPCAYAAADtc08vAAAAAXNSR0IArs4c6QAAAbRJREFUOE+dk7FP21AQxr/PzyZCsLQjXWFhQR0qVQyoLFXF2JIsicBxVHWooHSsOtRbxUAlRKWqgDDItiDAP8AEqBPs/RM6FykTxO9dFSd2lKSkUt/47u6n7+67I4Y+YTtMydOKxwonJW274QshdzsJnXAWrEbrAj7UQfk10r+iySH+uQ1/PlFeWIKw3gvwfQv+J7GX41mxcAFwfwCSAarRIoCjXkBLSArxjeOFM0Z4DWJX71Xe5kr8C5UqaAPqTAv6389pGyelO6d2+NgYfQViJ4c8+G1h+02zCxg+RRRq4WQivKYgTILKO/S2UCfceGpE6ULK0Va3JWVE4DhNJA0lmIXwgOSXpOF8aKnLFahq9AvAxD+E3AAyCrBgwTxtBktXyo2LoBwTSwePgMIYLN31OqNpZcMkDWuEC4R8F5gNM37zEVurt8oLX0F4OuhCnxTHjZ4Yyg8RfjP7lfdtN0q6Cxjigu2Gz4Q8B/hVB+WVtDhz4V4FnT2wa/GcGLkkuJkE5bWBPfgrICv2ouciOBsobt1EZqMbvwSlbwb5oUSfxcKY3qus3nsLuQv/e41ePC8i238Ap2nyLhWRefAAAAAASUVORK5CYII=);
274
+ &:hover {
275
+ background: #07579a;
276
+ }
277
+ }
278
+ }
279
+
280
+ ul {
281
+ height: 100%;
282
+ width: 100%;
283
+ padding: 0;
284
+ margin: 0;
285
+ display: flex;
286
+ align-items: flex-end;
287
+ justify-content: left;
288
+ list-style: none;
289
+ overflow-y: hidden;
290
+ overflow-x: auto;
291
+ &::-webkit-scrollbar {
292
+ display: none;
293
+ height:0;
294
+ }
295
+ li {
296
+ padding: 0 30px;
297
+ font-size: 14px;
298
+ color: #515a6e;
299
+ height: 35px;
300
+ margin: 10px -19px 0 0;
301
+ cursor: pointer;
302
+ display: flex;
303
+ white-space: nowrap;
304
+ align-items: center;
305
+ justify-content: center;
306
+ box-sizing: content-box;
307
+ mask: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANoAAAAkBAMAAAAdqzmBAAAAMFBMVEVHcEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlTPQ5AAAAD3RSTlMAr3DvEM8wgCBA379gj5//tJBPAAAAnUlEQVRIx2NgAAM27fj/tAO/xBsYkIHyf9qCT8iWMf6nNQhAsk2f5rYheY7Dnua2/U+A28ZEe8v+F9Ax2v7/F4DbxkUH2wzgtvHTwbYPo7aN2jZq26hto7aN2jZq25Cy7Qvctnw62PYNbls9HWz7S8/G6//PsI6H4396gAUQy1je08W2jxDbpv6nD4gB2uWp+J9eYPsEhv/0BPS1DQBvoBLVZ3BppgAAAABJRU5ErkJggg==);
308
+ mask-repeat: no-repeat;
309
+ mask-size: 95% 100%;
310
+ transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
311
+ .close-icon {
312
+ transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
313
+ margin-left: 8px;
314
+ width: 0;
315
+ overflow: hidden;
316
+ &:hover {
317
+ border-radius: 50%;
318
+ background: #666666;
319
+ color: white;
320
+ }
321
+ }
322
+ &:hover {
323
+ background: #dee1e6;
324
+ .close-icon {
325
+ width: 14px;
326
+ }
327
+ }
328
+ }
329
+ .active-tag {
330
+ padding: 0 20px !important;
331
+ color: #0361A4 !important;
332
+ background: #ECF5FF !important;
333
+ .close-icon {
334
+ min-width: 14px;
335
+ }
336
+ }
337
+ }
338
+ .scrollbar-icon {
339
+ cursor: pointer;
340
+ width: 13px;
341
+ height: 13px;
342
+ position: absolute;
343
+ top: 50%;
344
+ transform: translateY(-50%);
345
+ &:hover {
346
+ background: #07579a;
347
+ }
348
+ }
349
+ .left {
350
+ background: #99999a;
351
+ left: 55px;
352
+ mask: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAcCAYAAAB2+A+pAAAAAXNSR0IArs4c6QAAA9RJREFUSEuVl0tvG2UUhp/zeRIXaMFiEaEsyq1NU0oJKVBaxEVtWqCoRVzELyB2HEXiByAkAgsuldhESmJHsiIlexawoC0qioAFFWUFCJVFEWJFEBtEAh6Pv4NOPBMcx5fxSN7NO8/3nffcLKR8VFUqlcr+KIqOOOe0Vqv9MDMz81tKOaYvlUp3ZzKZw977WyStsFKp7KvVauMi8hiw6Zxby+fzP/Wjr9frx1T1GJBNBZ6fn98bBMHDwCvA08BN7/3C9PT0Whpwk/5V4KRpeoKXl5f3hGH4AHABeBk4CnwnIm8XCoXPeoFb9AYeAWpdwSaqVquHgAkRMZGFaQ9wXVXfLBaLn3cDt9E/CgRA1BEcn/Sgqp4VkbPACSBnIFX9AninWCx+2QncRR8Cf7cFJycVkVOqekFExoE7AAfUgSvAe1NTU1+3A/fQ/wv8uQtsoiiKRur1+pmWm2qcExFg3l5sB06h3wR+3wFuOulpVT0f39TCa+9tg1X1koh8mICtRkVEU+p3gufm5rLZbHbEPAWeFZHHE09bwhmJyBUR+SCfz3+VQPvQ/wP8sXXjDp4kN2210UJt2bztcZ/6BnhhYeG+gYGBIe+9NYZTzdnbIWO3PLYb53K5a+vr67kgCEZE5KmU+ga4VCq97py7x3tvyTQaZ2+7bG/2+NNMJnPROfdjFEVjqvqCQXvok3s0wEtLS4vAqKo+GRd3p9JsBn+sqh9ls9lfwjA8JyJ54Dgw2KuTAQ1wuVyuiMghVbUeanWaGhwEwa/ee6vzvKo+AmT6Ab8B3Bv7cz+wt4O4uY4/sToeHBy8EYbhcRE5r6rm8YEu+p2hLpfLo977u5xzp4FnAOtS+7qcfDu5VPVb59ydURQd7kPfCLXV4erq6q2bm5sPicgZ4BzwYBf4rnJaWVm5rQ/9/3VstzPxxsaGbReWoROAzd92Yd9qIKr6vnWupIH0od8JNrgNbOfcWCaTmVDV54EjwO2tnatTy0ypt5bZ6FzNj604YRiaZ88BFvrE81RDIoV+95BIDmBhq1arR+MJZaFv9rwuIpeTULdLwh56C/XusdgM7+C53fyqc+5dGxKdsr+L51Xgr66rT+KZc84m1ovxvhWo6jfAW8Vi8Wq3htFGPxa/X+257MWeWam9ZL+4SVyLl73LvTpVi96Wxf3WNnuC7cPlctnWHpvPrwFPAD8Dc4VCYc0WgF7wFr19p/uWmXzQanVxcTHnnDPRSRHZcM5dmpyc/D4NuFkvIidUdTDVje0As7Ozbnh4+ID33oaBF5HrhULhZhpwoh8aGjoYBMG4/YX5D8BcMmEDOwIbAAAAAElFTkSuQmCC);
353
+ mask-size: 100% 100%;
354
+ mask-repeat: no-repeat;
355
+ }
356
+ .right {
357
+ background: #99999a;
358
+ right: 55px;
359
+ mask: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAAAXNSR0IArs4c6QAAA25JREFUSEuVls9rXFUUx7/fO3mDojAhZGFwIYgbFXUj4kJqpQqtC5dxHUiYRDCL7NRSWsG/IS/PB6Vr20ijNNL0h0mlPzQNRVyIyZgWF1FrWhV1kpl59ytH3pNxmJk73uXjfu/nnXO+95zLOI7fdM7VW63WNzMzM9skhcBK0/Qx7/1z3nuWSqWvJycnb4d0jOP4KMm6pKsjIyM3x8fHGyFQkiRPSzpEskzyi0qlshHSGegagCbJz7IsO1Mqlb6vVqvNfrA4jg3yFoBHSH7aarUWQzouLCz8mh+6Lum09/7y6Ojodr8/TJLkiKQTAJ4iedV7vxjSGagOoAzgDwDXASw659YqlUqtFyxJklcBfCDpBQC/AbgR0hnINj4IIAJwj+QVScskL0va7pbGJElelvQ+gAN5NoI6A90H8FAOMsf9AuCapCXn3JXh4eHbnZEZCMBxSQcBFC7tqzPQLoCH8/SZiAB+NDdJWsmybLUotCSajfOIrEYGtNVXZxs6QYXZMgC7JM0gZ9thtqEjonaD9tT1AhXiXUlrAM63uyqO4wMkjwN4pcc1+I+uXC7fDYG8RQbgJoAl7/3y9PT0nTRNX/LeHwNg7uu2/tFJ2iD5MclaCFQcYnfNDHJqaGhopdlsPumcew/AkUAXMUevkdwcBFQU2lx1kmRKcsR7/w6AN/qACt2OpDv/B3Sf5ElJHwKoAHh3QNDPAH4YBGQ/bV3jKwCnoig612g0nnDOHZX0eiB1f+YtKpg6C9/qcwvAJwCWd3Z2tsbGxl4keUzSaz1A/+pIngUQNIN1Det/5wFcLJfLmxMTE3sD2LvQrQC44L3/qVfqzJ73LBIbA5Iu7e/vfzc7O7sfuLA9db1a0N3czhecc5eiKKpZJEULmp+fP+icswvb2YK66ooW1N5U7Ztd0C+tJpJWG41GzSIpIF0iKmzcVVfUsHNMWOGv27S13O7t7W0V6WovepcxEdS1D76/cgsvkfw8iqJvLV3dXNUx+H4vWlQ/XTGPSpJuOefOZFl2sV6v1+bm5mzydl1xHB92zp2Q9KylmeRiSGegdQCt3MIftburD+iQc+5tSY9KOkfydEhnIJv9dZumURTd6JWuAmqmSNP0Ge/9YZIPAFgdRGfPrQl7QALYmJqa2gw9BA2UJMnjkp4H4ACsV6vVrZDubzHWkATwr3pxAAAAAElFTkSuQmCC);
360
+ mask-size: 100% 100%;
361
+ mask-repeat: no-repeat;
362
+ }
363
+ .right-menu {
364
+ box-shadow: 0 -2px 4px 0 rgba(0,0,0,0.25);
365
+ justify-content: center;
366
+ cursor: pointer;
367
+ width: 40px;
368
+ height: 100%;
369
+ position: absolute;
370
+ top: 0;
371
+ right: 0px;
372
+ display: flex;
373
+ align-items: center;
374
+ }
375
+ }
376
+ </style>
@@ -0,0 +1,180 @@
1
+ <template>
2
+ <div
3
+ v-show="!menuState"
4
+ class="tf-menu"
5
+ :style="{ width: isCollapse ? '64px' : '175px' }"
6
+ >
7
+ <el-scrollbar class="tf-menu-scroll">
8
+ <el-menu
9
+ :collapse="isCollapse"
10
+ :default-active="activePath"
11
+ class="tf-menu-content"
12
+ background-color="#001529"
13
+ text-color="#919398"
14
+ active-text-color="#ffffff"
15
+ :router="true"
16
+ :style="{ width: isCollapse ? '64px' : '175px' }"
17
+ >
18
+ <template v-for="firstMenuItem in menusInfo">
19
+ <el-submenu
20
+ v-if="firstMenuItem.childNode"
21
+ :key="firstMenuItem.path"
22
+ :index="firstMenuItem.path"
23
+ >
24
+ <template slot="title">
25
+ <svg-icon
26
+ :icon-class="firstMenuItem.icon"
27
+ style="height: 15px; width: 15px; margin-right: 10px"
28
+ />
29
+ <span>{{ firstMenuItem.title }}</span>
30
+ </template>
31
+ <el-menu-item
32
+ v-for="secondMenuItem in firstMenuItem.childNode"
33
+ :key="secondMenuItem.path"
34
+ :index="secondMenuItem.path"
35
+ >
36
+ <svg-icon
37
+ :icon-class="firstMenuItem.icon"
38
+ style="height: 15px; width: 15px; margin-right: 10px"
39
+ />
40
+ <span>{{ secondMenuItem.title }}</span>
41
+ </el-menu-item>
42
+ </el-submenu>
43
+ <el-menu-item
44
+ v-else
45
+ :key="firstMenuItem.path"
46
+ :index="firstMenuItem.path"
47
+ >
48
+ <svg-icon
49
+ :icon-class="firstMenuItem.icon"
50
+ style="height: 15px; width: 15px; margin-right: 10px"
51
+ />
52
+ <span slot="title">{{ firstMenuItem.title }}</span>
53
+ </el-menu-item>
54
+ </template>
55
+ </el-menu>
56
+ </el-scrollbar>
57
+ <div
58
+ class="bottom-menu"
59
+ :style="{ transform: isCollapse ? 'rotate(0deg)' : 'rotate(180deg)' }"
60
+ @click="isCollapse = !isCollapse"
61
+ >
62
+ <img
63
+ src="data:image/png;base64,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"
64
+ alt=""
65
+ >
66
+ </div>
67
+ </div>
68
+ </template>
69
+
70
+ <script>
71
+ export default {
72
+ name: 'TfMenu',
73
+ props: {
74
+ menusInfo: {
75
+ type: Array,
76
+ default: function () {
77
+ return []
78
+ }
79
+ },
80
+ menuState: {
81
+ default: false,
82
+ type: Boolean
83
+ }
84
+ },
85
+ data () {
86
+ return {
87
+ isCollapse: false,
88
+ activePath: null
89
+ }
90
+ },
91
+ watch: {
92
+ '$route.path': {
93
+ handler: function (params) {
94
+ if (params) this.activePath = params
95
+ },
96
+ deep: true,
97
+ immediate: true
98
+ }
99
+ }
100
+ }
101
+ </script>
102
+
103
+ <style lang="less" scoped>
104
+ .tf-menu {
105
+ height: 100%;
106
+ background: #001529;
107
+ transition: width 0.3s ease-in-out;
108
+ /deep/.tf-menu-content {
109
+ transition: width 0.3s ease-in-out;
110
+ border-right: none !important;
111
+ .el-menu--collapse {
112
+ width: 64px !important;
113
+ .el-submenu .el-menu-item {
114
+ height: 40px;
115
+ width: 175px;
116
+ }
117
+ }
118
+ .el-submenu .el-menu-item {
119
+
120
+ transition: width 0.3s;
121
+ height: 40px;
122
+ width: 175px;
123
+ }
124
+ .el-menu-item,
125
+ .el-submenu__title {
126
+ transition: width 0.3s !important;
127
+ display:flex;
128
+ align-items: center;
129
+ height: 40px;
130
+ line-height: 40px;
131
+ &:hover {
132
+ background: #0361a4 !important;
133
+ }
134
+ span {
135
+ margin-left: 5px;
136
+ }
137
+ }
138
+ .is-active {
139
+ transition: width 0.3s !important;
140
+
141
+ background: #0361a4 !important;
142
+ }
143
+ margin-bottom: 10px;
144
+ }
145
+ .tf-menu-scroll {
146
+ height: calc(100vh - 200px);
147
+ width: 100%;
148
+ }
149
+ /deep/.el-scrollbar__wrap {
150
+ overflow-x: hidden;
151
+ }
152
+ .bottom-menu {
153
+ width: 100%;
154
+ height: 60px;
155
+ display: flex;
156
+ align-items: center;
157
+ justify-content: center;
158
+ img {
159
+ width: 20px;
160
+ height: 20px;
161
+ transition: all 0.3s;
162
+ }
163
+ }
164
+ }
165
+ </style>
166
+ <style lang="less">
167
+ .el-menu--vertical {
168
+ .el-menu--collapse .el-menu .el-submenu,
169
+ .el-menu--popup {
170
+ min-width: 175px;
171
+ .el-menu-item {
172
+ height: 40px;
173
+ line-height: 40px;
174
+ &:hover {
175
+ background: #0361a4 !important;
176
+ }
177
+ }
178
+ }
179
+ }
180
+ </style>