n20-common-lib 1.1.98

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 (196) hide show
  1. package/README.md +27 -0
  2. package/package.json +87 -0
  3. package/src/_qiankun/index.js +113 -0
  4. package/src/_qiankun/postMessage.js +48 -0
  5. package/src/assets/css/_coreLib.scss +35 -0
  6. package/src/assets/css/cl-anchor.scss +24 -0
  7. package/src/assets/css/cl-approve-card.scss +58 -0
  8. package/src/assets/css/cl-dialog.scss +99 -0
  9. package/src/assets/css/cl-drag-list.scss +22 -0
  10. package/src/assets/css/cl-empty.scss +10 -0
  11. package/src/assets/css/cl-expandable-pane.scss +25 -0
  12. package/src/assets/css/cl-expandable.scss +23 -0
  13. package/src/assets/css/cl-file-upload-table.scss +11 -0
  14. package/src/assets/css/cl-filter.scss +4 -0
  15. package/src/assets/css/cl-flow-step.scss +186 -0
  16. package/src/assets/css/cl-footer-box.scss +10 -0
  17. package/src/assets/css/cl-form-item.scss +322 -0
  18. package/src/assets/css/cl-general-card.scss +12 -0
  19. package/src/assets/css/cl-layout-aside.scss +88 -0
  20. package/src/assets/css/cl-layout-content.scss +16 -0
  21. package/src/assets/css/cl-layout-header.scss +73 -0
  22. package/src/assets/css/cl-layout-tabs.scss +87 -0
  23. package/src/assets/css/cl-layout.scss +97 -0
  24. package/src/assets/css/cl-login-temporary.scss +37 -0
  25. package/src/assets/css/cl-message.scss +75 -0
  26. package/src/assets/css/cl-more-tab.scss +98 -0
  27. package/src/assets/css/cl-nav-menu.scss +5 -0
  28. package/src/assets/css/cl-pagination.scss +65 -0
  29. package/src/assets/css/cl-secondary-tab.scss +39 -0
  30. package/src/assets/css/cl-showcolumn.scss +23 -0
  31. package/src/assets/css/cl-sifting.scss +51 -0
  32. package/src/assets/css/cl-statis.scss +42 -0
  33. package/src/assets/css/cl-step.scss +73 -0
  34. package/src/assets/css/cl-suspend.scss +19 -0
  35. package/src/assets/css/cl-tertiary-tab.scss +9 -0
  36. package/src/assets/css/cl-upload.scss +41 -0
  37. package/src/assets/css/cl-worn-pagination.scss +50 -0
  38. package/src/assets/css/el-button.scss +169 -0
  39. package/src/assets/css/el-table.scss +79 -0
  40. package/src/assets/css/element-variables.scss +1061 -0
  41. package/src/assets/css/element.dev.scss +21 -0
  42. package/src/assets/css/font-icon.scss +26 -0
  43. package/src/assets/css/index.dev.scss +4 -0
  44. package/src/assets/css/index.scss +11 -0
  45. package/src/assets/css/normalize.scss +723 -0
  46. package/src/assets/css/rootvar.scss +139 -0
  47. package/src/assets/css/select.scss +26 -0
  48. package/src/assets/css/title-pop.scss +4 -0
  49. package/src/assets/getJsonc.js +50 -0
  50. package/src/assets/realUrl.js +12 -0
  51. package/src/components/Anchor/AnchorItem.vue +30 -0
  52. package/src/components/Anchor/index.vue +185 -0
  53. package/src/components/ApprovalButtons/index.vue +232 -0
  54. package/src/components/ApprovalCard/index.vue +128 -0
  55. package/src/components/ApprovalRecord/approvalImg.vue +39 -0
  56. package/src/components/ApprovalRecord/index.vue +59 -0
  57. package/src/components/Button/button-group.vue +150 -0
  58. package/src/components/Button/icon-group-button.vue +61 -0
  59. package/src/components/Button/index.vue +56 -0
  60. package/src/components/ContentLoading/index.vue +41 -0
  61. package/src/components/ContentNull/index.vue +19 -0
  62. package/src/components/DatePicker/index.vue +27 -0
  63. package/src/components/DatePicker/por.vue +169 -0
  64. package/src/components/Dialog/index.vue +26 -0
  65. package/src/components/Dialog/indexO.vue +116 -0
  66. package/src/components/DragList/index.vue +68 -0
  67. package/src/components/Empty/img/404.png +0 -0
  68. package/src/components/Empty/img/abnormal.svg +109 -0
  69. package/src/components/Empty/img/dispose.svg +72 -0
  70. package/src/components/Empty/img/empty.svg +58 -0
  71. package/src/components/Empty/img/general.svg +59 -0
  72. package/src/components/Empty/img/lock.svg +58 -0
  73. package/src/components/Empty/img/network.svg +60 -0
  74. package/src/components/Empty/img/relevant.svg +69 -0
  75. package/src/components/Empty/img/search.svg +73 -0
  76. package/src/components/Empty/index.vue +92 -0
  77. package/src/components/Expandable/index.vue +49 -0
  78. package/src/components/Expandable/main.vue +52 -0
  79. package/src/components/FileUploadTable/index.vue +484 -0
  80. package/src/components/Filters/index.vue +358 -0
  81. package/src/components/Filters/indexO.vue +104 -0
  82. package/src/components/FlowStep/index.vue +69 -0
  83. package/src/components/FooterBox/index.vue +21 -0
  84. package/src/components/GeneralCard/index.vue +15 -0
  85. package/src/components/InputNumber/index.vue +153 -0
  86. package/src/components/InputNumber/numberRange.vue +47 -0
  87. package/src/components/InputSearch/index.vue +75 -0
  88. package/src/components/Layout/AsideNav/index.vue +144 -0
  89. package/src/components/Layout/HeaderWrap/changePwd.vue +215 -0
  90. package/src/components/Layout/HeaderWrap/index.vue +336 -0
  91. package/src/components/Layout/HeaderWrap/noticePop.vue +300 -0
  92. package/src/components/Layout/SubContent/index.vue +131 -0
  93. package/src/components/Layout/TabsNav/index.vue +170 -0
  94. package/src/components/Layout/index.vue +529 -0
  95. package/src/components/Layout/utils.js +12 -0
  96. package/src/components/LoginTemporary/form.vue +511 -0
  97. package/src/components/LoginTemporary/index.vue +122 -0
  98. package/src/components/LoginTemporary/qr.png +0 -0
  99. package/src/components/LoginTemporary/qrcode.vue +90 -0
  100. package/src/components/LoginTemporary/qrt.png +0 -0
  101. package/src/components/LoginTemporary/retrievePw.vue +28 -0
  102. package/src/components/LoginTemporary/utils.js +73 -0
  103. package/src/components/MicroApp/index.js +67 -0
  104. package/src/components/MicroFrame/index.vue +95 -0
  105. package/src/components/MoreTab/index.vue +232 -0
  106. package/src/components/NavMenu/index.vue +60 -0
  107. package/src/components/NstcG6Components/NstcApprovel/NstcApprovel.vue +13 -0
  108. package/src/components/NstcG6Components/NstcDialog/NstcDialog.vue +185 -0
  109. package/src/components/NstcG6Components/Progress/progress.vue +134 -0
  110. package/src/components/PageLayout/page.vue +15 -0
  111. package/src/components/Pagination/index.vue +96 -0
  112. package/src/components/SecondaryTab/index.vue +58 -0
  113. package/src/components/SelectLazy/index.vue +75 -0
  114. package/src/components/SelectTree/SelectTreeLazy.vue +241 -0
  115. package/src/components/SelectTree/index.vue +208 -0
  116. package/src/components/ShowColumn/index.vue +188 -0
  117. package/src/components/Sifting/index.vue +99 -0
  118. package/src/components/Statis/index.vue +97 -0
  119. package/src/components/Statis/statisItem.vue +54 -0
  120. package/src/components/Statis/statisPopover.vue +55 -0
  121. package/src/components/Step/index.vue +38 -0
  122. package/src/components/Suspend/index.vue +72 -0
  123. package/src/components/Table/index.vue +131 -0
  124. package/src/components/Table/indexO.vue +149 -0
  125. package/src/components/Task/index.vue +26 -0
  126. package/src/components/TertiaryTab/index.vue +53 -0
  127. package/src/components/TimePicker/index.vue +28 -0
  128. package/src/components/Upload/index.vue +242 -0
  129. package/src/components/WornPagination/index.vue +73 -0
  130. package/src/directives/VClickOutside/index.js +19 -0
  131. package/src/directives/VDrag/index.js +72 -0
  132. package/src/directives/VHas/index.js +27 -0
  133. package/src/directives/VMove/index.js +42 -0
  134. package/src/directives/VTitle/index.js +56 -0
  135. package/src/directives/VTitle/tooltip.vue +21 -0
  136. package/src/index.js +225 -0
  137. package/src/plugins/CompatibleOld/index.js +57 -0
  138. package/src/plugins/Print/index.js +4 -0
  139. package/src/plugins/Print/print-js/.babelrc +12 -0
  140. package/src/plugins/Print/print-js/LICENSE +21 -0
  141. package/src/plugins/Print/print-js/README.md +98 -0
  142. package/src/plugins/Print/print-js/dist/print.css +97 -0
  143. package/src/plugins/Print/print-js/dist/print.js +991 -0
  144. package/src/plugins/Print/print-js/dist/print.map +1 -0
  145. package/src/plugins/Print/print-js/package.json +60 -0
  146. package/src/plugins/Print/print-js/src/index.d.ts +45 -0
  147. package/src/plugins/Print/print-js/src/index.js +10 -0
  148. package/src/plugins/Print/print-js/src/js/browser.js +33 -0
  149. package/src/plugins/Print/print-js/src/js/functions.js +103 -0
  150. package/src/plugins/Print/print-js/src/js/html.js +70 -0
  151. package/src/plugins/Print/print-js/src/js/image.js +48 -0
  152. package/src/plugins/Print/print-js/src/js/init.js +168 -0
  153. package/src/plugins/Print/print-js/src/js/json.js +109 -0
  154. package/src/plugins/Print/print-js/src/js/modal.js +62 -0
  155. package/src/plugins/Print/print-js/src/js/pdf.js +62 -0
  156. package/src/plugins/Print/print-js/src/js/print.js +102 -0
  157. package/src/plugins/Print/print-js/src/js/raw-html.js +15 -0
  158. package/src/plugins/Print/print-js/src/sass/index.scss +14 -0
  159. package/src/plugins/Print/print-js/src/sass/modules/_colors.scss +10 -0
  160. package/src/plugins/Print/print-js/src/sass/partials/_modal.scss +41 -0
  161. package/src/plugins/Print/print-js/src/sass/partials/_spinner.scss +46 -0
  162. package/src/plugins/Print/print.js +2 -0
  163. package/src/plugins/Print/print.scss +1 -0
  164. package/src/plugins/SetMenuTree/index.vue +41 -0
  165. package/src/plugins/SetMenuTree/logoIcon.vue +37 -0
  166. package/src/plugins/SetMenuTree/setmenutree.vue +427 -0
  167. package/src/plugins/SetMenuTree/utils.js +74 -0
  168. package/src/plugins/Sign/InfosecNetSignCNGAgent.min.js +2000 -0
  169. package/src/plugins/Sign/index.js +65 -0
  170. package/src/plugins/Sign/sign.js +1 -0
  171. package/src/plugins/setTabsForSub.js +2 -0
  172. package/src/utils/auth.js +53 -0
  173. package/src/utils/axios.js +203 -0
  174. package/src/utils/downloadBlob.js +19 -0
  175. package/src/utils/forEachs.js +16 -0
  176. package/src/utils/getScrollContainer.js +43 -0
  177. package/src/utils/i18n/cn2hk.json +1270 -0
  178. package/src/utils/i18n/index.js +54 -0
  179. package/src/utils/list2tree.js +36 -0
  180. package/src/utils/msgboxPor.js +26 -0
  181. package/src/utils/print.js +161 -0
  182. package/src/utils/relaNo.js +35 -0
  183. package/src/utils/repairElementUI.js +66 -0
  184. package/src/utils/urlToGo.js +82 -0
  185. package/style/css/normalize.scss +723 -0
  186. package/style/fonts/element-icons.535877f5.woff +0 -0
  187. package/style/fonts/element-icons.732389de.ttf +0 -0
  188. package/style/index.css +3 -0
  189. package/style/index.css.map +1 -0
  190. package/style/index.umd.min.js +2 -0
  191. package/style/index.umd.min.js.map +1 -0
  192. package/style/pageDemo/demo-1.vue +130 -0
  193. package/style/pageDemo/demo-2.vue +35 -0
  194. package/style/pageDemo/demo-3.vue +22 -0
  195. package/style/pageDemo/seeCode.js +20 -0
  196. package/style/server-config.jsonc +663 -0
@@ -0,0 +1,90 @@
1
+ <template>
2
+ <div v-loading="loadingV">
3
+ <canvas
4
+ ref="qr-canvas"
5
+ style="display: block; width: 212px; height: 212px; margin: 0 auto"
6
+ ></canvas>
7
+ <div
8
+ class="text-r"
9
+ style="font-size: 12px; color: #3d4a57; margin-bottom: -8px"
10
+ >
11
+ 请使用网银移动端扫码免Ukey登录<el-button
12
+ class="m-l-s"
13
+ type="text"
14
+ @click="refreshQrCode"
15
+ >
16
+ <i class="el-icon-refresh"></i>
17
+ 刷新</el-button
18
+ >
19
+ </div>
20
+ </div>
21
+ </template>
22
+ <script>
23
+ import QRCode from 'qrcode'
24
+ import axios from '../../utils/axios'
25
+
26
+ export default {
27
+ data() {
28
+ this.timeA = undefined
29
+ return {
30
+ loadingV: false,
31
+ qrCode: ''
32
+ }
33
+ },
34
+ created() {
35
+ this.getQrcode()
36
+ },
37
+ beforeDestroy() {
38
+ clearTimeout(this.timeA)
39
+ },
40
+ methods: {
41
+ getQrcode() {
42
+ this.loadingV = true
43
+ let loading = () => {
44
+ setTimeout(() => {
45
+ this.loadingV = false
46
+ }, 500)
47
+ }
48
+
49
+ axios
50
+ .get('/bems/prod_1.0/uas/api/qrCode', null, { loading })
51
+ .then(({ data }) => {
52
+ this.qrCode = data.qrCode
53
+
54
+ let qrCanvas = this.$refs['qr-canvas']
55
+ let width = qrCanvas.clientWidth
56
+
57
+ QRCode.toCanvas(this.$refs['qr-canvas'], this.qrCode, {
58
+ width: width,
59
+ height: width,
60
+ margin: 1
61
+ })
62
+
63
+ this.getQrCodePwd()
64
+ })
65
+ },
66
+ refreshQrCode() {
67
+ this.getQrcode()
68
+ },
69
+ getQrCodePwd() {
70
+ axios
71
+ .get(`/bems/prod_1.0/uas/api/qrCode/${this.qrCode}`, null, {
72
+ loading: false
73
+ })
74
+ .then(({ data }) => {
75
+ clearTimeout(this.timeA)
76
+ if (data.status === 3) {
77
+ this.QrcodeLogin(data)
78
+ } else {
79
+ this.timeA = setTimeout(() => {
80
+ this.getQrCodePwd()
81
+ }, 2000)
82
+ }
83
+ })
84
+ },
85
+ QrcodeLogin({ userNo, qrcode }) {
86
+ this.$emit('qrcode-login', { userNo, qrcode })
87
+ }
88
+ }
89
+ }
90
+ </script>
@@ -0,0 +1,28 @@
1
+ <template>
2
+ <div>
3
+ <div>找回密码开发中...</div>
4
+ <div class="dialog-footer">
5
+ <el-button type="primary" @click="confirmFn">确认</el-button>
6
+ <el-button @click="closeFn">取消</el-button>
7
+ </div>
8
+ </div>
9
+ </template>
10
+
11
+ <script>
12
+ export default {
13
+ props: {
14
+ visible: {
15
+ type: Boolean,
16
+ default: false
17
+ }
18
+ },
19
+ methods: {
20
+ closeFn() {
21
+ this.$emit('update:visible', false)
22
+ },
23
+ confirmFn() {
24
+ this.$emit('update:visible', false)
25
+ }
26
+ }
27
+ }
28
+ </script>
@@ -0,0 +1,73 @@
1
+ import forEachs from '../../utils/forEachs'
2
+ import list2tree from '../../utils/list2tree'
3
+
4
+ export function siteTree2menus(siteTree) {
5
+ let list_1 = []
6
+
7
+ forEachs(siteTree, (item) => {
8
+ if (item.resType === '1' || item.resType === '2') {
9
+ list_1.push(item)
10
+ }
11
+ })
12
+
13
+ let list_2 = []
14
+ list_1.forEach((item) => {
15
+ let menuObj = {
16
+ menuid: item.menuid,
17
+ pmid: item.pmid,
18
+ sortnum: item.sortnum ? Number(item.sortnum) : item.menuid,
19
+ appNo: item.appNo || undefined,
20
+ title: item.label
21
+ }
22
+ if (/^http(s)?:|\/\//.test(item.pageurl)) {
23
+ menuObj.href = item.pageurl
24
+ } else {
25
+ menuObj.route = item.pageurl
26
+ }
27
+
28
+ if (/\//.test(item.logo)) {
29
+ menuObj.iconUrl = item.logo
30
+ } else {
31
+ menuObj.iconClass = item.logo
32
+ }
33
+
34
+ if (item.resType === '2') {
35
+ menuObj.hide = true
36
+ }
37
+
38
+ list_2.push(menuObj)
39
+ })
40
+
41
+ return list2tree(list_2, 'menuid', 'pmid', 'children', 'sortnum')
42
+ }
43
+
44
+ export function siteTree2RelaNos(siteTree) {
45
+ let relaNos = []
46
+ siteTree.forEach((m) => {
47
+ let oRelaObj = relaNos.find((item) => item.appNo === m.appNo)
48
+ if (oRelaObj) {
49
+ m.treeno && oRelaObj.relaNos.push(m.treeno)
50
+ if (Array.isArray(m.children)) {
51
+ forEachs(m.children, (item) => {
52
+ item.treeno && oRelaObj.relaNos.push(item.treeno)
53
+ })
54
+ }
55
+ } else {
56
+ oRelaObj = {
57
+ appNo: m.appNo,
58
+ label: m.label,
59
+ pageurl: m.pageurl,
60
+ relaNos: []
61
+ }
62
+
63
+ m.treeno && oRelaObj.relaNos.push(m.treeno)
64
+ if (Array.isArray(m.children)) {
65
+ forEachs(m.children, (item) => {
66
+ item.treeno && oRelaObj.relaNos.push(item.treeno)
67
+ })
68
+ }
69
+ relaNos.push(oRelaObj)
70
+ }
71
+ })
72
+ return relaNos
73
+ }
@@ -0,0 +1,67 @@
1
+ import { loadMicroApp } from 'qiankun'
2
+ export default {
3
+ props: {
4
+ name: {
5
+ type: String,
6
+ default: ''
7
+ },
8
+ entry: {
9
+ type: String,
10
+ default: ''
11
+ },
12
+ props: {
13
+ type: Object,
14
+ default: undefined
15
+ },
16
+ noCache: {
17
+ type: Boolean,
18
+ default: false
19
+ }
20
+ },
21
+ data() {
22
+ this.microApp = undefined
23
+ return {}
24
+ },
25
+ computed: {
26
+ appName() {
27
+ return '_qiankun_abstract_' + this.name
28
+ }
29
+ },
30
+ watch: {
31
+ entry() {
32
+ this.mountApp()
33
+ }
34
+ },
35
+ mounted() {
36
+ this.mountApp()
37
+ },
38
+ activated() {
39
+ if (this.noCache && window._pending_update_cache) {
40
+ window._pending_update_cache[this.props.router] = true
41
+ window.postMessage({
42
+ updateCache: true,
43
+ targetName: '*',
44
+ originName: 'main'
45
+ })
46
+ }
47
+ },
48
+ beforeDestroy() {
49
+ window[this.appName]?.unmount({ props: this.props })
50
+ },
51
+ methods: {
52
+ async mountApp() {
53
+ window[this.appName]?.unmount({ props: this.props })
54
+ if (this.entry) {
55
+ window[this.appName] = loadMicroApp({
56
+ name: this.name,
57
+ container: this.$el,
58
+ entry: this.entry,
59
+ props: this.props
60
+ })
61
+ }
62
+ }
63
+ },
64
+ render(h) {
65
+ return h('div')
66
+ }
67
+ }
@@ -0,0 +1,95 @@
1
+ <template>
2
+ <content-loading />
3
+ </template>
4
+
5
+ <script>
6
+ import contentLoading from '../ContentLoading'
7
+ export default {
8
+ components: {
9
+ contentLoading
10
+ },
11
+ data() {
12
+ return {
13
+ loading: true,
14
+ frameUrl: undefined
15
+ }
16
+ },
17
+ activated() {
18
+ let contentWrap = document.querySelector(`[data-url="${this.frameUrl}"]`)
19
+ if (!contentWrap) {
20
+ this.getUrl()
21
+ this.addFrame()
22
+ } else {
23
+ this.showFrame()
24
+ }
25
+ contentWrap = undefined
26
+ },
27
+ deactivated() {
28
+ this.hideFrame()
29
+ },
30
+ methods: {
31
+ destroy() {
32
+ this.removeFrame()
33
+ },
34
+ getUrl() {
35
+ let hrefPrefix = this.$route.meta.hrefPrefix || '/'
36
+ let pathMatch = this.$route.params.pathMatch || ''
37
+ let [path, params] = pathMatch.split('/_PARAMS_/')
38
+ let url = hrefPrefix + path
39
+ params && (url = url + '?' + params)
40
+
41
+ this.frameUrl = url
42
+ },
43
+ addFrame() {
44
+ let frame = document.createElement('iframe')
45
+ frame.setAttribute('src', this.frameUrl)
46
+ frame.style.width = '100%'
47
+ frame.style.height = '100%'
48
+
49
+ frame.addEventListener('load', () => {
50
+ let subDoc = frame.contentDocument
51
+ if (subDoc) {
52
+ let style = subDoc.createElement('style')
53
+ style.textContent =
54
+ '::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-button{width:0;height:0}::-webkit-scrollbar-corner{background-color:transparent}::-webkit-scrollbar-thumb,::-webkit-scrollbar-track{border-color:transparent;border-style:solid}::-webkit-scrollbar-thumb{min-height:28px;background-color:rgba(0,0,0,0.07);border-width:0;border-radius:3px}::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,0.2)}::-webkit-scrollbar-thumb:active{background-color:rgba(0,0,0,0.25)}::-webkit-scrollbar-track:hover{background-color:rgba(0,0,0,0.03)}::-webkit-scrollbar-track:active{background-color:rgba(0,0,0,0.03)}html{overflow:auto}'
55
+ subDoc.querySelector('head').appendChild(style)
56
+ }
57
+
58
+ contentWrap.style.display = ''
59
+ this.loading = false
60
+ })
61
+
62
+ let contentBox = document.createElement('div')
63
+ contentBox.setAttribute('class', 'content-box')
64
+ contentBox.style.overflow = 'hidden'
65
+ contentBox.appendChild(frame)
66
+
67
+ let contentWrap = document.createElement('div')
68
+ contentWrap.setAttribute('class', 'content-wrap')
69
+ contentWrap.setAttribute('data-url', this.frameUrl)
70
+ contentWrap.style.display = 'none'
71
+ contentWrap.appendChild(contentBox)
72
+
73
+ document.querySelector('body').appendChild(contentWrap)
74
+ },
75
+ showFrame() {
76
+ let contentWrap = document.querySelector(`[data-url="${this.frameUrl}"]`)
77
+ if (contentWrap) {
78
+ contentWrap.style.display = ''
79
+ }
80
+ },
81
+ hideFrame() {
82
+ let contentWrap = document.querySelector(`[data-url="${this.frameUrl}"]`)
83
+ if (contentWrap) {
84
+ contentWrap.style.display = 'none'
85
+ }
86
+ },
87
+ removeFrame() {
88
+ let contentWrap = document.querySelector(`[data-url="${this.frameUrl}"]`)
89
+ if (contentWrap) {
90
+ contentWrap.parentNode.removeChild(contentWrap)
91
+ }
92
+ }
93
+ }
94
+ }
95
+ </script>
@@ -0,0 +1,232 @@
1
+ /**
2
+ * author: zhengwei
3
+ * tiem: 2021-8-31
4
+ */
5
+ <template>
6
+ <div class="__common-layout-pageTabs">
7
+ <el-scrollbar>
8
+ <div class="__tabs">
9
+ <div
10
+ v-for="item in openedPageRouters"
11
+ :key="item.fullPath"
12
+ class="__tab-item"
13
+ :class="{
14
+ '__is-active': item.fullPath == $route.fullPath
15
+ }"
16
+ @click="onClick(item)"
17
+ @contextmenu.prevent="showContextMenu($event, item)"
18
+ >
19
+ {{ item.meta.title }}
20
+ <span
21
+ class="el-icon-close"
22
+ :style="openedPageRouters.length <= 1 ? 'width:0;' : ''"
23
+ @click.stop="onClose(item)"
24
+ @contextmenu.prevent.stop
25
+ ></span>
26
+ </div>
27
+ </div>
28
+ </el-scrollbar>
29
+ <div v-show="contextMenuVisible">
30
+ <ul
31
+ :style="{ left: contextMenuLeft + 'px', top: contextMenuTop + 'px' }"
32
+ class="__contextmenu"
33
+ >
34
+ <li>
35
+ <el-button type="text" size="mini" @click="reload()"
36
+ >重新加载</el-button
37
+ >
38
+ </li>
39
+ <li>
40
+ <el-button
41
+ type="text"
42
+ :disabled="false"
43
+ size="mini"
44
+ @click="closeOtherLeft"
45
+ >关闭左边</el-button
46
+ >
47
+ </li>
48
+ <li>
49
+ <el-button
50
+ type="text"
51
+ :disabled="false"
52
+ size="mini"
53
+ @click="closeOtherRight"
54
+ >关闭右边</el-button
55
+ >
56
+ </li>
57
+ <li>
58
+ <el-button type="text" size="mini" @click="closeOther"
59
+ >关闭其他</el-button
60
+ >
61
+ </li>
62
+ </ul>
63
+ </div>
64
+ </div>
65
+ </template>
66
+ <script>
67
+ export default {
68
+ name: 'MoreTab',
69
+ props: {
70
+ keepAliveComponentInstance: {
71
+ type: Object,
72
+ default: () => ({})
73
+ }, //keep-alive控件实例对象
74
+ blankRouteName: {
75
+ type: String,
76
+ default: 'blank'
77
+ } //空白路由的name值
78
+ },
79
+ data() {
80
+ return {
81
+ contextMenuVisible: false, //右键菜单是否显示
82
+ contextMenuLeft: 0, //右键菜单显示位置
83
+ contextMenuTop: 0, //右键菜单显示位置
84
+ contextMenuTargetPageRoute: null, //右键所指向的菜单路由
85
+ openedPageRouters: [] //已打开的路由页面
86
+ }
87
+ },
88
+ watch: {
89
+ //当路由变更时,执行打开页面的方法
90
+ $route: {
91
+ handler(v) {
92
+ this.openPage(v)
93
+ },
94
+ immediate: true
95
+ }
96
+ },
97
+ mounted() {
98
+ //添加点击关闭右键菜单
99
+ window.addEventListener('click', this.closeContextMenu)
100
+ },
101
+ destroyed() {
102
+ window.removeEventListener('click', this.closeContextMenu)
103
+ },
104
+ methods: {
105
+ //打开页面
106
+ openPage(route) {
107
+ if (route.name === this.blankRouteName) {
108
+ return
109
+ }
110
+ let isExist = this.openedPageRouters.some(
111
+ (item) => item.fullPath === route.fullPath
112
+ )
113
+ if (!isExist) {
114
+ let openedPageRoute = this.openedPageRouters.find(
115
+ (item) => item.path === route.path
116
+ ) //判断页面是否支持不同参数多开页面功能,如果不支持且已存在path值一样的页面路由,那就替换它
117
+ if (!route.meta.canMultipleOpen && openedPageRoute != null) {
118
+ this.delRouteCache(openedPageRoute.fullPath)
119
+ this.openedPageRouters.splice(
120
+ this.openedPageRouters.indexOf(openedPageRoute),
121
+ 1,
122
+ route
123
+ )
124
+ } else {
125
+ this.openedPageRouters.push(route)
126
+ }
127
+ }
128
+ }, //点击页面标签卡时
129
+ onClick(route) {
130
+ if (route.fullPath !== this.$route.fullPath) {
131
+ this.$router.push(route.fullPath)
132
+ }
133
+ }, //关闭页面标签时
134
+ onClose(route) {
135
+ let index = this.openedPageRouters.indexOf(route)
136
+ this.delPageRoute(route)
137
+ if (route.fullPath === this.$route.fullPath) {
138
+ //删除页面后,跳转到上一页面
139
+ this.$router.replace(
140
+ this.openedPageRouters[index === 0 ? 0 : index - 1]
141
+ )
142
+ }
143
+ }, //右键显示菜单
144
+ showContextMenu(e, route) {
145
+ this.contextMenuTargetPageRoute = route
146
+ this.contextMenuLeft = e.layerX
147
+ this.contextMenuTop = e.layerY
148
+ this.contextMenuVisible = true
149
+ }, //隐藏右键菜单
150
+ closeContextMenu() {
151
+ this.contextMenuVisible = false
152
+ this.contextMenuTargetPageRoute = null
153
+ }, //重载页面
154
+ reload() {
155
+ this.delRouteCache(this.contextMenuTargetPageRoute.fullPath)
156
+ if (this.contextMenuTargetPageRoute.fullPath === this.$route.fullPath) {
157
+ this.$router.replace({ name: this.blankRouteName }).then(() => {
158
+ this.$router.replace(this.contextMenuTargetPageRoute)
159
+ })
160
+ }
161
+ }, //关闭其他页面
162
+ closeOther() {
163
+ for (let i = 0; i < this.openedPageRouters.length; i++) {
164
+ let r = this.openedPageRouters[i]
165
+ if (r !== this.contextMenuTargetPageRoute) {
166
+ this.delPageRoute(r)
167
+ i--
168
+ }
169
+ }
170
+ if (this.contextMenuTargetPageRoute.fullPath !== this.$route.fullPath) {
171
+ this.$router.replace(this.contextMenuTargetPageRoute)
172
+ }
173
+ }, //根据路径获取索引
174
+ getPageRouteIndex(fullPath) {
175
+ for (let i = 0; i < this.openedPageRouters.length; i++) {
176
+ if (this.openedPageRouters[i].fullPath === fullPath) {
177
+ return i
178
+ }
179
+ }
180
+ }, //关闭左边页面
181
+ closeOtherLeft() {
182
+ let index = this.openedPageRouters.indexOf(
183
+ this.contextMenuTargetPageRoute
184
+ )
185
+ let currentIndex = this.getPageRouteIndex(this.$route.fullPath)
186
+ if (index > currentIndex) {
187
+ this.$router.replace(this.contextMenuTargetPageRoute)
188
+ }
189
+ for (let i = 0; i < index; i++) {
190
+ let r = this.openedPageRouters[i]
191
+ this.delPageRoute(r)
192
+ i--
193
+ index--
194
+ }
195
+ }, //关闭右边页面
196
+ closeOtherRight() {
197
+ let index = this.openedPageRouters.indexOf(
198
+ this.contextMenuTargetPageRoute
199
+ )
200
+ let currentIndex = this.getPageRouteIndex(this.$route.fullPath)
201
+ for (let i = index + 1; i < this.openedPageRouters.length; i++) {
202
+ let r = this.openedPageRouters[i]
203
+ this.delPageRoute(r)
204
+ i--
205
+ }
206
+ if (index < currentIndex) {
207
+ this.$router.replace(this.contextMenuTargetPageRoute)
208
+ }
209
+ }, //删除页面
210
+ delPageRoute(route) {
211
+ let routeIndex = this.openedPageRouters.indexOf(route)
212
+ if (routeIndex >= 0) {
213
+ this.openedPageRouters.splice(routeIndex, 1)
214
+ }
215
+ this.delRouteCache(route.fullPath)
216
+ }, //删除页面缓存
217
+ delRouteCache(key) {
218
+ let cache = this.keepAliveComponentInstance.cache
219
+ let keys = this.keepAliveComponentInstance.keys
220
+ for (let i = 0; i < keys.length; i++) {
221
+ if (keys[i] === key) {
222
+ keys.splice(i, 1)
223
+ if (cache[key] != null) {
224
+ delete cache[key]
225
+ }
226
+ break
227
+ }
228
+ }
229
+ }
230
+ }
231
+ }
232
+ </script>
@@ -0,0 +1,60 @@
1
+ <template>
2
+ <el-menu :router="true">
3
+ <template v-for="omenus in menus">
4
+ <template v-for="item in omenus.menu">
5
+ <el-submenu v-if="item.children" :key="item.title" :index="item.title">
6
+ <template slot="title">
7
+ <i
8
+ v-if="item.iconUrl"
9
+ class="el-icon- icon-url"
10
+ :style="{ backgroundImage: `url(${item.iconUrl})` }"
11
+ ></i>
12
+ <i v-else :class="item.iconClass"></i>
13
+ <span>{{ item.title }}</span>
14
+ </template>
15
+ <template v-for="itemc in item.children">
16
+ <el-menu-item
17
+ :key="itemc.title"
18
+ :index="itemc.title"
19
+ :route="omenus.base + itemc.route"
20
+ >
21
+ <i
22
+ v-if="item.iconUrl"
23
+ class="el-icon- icon-url"
24
+ :style="{ backgroundImage: `url(${itemc.iconUrl})` }"
25
+ ></i>
26
+ <i v-else :class="itemc.iconClass"></i>
27
+ <span slot="title">{{ itemc.title }}</span>
28
+ </el-menu-item>
29
+ </template>
30
+ </el-submenu>
31
+ <el-menu-item
32
+ v-else
33
+ :key="item.title"
34
+ :index="item.title"
35
+ :route="omenus.base + item.route"
36
+ >
37
+ <i
38
+ v-if="item.iconUrl"
39
+ class="el-icon- icon-url"
40
+ :style="{ backgroundImage: `url(${item.iconUrl})` }"
41
+ ></i>
42
+ <i v-else :class="item.iconClass"></i>
43
+ <span slot="title">{{ item.title }}</span>
44
+ </el-menu-item>
45
+ </template>
46
+ </template>
47
+ </el-menu>
48
+ </template>
49
+
50
+ <script>
51
+ export default {
52
+ name: 'NavMenu',
53
+ props: {
54
+ menus: {
55
+ type: Array,
56
+ default: () => []
57
+ }
58
+ }
59
+ }
60
+ </script>
@@ -0,0 +1,13 @@
1
+ <template>
2
+
3
+ </template>
4
+
5
+ <script>
6
+ export default {
7
+ name: "NstcApprove"
8
+ }
9
+ </script>
10
+
11
+ <style scoped>
12
+
13
+ </style>