@lambo-design/shared 1.0.0-beta.36 → 1.0.0-beta.360
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.
- package/config/config.js +20 -3
- package/config/index.js +7 -2
- package/config/locale.js +61 -0
- package/config/themes/atrovirens/atrovirens.css +590 -0
- package/config/themes/atrovirens/atrovirens.css.map +1 -0
- package/config/themes/atrovirens/atrovirens.less +681 -0
- package/config/themes/atrovirens/var.css +29 -0
- package/config/themes/atrovirens/var.css.map +1 -0
- package/config/themes/atrovirens/var.less +689 -0
- package/config/themes/blue/blue.css +590 -0
- package/config/themes/blue/blue.css.map +1 -0
- package/config/themes/blue/blue.less +684 -0
- package/config/themes/blue/var.less +692 -0
- package/config/themes/blue-208/blue-208.css +590 -0
- package/config/themes/blue-208/blue-208.css.map +1 -0
- package/config/themes/blue-208/blue-208.less +685 -0
- package/config/themes/blue-208/var.less +691 -0
- package/config/themes/blue-digital/blue-digital.css +590 -0
- package/config/themes/blue-digital/blue-digital.css.map +1 -0
- package/config/themes/blue-digital/blue-digital.less +684 -0
- package/config/themes/blue-digital/var.less +692 -0
- package/config/themes/blue-leaf/blue-leaf.css +590 -0
- package/config/themes/blue-leaf/blue-leaf.css.map +1 -0
- package/config/themes/blue-leaf/blue-leaf.less +685 -0
- package/config/themes/blue-leaf/var.less +691 -0
- package/config/themes/blue-white/blue-white.css +590 -0
- package/config/themes/blue-white/blue-white.css.map +1 -0
- package/config/themes/blue-white/blue-white.less +685 -0
- package/config/themes/blue-white/var.less +691 -0
- package/config/themes/blue-white-big/blue-white-big.css +590 -0
- package/config/themes/blue-white-big/blue-white-big.css.map +1 -0
- package/config/themes/blue-white-big/blue-white-big.less +685 -0
- package/config/themes/blue-white-big/var.less +691 -0
- package/config/themes/blue-white-tight/blue-white-tight.css +591 -0
- package/config/themes/blue-white-tight/blue-white-tight.css.map +1 -0
- package/config/themes/blue-white-tight/blue-white-tight.less +685 -0
- package/config/themes/blue-white-tight/var.less +693 -0
- package/config/themes/canglan/canglan.css +590 -0
- package/config/themes/canglan/canglan.css.map +1 -0
- package/config/themes/canglan/canglan.less +682 -0
- package/config/themes/canglan/var.less +693 -0
- package/config/themes/cuiwei/cuiwei.css +590 -0
- package/config/themes/cuiwei/cuiwei.css.map +1 -0
- package/config/themes/cuiwei/cuiwei.less +682 -0
- package/config/themes/cuiwei/var.less +691 -0
- package/config/themes/danqing/danqing.css +590 -0
- package/config/themes/danqing/danqing.css.map +1 -0
- package/config/themes/danqing/danqing.less +682 -0
- package/config/themes/danqing/danqing.wxss +576 -0
- package/config/themes/danqing/var.less +696 -0
- package/config/themes/deep/deep.css +590 -0
- package/config/themes/deep/deep.css.map +1 -0
- package/config/themes/deep/deep.less +682 -0
- package/config/themes/deep/var.less +694 -0
- package/config/themes/default/default.css +404 -57
- package/config/themes/default/default.css.map +1 -1
- package/config/themes/default/default.less +381 -16
- package/config/themes/default/var.less +390 -11
- package/config/themes/eap/eap.css +590 -0
- package/config/themes/eap/eap.css.map +1 -0
- package/config/themes/eap/eap.less +685 -0
- package/config/themes/eap/var.less +693 -0
- package/config/themes/gold/gold.css +590 -0
- package/config/themes/gold/gold.css.map +1 -0
- package/config/themes/gold/gold.less +685 -0
- package/config/themes/gold/var.css +0 -0
- package/config/themes/gold/var.css.map +0 -0
- package/config/themes/gold/var.less +386 -5
- package/config/themes/index.js +32 -4
- package/config/themes/lime/lime.css +590 -0
- package/config/themes/lime/lime.css.map +1 -0
- package/config/themes/lime/lime.less +685 -0
- package/config/themes/lime/var.less +385 -5
- package/config/themes/orange/orange.css +354 -7
- package/config/themes/orange/orange.css.map +1 -1
- package/config/themes/orange/orange.less +366 -0
- package/config/themes/orange/var.less +386 -5
- package/config/themes/red/red.css +354 -7
- package/config/themes/red/red.css.map +1 -1
- package/config/themes/red/red.less +366 -0
- package/config/themes/red/var.less +386 -5
- package/config/themes/sichuan/sichuan.css +590 -0
- package/config/themes/sichuan/sichuan.css.map +1 -0
- package/config/themes/sichuan/sichuan.less +685 -0
- package/config/themes/sichuan/var.less +691 -0
- package/config/themes/theme-atrovirens.js +572 -0
- package/config/themes/theme-b208.js +572 -0
- package/config/themes/theme-bd.js +572 -0
- package/config/themes/theme-bl.js +572 -0
- package/config/themes/theme-blue.js +572 -0
- package/config/themes/theme-bw.js +572 -0
- package/config/themes/theme-bwb.js +572 -0
- package/config/themes/theme-bwt.js +573 -0
- package/config/themes/theme-canglan.js +574 -0
- package/config/themes/theme-cuiwei.js +574 -0
- package/config/themes/theme-danqing.js +575 -0
- package/config/themes/theme-deep.js +572 -0
- package/config/themes/theme-default.js +379 -60
- package/config/themes/theme-eap.js +572 -0
- package/config/themes/theme-gold.js +327 -8
- package/config/themes/theme-lime.js +327 -8
- package/config/themes/theme-orange.js +561 -29
- package/config/themes/theme-red.js +564 -33
- package/config/themes/theme-sichuan.js +572 -0
- package/config/themes/theme-white.js +572 -0
- package/config/themes/white/var.less +692 -0
- package/config/themes/white/white.css +590 -0
- package/config/themes/white/white.css.map +1 -0
- package/config/themes/white/white.less +685 -0
- package/directives/module/print.js +1 -0
- package/directives/module/vue-print-nb/README.md +63 -0
- package/directives/module/vue-print-nb/print.js +94 -0
- package/directives/module/vue-print-nb/printarea.js +532 -0
- package/index.js +7 -1
- package/nstyles/common.less +197 -0
- package/nstyles/components/404.less +46 -0
- package/nstyles/components/button.less +34 -0
- package/nstyles/components/date-picker.less +41 -0
- package/nstyles/components/drawer.less +20 -0
- package/nstyles/components/dropdown.less +18 -0
- package/nstyles/components/excel-flow.less +72 -0
- package/nstyles/components/form.less +314 -0
- package/nstyles/components/index.less +23 -0
- package/nstyles/components/layout/collect.less +10 -0
- package/nstyles/components/layout/detail-view.less +107 -0
- package/nstyles/components/layout/full-screen.less +7 -0
- package/nstyles/components/layout/index.less +7 -0
- package/nstyles/components/layout/other-menu.less +142 -0
- package/nstyles/components/layout/page-view.less +101 -0
- package/nstyles/components/layout/sider-trigger.less +41 -0
- package/nstyles/components/layout/tags-nav.less +113 -0
- package/nstyles/components/modal.less +90 -0
- package/nstyles/components/n-button.less +131 -0
- package/nstyles/components/n-image-preview.less +131 -0
- package/nstyles/components/n-model/index.less +19 -0
- package/nstyles/components/n-model/report-index.less +43 -0
- package/nstyles/components/n-panel.less +41 -0
- package/nstyles/components/n-picker.less +37 -0
- package/nstyles/components/n-sign.less +17 -0
- package/nstyles/components/n-tooltip.less +10 -0
- package/nstyles/components/panel.less +31 -0
- package/nstyles/components/select.less +3 -0
- package/nstyles/components/sign.less +27 -0
- package/nstyles/components/table.less +523 -0
- package/nstyles/components/tree.less +166 -0
- package/nstyles/components/upload.less +174 -0
- package/nstyles/index.css +2676 -0
- package/nstyles/index.css.map +1 -0
- package/nstyles/index.less +5 -0
- package/nstyles/reset.less +73 -0
- package/nstyles/third/ag.less +226 -0
- package/nstyles/third/icons/sort-desc.svg +1 -0
- package/nstyles/third/icons/sort-up.svg +1 -0
- package/nstyles/third/icons/sorting.svg +1 -0
- package/nstyles/third/index.less +11 -0
- package/nstyles/third/view-design.less +402 -0
- package/nstyles/variables/base.less +143 -0
- package/nstyles/variables/index.less +4 -0
- package/nstyles/variables/theme/default/button.less +7 -0
- package/nstyles/variables/theme/default/common.less +60 -0
- package/nstyles/variables/theme/default/index.less +7 -0
- package/nstyles/variables/theme/default/layout.less +40 -0
- package/nstyles/variables/theme/default/table.less +37 -0
- package/nstyles/variables/theme/default/tag.less +3 -0
- package/nstyles/variables/theme/default/upload.less +3 -0
- package/nstyles/variables/theme/index.less +13 -0
- package/nstyles/variables/theme/lsv/button.less +7 -0
- package/nstyles/variables/theme/lsv/common.less +39 -0
- package/nstyles/variables/theme/lsv/index.less +5 -0
- package/nstyles/variables/theme/lsv/layout.less +21 -0
- package/nstyles/variables/theme/lsv/table.less +20 -0
- package/nstyles/variables/theme/lsv/tag.less +3 -0
- package/nstyles/variables/theme/small/button.less +7 -0
- package/nstyles/variables/theme/small/common.less +41 -0
- package/nstyles/variables/theme/small/index.less +5 -0
- package/nstyles/variables/theme/small/layout.less +21 -0
- package/nstyles/variables/theme/small/table.less +17 -0
- package/nstyles/variables/theme/small/tag.less +3 -0
- package/package.json +28 -7
- package/plugin/index.js +12 -0
- package/plugin/module/date-format.js +30 -0
- package/plugin/module/loading.js +26 -0
- package/plugin/module/warn-handler.js +11 -0
- package/styles/image/indicator-card-header.png +0 -0
- package/styles/image/inspur.png +0 -0
- package/styles/image/lan_navigator.png +0 -0
- package/styles/image/layout-header-bg-canglan.png +0 -0
- package/styles/image/layout-header-bg-cuiwei.png +0 -0
- package/styles/image/lv_navigator.png +0 -0
- package/utils/ajax/abort-controller.js +70 -0
- package/utils/ajax/cancel-reason.js +25 -0
- package/utils/ajax/cancel-token.js +83 -0
- package/utils/ajax/content-type.js +30 -0
- package/utils/ajax/headers.js +11 -0
- package/utils/ajax/interceptors.js +45 -10
- package/utils/ajax/sseFetchUtil.js +118 -0
- package/utils/ajax/throttle.js +49 -0
- package/utils/assist.js +155 -27
- package/utils/base64.js +126 -0
- package/utils/blob.js +47 -0
- package/utils/context-menu.js +264 -0
- package/utils/crypto/aes.js +23 -0
- package/utils/crypto/index.js +10 -0
- package/utils/crypto/rsa.js +23 -0
- package/utils/date.js +334 -305
- package/utils/dict/built-in-dict.js +20 -0
- package/utils/dict/index.js +191 -0
- package/utils/event.js +72 -0
- package/utils/excel.js +504 -290
- package/utils/file.js +19 -0
- package/utils/form/validate.js +29 -0
- package/utils/getChild.js +87 -0
- package/utils/half-year.js +68 -0
- package/utils/index.js +37 -0
- package/utils/json.js +44 -0
- package/utils/locale/en-US.js +179 -0
- package/utils/locale/zh-CN.js +183 -0
- package/utils/lodop.js +5 -0
- package/utils/menu/generatorDynamicRouter.js +301 -0
- package/utils/menu/index.js +426 -15
- package/utils/mime_type.js +67 -0
- package/utils/modelerUtil.js +4 -1
- package/utils/n/api.js +42 -0
- package/utils/n/date.js +57 -0
- package/utils/n/index.js +10 -0
- package/utils/n/is-type.js +176 -0
- package/utils/n/number.js +144 -0
- package/utils/n/permission-cache.js +11 -0
- package/utils/n/reuqest/axiosN.js +17 -0
- package/utils/n/reuqest/content-type.js +19 -0
- package/utils/n/reuqest/interceptors.js +95 -0
- package/utils/n/reuqest/url-params.js +12 -0
- package/utils/n/storage.js +51 -0
- package/utils/n/token.js +51 -0
- package/utils/n/user-cache.js +11 -0
- package/utils/n/user.js +34 -0
- package/utils/n/uuid.js +16 -0
- package/utils/n-generator-routers.js +208 -0
- package/utils/n-router.js +205 -0
- package/utils/n-theme.js +30 -0
- package/utils/number.js +72 -15
- package/utils/oss.js +57 -0
- package/utils/platform.js +951 -31
- package/utils/quarter.js +58 -0
- package/utils/storage.js +198 -0
- package/utils/style.js +24 -0
- package/utils/theme.js +98 -3
- package/utils/transfer-queue.js +7 -0
- package/utils/transform.js +205 -0
- package/utils/type.js +102 -0
- package/utils/util.js +795 -0
- package/utils/vForm.js +349 -0
- package/utils/validator.js +181 -0
- package/config/themes/gold/default.css +0 -243
- package/config/themes/gold/default.css.map +0 -1
- package/config/themes/gold/default.less +0 -320
- package/config/themes/lime/default.css +0 -243
- package/config/themes/lime/default.css.map +0 -1
- package/config/themes/lime/default.less +0 -320
package/utils/platform.js
CHANGED
|
@@ -1,8 +1,48 @@
|
|
|
1
|
-
import
|
|
1
|
+
import {deepCopy} from './assist';
|
|
2
|
+
import _ from 'lodash';
|
|
3
|
+
import config from "../config/config";
|
|
4
|
+
import systemLogo from '../styles/image/inspur.png';
|
|
5
|
+
import {changeByThemeKey, changeThemeByThemeId} from "./theme";
|
|
6
|
+
import ajax from "./ajax";
|
|
7
|
+
import qs from 'qs'
|
|
8
|
+
import {disableF12, disableRightClick, disableShortcutKeys, enableRightClick, enableShortcutKeys, enableF12,
|
|
9
|
+
disableTextSelection, enableTextSelection} from "./context-menu";
|
|
2
10
|
|
|
3
|
-
export
|
|
11
|
+
export let TOKEN_KEY = "lambo-token"
|
|
4
12
|
|
|
5
|
-
export
|
|
13
|
+
export let getTokenKey = function () {
|
|
14
|
+
if (config.tokenKey) {
|
|
15
|
+
return config.tokenKey
|
|
16
|
+
}
|
|
17
|
+
return "lambo-token"
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export let COOKIE_KEY = "lambo-sso-key"
|
|
21
|
+
|
|
22
|
+
export let getCookieKey = function () {
|
|
23
|
+
if (config.cookieKey) {
|
|
24
|
+
return config.cookieKey
|
|
25
|
+
}
|
|
26
|
+
return "lambo-sso-key"
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export let SSO_TOKEN_KEY = "lambo-sso-token"
|
|
30
|
+
|
|
31
|
+
export let getSsoTokenKey = function () {
|
|
32
|
+
if (config.ssoTokenKey) {
|
|
33
|
+
return config.ssoTokenKey
|
|
34
|
+
}
|
|
35
|
+
return "lambo-sso-token"
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export let PASSWORD_EXPIRED_KEY = "lambo-password-expired-time"
|
|
39
|
+
|
|
40
|
+
export let getPasswordExpiredKey = function () {
|
|
41
|
+
if (config.passwordExpiredKey) {
|
|
42
|
+
return config.passwordExpiredKey
|
|
43
|
+
}
|
|
44
|
+
return "lambo-password-expired-time"
|
|
45
|
+
}
|
|
6
46
|
|
|
7
47
|
export function objEqual(obj1, obj2) {
|
|
8
48
|
const keysArr1 = Object.keys(obj1)
|
|
@@ -13,6 +53,10 @@ export function objEqual(obj1, obj2) {
|
|
|
13
53
|
else return !keysArr1.some(key => obj1[key] !== obj2[key])
|
|
14
54
|
}
|
|
15
55
|
|
|
56
|
+
export function arraysEqual(a, b) {
|
|
57
|
+
return _.isEqual(a,b)
|
|
58
|
+
}
|
|
59
|
+
|
|
16
60
|
/**
|
|
17
61
|
* @param {Array} list 标签列表
|
|
18
62
|
* @param {String} name 当前关闭的标签的name
|
|
@@ -31,47 +75,47 @@ export function getNextRoute(list, route) {
|
|
|
31
75
|
|
|
32
76
|
|
|
33
77
|
export const setToken = (token) => {
|
|
34
|
-
sessionStorage.setItem(
|
|
78
|
+
typeof sessionStorage != 'undefined' && sessionStorage.setItem(getTokenKey(), token)
|
|
35
79
|
}
|
|
36
80
|
|
|
37
81
|
export const getToken = () => {
|
|
38
|
-
const token = sessionStorage.getItem(
|
|
82
|
+
const token = typeof sessionStorage != 'undefined' && sessionStorage.getItem(getTokenKey())
|
|
39
83
|
if (token) return token
|
|
40
84
|
else return false
|
|
41
85
|
}
|
|
42
86
|
|
|
43
87
|
export const setSessionStorage = (key, value) => {
|
|
44
|
-
sessionStorage.setItem(key, JSON.stringify(value))
|
|
88
|
+
typeof sessionStorage != 'undefined' && sessionStorage.setItem(key, JSON.stringify(value))
|
|
45
89
|
}
|
|
46
90
|
|
|
47
91
|
export const getSessionStorage = (key) => {
|
|
48
|
-
const value = sessionStorage.getItem(key)
|
|
92
|
+
const value = typeof sessionStorage != 'undefined' && sessionStorage.getItem(key)
|
|
49
93
|
if (value) return JSON.parse(value)
|
|
50
94
|
else return null
|
|
51
95
|
}
|
|
52
96
|
|
|
53
97
|
export const removeSessionStorage = (key) => {
|
|
54
|
-
return sessionStorage.removeItem(key)
|
|
98
|
+
return typeof sessionStorage != 'undefined' && sessionStorage.removeItem(key)
|
|
55
99
|
}
|
|
56
100
|
|
|
57
101
|
export const clearSessionStorage = () => {
|
|
58
|
-
return sessionStorage.clear()
|
|
102
|
+
return typeof sessionStorage != 'undefined' && sessionStorage.clear()
|
|
59
103
|
}
|
|
60
104
|
|
|
61
105
|
export const setLocalStorage = (key, localstorage) => {
|
|
62
|
-
localStorage.setItem(key, localstorage)
|
|
106
|
+
typeof localStorage != 'undefined' &&localStorage.setItem(key, localstorage)
|
|
63
107
|
}
|
|
64
108
|
|
|
65
109
|
export const getLocalStorage = (key) => {
|
|
66
|
-
return localStorage.getItem(key)
|
|
110
|
+
return typeof localStorage != 'undefined' &&localStorage.getItem(key)
|
|
67
111
|
}
|
|
68
112
|
|
|
69
113
|
export const removeLocalStorage = (key) => {
|
|
70
|
-
return localStorage.removeItem(key)
|
|
114
|
+
return typeof localStorage != 'undefined' &&localStorage.removeItem(key)
|
|
71
115
|
}
|
|
72
116
|
|
|
73
117
|
export const clearLocalStorage = () => {
|
|
74
|
-
return localStorage.clear()
|
|
118
|
+
return typeof localStorage != 'undefined' &&localStorage.clear()
|
|
75
119
|
}
|
|
76
120
|
|
|
77
121
|
export const hasChild = (item) => {
|
|
@@ -159,6 +203,14 @@ export const setTagNavListInLocalstorage = (list , key) => {
|
|
|
159
203
|
}
|
|
160
204
|
localStorage[key] = JSON.stringify(list)
|
|
161
205
|
}
|
|
206
|
+
|
|
207
|
+
export const setTagNavListInSessionstorage = (list , key) => {
|
|
208
|
+
if (!key) {
|
|
209
|
+
key = 'LD-tagNavList';
|
|
210
|
+
}
|
|
211
|
+
sessionStorage[key] = JSON.stringify(list)
|
|
212
|
+
}
|
|
213
|
+
|
|
162
214
|
/**
|
|
163
215
|
* @returns {Array} 其中的每个元素只包含路由原信息中的name, path, meta三项
|
|
164
216
|
*/
|
|
@@ -170,6 +222,14 @@ export const getTagNavListFromLocalstorage = (key) => {
|
|
|
170
222
|
return list ? JSON.parse(list) : []
|
|
171
223
|
}
|
|
172
224
|
|
|
225
|
+
export const getTagNavListFromLocalstorage = (key) => {
|
|
226
|
+
if (!key) {
|
|
227
|
+
key = 'LD-tagNavList';
|
|
228
|
+
}
|
|
229
|
+
const list = sessionStorage[key]
|
|
230
|
+
return list ? JSON.parse(list) : []
|
|
231
|
+
}
|
|
232
|
+
|
|
173
233
|
/**
|
|
174
234
|
* @param {Array} routers 路由列表数组
|
|
175
235
|
* @description 用于找到路由列表中name为home的对象
|
|
@@ -315,6 +375,12 @@ export const getTableDataFromArray = (array) => {
|
|
|
315
375
|
}
|
|
316
376
|
}
|
|
317
377
|
|
|
378
|
+
/**
|
|
379
|
+
* 寻找上级节点
|
|
380
|
+
* @param ele
|
|
381
|
+
* @param tag
|
|
382
|
+
* @returns {*}
|
|
383
|
+
*/
|
|
318
384
|
export const findNodeUpper = (ele, tag) => {
|
|
319
385
|
if (ele.parentNode) {
|
|
320
386
|
if (ele.parentNode.tagName === tag.toUpperCase()) {
|
|
@@ -325,6 +391,12 @@ export const findNodeUpper = (ele, tag) => {
|
|
|
325
391
|
}
|
|
326
392
|
}
|
|
327
393
|
|
|
394
|
+
/**
|
|
395
|
+
* 根据class寻找上级节点
|
|
396
|
+
* @param ele
|
|
397
|
+
* @param classes
|
|
398
|
+
* @returns {*}
|
|
399
|
+
*/
|
|
328
400
|
export const findNodeUpperByClasses = (ele, classes) => {
|
|
329
401
|
let parentNode = ele.parentNode
|
|
330
402
|
if (parentNode) {
|
|
@@ -337,6 +409,12 @@ export const findNodeUpperByClasses = (ele, classes) => {
|
|
|
337
409
|
}
|
|
338
410
|
}
|
|
339
411
|
|
|
412
|
+
/**
|
|
413
|
+
* 根据ele寻找下级节点
|
|
414
|
+
* @param ele
|
|
415
|
+
* @param tag
|
|
416
|
+
* @returns {*}
|
|
417
|
+
*/
|
|
340
418
|
export const findNodeDownward = (ele, tag) => {
|
|
341
419
|
const tagName = tag.toUpperCase()
|
|
342
420
|
if (ele.childNodes.length) {
|
|
@@ -350,6 +428,12 @@ export const findNodeDownward = (ele, tag) => {
|
|
|
350
428
|
}
|
|
351
429
|
}
|
|
352
430
|
|
|
431
|
+
/**
|
|
432
|
+
* @description 判断要查询的数组是否至少有一个元素包含在目标数组中
|
|
433
|
+
* @param access 需要查询的数组
|
|
434
|
+
* @param canViewAccess 目标数组
|
|
435
|
+
* @returns {*}
|
|
436
|
+
*/
|
|
353
437
|
export const showByAccess = (access, canViewAccess) => {
|
|
354
438
|
return hasOneOf(canViewAccess, access)
|
|
355
439
|
}
|
|
@@ -364,7 +448,9 @@ export const routeEqual = (route1, route2) => {
|
|
|
364
448
|
const params2 = route2.params || {}
|
|
365
449
|
const query1 = route1.query || {}
|
|
366
450
|
const query2 = route2.query || {}
|
|
367
|
-
|
|
451
|
+
const uri1 = route1.uri || {}
|
|
452
|
+
const uri2 = route2.uri || {}
|
|
453
|
+
return (route1.name === route2.name) && objEqual(params1, params2) && objEqual(query1, query2) && objEqual(uri1, uri2)
|
|
368
454
|
}
|
|
369
455
|
|
|
370
456
|
/**
|
|
@@ -379,16 +465,23 @@ export const routeHasExist = (tagNavList, routeItem) => {
|
|
|
379
465
|
return res
|
|
380
466
|
}
|
|
381
467
|
|
|
382
|
-
|
|
468
|
+
/**
|
|
469
|
+
* scrollTop animation
|
|
470
|
+
* @param el
|
|
471
|
+
* @param from
|
|
472
|
+
* @param to
|
|
473
|
+
* @param duration
|
|
474
|
+
* @param endCallback
|
|
475
|
+
*/
|
|
383
476
|
export const scrollTop = (el, from = 0, to, duration = 500, endCallback) => {
|
|
384
477
|
if (!window.requestAnimationFrame) {
|
|
385
478
|
window.requestAnimationFrame = (
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
479
|
+
window.webkitRequestAnimationFrame ||
|
|
480
|
+
window.mozRequestAnimationFrame ||
|
|
481
|
+
window.msRequestAnimationFrame ||
|
|
482
|
+
function (callback) {
|
|
483
|
+
return window.setTimeout(callback, 1000 / 60)
|
|
484
|
+
}
|
|
392
485
|
)
|
|
393
486
|
}
|
|
394
487
|
const difference = Math.abs(from - to)
|
|
@@ -428,8 +521,16 @@ export const setTitle = (configTitle,routeItem, vm) => {
|
|
|
428
521
|
window.document.title = resTitle
|
|
429
522
|
}
|
|
430
523
|
|
|
431
|
-
|
|
432
|
-
|
|
524
|
+
/**
|
|
525
|
+
* 获取浏览器地址url中的参数
|
|
526
|
+
* @param url
|
|
527
|
+
* @returns {Object}
|
|
528
|
+
*/
|
|
529
|
+
export const getUrlParams = (url) => {
|
|
530
|
+
if (!url){
|
|
531
|
+
url = location.search;
|
|
532
|
+
}
|
|
533
|
+
//const url = location.search; //获取url中"?"符后的字串
|
|
433
534
|
const theRequest = new Object();
|
|
434
535
|
if (url.indexOf("?") != -1) {
|
|
435
536
|
const str = url.substr(1);
|
|
@@ -468,6 +569,80 @@ export const getChangeTableDatas = (oldData, newData) => {
|
|
|
468
569
|
return list
|
|
469
570
|
}
|
|
470
571
|
|
|
572
|
+
/**
|
|
573
|
+
* 合并数组并去重
|
|
574
|
+
* @param oldRow
|
|
575
|
+
* @param newRow
|
|
576
|
+
* @param key
|
|
577
|
+
* @returns {*[]}
|
|
578
|
+
*/
|
|
579
|
+
export const removeDup = (oldRow,newRow,key) => {
|
|
580
|
+
let resultMap = {};
|
|
581
|
+
for(let o of oldRow){
|
|
582
|
+
resultMap[o[key]] = o;
|
|
583
|
+
}
|
|
584
|
+
for (let n of newRow) {
|
|
585
|
+
resultMap[n[key]] = n;
|
|
586
|
+
}
|
|
587
|
+
let result = []
|
|
588
|
+
for (let row in resultMap) {
|
|
589
|
+
result.push(resultMap[row])
|
|
590
|
+
}
|
|
591
|
+
return result;
|
|
592
|
+
}
|
|
593
|
+
/**
|
|
594
|
+
* 获取数组修改的数据
|
|
595
|
+
* @param oldRow
|
|
596
|
+
* @param newRow
|
|
597
|
+
* @param key
|
|
598
|
+
* @returns {{delList: *[], addList: *[]}}
|
|
599
|
+
*/
|
|
600
|
+
export const getChangeData = (oldRow,newRow,key) =>{
|
|
601
|
+
let oldMap = {};
|
|
602
|
+
for(let o of oldRow){
|
|
603
|
+
if (key){
|
|
604
|
+
oldMap[o[key]] = o;
|
|
605
|
+
} else {
|
|
606
|
+
oldMap[o] = o;
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
let newMap = {}
|
|
610
|
+
for(let n of newRow){
|
|
611
|
+
if (key){
|
|
612
|
+
newMap[n[key]] = n;
|
|
613
|
+
} else {
|
|
614
|
+
newMap[n] = n;
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
let addList = []
|
|
618
|
+
for (let n of newRow) {
|
|
619
|
+
if (key){
|
|
620
|
+
if (!oldMap[n[key]]) {
|
|
621
|
+
addList.push(n);
|
|
622
|
+
}
|
|
623
|
+
} else {
|
|
624
|
+
if (!oldMap[n]) {
|
|
625
|
+
addList.push(n);
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
let delList = []
|
|
630
|
+
for (let o of oldRow) {
|
|
631
|
+
if (key){
|
|
632
|
+
if (!newMap[o[key]]) {
|
|
633
|
+
delList.push(o);
|
|
634
|
+
}
|
|
635
|
+
} else {
|
|
636
|
+
if (!newMap[o]) {
|
|
637
|
+
delList.push(o);
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
return {
|
|
642
|
+
addList,delList
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
|
|
471
646
|
/**
|
|
472
647
|
* @param {Array} arr1
|
|
473
648
|
* @param {Array} arr2
|
|
@@ -502,6 +677,11 @@ const hasOneOf = (targetarr, arr) => {
|
|
|
502
677
|
return targetarr.some(_ => arr.indexOf(_) > -1)
|
|
503
678
|
}
|
|
504
679
|
|
|
680
|
+
/**
|
|
681
|
+
* foreach
|
|
682
|
+
* @param arr
|
|
683
|
+
* @param fn 回调函数,参数接收arr的元素,索引,arr本身
|
|
684
|
+
*/
|
|
505
685
|
const forEach = (arr, fn) => {
|
|
506
686
|
if (!arr.length || !fn) return
|
|
507
687
|
let i = -1
|
|
@@ -525,9 +705,17 @@ export function oneOf (value, validList) {
|
|
|
525
705
|
return false
|
|
526
706
|
}
|
|
527
707
|
|
|
708
|
+
/**
|
|
709
|
+
* recursionKeyFindItem
|
|
710
|
+
* @param arr
|
|
711
|
+
* @param filterKey
|
|
712
|
+
* @param filterValue
|
|
713
|
+
* @param recursionKey
|
|
714
|
+
* @returns {*|null}
|
|
715
|
+
*/
|
|
528
716
|
export const recursionKeyFindItem = (arr, filterKey, filterValue, recursionKey) => {
|
|
529
717
|
for (const item of arr) {
|
|
530
|
-
if (item[filterKey] && item[filterKey] == filterValue) {
|
|
718
|
+
if (item[filterKey] && item[filterKey] == filterValue && item['type'] == 2) {
|
|
531
719
|
return item;
|
|
532
720
|
}
|
|
533
721
|
let result = null;
|
|
@@ -541,18 +729,394 @@ export const recursionKeyFindItem = (arr, filterKey, filterValue, recursionKey)
|
|
|
541
729
|
return null;
|
|
542
730
|
};
|
|
543
731
|
|
|
732
|
+
/**
|
|
733
|
+
* filterMenuName
|
|
734
|
+
* @param menuList
|
|
735
|
+
* @param name
|
|
736
|
+
* @returns {*|null}
|
|
737
|
+
*/
|
|
544
738
|
export const filterMenuName = (menuList, name) => {
|
|
545
739
|
return recursionKeyFindItem(menuList, 'name', name, 'children')
|
|
546
740
|
};
|
|
547
741
|
|
|
742
|
+
/**
|
|
743
|
+
* filterMenuUri
|
|
744
|
+
* @param menuList
|
|
745
|
+
* @param name
|
|
746
|
+
* @returns {*|null}
|
|
747
|
+
*/
|
|
548
748
|
export const filterMenuUri = (menuList, name) => {
|
|
549
749
|
return recursionKeyFindItem(menuList, 'uri', name, 'children')
|
|
550
750
|
};
|
|
551
751
|
|
|
752
|
+
/**
|
|
753
|
+
* tagExists
|
|
754
|
+
* @param taglist
|
|
755
|
+
* @param name
|
|
756
|
+
* @returns {boolean}
|
|
757
|
+
*/
|
|
552
758
|
export const tagExists = (taglist, name) => {
|
|
553
759
|
return taglist && taglist.filter(item => item.name === name).length > 0;
|
|
554
760
|
};
|
|
555
761
|
|
|
762
|
+
/**
|
|
763
|
+
* 判断菜单是否为新窗口打开
|
|
764
|
+
* @param menu
|
|
765
|
+
*/
|
|
766
|
+
export const isOpenBlank = (menu) => {
|
|
767
|
+
let extendProps = {}
|
|
768
|
+
if (menu && menu.meta && menu.meta.data && menu.meta.data.extension) {
|
|
769
|
+
extendProps = JSON.parse(menu.meta.data.extension)
|
|
770
|
+
}
|
|
771
|
+
if (menu && menu.extension) {
|
|
772
|
+
extendProps = JSON.parse(menu.extension)
|
|
773
|
+
}
|
|
774
|
+
if (extendProps && extendProps.target_type && extendProps.target_type == 'blank') {
|
|
775
|
+
return true;
|
|
776
|
+
}
|
|
777
|
+
if (extendProps && extendProps.targetType && extendProps.targetType == 'blank') {
|
|
778
|
+
return true;
|
|
779
|
+
}
|
|
780
|
+
return false;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
/**
|
|
784
|
+
* 判断应用是否为移动应用
|
|
785
|
+
* @param app
|
|
786
|
+
*/
|
|
787
|
+
export const isMobileApp = (app) => {
|
|
788
|
+
try{
|
|
789
|
+
let extendProps = {};
|
|
790
|
+
if (app.extendProps) {
|
|
791
|
+
if (typeof app.extendProps == 'string') {
|
|
792
|
+
extendProps = JSON.parse(app.extendProps);
|
|
793
|
+
} else {
|
|
794
|
+
extendProps = app.extendProps;
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
if (app.setting) {
|
|
798
|
+
if (typeof app.setting == 'string') {
|
|
799
|
+
extendProps = JSON.parse(app.setting);
|
|
800
|
+
} else {
|
|
801
|
+
extendProps = app.setting;
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
if (extendProps && extendProps.is_mobile_app && extendProps.is_mobile_app == '1') {
|
|
805
|
+
return true;
|
|
806
|
+
}
|
|
807
|
+
}catch (e) {
|
|
808
|
+
console.error(e)
|
|
809
|
+
}
|
|
810
|
+
return false;
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
/**
|
|
814
|
+
* 获取pc应用列表
|
|
815
|
+
* @param appList
|
|
816
|
+
* @returns {*[]}
|
|
817
|
+
*/
|
|
818
|
+
export const getPCAppList = (appList,filterCenter = false) => {
|
|
819
|
+
let finalList = []
|
|
820
|
+
if(appList) {
|
|
821
|
+
for (let app of appList) {
|
|
822
|
+
if ((!isMobileApp(app) && filterCenter && isCenterApp(app))
|
|
823
|
+
|| (!isMobileApp(app) && !filterCenter)) {
|
|
824
|
+
finalList.push(app);
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
return finalList;
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
/**
|
|
832
|
+
* 获取移动应用列表
|
|
833
|
+
* @param appList
|
|
834
|
+
* @returns {*[]}
|
|
835
|
+
*/
|
|
836
|
+
export const getMobileAppList = (appList,filterCenter= false) => {
|
|
837
|
+
let finalList = []
|
|
838
|
+
if(appList) {
|
|
839
|
+
for (let app of appList) {
|
|
840
|
+
if ((isMobileApp(app) && filterCenter && isCenterApp(app))
|
|
841
|
+
|| (isMobileApp(app) && !filterCenter)) {
|
|
842
|
+
finalList.push(app);
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
return finalList;
|
|
847
|
+
}
|
|
848
|
+
/**
|
|
849
|
+
* 判断应用是否门户应用
|
|
850
|
+
* @param menu
|
|
851
|
+
*/
|
|
852
|
+
export const isCenterApp = (app) => {
|
|
853
|
+
try{
|
|
854
|
+
let extendProps = {};
|
|
855
|
+
if (app.extendProps) {
|
|
856
|
+
if (typeof app.extendProps == 'string') {
|
|
857
|
+
extendProps = JSON.parse(app.extendProps);
|
|
858
|
+
} else {
|
|
859
|
+
extendProps = app.extendProps;
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
if (app.setting) {
|
|
863
|
+
if (typeof app.setting == 'string') {
|
|
864
|
+
extendProps = JSON.parse(app.setting);
|
|
865
|
+
} else {
|
|
866
|
+
extendProps = app.setting;
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
if (extendProps && extendProps.is_center_app && extendProps.is_center_app == '1') {
|
|
870
|
+
return true;
|
|
871
|
+
}
|
|
872
|
+
}catch (e) {
|
|
873
|
+
console.error(e);
|
|
874
|
+
}
|
|
875
|
+
return false;
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
/**
|
|
879
|
+
* 获取一级菜单作为顶级导航
|
|
880
|
+
* @param permissionList
|
|
881
|
+
* @param appType
|
|
882
|
+
* @returns {*[]}
|
|
883
|
+
*/
|
|
884
|
+
export const buildNavListByMenu = (permissionList,appInfo,appType,defaultHideName = '') => {
|
|
885
|
+
let navList = []
|
|
886
|
+
if (permissionList && appInfo && appInfo.appId) {
|
|
887
|
+
let hideNames = [];
|
|
888
|
+
if (defaultHideName && typeof defaultHideName === 'string') {
|
|
889
|
+
hideNames = defaultHideName.split(',').map(name => name.trim());
|
|
890
|
+
}
|
|
891
|
+
let permissions = permissionList.filter(item => item.hasOwnProperty('pid')
|
|
892
|
+
&& item.pid == '0' && item.appId == appInfo.appId && !hideNames.includes(item.name))
|
|
893
|
+
for (let per of permissions) {
|
|
894
|
+
if (appType && appType == 'sc') {
|
|
895
|
+
let nav = {
|
|
896
|
+
"data" : deepCopy(per),
|
|
897
|
+
"appInfo" : deepCopy(appInfo),
|
|
898
|
+
"orderNo": per.orders,
|
|
899
|
+
"application": {
|
|
900
|
+
"extendProps": per.extension ? JSON.parse(per.extension) : "",
|
|
901
|
+
"appId": per.permissionId,
|
|
902
|
+
"appBizCode": per.permissionValue,
|
|
903
|
+
"appName": per.title,
|
|
904
|
+
"appDesc": per.description,
|
|
905
|
+
"appUrl": appInfo.basepath,
|
|
906
|
+
"icon": per.icon,
|
|
907
|
+
"appStatus": 1,
|
|
908
|
+
"manageUnitId": "",
|
|
909
|
+
"protocolType": null,
|
|
910
|
+
"grantTypes": null,
|
|
911
|
+
"logoutUrl": null,
|
|
912
|
+
"redirectUrls": null,
|
|
913
|
+
"codeExpiresIn": null,
|
|
914
|
+
"idTokenExpiresIn": null,
|
|
915
|
+
"accessTokenExpiresIn": null,
|
|
916
|
+
"clientId": "",
|
|
917
|
+
"clientSecret": "",
|
|
918
|
+
"isEnableSso": false,
|
|
919
|
+
"isShare": false,
|
|
920
|
+
"referAppId": null,
|
|
921
|
+
"externalId": null,
|
|
922
|
+
"callerAppId": null,
|
|
923
|
+
"orderNo": 1,
|
|
924
|
+
"parentId": null,
|
|
925
|
+
"appType": null,
|
|
926
|
+
"relativeName": null,
|
|
927
|
+
"shortName": null,
|
|
928
|
+
"authType": "1",
|
|
929
|
+
"isLower": null
|
|
930
|
+
},
|
|
931
|
+
"basepath": appInfo.basepath,
|
|
932
|
+
"appId": per.permissionId,
|
|
933
|
+
"icon": per.icon,
|
|
934
|
+
"name": per.name,
|
|
935
|
+
"extendProps": per.extension ? JSON.parse(per.extension) : "",
|
|
936
|
+
"title": per.title,
|
|
937
|
+
"type": "00",
|
|
938
|
+
"status": 1
|
|
939
|
+
}
|
|
940
|
+
navList.push(nav)
|
|
941
|
+
} else {
|
|
942
|
+
let nav = {
|
|
943
|
+
"data" : deepCopy(per),
|
|
944
|
+
"appInfo" : deepCopy(appInfo),
|
|
945
|
+
"id": per.id,
|
|
946
|
+
"appId": per.permissionId,
|
|
947
|
+
"systemId": per.systemId,
|
|
948
|
+
"icon": per.icon,
|
|
949
|
+
"banner": null,
|
|
950
|
+
"theme": null,
|
|
951
|
+
"basepath": appInfo.basepath,
|
|
952
|
+
"status": 1,
|
|
953
|
+
"name": per.name,
|
|
954
|
+
"title": per.title,
|
|
955
|
+
"type": "00",
|
|
956
|
+
"setting": "",
|
|
957
|
+
"description": per.description,
|
|
958
|
+
"orders": per.orders,
|
|
959
|
+
"createTime": 1710772466000,
|
|
960
|
+
"updateTime": 1710772466000
|
|
961
|
+
}
|
|
962
|
+
navList.push(nav)
|
|
963
|
+
}
|
|
964
|
+
}
|
|
965
|
+
}
|
|
966
|
+
return navList;
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
/**
|
|
970
|
+
* 判断是否为子菜单
|
|
971
|
+
* @param permissionList
|
|
972
|
+
* @param pid
|
|
973
|
+
* @param per
|
|
974
|
+
* @returns {boolean|boolean|*}
|
|
975
|
+
*/
|
|
976
|
+
export const isChildPermission = (permissionList, pid, per) => {
|
|
977
|
+
if (permissionList && pid && per && per.pid) {
|
|
978
|
+
let res = permissionList.find(item => item.hasOwnProperty('permissionId') && item.permissionId == per.pid)
|
|
979
|
+
if (res && res.permissionId && res.permissionId == pid) {
|
|
980
|
+
return true;
|
|
981
|
+
} else {
|
|
982
|
+
return isChildPermission(permissionList, pid, res)
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
return false;
|
|
986
|
+
}
|
|
987
|
+
/**
|
|
988
|
+
* 获取所有子菜单 - 优化版
|
|
989
|
+
* 使用 Map 缓存 + 迭代,复杂度从 O(n²×depth) 降到 O(n×depth)
|
|
990
|
+
* @param {Array} permissionList 权限列表
|
|
991
|
+
* @param {string|number} pid 父级ID
|
|
992
|
+
* @param {Object} appInfo 应用信息
|
|
993
|
+
* @returns {Array} 所有子节点
|
|
994
|
+
*/
|
|
995
|
+
export const getChildPermissions = (permissionList, pid, appInfo) => {
|
|
996
|
+
if (!permissionList || !pid) return [];
|
|
997
|
+
|
|
998
|
+
// 建立 id -> permission 的 Map,O(n)
|
|
999
|
+
const permissionMap = new Map();
|
|
1000
|
+
for (const permission of permissionList) {
|
|
1001
|
+
if (permission && permission.hasOwnProperty('permissionId')) {
|
|
1002
|
+
permissionMap.set(permission.permissionId, permission);
|
|
1003
|
+
}
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1006
|
+
// 使用迭代检查是否为子节点,避免递归栈溢出
|
|
1007
|
+
const isChildOf = (permission) => {
|
|
1008
|
+
let current = permission;
|
|
1009
|
+
const visited = new Set(); // 防止循环引用
|
|
1010
|
+
|
|
1011
|
+
while (current && current.pid) {
|
|
1012
|
+
// 循环引用检测
|
|
1013
|
+
if (visited.has(current.permissionId)) return false;
|
|
1014
|
+
visited.add(current.permissionId);
|
|
1015
|
+
|
|
1016
|
+
if (current.pid == pid) return true;
|
|
1017
|
+
current = permissionMap.get(current.pid); // O(1) 查找
|
|
1018
|
+
}
|
|
1019
|
+
return false;
|
|
1020
|
+
};
|
|
1021
|
+
|
|
1022
|
+
const res = [];
|
|
1023
|
+
for (const permission of permissionList) {
|
|
1024
|
+
if (isChildOf(permission)) {
|
|
1025
|
+
const per2 = deepCopy(permission);
|
|
1026
|
+
per2.appId = pid;
|
|
1027
|
+
if (per2.pid == pid) {
|
|
1028
|
+
per2.pid = "0";
|
|
1029
|
+
}
|
|
1030
|
+
per2.appInfo = deepCopy(appInfo);
|
|
1031
|
+
res.push(per2);
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
return res;
|
|
1036
|
+
}
|
|
1037
|
+
/**
|
|
1038
|
+
* 恢复权限的原始信息
|
|
1039
|
+
* @param permission
|
|
1040
|
+
*/
|
|
1041
|
+
export const getOriginalPermission = (permission) => {
|
|
1042
|
+
if (permission && permission.meta && permission.meta.data && permission.meta.data.appInfo) {
|
|
1043
|
+
let per2 = deepCopy(permission);
|
|
1044
|
+
if (per2.hasOwnProperty('pid') && per2.pid == '0') {
|
|
1045
|
+
per2.pid = per2.meta.data.appId;
|
|
1046
|
+
per2.meta.data.pid = per2.meta.data.appId;
|
|
1047
|
+
}
|
|
1048
|
+
per2.meta.appId = permission.meta.data.appInfo.appId;
|
|
1049
|
+
per2.meta.data.appId = permission.meta.data.appInfo.appId;
|
|
1050
|
+
return per2;
|
|
1051
|
+
}
|
|
1052
|
+
return permission
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
/**
|
|
1056
|
+
* 单应用时修改源权限信息
|
|
1057
|
+
* @param permissionList
|
|
1058
|
+
* @param menu
|
|
1059
|
+
* @param appInfo
|
|
1060
|
+
* @returns {*}
|
|
1061
|
+
*/
|
|
1062
|
+
export const buildSinglePermission = (permissionList, menu) => {
|
|
1063
|
+
let permission = permissionList.find(item => item.permissionId == menu.permissionId && item.appId == menu.appId)
|
|
1064
|
+
let rootPermission = getRootPermission(permissionList, permission)
|
|
1065
|
+
if (rootPermission && rootPermission.permissionId) {
|
|
1066
|
+
menu.appInfo = {
|
|
1067
|
+
appId: menu.appId
|
|
1068
|
+
}
|
|
1069
|
+
menu.appId = rootPermission.permissionId;
|
|
1070
|
+
}
|
|
1071
|
+
return menu;
|
|
1072
|
+
}
|
|
1073
|
+
/**
|
|
1074
|
+
* 获取菜单根节点
|
|
1075
|
+
* @param permissionList
|
|
1076
|
+
* @param permission
|
|
1077
|
+
* @returns {*|{pid}|{}}
|
|
1078
|
+
*/
|
|
1079
|
+
export const getRootPermission = (permissionList, permission) => {
|
|
1080
|
+
if (!permissionList || !permission) return permission;
|
|
1081
|
+
|
|
1082
|
+
// 构建 Map,O(n)
|
|
1083
|
+
const permissionMap = new Map();
|
|
1084
|
+
for (const item of permissionList) {
|
|
1085
|
+
if (item && item.permissionId != null) {
|
|
1086
|
+
const key = `${item.permissionId}|${item.appId || ''}`;
|
|
1087
|
+
permissionMap.set(key, item);
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
// 迭代向上查找根节点
|
|
1092
|
+
let current = permission;
|
|
1093
|
+
const visited = new Set();
|
|
1094
|
+
|
|
1095
|
+
while (current) {
|
|
1096
|
+
if (!current.pid || current.pid === '0') {
|
|
1097
|
+
return current;
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
// 循环引用检测
|
|
1101
|
+
const key = `${current.permissionId}|${current.appId || ''}`;
|
|
1102
|
+
if (visited.has(key)) return permission;
|
|
1103
|
+
visited.add(key);
|
|
1104
|
+
|
|
1105
|
+
// O(1) 查找父节点
|
|
1106
|
+
const parentKey = `${current.pid}|${current.appId || ''}`;
|
|
1107
|
+
current = permissionMap.get(parentKey);
|
|
1108
|
+
|
|
1109
|
+
if (!current) return permission;
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
return permission;
|
|
1113
|
+
}
|
|
1114
|
+
/**
|
|
1115
|
+
* getPreviousTagIndex
|
|
1116
|
+
* @param tagList
|
|
1117
|
+
* @param name
|
|
1118
|
+
* @returns {number}
|
|
1119
|
+
*/
|
|
556
1120
|
export const getPreviousTagIndex = (tagList, name) => {
|
|
557
1121
|
let count = 0;
|
|
558
1122
|
if (tagList && name) {
|
|
@@ -570,6 +1134,12 @@ export const getPreviousTagIndex = (tagList, name) => {
|
|
|
570
1134
|
return count;
|
|
571
1135
|
};
|
|
572
1136
|
|
|
1137
|
+
/**
|
|
1138
|
+
* getDelTagIndex
|
|
1139
|
+
* @param tagList
|
|
1140
|
+
* @param name
|
|
1141
|
+
* @returns {number}
|
|
1142
|
+
*/
|
|
573
1143
|
export const getDelTagIndex = (tagList, name) => {
|
|
574
1144
|
let count = 1;
|
|
575
1145
|
if (tagList && name) {
|
|
@@ -583,13 +1153,363 @@ export const getDelTagIndex = (tagList, name) => {
|
|
|
583
1153
|
return count;
|
|
584
1154
|
}
|
|
585
1155
|
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
1156
|
+
/**
|
|
1157
|
+
* turnToPage
|
|
1158
|
+
* @param vm
|
|
1159
|
+
* @param name
|
|
1160
|
+
* @param url
|
|
1161
|
+
* @param forceLocation
|
|
1162
|
+
* @param queryObj
|
|
1163
|
+
*/
|
|
1164
|
+
export const turnToPage = (vm, name ,url, forceLocation = false, queryObj = {}) =>{
|
|
1165
|
+
let query = qs.stringify(queryObj)
|
|
1166
|
+
if(query){
|
|
1167
|
+
url = url + '?' + query;
|
|
1168
|
+
}
|
|
1169
|
+
if (window.top && window.top.location.href !== window.location.href) {
|
|
1170
|
+
typeof sessionStorage != 'undefined' && sessionStorage.removeItem('activeName')
|
|
1171
|
+
window.top.location.href = url;
|
|
1172
|
+
} else if (forceLocation){
|
|
1173
|
+
typeof sessionStorage != 'undefined' && sessionStorage.removeItem('activeName')
|
|
1174
|
+
if (window.top){
|
|
1175
|
+
window.top.location.href = url;
|
|
1176
|
+
} else {
|
|
1177
|
+
window.location.href = url;
|
|
1178
|
+
}
|
|
1179
|
+
} else if (vm && vm.$router){
|
|
591
1180
|
vm.$router.push({
|
|
592
|
-
name: name
|
|
1181
|
+
name: name,
|
|
1182
|
+
...queryObj
|
|
593
1183
|
})
|
|
1184
|
+
} else {
|
|
1185
|
+
window.location.href = url;
|
|
1186
|
+
}
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
|
|
1190
|
+
/**
|
|
1191
|
+
* 获取上级节点的方法
|
|
1192
|
+
* @param vm
|
|
1193
|
+
* @param methodName
|
|
1194
|
+
* @returns {*}
|
|
1195
|
+
*/
|
|
1196
|
+
export const getParentMethod = (vm,methodName) => {
|
|
1197
|
+
if (vm.$parent) {
|
|
1198
|
+
if (vm.$parent[methodName]) {
|
|
1199
|
+
return vm.$parent[methodName];
|
|
1200
|
+
} else {
|
|
1201
|
+
return getParentMethod(vm.$parent,methodName)
|
|
1202
|
+
}
|
|
1203
|
+
}
|
|
1204
|
+
return undefined;
|
|
1205
|
+
}
|
|
1206
|
+
|
|
1207
|
+
/**
|
|
1208
|
+
* 执行全屏操作
|
|
1209
|
+
* @param vm
|
|
1210
|
+
*/
|
|
1211
|
+
export const doParentMethod = (vm,methodName) => {
|
|
1212
|
+
let action = getParentMethod(vm,methodName)
|
|
1213
|
+
if (action) {
|
|
1214
|
+
action()
|
|
1215
|
+
}
|
|
1216
|
+
}
|
|
1217
|
+
/**
|
|
1218
|
+
* 替换url中的指定参数
|
|
1219
|
+
* @param url
|
|
1220
|
+
* @param paramName
|
|
1221
|
+
* @param paramValue
|
|
1222
|
+
* @returns {string}
|
|
1223
|
+
*/
|
|
1224
|
+
export const replaceUrlParam = (url, paramName, paramValue) => {
|
|
1225
|
+
let pattern = new RegExp('(' + paramName + '=)([^&]+)', 'i');
|
|
1226
|
+
let queryString = url.split('?')[1];
|
|
1227
|
+
if (queryString) {
|
|
1228
|
+
let newParam = paramName + '=' + encodeURIComponent(paramValue);
|
|
1229
|
+
let newQueryString = queryString.replace(pattern, newParam);
|
|
1230
|
+
return url.split('?')[0] + '?' + newQueryString;
|
|
1231
|
+
} else {
|
|
1232
|
+
return url + '?' + paramName + '=' + encodeURIComponent(paramValue);
|
|
1233
|
+
}
|
|
1234
|
+
}
|
|
1235
|
+
/**
|
|
1236
|
+
* 拼接url
|
|
1237
|
+
* @param href
|
|
1238
|
+
* @param key
|
|
1239
|
+
* @param value
|
|
1240
|
+
* @returns {string}
|
|
1241
|
+
*/
|
|
1242
|
+
export const buildParams = (href, key, value) =>{
|
|
1243
|
+
if (href && key && value) {
|
|
1244
|
+
if (!href.includes(key + '=')) {
|
|
1245
|
+
if (href.includes('?')) {
|
|
1246
|
+
href += '&' + key + '=' + value
|
|
1247
|
+
} else {
|
|
1248
|
+
href += '?' + key + '=' + value
|
|
1249
|
+
}
|
|
1250
|
+
} else {
|
|
1251
|
+
href = replaceUrlParam(href,key,value)
|
|
1252
|
+
}
|
|
1253
|
+
return href;
|
|
594
1254
|
}
|
|
595
|
-
|
|
1255
|
+
return '';
|
|
1256
|
+
}
|
|
1257
|
+
/**
|
|
1258
|
+
* 组装菜单url
|
|
1259
|
+
* @param item
|
|
1260
|
+
* @param ssoToken
|
|
1261
|
+
* @param ssoid
|
|
1262
|
+
* @returns {string}
|
|
1263
|
+
*/
|
|
1264
|
+
export const buildMenuUri = (item,ssoToken,ssoid) => {
|
|
1265
|
+
if (!item.uri) {
|
|
1266
|
+
return ''
|
|
1267
|
+
}
|
|
1268
|
+
let href = ''
|
|
1269
|
+
let uri = item.uri
|
|
1270
|
+
if (uri.startsWith('http')) {
|
|
1271
|
+
href = uri
|
|
1272
|
+
} else {
|
|
1273
|
+
let basepath = ''
|
|
1274
|
+
if (item.navList) {
|
|
1275
|
+
let navList = deepCopy(item.navList);
|
|
1276
|
+
let appId = '';
|
|
1277
|
+
if (item.appId) {
|
|
1278
|
+
appId = item.appId;
|
|
1279
|
+
} else if (item.meta && item.meta.appId) {
|
|
1280
|
+
appId = item.meta.appId;
|
|
1281
|
+
}
|
|
1282
|
+
let appInfo = navList.find(app => app.appId === appId)
|
|
1283
|
+
if (appInfo && appInfo.basepath) {
|
|
1284
|
+
basepath = appInfo.basepath
|
|
1285
|
+
}
|
|
1286
|
+
}
|
|
1287
|
+
if (!basepath.startsWith('/') && !basepath.startsWith('http')) {
|
|
1288
|
+
basepath = '/' + basepath
|
|
1289
|
+
}
|
|
1290
|
+
if (basepath.endsWith('/')) {
|
|
1291
|
+
basepath = basepath.substring(0, basepath.length - 1)
|
|
1292
|
+
}
|
|
1293
|
+
if (!uri.startsWith('/')) {
|
|
1294
|
+
uri = '/' + uri
|
|
1295
|
+
}
|
|
1296
|
+
href = basepath + uri
|
|
1297
|
+
}
|
|
1298
|
+
href = buildParams(href,"layout","screen");
|
|
1299
|
+
if (ssoToken) {
|
|
1300
|
+
href = buildParams(href,"token",ssoToken);
|
|
1301
|
+
}
|
|
1302
|
+
if (ssoid) {
|
|
1303
|
+
href = buildParams(href,"ssoid",ssoid);
|
|
1304
|
+
}
|
|
1305
|
+
if (item.cts) {
|
|
1306
|
+
href = buildParams(href,"cts",item.cts);
|
|
1307
|
+
}
|
|
1308
|
+
return href
|
|
1309
|
+
}
|
|
1310
|
+
/**
|
|
1311
|
+
* 给query添加时间戳
|
|
1312
|
+
*/
|
|
1313
|
+
export const addTimestamp = ($route) => {
|
|
1314
|
+
let query = {};
|
|
1315
|
+
if ($route.query) {
|
|
1316
|
+
query = $route.query;
|
|
1317
|
+
}
|
|
1318
|
+
query = Object.assign({},query,{cts:new Date().getTime()})
|
|
1319
|
+
$route.query = query;
|
|
1320
|
+
return $route;
|
|
1321
|
+
}
|
|
1322
|
+
/**
|
|
1323
|
+
* 根据配置信息修改系统信息
|
|
1324
|
+
* @param systemInfo
|
|
1325
|
+
*/
|
|
1326
|
+
export const changeSystemInfo = async (systemInfo) => {
|
|
1327
|
+
let defaultSystemInfo = {
|
|
1328
|
+
layoutSize: 'small',
|
|
1329
|
+
systemLogo: systemLogo,
|
|
1330
|
+
logoWidth: '150px',
|
|
1331
|
+
systemName: sessionStorage.getItem('systemName') ? sessionStorage.getItem('systemName') : config.title,
|
|
1332
|
+
nameSize: 1,
|
|
1333
|
+
navType: 'dropdown',
|
|
1334
|
+
rightTopOptButtonList: ['collect', 'fullScreen'],
|
|
1335
|
+
rightTopShowFunList: ['theme', 'personalCenter', 'noticeList', 'logout'],
|
|
1336
|
+
menuLogo: '1',
|
|
1337
|
+
titleShow: 'wrap',
|
|
1338
|
+
menuScaling: '1',
|
|
1339
|
+
footerInfo: 'Copyright © 2021 浪潮数字商业科技有限公司 版权所有<br> 辽ICP备11001865号-3',
|
|
1340
|
+
showTheme: '',
|
|
1341
|
+
theme: 'default',
|
|
1342
|
+
tabNum: 5,
|
|
1343
|
+
topMenu: 4,
|
|
1344
|
+
};
|
|
1345
|
+
if (systemInfo) {
|
|
1346
|
+
systemInfo = Object.assign(defaultSystemInfo, systemInfo);
|
|
1347
|
+
} else {
|
|
1348
|
+
systemInfo = defaultSystemInfo;
|
|
1349
|
+
}
|
|
1350
|
+
if (systemInfo.logo) {
|
|
1351
|
+
systemInfo.systemLogo = config.ossServerContext + '/anon/system/file/get/' + systemInfo.logo
|
|
1352
|
+
} else {
|
|
1353
|
+
systemInfo.systemLogo = ''
|
|
1354
|
+
}
|
|
1355
|
+
sessionStorage.setItem('systemLogo', systemInfo.systemLogo)
|
|
1356
|
+
if(systemInfo.favoriteIcon){
|
|
1357
|
+
systemInfo.favoriteIcon = config.ossServerContext + '/anon/system/file/get/' + systemInfo.favoriteIcon
|
|
1358
|
+
sessionStorage.setItem('systemFavoriteIcon', systemInfo.favoriteIcon)
|
|
1359
|
+
let link = document.querySelector("link[rel*='icon']") || document.createElement('link');
|
|
1360
|
+
link.setAttribute('href', systemInfo.favoriteIcon);
|
|
1361
|
+
if (!link.getAttribute('rel')) {
|
|
1362
|
+
link.setAttribute('rel', 'icon');
|
|
1363
|
+
}
|
|
1364
|
+
if (!link.getAttribute('type')) {
|
|
1365
|
+
link.setAttribute('type', 'image/png');
|
|
1366
|
+
}
|
|
1367
|
+
} else if (systemInfo.systemLogo) {
|
|
1368
|
+
let link = document.querySelector("link[rel*='icon']") || document.createElement('link');
|
|
1369
|
+
link.setAttribute('href', systemInfo.systemLogo);
|
|
1370
|
+
if (!link.getAttribute('rel')) {
|
|
1371
|
+
link.setAttribute('rel', 'icon');
|
|
1372
|
+
}
|
|
1373
|
+
if (!link.getAttribute('type')) {
|
|
1374
|
+
link.setAttribute('type', 'image/png');
|
|
1375
|
+
}
|
|
1376
|
+
}
|
|
1377
|
+
|
|
1378
|
+
if (systemInfo.logoWidth) {
|
|
1379
|
+
systemInfo.logoWidth = systemInfo.logoWidth + ''
|
|
1380
|
+
}
|
|
1381
|
+
if (systemInfo.systemName) {
|
|
1382
|
+
document.title = systemInfo.systemName
|
|
1383
|
+
sessionStorage.setItem('systemName', systemInfo.systemName)
|
|
1384
|
+
}
|
|
1385
|
+
if (localStorage.getItem('theme')) {
|
|
1386
|
+
systemInfo.theme = localStorage.getItem('theme')
|
|
1387
|
+
}
|
|
1388
|
+
changeByThemeKey(systemInfo.theme)
|
|
1389
|
+
//禁用快捷键/鼠标右键
|
|
1390
|
+
if (systemInfo.showShortcutKeyConfig === '0'){
|
|
1391
|
+
if(systemInfo.contextmenu === '0'){
|
|
1392
|
+
window.contextMenu = '0'
|
|
1393
|
+
// console.log("systemInfo.contextmenu", systemInfo.contextmenu)
|
|
1394
|
+
disableRightClick();
|
|
1395
|
+
}else{
|
|
1396
|
+
window.contextMenu = '1'
|
|
1397
|
+
}
|
|
1398
|
+
|
|
1399
|
+
// Ctrl+S
|
|
1400
|
+
let shortcutKeyList = [];
|
|
1401
|
+
if (systemInfo.shortcutCtrlS === '0') {
|
|
1402
|
+
shortcutKeyList.push('ctrl+s');
|
|
1403
|
+
}
|
|
1404
|
+
// Ctrl+C
|
|
1405
|
+
if (systemInfo.shortcutCtrlC === '0') {
|
|
1406
|
+
shortcutKeyList.push('ctrl+c');
|
|
1407
|
+
}
|
|
1408
|
+
|
|
1409
|
+
if (shortcutKeyList.length > 0) {
|
|
1410
|
+
window.shortcutKey = '0';
|
|
1411
|
+
// console.log("shortcutKeyList===", shortcutKeyList)
|
|
1412
|
+
disableShortcutKeys(shortcutKeyList);
|
|
1413
|
+
} else {
|
|
1414
|
+
window.shortcutKey = '1';
|
|
1415
|
+
enableShortcutKeys();
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1418
|
+
if(systemInfo.shortcutF12 === '0'){
|
|
1419
|
+
window.shortcutF12 = '0'
|
|
1420
|
+
disableF12();
|
|
1421
|
+
}else{
|
|
1422
|
+
window.shortcutF12 = '1'
|
|
1423
|
+
}
|
|
1424
|
+
if(systemInfo.textSelected === '0'){
|
|
1425
|
+
window.textSelected = '0';
|
|
1426
|
+
disableTextSelection();
|
|
1427
|
+
}else{
|
|
1428
|
+
window.textSelected = '1';
|
|
1429
|
+
}
|
|
1430
|
+
}else {
|
|
1431
|
+
enableRightClick();
|
|
1432
|
+
enableShortcutKeys();
|
|
1433
|
+
enableF12();
|
|
1434
|
+
enableTextSelection();
|
|
1435
|
+
}
|
|
1436
|
+
|
|
1437
|
+
if (localStorage.getItem('themeIdCurrent')) {
|
|
1438
|
+
systemInfo.showTheme = localStorage.getItem('themeIdCurrent')
|
|
1439
|
+
}
|
|
1440
|
+
if (systemInfo.showTheme) {
|
|
1441
|
+
let showTheme = systemInfo.showTheme
|
|
1442
|
+
let split = showTheme.split('-')
|
|
1443
|
+
let systemForm = null
|
|
1444
|
+
let themeId = split[0];
|
|
1445
|
+
let status = split[1];
|
|
1446
|
+
let filterStatus = split[2];
|
|
1447
|
+
if (themeId) {
|
|
1448
|
+
let res = await ajax.get(config.upmsServerContext + '/anon/system/themeInfo?themeId=' + split[0])
|
|
1449
|
+
if (res.data.code == 1) {
|
|
1450
|
+
systemForm = res.data.data[0]
|
|
1451
|
+
if (!status && systemForm.status) {
|
|
1452
|
+
status = systemForm.status;
|
|
1453
|
+
}
|
|
1454
|
+
if (!filterStatus && systemForm.filterStatus) {
|
|
1455
|
+
filterStatus = systemForm.filterStatus;
|
|
1456
|
+
}
|
|
1457
|
+
}
|
|
1458
|
+
}
|
|
1459
|
+
if (systemForm) {
|
|
1460
|
+
changeThemeByThemeId(themeId, status, filterStatus, systemForm)
|
|
1461
|
+
}
|
|
1462
|
+
}
|
|
1463
|
+
if (!systemInfo.rightTopOptButtonList || systemInfo.rightTopOptButtonList.length <= 0) {
|
|
1464
|
+
systemInfo.rightTopOptButtonList = ['collect', 'fullScreen'];
|
|
1465
|
+
}
|
|
1466
|
+
if (!systemInfo.rightTopShowFunList || systemInfo.rightTopShowFunList.length <= 0) {
|
|
1467
|
+
systemInfo.rightTopShowFunList = ['theme', 'personalCenter', 'noticeList', 'logout']
|
|
1468
|
+
}
|
|
1469
|
+
return systemInfo;
|
|
1470
|
+
}
|
|
1471
|
+
|
|
1472
|
+
export const buildHomeConfigs = (settings) => {
|
|
1473
|
+
let result = [];
|
|
1474
|
+
if (settings && settings.length > 0) {
|
|
1475
|
+
let settingMap = {}
|
|
1476
|
+
for (let st of settings) {
|
|
1477
|
+
let key = st.categoryCode;
|
|
1478
|
+
if (!key) {
|
|
1479
|
+
key = "otherCategory";
|
|
1480
|
+
}
|
|
1481
|
+
if (settingMap[key]) {
|
|
1482
|
+
let oldSt = settingMap[key];
|
|
1483
|
+
if (st.permit && oldSt.permit
|
|
1484
|
+
&& (st.permit.permissionType > oldSt.permit.permissionType
|
|
1485
|
+
|| (st.permit.permissionType == oldSt.permit.permissionType
|
|
1486
|
+
&& st.permit.createTime > oldSt.permit.createTime))) {
|
|
1487
|
+
settingMap[key] = st;
|
|
1488
|
+
}
|
|
1489
|
+
} else {
|
|
1490
|
+
settingMap[key] = st;
|
|
1491
|
+
}
|
|
1492
|
+
}
|
|
1493
|
+
if (settingMap['default']) {
|
|
1494
|
+
result.push(settingMap['default']);
|
|
1495
|
+
}
|
|
1496
|
+
for(let key in settingMap) {
|
|
1497
|
+
if (key != 'default') {
|
|
1498
|
+
result.push(settingMap[key])
|
|
1499
|
+
}
|
|
1500
|
+
}
|
|
1501
|
+
}
|
|
1502
|
+
return result;
|
|
1503
|
+
}
|
|
1504
|
+
|
|
1505
|
+
export const getAllElements = ( plist = [], result = []) => {
|
|
1506
|
+
for (let obj of plist) {
|
|
1507
|
+
if (obj.permissionId) {
|
|
1508
|
+
result.push(obj.permissionId);
|
|
1509
|
+
}
|
|
1510
|
+
if (obj.children && obj.children.length > 0) {
|
|
1511
|
+
getAllElements(obj.children, result);
|
|
1512
|
+
}
|
|
1513
|
+
}
|
|
1514
|
+
return result;
|
|
1515
|
+
}
|