n20-common-lib 1.2.6 → 1.2.9

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 (202) hide show
  1. package/README.md +2 -2
  2. package/package.json +87 -87
  3. package/src/_qiankun/index.js +113 -113
  4. package/src/_qiankun/postMessage.js +48 -48
  5. package/src/assets/css/_coreLib.scss +35 -35
  6. package/src/assets/css/cl-anchor.scss +23 -23
  7. package/src/assets/css/cl-approve-card.scss +58 -58
  8. package/src/assets/css/cl-dialog.scss +99 -99
  9. package/src/assets/css/cl-drag-list.scss +22 -22
  10. package/src/assets/css/cl-empty.scss +10 -10
  11. package/src/assets/css/cl-expandable-pane.scss +26 -26
  12. package/src/assets/css/cl-expandable.scss +24 -24
  13. package/src/assets/css/cl-file-upload-table.scss +11 -11
  14. package/src/assets/css/cl-filter.scss +4 -4
  15. package/src/assets/css/cl-flow-step.scss +185 -185
  16. package/src/assets/css/cl-footer-box.scss +10 -10
  17. package/src/assets/css/cl-form-item.scss +454 -454
  18. package/src/assets/css/cl-general-card.scss +11 -11
  19. package/src/assets/css/cl-layout-aside.scss +88 -88
  20. package/src/assets/css/cl-layout-content.scss +16 -16
  21. package/src/assets/css/cl-layout-header.scss +73 -73
  22. package/src/assets/css/cl-layout-tabs.scss +87 -87
  23. package/src/assets/css/cl-layout.scss +97 -97
  24. package/src/assets/css/cl-login-temporary.scss +37 -37
  25. package/src/assets/css/cl-message.scss +75 -75
  26. package/src/assets/css/cl-more-tab.scss +98 -98
  27. package/src/assets/css/cl-nav-menu.scss +5 -5
  28. package/src/assets/css/cl-pagination.scss +65 -65
  29. package/src/assets/css/cl-secondary-tab.scss +39 -39
  30. package/src/assets/css/cl-showcolumn.scss +23 -23
  31. package/src/assets/css/cl-sifting.scss +51 -51
  32. package/src/assets/css/cl-statis.scss +42 -42
  33. package/src/assets/css/cl-step.scss +73 -73
  34. package/src/assets/css/cl-suspend.scss +19 -19
  35. package/src/assets/css/cl-tertiary-tab.scss +9 -9
  36. package/src/assets/css/cl-upload.scss +41 -41
  37. package/src/assets/css/cl-worn-pagination.scss +50 -50
  38. package/src/assets/css/el-button.scss +173 -173
  39. package/src/assets/css/el-table.scss +79 -79
  40. package/src/assets/css/element-variables.scss +1061 -1061
  41. package/src/assets/css/element.dev.scss +21 -21
  42. package/src/assets/css/font-icon.scss +27 -26
  43. package/src/assets/css/index.dev.scss +4 -4
  44. package/src/assets/css/index.scss +11 -11
  45. package/src/assets/css/normalize.scss +726 -726
  46. package/src/assets/css/rootvar.scss +139 -139
  47. package/src/assets/css/select.scss +25 -25
  48. package/src/assets/css/title-pop.scss +4 -4
  49. package/src/assets/getJsonc.js +50 -50
  50. package/src/assets/iconFont/demo.css +539 -0
  51. package/src/assets/iconFont/demo_index.html +1614 -0
  52. package/src/assets/iconFont/iconfont.css +263 -0
  53. package/src/assets/iconFont/iconfont.js +1 -0
  54. package/src/assets/iconFont/iconfont.json +443 -0
  55. package/src/assets/iconFont/iconfont.ttf +0 -0
  56. package/src/assets/iconFont/iconfont.woff +0 -0
  57. package/src/assets/iconFont/iconfont.woff2 +0 -0
  58. package/src/assets/realUrl.js +12 -12
  59. package/src/components/.DS_Store +0 -0
  60. package/src/components/Anchor/AnchorItem.vue +29 -29
  61. package/src/components/Anchor/index.vue +185 -185
  62. package/src/components/ApprovalButtons/index.vue +232 -232
  63. package/src/components/ApprovalCard/index.vue +128 -128
  64. package/src/components/ApprovalRecord/approvalImg.vue +39 -39
  65. package/src/components/ApprovalRecord/index.vue +59 -59
  66. package/src/components/Button/button-group.vue +150 -150
  67. package/src/components/Button/icon-group-button.vue +61 -61
  68. package/src/components/Button/index.vue +56 -56
  69. package/src/components/CascaderArea/index.vue +81 -81
  70. package/src/components/ContentLoading/index.vue +41 -41
  71. package/src/components/ContentNull/index.vue +19 -19
  72. package/src/components/DatePicker/index.vue +27 -27
  73. package/src/components/DatePicker/por.vue +169 -169
  74. package/src/components/Dialog/index.vue +26 -26
  75. package/src/components/Dialog/indexO.vue +116 -116
  76. package/src/components/DragList/index.vue +68 -68
  77. package/src/components/Empty/img/abnormal.svg +108 -108
  78. package/src/components/Empty/img/dispose.svg +71 -71
  79. package/src/components/Empty/img/empty.svg +57 -57
  80. package/src/components/Empty/img/general.svg +58 -58
  81. package/src/components/Empty/img/lock.svg +57 -57
  82. package/src/components/Empty/img/network.svg +59 -59
  83. package/src/components/Empty/img/relevant.svg +68 -68
  84. package/src/components/Empty/img/search.svg +72 -72
  85. package/src/components/Empty/index.vue +92 -92
  86. package/src/components/Expandable/index.vue +49 -49
  87. package/src/components/Expandable/main.vue +52 -52
  88. package/src/components/FileExportAsync/index.vue +174 -0
  89. package/src/components/FileUploadTable/index.vue +484 -484
  90. package/src/components/Filters/index.vue +369 -369
  91. package/src/components/Filters/indexO.vue +104 -104
  92. package/src/components/FlowStep/index.vue +68 -68
  93. package/src/components/FooterBox/index.vue +21 -21
  94. package/src/components/GeneralCard/index.vue +15 -15
  95. package/src/components/InputNumber/index.vue +153 -153
  96. package/src/components/InputNumber/numberRange.vue +47 -47
  97. package/src/components/InputSearch/index.vue +75 -75
  98. package/src/components/Layout/.DS_Store +0 -0
  99. package/src/components/Layout/AsideNav/index.vue +119 -144
  100. package/src/components/Layout/AsideNav/menuItem.vue +34 -0
  101. package/src/components/Layout/AsideNav/submenuTitle.vue +26 -0
  102. package/src/components/Layout/HeaderWrap/changePwd.vue +215 -215
  103. package/src/components/Layout/HeaderWrap/index.vue +348 -333
  104. package/src/components/Layout/HeaderWrap/noticePop.vue +300 -300
  105. package/src/components/Layout/SubContent/index.vue +131 -131
  106. package/src/components/Layout/TabsNav/index.vue +170 -170
  107. package/src/components/Layout/index.vue +529 -529
  108. package/src/components/Layout/utils.js +12 -12
  109. package/src/components/LoginTemporary/form.vue +537 -537
  110. package/src/components/LoginTemporary/index.vue +122 -122
  111. package/src/components/LoginTemporary/qrcode.vue +90 -90
  112. package/src/components/LoginTemporary/retrievePw.vue +28 -28
  113. package/src/components/LoginTemporary/utils.js +73 -73
  114. package/src/components/MicroApp/index.js +67 -67
  115. package/src/components/MicroFrame/index.vue +95 -95
  116. package/src/components/MoreTab/index.vue +232 -232
  117. package/src/components/NavMenu/index.vue +60 -60
  118. package/src/components/NstcG6Components/NstcDialog/NstcDialog.vue +184 -184
  119. package/src/components/PageLayout/page.vue +15 -15
  120. package/src/components/Pagination/index.vue +96 -96
  121. package/src/components/SecondaryTab/index.vue +58 -58
  122. package/src/components/SelectLazy/index.vue +75 -75
  123. package/src/components/SelectTree/SelectTreeLazy.vue +241 -241
  124. package/src/components/SelectTree/index.vue +205 -205
  125. package/src/components/ShowColumn/index.vue +204 -204
  126. package/src/components/Sifting/index.vue +99 -99
  127. package/src/components/Statis/index.vue +97 -97
  128. package/src/components/Statis/statisItem.vue +54 -54
  129. package/src/components/Statis/statisPopover.vue +55 -55
  130. package/src/components/Step/index.vue +38 -38
  131. package/src/components/Suspend/index.vue +72 -72
  132. package/src/components/Table/index.vue +179 -179
  133. package/src/components/Table/indexO.vue +149 -149
  134. package/src/components/Task/index.vue +26 -26
  135. package/src/components/TertiaryTab/index.vue +53 -53
  136. package/src/components/TimePicker/index.vue +28 -28
  137. package/src/components/Upload/index.vue +242 -242
  138. package/src/components/WornPagination/index.vue +73 -73
  139. package/src/directives/VClickOutside/index.js +19 -19
  140. package/src/directives/VHas/index.js +32 -32
  141. package/src/directives/VMove/index.js +42 -42
  142. package/src/directives/VTitle/index.js +64 -56
  143. package/src/directives/VTitle/tooltip.vue +21 -21
  144. package/src/index.js +225 -218
  145. package/src/plugins/CompatibleOld/index.js +57 -57
  146. package/src/plugins/Print/index.js +4 -4
  147. package/src/plugins/Print/print-js/.babelrc +12 -12
  148. package/src/plugins/Print/print-js/LICENSE +21 -21
  149. package/src/plugins/Print/print-js/README.md +98 -98
  150. package/src/plugins/Print/print-js/dist/print.css +96 -96
  151. package/src/plugins/Print/print-js/dist/print.js +990 -990
  152. package/src/plugins/Print/print-js/package.json +60 -60
  153. package/src/plugins/Print/print-js/src/index.d.ts +45 -45
  154. package/src/plugins/Print/print-js/src/index.js +10 -10
  155. package/src/plugins/Print/print-js/src/js/browser.js +33 -33
  156. package/src/plugins/Print/print-js/src/js/functions.js +103 -103
  157. package/src/plugins/Print/print-js/src/js/html.js +70 -70
  158. package/src/plugins/Print/print-js/src/js/image.js +48 -48
  159. package/src/plugins/Print/print-js/src/js/init.js +168 -168
  160. package/src/plugins/Print/print-js/src/js/json.js +109 -109
  161. package/src/plugins/Print/print-js/src/js/modal.js +62 -62
  162. package/src/plugins/Print/print-js/src/js/pdf.js +62 -62
  163. package/src/plugins/Print/print-js/src/js/print.js +102 -102
  164. package/src/plugins/Print/print-js/src/js/raw-html.js +15 -15
  165. package/src/plugins/Print/print-js/src/sass/index.scss +13 -13
  166. package/src/plugins/Print/print-js/src/sass/modules/_colors.scss +9 -9
  167. package/src/plugins/Print/print-js/src/sass/partials/_modal.scss +40 -40
  168. package/src/plugins/Print/print-js/src/sass/partials/_spinner.scss +45 -45
  169. package/src/plugins/Print/print.js +2 -2
  170. package/src/plugins/Print/print.scss +1 -1
  171. package/src/plugins/SetMenuTree/index.vue +41 -41
  172. package/src/plugins/SetMenuTree/logoIcon.vue +37 -37
  173. package/src/plugins/SetMenuTree/setmenutree.vue +427 -427
  174. package/src/plugins/SetMenuTree/utils.js +74 -74
  175. package/src/plugins/Sign/InfosecNetSignCNGAgent.min.js +2000 -2000
  176. package/src/plugins/Sign/index.js +65 -65
  177. package/src/plugins/Sign/sign.js +1 -1
  178. package/src/plugins/setTabsForSub.js +2 -2
  179. package/src/utils/auth.js +53 -53
  180. package/src/utils/axios.js +203 -203
  181. package/src/utils/downloadBlob.js +19 -19
  182. package/src/utils/forEachs.js +16 -16
  183. package/src/utils/getScrollContainer.js +43 -43
  184. package/src/utils/i18n/cn2hk.json +1270 -1270
  185. package/src/utils/i18n/index.js +54 -54
  186. package/src/utils/list2tree.js +36 -36
  187. package/src/utils/msgboxPor.js +26 -26
  188. package/src/utils/print.js +161 -161
  189. package/src/utils/relaNo.js +69 -69
  190. package/src/utils/repairElementUI.js +66 -66
  191. package/src/utils/urlToGo.js +82 -82
  192. package/style/css/normalize.scss +723 -726
  193. package/style/fonts/iconfont.022f36c4.woff2 +0 -0
  194. package/style/fonts/iconfont.4a1b2c93.woff +0 -0
  195. package/style/fonts/iconfont.a9febaa2.ttf +0 -0
  196. package/style/index.css +3 -2
  197. package/style/index.css.map +1 -1
  198. package/style/pageDemo/demo-1.vue +130 -131
  199. package/style/pageDemo/demo-2.vue +35 -35
  200. package/style/pageDemo/demo-3.vue +22 -22
  201. package/style/pageDemo/seeCode.js +20 -20
  202. package/style/server-config.jsonc +663 -596
@@ -1,529 +1,529 @@
1
- <template>
2
- <div class="layout-wrap">
3
- <headerWrap
4
- class="header-wrap"
5
- @custom-event="(par) => $emit('custom-event', par)"
6
- />
7
- <asideNav
8
- :menus="menusC"
9
- :active-nav="activeNavC"
10
- :collapse.sync="collapse"
11
- @menu-click="menuClick"
12
- />
13
- <tabsNav
14
- class="tabs-nav-wrap"
15
- :tab-list="tabList"
16
- :active-nav="activeNav"
17
- @tab-click="tabClick"
18
- @tab-close="tabClose"
19
- @tab-close-nexts="tabCloseNexts"
20
- @tab-close-others="tabCloseOthers"
21
- @tab-refresh="tabRefresh"
22
- />
23
- <div ref="content-wrap" class="content-wrap">
24
- <keep-alive v-if="dnsKey">
25
- <router-view
26
- ref="content-cache"
27
- :key="$route.path"
28
- class="content-box"
29
- :no-cache="$route.meta.noCache"
30
- />
31
- </keep-alive>
32
- <router-view
33
- v-else
34
- ref="content-cache"
35
- class="content-box"
36
- :no-cache="$route.meta.noCache"
37
- />
38
- </div>
39
- </div>
40
- </template>
41
-
42
- <script>
43
- const TestProduction = process.env.VUE_APP_TestProduction === 'true'
44
- const routerBase = process.env.BASE_URL
45
- const routerBaseRe = new RegExp('^' + routerBase)
46
-
47
- import { addListener, removeListener } from 'resize-detector'
48
- import forEachs from '../../utils/forEachs'
49
- import { setRela } from '../../utils/relaNo'
50
- import asideNav from './AsideNav/index.vue'
51
- import headerWrap from './HeaderWrap/index.vue'
52
- import tabsNav from './TabsNav/index.vue'
53
-
54
- export default {
55
- name: 'Layout',
56
- components: {
57
- asideNav,
58
- headerWrap,
59
- tabsNav
60
- },
61
- props: {
62
- appNo: {
63
- type: String,
64
- default: process.env.VUE_APP_NAME
65
- },
66
- menus: {
67
- type: Array,
68
- default: () => []
69
- },
70
- keepTab: {
71
- type: String,
72
- default: ''
73
- },
74
- isTest: {
75
- type: Boolean,
76
- default: false
77
- }
78
- },
79
- data() {
80
- let headerH = 48
81
- let tabsH = 35
82
- let clientM = 10 + 1
83
-
84
- return {
85
- dnsKey: this.isTest || TestProduction,
86
- headerH,
87
- tabsH,
88
- clientM,
89
- clientHeight:
90
- document.documentElement.offsetHeight - headerH - tabsH - 2 * clientM,
91
- collapse: window.localStorage.getItem('aside-nav-collapse') === 'true',
92
-
93
- menusC: [],
94
- menuList: [],
95
- tabList: [],
96
- activeNav: ''
97
- }
98
- },
99
- computed: {
100
- activeNavC() {
101
- return getShowUuid(this.activeNav, this.menuList)
102
- }
103
- },
104
- watch: {
105
- menus: {
106
- handler() {
107
- this.getMenuList()
108
- },
109
- immediate: true
110
- },
111
- collapse: {
112
- handler(val) {
113
- if (val) {
114
- document.querySelector('body').classList.add('aside-nav--collapse')
115
- } else {
116
- document.querySelector('body').classList.remove('aside-nav--collapse')
117
- }
118
- },
119
- immediate: true
120
- },
121
- clientHeight: {
122
- handler(val) {
123
- document
124
- .querySelector('body')
125
- .style.setProperty('--client-height', val + 'px')
126
- },
127
- immediate: true
128
- }
129
- },
130
- created() {
131
- window._tab_cache_route = undefined
132
- window._pending_update_cache = {}
133
-
134
- setRela(this.appNo)
135
-
136
- this.getCollapse()
137
- this.getTabList()
138
- setTimeout(() => {
139
- this.getActiveNav()
140
- }, 60)
141
-
142
- window.addEventListener('message', this.setMainTab)
143
-
144
- window.addEventListener('beforeunload', this.setTabList)
145
- },
146
- mounted() {
147
- addListener(this.$refs['content-wrap'], this.contentChange)
148
- },
149
- beforeDestroy() {
150
- removeListener(this.$refs['content-wrap'], this.contentChange)
151
- this.setTabList()
152
-
153
- window.removeEventListener('message', this.setMainTab)
154
-
155
- window.removeEventListener('beforeunload', this.setTabList)
156
- },
157
- methods: {
158
- setMainTab(ev) {
159
- const {
160
- targetName,
161
- replaceTab,
162
- addTab,
163
- closeTab,
164
- setTabName,
165
- addTabO,
166
- refreshTab
167
- } = ev.data
168
-
169
- if (targetName === 'main') {
170
- replaceTab && this.tabReplace(replaceTab)
171
- addTab && this.tabAdd(addTab)
172
- addTabO && this.tabAddO(addTabO)
173
- closeTab && this.tabClose(closeTab)
174
- setTabName && this.tabSetName(setTabName)
175
- refreshTab && this.tabRefresh(refreshTab)
176
- }
177
- },
178
- getCollapse() {
179
- this.collapse =
180
- window.localStorage.getItem('aside-nav-collapse') === 'true'
181
- },
182
- contentChange(dom) {
183
- this.clientHeight = dom.clientHeight - 2 * this.clientM
184
- },
185
- getMenuList() {
186
- let menus = JSON.parse(JSON.stringify(this.menus))
187
- let menuList = []
188
- menus.forEach((sub) => {
189
- let base = sub.base
190
- forEachs(sub.menu, (m, i, a, p) => {
191
- if (m.route) {
192
- m.pid = p.uuid
193
- m.route = base + m.route.replace(/\/$/, '')
194
- m.route || (m.route = '/')
195
- m.uuid = m.route
196
-
197
- menuList.push(m)
198
- }
199
- })
200
- })
201
-
202
- menus.forEach((sub) => {
203
- sub.menu = sub.menu.filter((c) => !c.hide)
204
- forEachs(sub.menu, (m) => {
205
- if (m.children) {
206
- let cN = m.children.filter((c) => !c.hide)
207
- m.children = cN.length ? cN : undefined
208
- }
209
- })
210
- })
211
-
212
- this.menusC = menus
213
- this.menuList = menuList
214
- },
215
- getTabList() {
216
- let tabList = JSON.parse(window.sessionStorage.getItem('tab-list')) || []
217
- if (!tabList.some((tab) => tab.route === this.keepTab)) {
218
- let menu = this.menuList.find((m) => m.route === this.keepTab)
219
- if (menu) {
220
- let keepMenu = Object.assign({}, menu, { keep: true })
221
- tabList.unshift(keepMenu)
222
- }
223
- }
224
- this.tabList = tabList
225
- },
226
- setTabList() {
227
- window.sessionStorage.setItem('tab-list', JSON.stringify(this.tabList))
228
- },
229
- getActiveNav() {
230
- let tab = this.tabList.find(
231
- (t) => this.$route.path === t.uuid || this.$route.path === t.route
232
- )
233
- if (tab) {
234
- this.activeNav = tab.uuid
235
- } else {
236
- this.$router.replace({
237
- path: this.keepTab || '/'
238
- })
239
- }
240
- },
241
- routerPush({ path, query = {} }) {
242
- if (path !== this.$route.path) {
243
- this.$router.push({
244
- path: path,
245
- query: query
246
- })
247
- } else if (JSON.stringify(query) !== JSON.stringify(this.$route.query)) {
248
- this.$router.push({
249
- path: path,
250
- query: query
251
- })
252
- }
253
- },
254
- menuClick(menu) {
255
- this.routerPush({ path: menu.route })
256
- },
257
- tabClick(tab) {
258
- this.activeNav = tab.uuid
259
-
260
- this.routerPush({
261
- path: tab.route,
262
- query: tab.query
263
- })
264
- },
265
- tabReplace(opt) {
266
- let { path } = opt
267
- path = path.replace(routerBaseRe, '/')
268
- path = path.replace(/\/$/, '')
269
-
270
- let tab = this.tabList.find((t) => t.uuid === this.activeNav)
271
- if (tab) {
272
- if (window._tab_cache_route === tab.route) {
273
- setTimeout(() => {
274
- window._tab_cache_route = undefined
275
- }, 100)
276
- } else {
277
- this.removeOcache({ path: tab.route })
278
- }
279
-
280
- this.$set(tab, 'route', path)
281
- for (let k in opt) {
282
- k !== 'path' && this.$set(tab, k, opt[k])
283
- }
284
- }
285
- },
286
- tabAddO(opt) {
287
- let { path, query } = opt
288
- path = path.replace(routerBaseRe, '/')
289
- path = path.replace(/\/$/, '')
290
- path || (path = '/')
291
-
292
- let tab = this.tabList.find((t) => t.route === path)
293
- if (tab) {
294
- this.activeNav = tab.uuid
295
-
296
- let queryStr = JSON.stringify({ ...tab.query, _fromNo: undefined })
297
- let queryStrN = JSON.stringify({ ...query, _fromNo: undefined })
298
-
299
- this.$set(tab, 'route', path)
300
- for (let k in opt) {
301
- k !== 'path' && this.$set(tab, k, opt[k])
302
- }
303
-
304
- queryStr !== queryStrN && this.tabRefresh({ uuid: tab.uuid })
305
- } else {
306
- let tabI = this.tabList.findIndex((t) => t.uuid === path)
307
- tab = this.tabList[tabI]
308
- if (tab) {
309
- if (window._tab_cache_route === tab.route) {
310
- setTimeout(() => {
311
- window._tab_cache_route = undefined
312
- }, 100)
313
- } else {
314
- this.removeOcache({ path: tab.route })
315
- }
316
-
317
- for (let k in opt) {
318
- k !== 'path' && this.$set(tab, k, opt[k])
319
- }
320
- } else {
321
- let tabN = {
322
- ...opt,
323
- route: path,
324
- path: undefined,
325
- uuid: path,
326
- keep: path === this.keepTab ? true : undefined
327
- }
328
- this.tabList.push(tabN)
329
- this.activeNav = path
330
- }
331
- }
332
- },
333
- tabAdd(opt) {
334
- let { path, query } = opt
335
- this.$router.push({ path, query })
336
- this.$nextTick(() => {
337
- this.tabAddO(opt)
338
- })
339
- },
340
- tabClose({ uuid, path }) {
341
- let tabI = -1
342
- if (uuid) {
343
- tabI = this.tabList.findIndex((t) => t.uuid === uuid)
344
- } else if (path) {
345
- tabI = this.tabList.findIndex((t) => t.route === path)
346
- }
347
- if (tabI !== -1) {
348
- uuid = this.tabList[tabI].uuid
349
- let path = this.tabList[tabI].route
350
-
351
- this.tabList.splice(tabI, 1)
352
- if (uuid === this.activeNav) {
353
- let tabN = this.tabList[tabI] || this.tabList[tabI - 1]
354
- if (tabN) {
355
- if (tabN.uuid !== this.activeNav) {
356
- this.routerPush({
357
- path: tabN.route,
358
- query: tabN.query
359
- })
360
- }
361
- } else {
362
- this.routerPush({
363
- path: '/'
364
- })
365
- }
366
- }
367
-
368
- this.$nextTick(() => {
369
- this.removeOcache({ path: path })
370
- })
371
- } else {
372
- console.warn('请求关闭的Tab页签不存在')
373
- }
374
- },
375
- tabCloseNexts(uuid) {
376
- let tabI = this.tabList.findIndex((t) => t.uuid === uuid)
377
- let nextTabs = this.tabList.splice(tabI + 1)
378
-
379
- if (!this.tabList.some((t) => t.uuid === this.activeNav)) {
380
- let tab = this.tabList[tabI]
381
- this.activeNav = tab.uuid
382
- this.routerPush({
383
- path: tab.route,
384
- query: tab.query
385
- })
386
- }
387
-
388
- this.$nextTick(() => {
389
- nextTabs.forEach((t) => {
390
- this.removeOcache({ path: t.route })
391
- })
392
- nextTabs = undefined
393
- })
394
- },
395
- tabCloseOthers(uuid) {
396
- let tab = this.tabList.find((t) => t.uuid === uuid)
397
- let tabs = []
398
- let otherTabs = []
399
- this.tabList.forEach((t) => {
400
- if (t.uuid === uuid) {
401
- tabs.push(t)
402
- tab = t
403
- } else if (t.keep) {
404
- tabs.push(t)
405
- } else {
406
- otherTabs.push(t)
407
- }
408
- })
409
-
410
- this.tabList = tabs
411
- if (this.activeNav !== tab.uuid) {
412
- this.activeNav = tab.uuid
413
- this.routerPush({
414
- path: tab.route,
415
- query: tab.query
416
- })
417
- }
418
-
419
- this.$nextTick(() => {
420
- otherTabs.forEach((t) => {
421
- this.removeOcache({ path: t.route })
422
- })
423
- otherTabs = undefined
424
- })
425
- },
426
- tabRefresh({ uuid, path }) {
427
- let tab = undefined
428
- if (uuid) {
429
- tab = this.tabList.find((t) => uuid === t.uuid)
430
- } else if (path) {
431
- tab = this.tabList.find((t) => t.route === path)
432
- }
433
-
434
- if (
435
- tab.uuid === this.activeNav &&
436
- this.$route.matched[0]['path'] !== '*'
437
- ) {
438
- let path = this.$route.path
439
- let oTab = JSON.parse(
440
- JSON.stringify({
441
- path: this.$route.path,
442
- query: this.$route.query
443
- })
444
- )
445
-
446
- this.$router.replace('/loading')
447
- this.removeOcache({ path: path })
448
- this.$nextTick(() => {
449
- this.$router.replace(oTab)
450
- })
451
- } else {
452
- this.removeOcache({ path: tab.route })
453
- }
454
- },
455
- tabSetName({ uuid, path, title }) {
456
- let tabI = -1
457
- if (uuid) {
458
- tabI = this.tabList.findIndex((t) => t.uuid === uuid)
459
- } else if (path) {
460
- tabI = this.tabList.findIndex((t) => t.route === path)
461
- }
462
- if (tabI !== -1) {
463
- let tab = this.tabList[tabI]
464
- tab.title = title
465
- }
466
- },
467
- removeOcache({ path }) {
468
- if (!this.dnsKey) return
469
-
470
- let componentInstance =
471
- this.$refs['content-cache']?.$vnode.parent.componentInstance
472
-
473
- if (componentInstance) {
474
- let kI = componentInstance.keys.findIndex((k) => k === path)
475
- if (kI !== -1) {
476
- window._pending_update_cache[path] = true
477
- window.postMessage({
478
- updateCache: true,
479
- targetName: '*',
480
- originName: 'main'
481
- })
482
- let isNull = componentInstance.cache[path].componentInstance.isNull
483
- if (isNull) {
484
- return
485
- }
486
- let destroy = componentInstance.cache[path].componentInstance.destroy
487
- destroy && destroy()
488
-
489
- delete componentInstance.cache[path]
490
- componentInstance.keys.splice(kI, 1)
491
-
492
- // console.log({
493
- // cache: componentInstance.cache,
494
- // keys: componentInstance.keys
495
- // })
496
- } else {
497
- window._pending_update_cache[path] = true
498
- window.postMessage({
499
- updateCache: true,
500
- targetName: '*',
501
- originName: 'main'
502
- })
503
- }
504
- } else {
505
- window._pending_update_cache[path] = true
506
- window.postMessage({
507
- updateCache: true,
508
- targetName: '*',
509
- originName: 'main'
510
- })
511
- }
512
- }
513
- }
514
- }
515
-
516
- function getShowUuid(uuid, list) {
517
- let menu = list.find((m) => m.uuid === uuid)
518
- if (menu) {
519
- return menu.hide ? menu.pid : menu.uuid
520
- }
521
-
522
- let pid = uuid.replace(/\/[^\/]+\/*$/, '')
523
- if (pid !== '' && pid !== '/') {
524
- return getShowUuid(pid, list)
525
- }
526
-
527
- return '/'
528
- }
529
- </script>
1
+ <template>
2
+ <div class="layout-wrap">
3
+ <headerWrap
4
+ class="header-wrap"
5
+ @custom-event="(par) => $emit('custom-event', par)"
6
+ />
7
+ <asideNav
8
+ :menus="menusC"
9
+ :active-nav="activeNavC"
10
+ :collapse.sync="collapse"
11
+ @menu-click="menuClick"
12
+ />
13
+ <tabsNav
14
+ class="tabs-nav-wrap"
15
+ :tab-list="tabList"
16
+ :active-nav="activeNav"
17
+ @tab-click="tabClick"
18
+ @tab-close="tabClose"
19
+ @tab-close-nexts="tabCloseNexts"
20
+ @tab-close-others="tabCloseOthers"
21
+ @tab-refresh="tabRefresh"
22
+ />
23
+ <div ref="content-wrap" class="content-wrap">
24
+ <keep-alive v-if="dnsKey">
25
+ <router-view
26
+ ref="content-cache"
27
+ :key="$route.path"
28
+ class="content-box"
29
+ :no-cache="$route.meta.noCache"
30
+ />
31
+ </keep-alive>
32
+ <router-view
33
+ v-else
34
+ ref="content-cache"
35
+ class="content-box"
36
+ :no-cache="$route.meta.noCache"
37
+ />
38
+ </div>
39
+ </div>
40
+ </template>
41
+
42
+ <script>
43
+ const TestProduction = process.env.VUE_APP_TestProduction === 'true'
44
+ const routerBase = process.env.BASE_URL
45
+ const routerBaseRe = new RegExp('^' + routerBase)
46
+
47
+ import { addListener, removeListener } from 'resize-detector'
48
+ import forEachs from '../../utils/forEachs'
49
+ import { setRela } from '../../utils/relaNo'
50
+ import asideNav from './AsideNav/index.vue'
51
+ import headerWrap from './HeaderWrap/index.vue'
52
+ import tabsNav from './TabsNav/index.vue'
53
+
54
+ export default {
55
+ name: 'Layout',
56
+ components: {
57
+ asideNav,
58
+ headerWrap,
59
+ tabsNav
60
+ },
61
+ props: {
62
+ appNo: {
63
+ type: String,
64
+ default: process.env.VUE_APP_NAME
65
+ },
66
+ menus: {
67
+ type: Array,
68
+ default: () => []
69
+ },
70
+ keepTab: {
71
+ type: String,
72
+ default: ''
73
+ },
74
+ isTest: {
75
+ type: Boolean,
76
+ default: false
77
+ }
78
+ },
79
+ data() {
80
+ let headerH = 48
81
+ let tabsH = 35
82
+ let clientM = 10 + 1
83
+
84
+ return {
85
+ dnsKey: this.isTest || TestProduction,
86
+ headerH,
87
+ tabsH,
88
+ clientM,
89
+ clientHeight:
90
+ document.documentElement.offsetHeight - headerH - tabsH - 2 * clientM,
91
+ collapse: window.localStorage.getItem('aside-nav-collapse') === 'true',
92
+
93
+ menusC: [],
94
+ menuList: [],
95
+ tabList: [],
96
+ activeNav: ''
97
+ }
98
+ },
99
+ computed: {
100
+ activeNavC() {
101
+ return getShowUuid(this.activeNav, this.menuList)
102
+ }
103
+ },
104
+ watch: {
105
+ menus: {
106
+ handler() {
107
+ this.getMenuList()
108
+ },
109
+ immediate: true
110
+ },
111
+ collapse: {
112
+ handler(val) {
113
+ if (val) {
114
+ document.querySelector('body').classList.add('aside-nav--collapse')
115
+ } else {
116
+ document.querySelector('body').classList.remove('aside-nav--collapse')
117
+ }
118
+ },
119
+ immediate: true
120
+ },
121
+ clientHeight: {
122
+ handler(val) {
123
+ document
124
+ .querySelector('body')
125
+ .style.setProperty('--client-height', val + 'px')
126
+ },
127
+ immediate: true
128
+ }
129
+ },
130
+ created() {
131
+ window._tab_cache_route = undefined
132
+ window._pending_update_cache = {}
133
+
134
+ setRela(this.appNo)
135
+
136
+ this.getCollapse()
137
+ this.getTabList()
138
+ setTimeout(() => {
139
+ this.getActiveNav()
140
+ }, 60)
141
+
142
+ window.addEventListener('message', this.setMainTab)
143
+
144
+ window.addEventListener('beforeunload', this.setTabList)
145
+ },
146
+ mounted() {
147
+ addListener(this.$refs['content-wrap'], this.contentChange)
148
+ },
149
+ beforeDestroy() {
150
+ removeListener(this.$refs['content-wrap'], this.contentChange)
151
+ this.setTabList()
152
+
153
+ window.removeEventListener('message', this.setMainTab)
154
+
155
+ window.removeEventListener('beforeunload', this.setTabList)
156
+ },
157
+ methods: {
158
+ setMainTab(ev) {
159
+ const {
160
+ targetName,
161
+ replaceTab,
162
+ addTab,
163
+ closeTab,
164
+ setTabName,
165
+ addTabO,
166
+ refreshTab
167
+ } = ev.data
168
+
169
+ if (targetName === 'main') {
170
+ replaceTab && this.tabReplace(replaceTab)
171
+ addTab && this.tabAdd(addTab)
172
+ addTabO && this.tabAddO(addTabO)
173
+ closeTab && this.tabClose(closeTab)
174
+ setTabName && this.tabSetName(setTabName)
175
+ refreshTab && this.tabRefresh(refreshTab)
176
+ }
177
+ },
178
+ getCollapse() {
179
+ this.collapse =
180
+ window.localStorage.getItem('aside-nav-collapse') === 'true'
181
+ },
182
+ contentChange(dom) {
183
+ this.clientHeight = dom.clientHeight - 2 * this.clientM
184
+ },
185
+ getMenuList() {
186
+ let menus = JSON.parse(JSON.stringify(this.menus))
187
+ let menuList = []
188
+ menus.forEach((sub) => {
189
+ let base = sub.base
190
+ forEachs(sub.menu, (m, i, a, p) => {
191
+ if (m.route) {
192
+ m.pid = p.uuid
193
+ m.route = base + m.route.replace(/\/$/, '')
194
+ m.route || (m.route = '/')
195
+ m.uuid = m.route
196
+
197
+ menuList.push(m)
198
+ }
199
+ })
200
+ })
201
+
202
+ menus.forEach((sub) => {
203
+ sub.menu = sub.menu.filter((c) => !c.hide)
204
+ forEachs(sub.menu, (m) => {
205
+ if (m.children) {
206
+ let cN = m.children.filter((c) => !c.hide)
207
+ m.children = cN.length ? cN : undefined
208
+ }
209
+ })
210
+ })
211
+
212
+ this.menusC = menus
213
+ this.menuList = menuList
214
+ },
215
+ getTabList() {
216
+ let tabList = JSON.parse(window.sessionStorage.getItem('tab-list')) || []
217
+ if (!tabList.some((tab) => tab.route === this.keepTab)) {
218
+ let menu = this.menuList.find((m) => m.route === this.keepTab)
219
+ if (menu) {
220
+ let keepMenu = Object.assign({}, menu, { keep: true })
221
+ tabList.unshift(keepMenu)
222
+ }
223
+ }
224
+ this.tabList = tabList
225
+ },
226
+ setTabList() {
227
+ window.sessionStorage.setItem('tab-list', JSON.stringify(this.tabList))
228
+ },
229
+ getActiveNav() {
230
+ let tab = this.tabList.find(
231
+ (t) => this.$route.path === t.uuid || this.$route.path === t.route
232
+ )
233
+ if (tab) {
234
+ this.activeNav = tab.uuid
235
+ } else {
236
+ this.$router.replace({
237
+ path: this.keepTab || '/'
238
+ })
239
+ }
240
+ },
241
+ routerPush({ path, query = {} }) {
242
+ if (path !== this.$route.path) {
243
+ this.$router.push({
244
+ path: path,
245
+ query: query
246
+ })
247
+ } else if (JSON.stringify(query) !== JSON.stringify(this.$route.query)) {
248
+ this.$router.push({
249
+ path: path,
250
+ query: query
251
+ })
252
+ }
253
+ },
254
+ menuClick(menu) {
255
+ this.routerPush({ path: menu.route })
256
+ },
257
+ tabClick(tab) {
258
+ this.activeNav = tab.uuid
259
+
260
+ this.routerPush({
261
+ path: tab.route,
262
+ query: tab.query
263
+ })
264
+ },
265
+ tabReplace(opt) {
266
+ let { path } = opt
267
+ path = path.replace(routerBaseRe, '/')
268
+ path = path.replace(/\/$/, '')
269
+
270
+ let tab = this.tabList.find((t) => t.uuid === this.activeNav)
271
+ if (tab) {
272
+ if (window._tab_cache_route === tab.route) {
273
+ setTimeout(() => {
274
+ window._tab_cache_route = undefined
275
+ }, 100)
276
+ } else {
277
+ this.removeOcache({ path: tab.route })
278
+ }
279
+
280
+ this.$set(tab, 'route', path)
281
+ for (let k in opt) {
282
+ k !== 'path' && this.$set(tab, k, opt[k])
283
+ }
284
+ }
285
+ },
286
+ tabAddO(opt) {
287
+ let { path, query } = opt
288
+ path = path.replace(routerBaseRe, '/')
289
+ path = path.replace(/\/$/, '')
290
+ path || (path = '/')
291
+
292
+ let tab = this.tabList.find((t) => t.route === path)
293
+ if (tab) {
294
+ this.activeNav = tab.uuid
295
+
296
+ let queryStr = JSON.stringify({ ...tab.query, _fromNo: undefined })
297
+ let queryStrN = JSON.stringify({ ...query, _fromNo: undefined })
298
+
299
+ this.$set(tab, 'route', path)
300
+ for (let k in opt) {
301
+ k !== 'path' && this.$set(tab, k, opt[k])
302
+ }
303
+
304
+ queryStr !== queryStrN && this.tabRefresh({ uuid: tab.uuid })
305
+ } else {
306
+ let tabI = this.tabList.findIndex((t) => t.uuid === path)
307
+ tab = this.tabList[tabI]
308
+ if (tab) {
309
+ if (window._tab_cache_route === tab.route) {
310
+ setTimeout(() => {
311
+ window._tab_cache_route = undefined
312
+ }, 100)
313
+ } else {
314
+ this.removeOcache({ path: tab.route })
315
+ }
316
+
317
+ for (let k in opt) {
318
+ k !== 'path' && this.$set(tab, k, opt[k])
319
+ }
320
+ } else {
321
+ let tabN = {
322
+ ...opt,
323
+ route: path,
324
+ path: undefined,
325
+ uuid: path,
326
+ keep: path === this.keepTab ? true : undefined
327
+ }
328
+ this.tabList.push(tabN)
329
+ this.activeNav = path
330
+ }
331
+ }
332
+ },
333
+ tabAdd(opt) {
334
+ let { path, query } = opt
335
+ this.$router.push({ path, query })
336
+ this.$nextTick(() => {
337
+ this.tabAddO(opt)
338
+ })
339
+ },
340
+ tabClose({ uuid, path }) {
341
+ let tabI = -1
342
+ if (uuid) {
343
+ tabI = this.tabList.findIndex((t) => t.uuid === uuid)
344
+ } else if (path) {
345
+ tabI = this.tabList.findIndex((t) => t.route === path)
346
+ }
347
+ if (tabI !== -1) {
348
+ uuid = this.tabList[tabI].uuid
349
+ let path = this.tabList[tabI].route
350
+
351
+ this.tabList.splice(tabI, 1)
352
+ if (uuid === this.activeNav) {
353
+ let tabN = this.tabList[tabI] || this.tabList[tabI - 1]
354
+ if (tabN) {
355
+ if (tabN.uuid !== this.activeNav) {
356
+ this.routerPush({
357
+ path: tabN.route,
358
+ query: tabN.query
359
+ })
360
+ }
361
+ } else {
362
+ this.routerPush({
363
+ path: '/'
364
+ })
365
+ }
366
+ }
367
+
368
+ this.$nextTick(() => {
369
+ this.removeOcache({ path: path })
370
+ })
371
+ } else {
372
+ console.warn('请求关闭的Tab页签不存在')
373
+ }
374
+ },
375
+ tabCloseNexts(uuid) {
376
+ let tabI = this.tabList.findIndex((t) => t.uuid === uuid)
377
+ let nextTabs = this.tabList.splice(tabI + 1)
378
+
379
+ if (!this.tabList.some((t) => t.uuid === this.activeNav)) {
380
+ let tab = this.tabList[tabI]
381
+ this.activeNav = tab.uuid
382
+ this.routerPush({
383
+ path: tab.route,
384
+ query: tab.query
385
+ })
386
+ }
387
+
388
+ this.$nextTick(() => {
389
+ nextTabs.forEach((t) => {
390
+ this.removeOcache({ path: t.route })
391
+ })
392
+ nextTabs = undefined
393
+ })
394
+ },
395
+ tabCloseOthers(uuid) {
396
+ let tab = this.tabList.find((t) => t.uuid === uuid)
397
+ let tabs = []
398
+ let otherTabs = []
399
+ this.tabList.forEach((t) => {
400
+ if (t.uuid === uuid) {
401
+ tabs.push(t)
402
+ tab = t
403
+ } else if (t.keep) {
404
+ tabs.push(t)
405
+ } else {
406
+ otherTabs.push(t)
407
+ }
408
+ })
409
+
410
+ this.tabList = tabs
411
+ if (this.activeNav !== tab.uuid) {
412
+ this.activeNav = tab.uuid
413
+ this.routerPush({
414
+ path: tab.route,
415
+ query: tab.query
416
+ })
417
+ }
418
+
419
+ this.$nextTick(() => {
420
+ otherTabs.forEach((t) => {
421
+ this.removeOcache({ path: t.route })
422
+ })
423
+ otherTabs = undefined
424
+ })
425
+ },
426
+ tabRefresh({ uuid, path }) {
427
+ let tab = undefined
428
+ if (uuid) {
429
+ tab = this.tabList.find((t) => uuid === t.uuid)
430
+ } else if (path) {
431
+ tab = this.tabList.find((t) => t.route === path)
432
+ }
433
+
434
+ if (
435
+ tab.uuid === this.activeNav &&
436
+ this.$route.matched[0]['path'] !== '*'
437
+ ) {
438
+ let path = this.$route.path
439
+ let oTab = JSON.parse(
440
+ JSON.stringify({
441
+ path: this.$route.path,
442
+ query: this.$route.query
443
+ })
444
+ )
445
+
446
+ this.$router.replace('/loading')
447
+ this.removeOcache({ path: path })
448
+ this.$nextTick(() => {
449
+ this.$router.replace(oTab)
450
+ })
451
+ } else {
452
+ this.removeOcache({ path: tab.route })
453
+ }
454
+ },
455
+ tabSetName({ uuid, path, title }) {
456
+ let tabI = -1
457
+ if (uuid) {
458
+ tabI = this.tabList.findIndex((t) => t.uuid === uuid)
459
+ } else if (path) {
460
+ tabI = this.tabList.findIndex((t) => t.route === path)
461
+ }
462
+ if (tabI !== -1) {
463
+ let tab = this.tabList[tabI]
464
+ tab.title = title
465
+ }
466
+ },
467
+ removeOcache({ path }) {
468
+ if (!this.dnsKey) return
469
+
470
+ let componentInstance =
471
+ this.$refs['content-cache']?.$vnode.parent.componentInstance
472
+
473
+ if (componentInstance) {
474
+ let kI = componentInstance.keys.findIndex((k) => k === path)
475
+ if (kI !== -1) {
476
+ window._pending_update_cache[path] = true
477
+ window.postMessage({
478
+ updateCache: true,
479
+ targetName: '*',
480
+ originName: 'main'
481
+ })
482
+ let isNull = componentInstance.cache[path].componentInstance.isNull
483
+ if (isNull) {
484
+ return
485
+ }
486
+ let destroy = componentInstance.cache[path].componentInstance.destroy
487
+ destroy && destroy()
488
+
489
+ delete componentInstance.cache[path]
490
+ componentInstance.keys.splice(kI, 1)
491
+
492
+ // console.log({
493
+ // cache: componentInstance.cache,
494
+ // keys: componentInstance.keys
495
+ // })
496
+ } else {
497
+ window._pending_update_cache[path] = true
498
+ window.postMessage({
499
+ updateCache: true,
500
+ targetName: '*',
501
+ originName: 'main'
502
+ })
503
+ }
504
+ } else {
505
+ window._pending_update_cache[path] = true
506
+ window.postMessage({
507
+ updateCache: true,
508
+ targetName: '*',
509
+ originName: 'main'
510
+ })
511
+ }
512
+ }
513
+ }
514
+ }
515
+
516
+ function getShowUuid(uuid, list) {
517
+ let menu = list.find((m) => m.uuid === uuid)
518
+ if (menu) {
519
+ return menu.hide ? menu.pid : menu.uuid
520
+ }
521
+
522
+ let pid = uuid.replace(/\/[^\/]+\/*$/, '')
523
+ if (pid !== '' && pid !== '/') {
524
+ return getShowUuid(pid, list)
525
+ }
526
+
527
+ return '/'
528
+ }
529
+ </script>