@tongfun/tf-widget 0.1.7 → 0.1.11

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 (78) 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 +395 -0
  15. package/lib/tf-widget.common.js +88426 -63173
  16. package/lib/tf-widget.css +1 -1
  17. package/lib/tf-widget.umd.1.js +395 -0
  18. package/lib/tf-widget.umd.js +88425 -63172
  19. package/lib/tf-widget.umd.min.1.js +1 -0
  20. package/lib/tf-widget.umd.min.js +19 -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 +115 -0
  66. package/package/tf-layout/index.js +8 -0
  67. package/package/tf-layout/src/components/tf-labelbar.vue +378 -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.json +4 -2
  73. package/postinstall.js +10 -10
  74. package/src/api/file-enclosure.js +26 -0
  75. package/src/api/push-down.js +19 -0
  76. package/src/api/tableV3.js +186 -0
  77. package/src/index.js +11 -3
  78. package/src/mixins/t-data-query-mixin.js +289 -0
@@ -0,0 +1,115 @@
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
+
26
+ 例子:
27
+
28
+ ```javascript
29
+ <template>
30
+ <TfLayout
31
+ :menus-info="menuInfo"
32
+ @setThirdCache="setThirdCache"
33
+ />
34
+ </template>
35
+ <script>
36
+ export default {
37
+ name: 'Layout',
38
+
39
+ data() {
40
+ return {
41
+ menuInfo: this.$store.getters.menuInfo
42
+ }
43
+ },
44
+ methods: {
45
+ setThirdCache(value) {
46
+ this.$store.commit('routeCaching/setThirdCache', value)
47
+ }
48
+ }
49
+ }
50
+ </script>
51
+ ```
52
+
53
+ 4. 小标签栏禁止关闭
54
+
55
+ 需要在路由的meta属性新增 **defaultRoute: true**
56
+
57
+ ```javascript
58
+ // 例子:
59
+ {
60
+ path: '/',
61
+ component: () => import('@/views/home/tenan-management-home'),
62
+ name: 'TenantManagementHome',
63
+ icon: 'home',
64
+ meta: {
65
+ title: '主页',
66
+ defaultRoute: true
67
+ }
68
+ },
69
+ ```
70
+
71
+ 5. 为了防止路由标签混乱,需要在子应用的跟路由将当前子应用的路由base属性,添加到meta属性中
72
+
73
+ base配置统一采用:
74
+
75
+ ```
76
+ const base = process.env['NODE_ENV'] === 'development' ? process.env['VUE_APP_BASIC']:`/app${process.env['VUE_APP_BASIC']}/`
77
+ ```
78
+
79
+
80
+
81
+ ​ **配置文件:**
82
+
83
+ ​ **例: VUE_APP_BASIC = '/OperateAnalysis'**
84
+
85
+ ​ **VUE_APP_MODULE_NAME = '经营分析'**
86
+
87
+ ```javascript
88
+
89
+ // 示例
90
+ // 路由生成 base:
91
+ router = new VueRouter({
92
+ base: process.env['NODE_ENV'] === 'development' ? process.env['VUE_APP_BASIC'] : `/app${process.env['VUE_APP_BASIC']}/`,
93
+ mode: 'history',
94
+ routes: initMenu(prop.menuInfo)
95
+ })
96
+ // 跟路由配置base
97
+ const base = process.env['NODE_ENV'] === 'development' ? process.env['VUE_APP_BASIC'] : `/app${process.env['VUE_APP_BASIC']}/`
98
+ const routes = [
99
+ {
100
+ path: '/',
101
+ component: Layout,
102
+ meta: {
103
+ title: process.env['VUE_APP_MODULE_NAME'],
104
+ base
105
+ },
106
+ children: [
107
+ ...childrenRoutes
108
+ ]
109
+ }
110
+ ]
111
+
112
+
113
+
114
+ ```
115
+
@@ -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,378 @@
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
+ const base = process.env['NODE_ENV'] === 'development' ? process.env['VUE_APP_BASIC'] : `/app${process.env['VUE_APP_BASIC']}/`
95
+ if (newValue && newValue.matched[0]?.meta.base === base) {
96
+
97
+ const { meta, path, name, params, query } = newValue
98
+ if (!path) return
99
+ const obj = {
100
+ path,
101
+ name,
102
+ params,
103
+ query,
104
+ defaultRoute: meta.defaultRoute,
105
+ notCloseTag: meta.defaultRoute,
106
+ title: meta.title,
107
+ replace: meta.replace
108
+ }
109
+ if (!meta.noCache) {
110
+ const cacheArr = newValue.matched.map(item => item.name)
111
+ this.$emit('setCache', cacheArr)
112
+ obj.cacheArr = cacheArr
113
+ }
114
+ if (obj.defaultRoute) {
115
+ if (!this.checkMenu(obj.path)) this.tagList.unshift(obj)
116
+ } else {
117
+ if (!this.checkMenu(obj.path)) this.tagList.push(obj)
118
+ }
119
+ // todo: 增加页面缓存
120
+ this.activePath = path
121
+ }
122
+ },
123
+ deep: true,
124
+ immediate: true
125
+ }
126
+ },
127
+ created () {
128
+ window.addEventListener('click', () => {
129
+ this.showRightMenu = false
130
+ }, false)
131
+ },
132
+ methods: {
133
+ changeMenuState () {
134
+ this.coloseMenu = !this.coloseMenu
135
+ this.$emit('changeMenuState', this.coloseMenu)
136
+ },
137
+ /**
138
+ * @description tag右键点击事件
139
+ */
140
+ rightClick: function (tagItem, $event) {
141
+ this.routeJump(tagItem)
142
+ this.$nextTick(() => {
143
+ this.rightMenuTop = $event.clientY
144
+ this.rightMenuLeft = $event.clientX
145
+ this.showRightMenu = true
146
+ })
147
+ },
148
+
149
+ /**
150
+ * @member
151
+ * @description 右侧操作
152
+ * @param params: 操作指令: closeLeft => 关闭左侧, closeRight => 关闭右侧, closeAll => 关闭全部,
153
+ */
154
+ dropdownCommand: function (params) {
155
+ const activeNum = this.tagList.findIndex(
156
+ (item) => item.path === this.activePath
157
+ )
158
+ const pathMap = new Map()
159
+ const deleteArr = []
160
+ const pathArr = this.tagList.map((item) => {
161
+ pathMap.set(item.path, item)
162
+ return item.path
163
+ })
164
+ switch (params) {
165
+ case 'closeLeft':
166
+ deleteArr.push(...pathArr.slice(0, activeNum))
167
+ break
168
+ case 'closeRight':
169
+ deleteArr.push(...pathArr.slice(activeNum + 1, pathArr.length))
170
+ break
171
+ case 'closeOther':
172
+ deleteArr.push(...pathArr.slice(0, activeNum))
173
+ deleteArr.push(...pathArr.slice(activeNum + 1, pathArr.length))
174
+ break
175
+ default:
176
+ deleteArr.push(...pathArr)
177
+ break
178
+ }
179
+ const deleteCacheArr = []
180
+ deleteArr.forEach((item) => {
181
+ const tagItem = pathMap.get(item)
182
+ if (tagItem && tagItem.cacheArr) deleteCacheArr.push(tagItem.cacheArr)
183
+ if (tagItem && !tagItem.notCloseTag) {
184
+ const num = this.tagList.indexOf(tagItem)
185
+ this.tagList.splice(num, 1)
186
+ }
187
+ })
188
+
189
+ this.$emit('deleteCache', deleteCacheArr)
190
+ if (params === 'closeAll') this.routeJump(this.tagList[0])
191
+ },
192
+ /**
193
+ * @description 左右滑动
194
+ * @param direction: 滑动方向
195
+ */
196
+ handleScroll (direction) {
197
+ let rollNum = 0
198
+ rollNum = direction === 'right' ? rollNum + 50 : rollNum - 50
199
+ const dom = this.$refs.labelMenu
200
+ dom.scrollLeft += rollNum
201
+ },
202
+ /**
203
+ * @description 点击tag标签
204
+ * @param path: 每项Tag
205
+ */
206
+ checkMenu (path) {
207
+ if (this.tagList.find((item) => item.path === path)) return true
208
+ return false
209
+ },
210
+ /**
211
+ * @description 路由跳转
212
+ */
213
+ routeJump: function (value) {
214
+ if (value && value.path !== this.activePath) {
215
+ const { path, query, params, replace } = value
216
+ if (replace) {
217
+ this.$router.replace({
218
+ path,
219
+ query,
220
+ params
221
+ })
222
+ } else {
223
+ this.$router.push({
224
+ path,
225
+ query,
226
+ params
227
+ })
228
+ }
229
+ }
230
+ },
231
+ /**
232
+ * 关闭tag
233
+ */
234
+ closeTag: function (tagItem) {
235
+ if (tagItem.cacheArr) this.$emit('deleteCache', [tagItem.cacheArr])
236
+ const num = this.tagList.indexOf(tagItem)
237
+ if (tagItem) {
238
+ this.tagList.splice(num, 1)
239
+ this.routeJump(this.tagList[num - 1])
240
+ }
241
+ }
242
+ }
243
+ }
244
+ </script>
245
+ <style lang="less" scoped>
246
+ .tf-labelbar {
247
+ width: 100%;
248
+ height: 40px;
249
+ position: relative;
250
+ box-sizing: border-box;
251
+ padding: 0 73px;
252
+ .close-menu {
253
+ cursor: pointer;
254
+ position: absolute;
255
+ left:0;
256
+ height: 40px;
257
+ width: 40px;
258
+ display: flex;
259
+ align-items: center;
260
+ justify-content: center;
261
+ box-shadow: 0 -2px 4px 0 rgba(0,0,0,0.25);
262
+ .close-menu-icon {
263
+ height: 15px;
264
+ width: 15px;
265
+ background: #99999a;
266
+ 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==);
267
+ &:hover {
268
+ background: #07579a;
269
+ }
270
+ }
271
+ .open-menu-icon {
272
+ height: 15px;
273
+ width: 15px;
274
+ background: #99999a;
275
+ 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=);
276
+ &:hover {
277
+ background: #07579a;
278
+ }
279
+ }
280
+ }
281
+
282
+ ul {
283
+ height: 100%;
284
+ width: 100%;
285
+ padding: 0;
286
+ margin: 0;
287
+ display: flex;
288
+ align-items: flex-end;
289
+ justify-content: left;
290
+ list-style: none;
291
+ overflow-y: hidden;
292
+ overflow-x: auto;
293
+ &::-webkit-scrollbar {
294
+ display: none;
295
+ height:0;
296
+ }
297
+ li {
298
+ padding: 0 30px;
299
+ font-size: 14px;
300
+ color: #515a6e;
301
+ height: 35px;
302
+ margin: 10px -19px 0 0;
303
+ cursor: pointer;
304
+ display: flex;
305
+ white-space: nowrap;
306
+ align-items: center;
307
+ justify-content: center;
308
+ box-sizing: content-box;
309
+ mask: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANoAAAAkBAMAAAAdqzmBAAAAMFBMVEVHcEwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlTPQ5AAAAD3RSTlMAr3DvEM8wgCBA379gj5//tJBPAAAAnUlEQVRIx2NgAAM27fj/tAO/xBsYkIHyf9qCT8iWMf6nNQhAsk2f5rYheY7Dnua2/U+A28ZEe8v+F9Ax2v7/F4DbxkUH2wzgtvHTwbYPo7aN2jZq26hto7aN2jZq25Cy7Qvctnw62PYNbls9HWz7S8/G6//PsI6H4396gAUQy1je08W2jxDbpv6nD4gB2uWp+J9eYPsEhv/0BPS1DQBvoBLVZ3BppgAAAABJRU5ErkJggg==);
310
+ mask-repeat: no-repeat;
311
+ mask-size: 95% 100%;
312
+ transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
313
+ .close-icon {
314
+ transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
315
+ margin-left: 8px;
316
+ width: 0;
317
+ overflow: hidden;
318
+ &:hover {
319
+ border-radius: 50%;
320
+ background: #666666;
321
+ color: white;
322
+ }
323
+ }
324
+ &:hover {
325
+ background: #dee1e6;
326
+ .close-icon {
327
+ width: 14px;
328
+ }
329
+ }
330
+ }
331
+ .active-tag {
332
+ padding: 0 20px !important;
333
+ color: #0361A4 !important;
334
+ background: #ECF5FF !important;
335
+ .close-icon {
336
+ min-width: 14px;
337
+ }
338
+ }
339
+ }
340
+ .scrollbar-icon {
341
+ cursor: pointer;
342
+ width: 13px;
343
+ height: 13px;
344
+ position: absolute;
345
+ top: 50%;
346
+ transform: translateY(-50%);
347
+ &:hover {
348
+ background: #07579a;
349
+ }
350
+ }
351
+ .left {
352
+ background: #99999a;
353
+ left: 55px;
354
+ 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);
355
+ mask-size: 100% 100%;
356
+ mask-repeat: no-repeat;
357
+ }
358
+ .right {
359
+ background: #99999a;
360
+ right: 55px;
361
+ 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);
362
+ mask-size: 100% 100%;
363
+ mask-repeat: no-repeat;
364
+ }
365
+ .right-menu {
366
+ box-shadow: 0 -2px 4px 0 rgba(0,0,0,0.25);
367
+ justify-content: center;
368
+ cursor: pointer;
369
+ width: 40px;
370
+ height: 100%;
371
+ position: absolute;
372
+ top: 0;
373
+ right: 0px;
374
+ display: flex;
375
+ align-items: center;
376
+ }
377
+ }
378
+ </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>