vue2-client 1.18.63 → 1.18.65

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 (87) hide show
  1. package/.claude/settings.local.json +28 -28
  2. package/.eslintrc.js +74 -74
  3. package/Components.md +60 -60
  4. package/docs/index.md +30 -30
  5. package/index.js +31 -31
  6. package/jest-transform-stub.js +8 -8
  7. package/jest.setup.js +7 -7
  8. package/package.json +1 -1
  9. package/src/assets/img/querySlotDemo.svg +15 -15
  10. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  11. package/src/base-client/components/common/CitySelect/index.js +3 -3
  12. package/src/base-client/components/common/CitySelect/index.md +109 -109
  13. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  14. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  15. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  16. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  17. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  18. package/src/base-client/components/common/Tree/index.js +2 -2
  19. package/src/base-client/components/common/Upload/index.js +3 -3
  20. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +9 -4
  21. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  22. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  23. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  24. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  25. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  26. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  27. package/src/base-client/components/common/XDescriptions/index.md +322 -322
  28. package/src/base-client/components/common/XForm/index.md +178 -178
  29. package/src/base-client/components/common/XFormGroup/demo.vue +8 -11
  30. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  31. package/src/base-client/components/common/XStepView/index.js +3 -3
  32. package/src/base-client/components/common/XStepView/index.md +31 -31
  33. package/src/base-client/components/common/XTable/XTable.vue +1715 -1715
  34. package/src/base-client/components/common/XTable/XTableWrapper.vue +786 -786
  35. package/src/base-client/components/common/XTable/index.md +255 -255
  36. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  37. package/src/base-client/plugins/Config.js +19 -19
  38. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  39. package/src/components/Charts/Bar.vue +62 -62
  40. package/src/components/Charts/ChartCard.vue +134 -134
  41. package/src/components/Charts/Liquid.vue +67 -67
  42. package/src/components/Charts/MiniArea.vue +39 -39
  43. package/src/components/Charts/MiniBar.vue +39 -39
  44. package/src/components/Charts/MiniProgress.vue +75 -75
  45. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  46. package/src/components/Charts/Radar.vue +68 -68
  47. package/src/components/Charts/RankList.vue +77 -77
  48. package/src/components/Charts/TagCloud.vue +113 -113
  49. package/src/components/Charts/TransferBar.vue +64 -64
  50. package/src/components/Charts/Trend.vue +82 -82
  51. package/src/components/Charts/chart.less +12 -12
  52. package/src/components/Charts/smooth.area.less +13 -13
  53. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  54. package/src/components/NumberInfo/index.js +3 -3
  55. package/src/components/NumberInfo/index.less +54 -54
  56. package/src/components/NumberInfo/index.md +43 -43
  57. package/src/components/card/ChartCard.vue +79 -79
  58. package/src/components/chart/Bar.vue +60 -60
  59. package/src/components/chart/MiniArea.vue +67 -67
  60. package/src/components/chart/MiniBar.vue +59 -59
  61. package/src/components/chart/MiniProgress.vue +57 -57
  62. package/src/components/chart/Radar.vue +80 -80
  63. package/src/components/chart/RankingList.vue +60 -60
  64. package/src/components/chart/Trend.vue +79 -79
  65. package/src/components/chart/index.less +9 -9
  66. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  67. package/src/components/input/IInput.vue +66 -66
  68. package/src/components/menu/SideMenu.vue +75 -75
  69. package/src/components/menu/menu.js +273 -273
  70. package/src/components/tool/AStepItem.vue +60 -60
  71. package/src/layouts/BlankView.vue +16 -14
  72. package/src/layouts/CommonLayout.vue +56 -56
  73. package/src/layouts/header/HeaderNotice.vue +177 -177
  74. package/src/lib.js +1 -1
  75. package/src/mock/extend/index.js +84 -84
  76. package/src/mock/goods/index.js +108 -108
  77. package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
  78. package/src/pages/system/dictionary/index.vue +44 -44
  79. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  80. package/src/pages/system/monitor/operLog/index.vue +37 -37
  81. package/src/pages/userInfoDetailManage/uploadFilesHistory/index.vue +212 -212
  82. package/src/router/async/router.map.js +2 -2
  83. package/src/services/api/cas.js +79 -79
  84. package/src/store/modules/setting.js +119 -119
  85. package/src/utils/authority-utils.js +85 -85
  86. package/src/utils/errorCode.js +6 -6
  87. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
@@ -55,14 +55,14 @@ routerResource.example = {
55
55
  // component: () => import('@vue2-client/base-client/components/common/XDescriptions/demo.vue'),
56
56
  // component: () => import('@vue2-client/base-client/components/his/HChart/demo.vue'),
57
57
  // component: () => import('@vue2-client/pages/WorkflowDetail/WorkFlowDemo.vue'),
58
- component: () => import('@vue2-client/base-client/components/common/XFormTable/demo.vue')
58
+ // component: () => import('@vue2-client/base-client/components/common/XFormTable/demo.vue')
59
59
  // component: () => import('@vue2-client/base-client/components/common/ImagePreviewModal/demo.vue'),
60
60
  // component: () => import('@vue2-client/components/xScrollBox/example.vue'),
61
61
  // component: () => import('@vue2-client/pages/WorkflowDetail/WorkFlowDemo.vue'),
62
62
  // component: () => import('@vue2-client/pages/addressSelect/addressDemo.vue'),
63
63
  // component: () => import('@vue2-client/base-client/components/common/XDescriptions/demo.vue'),
64
64
  // component: () => import('@vue2-client/base-client/components/common/XAddNativeForm/demo.vue')
65
- // component: () => import('@vue2-client/base-client/components/common/XFormGroup/demo.vue'),
65
+ component: () => import('@vue2-client/base-client/components/common/XFormGroup/demo.vue')
66
66
  // component: () => import('@vue2-client/base-client/components/common/XReport/XReportDemo.vue'),
67
67
  // component: () => import('@vue2-client/base-client/components/common/XReportGrid/XReportDemo.vue'),
68
68
  // component: () => import('@vue2-client/base-client/components/common/HIS/demo.vue'),
@@ -1,79 +1,79 @@
1
- import { post } from '@vue2-client/services/api/restTools'
2
- import notification from 'ant-design-vue/lib/notification'
3
- import { logout } from '@vue2-client/services/user'
4
- import Cookie from 'js-cookie'
5
-
6
- const casApi = {
7
- // 根据用户信息校验服务访问权限并生成ST
8
- createSTByUserInfo: '/api/af-sso/logic/createSTByUserInfo',
9
- // 根据TGC生成ST
10
- createSTByTGC: '/api/af-sso/logic/createSTByTGC',
11
- // 验证ST
12
- serviceValidate: '/api/af-sso/logic/openapi/serviceValidate',
13
- // 其他验证
14
- otherValidate: '/api/af-sso/logic'
15
- }
16
-
17
- function setTGTCookie (cookie) {
18
- return Cookie.set('TGT-Cookie', cookie)
19
- }
20
- function removeTGTCookie () {
21
- return Cookie.remove('TGT-Cookie')
22
- }
23
- export function getTGTCookie () {
24
- return Cookie.get('TGT-Cookie')
25
- }
26
-
27
- export function CASLoginByAuth (serviceKey) {
28
- return new Promise((resolve, reject) => {
29
- post(casApi.createSTByUserInfo, {
30
- serviceKey: serviceKey
31
- }).then(res => {
32
- setTGTCookie(res.tgc)
33
- resolve(res)
34
- }).catch(msg => {
35
- reject(msg)
36
- })
37
- })
38
- }
39
-
40
- export function CASLogin (serviceKey, inner) {
41
- // 从第三方跳转登录
42
- const tgc = getTGTCookie()
43
- if (tgc && !inner) {
44
- return new Promise((resolve, reject) => {
45
- post(casApi.createSTByTGC, {
46
- serviceKey: serviceKey,
47
- tgc: tgc
48
- }).then(res => {
49
- resolve(res)
50
- }).catch(msg => {
51
- if (msg === '当前操作没有权限') {
52
- removeTGTCookie()
53
- notification.error({
54
- message: '授权已过期,请重新登录',
55
- description: '2秒后自动跳转回登陆页面'
56
- })
57
- logout().then(() => {
58
- setTimeout(() => {
59
- window.location.href = '/login?serviceKey=' + serviceKey
60
- }, 1500)
61
- })
62
- } else {
63
- reject(msg)
64
- }
65
- })
66
- })
67
- } else {
68
- return CASLoginByAuth(serviceKey)
69
- }
70
- }
71
-
72
- export function doOtherValidate (logicName, st, serviceKey) {
73
- return post(casApi.otherValidate + '/' + logicName, {
74
- st: st,
75
- serviceKey: serviceKey
76
- }, null)
77
- }
78
-
79
- export default casApi
1
+ import { post } from '@vue2-client/services/api/restTools'
2
+ import notification from 'ant-design-vue/lib/notification'
3
+ import { logout } from '@vue2-client/services/user'
4
+ import Cookie from 'js-cookie'
5
+
6
+ const casApi = {
7
+ // 根据用户信息校验服务访问权限并生成ST
8
+ createSTByUserInfo: '/api/af-sso/logic/createSTByUserInfo',
9
+ // 根据TGC生成ST
10
+ createSTByTGC: '/api/af-sso/logic/createSTByTGC',
11
+ // 验证ST
12
+ serviceValidate: '/api/af-sso/logic/openapi/serviceValidate',
13
+ // 其他验证
14
+ otherValidate: '/api/af-sso/logic'
15
+ }
16
+
17
+ function setTGTCookie (cookie) {
18
+ return Cookie.set('TGT-Cookie', cookie)
19
+ }
20
+ function removeTGTCookie () {
21
+ return Cookie.remove('TGT-Cookie')
22
+ }
23
+ export function getTGTCookie () {
24
+ return Cookie.get('TGT-Cookie')
25
+ }
26
+
27
+ export function CASLoginByAuth (serviceKey) {
28
+ return new Promise((resolve, reject) => {
29
+ post(casApi.createSTByUserInfo, {
30
+ serviceKey: serviceKey
31
+ }).then(res => {
32
+ setTGTCookie(res.tgc)
33
+ resolve(res)
34
+ }).catch(msg => {
35
+ reject(msg)
36
+ })
37
+ })
38
+ }
39
+
40
+ export function CASLogin (serviceKey, inner) {
41
+ // 从第三方跳转登录
42
+ const tgc = getTGTCookie()
43
+ if (tgc && !inner) {
44
+ return new Promise((resolve, reject) => {
45
+ post(casApi.createSTByTGC, {
46
+ serviceKey: serviceKey,
47
+ tgc: tgc
48
+ }).then(res => {
49
+ resolve(res)
50
+ }).catch(msg => {
51
+ if (msg === '当前操作没有权限') {
52
+ removeTGTCookie()
53
+ notification.error({
54
+ message: '授权已过期,请重新登录',
55
+ description: '2秒后自动跳转回登陆页面'
56
+ })
57
+ logout().then(() => {
58
+ setTimeout(() => {
59
+ window.location.href = '/login?serviceKey=' + serviceKey
60
+ }, 1500)
61
+ })
62
+ } else {
63
+ reject(msg)
64
+ }
65
+ })
66
+ })
67
+ } else {
68
+ return CASLoginByAuth(serviceKey)
69
+ }
70
+ }
71
+
72
+ export function doOtherValidate (logicName, st, serviceKey) {
73
+ return post(casApi.otherValidate + '/' + logicName, {
74
+ st: st,
75
+ serviceKey: serviceKey
76
+ }, null)
77
+ }
78
+
79
+ export default casApi
@@ -1,119 +1,119 @@
1
- import config from '@vue2-client/config'
2
- import { ADMIN } from '@vue2-client/config/default'
3
- import { formatFullPath } from '@vue2-client/utils/i18n'
4
- import { filterMenu } from '@vue2-client/utils/authority-utils'
5
- import { getLocalSetting } from '@vue2-client/utils/themeUtil'
6
- import deepClone from 'lodash.clonedeep'
7
-
8
- const localSetting = getLocalSetting(true)
9
- const customTitlesStr = sessionStorage.getItem(process.env.VUE_APP_TBAS_TITLES_KEY)
10
- const customTitles = (customTitlesStr && JSON.parse(customTitlesStr)) || []
11
-
12
- export default {
13
- namespaced: true,
14
- state: {
15
- isMobile: false,
16
- animates: ADMIN.animates,
17
- palettes: ADMIN.palettes,
18
- pageMinHeight: 0,
19
- menuData: [],
20
- activatedFirst: undefined,
21
- customTitles,
22
- ...config,
23
- ...localSetting
24
- },
25
- getters: {
26
- menuData (state, getters, rootState) {
27
- if (state.filterMenu) {
28
- const { permissions, roles } = rootState.account
29
- return filterMenu(deepClone(state.menuData), permissions, roles)
30
- }
31
- return state.menuData
32
- },
33
- firstMenu (state, getters) {
34
- const { menuData } = getters
35
- if (menuData.length > 0 && !menuData[0].fullPath) {
36
- formatFullPath(menuData)
37
- }
38
- return menuData.map(item => {
39
- const menuItem = { ...item }
40
- delete menuItem.children
41
- return menuItem
42
- })
43
- },
44
- subMenu (state) {
45
- const { menuData, activatedFirst } = state
46
- if (menuData.length > 0 && !menuData[0].fullPath) {
47
- formatFullPath(menuData)
48
- }
49
- const current = menuData.find(menu => menu.fullPath === activatedFirst)
50
- return current && current.children || []
51
- }
52
- },
53
- mutations: {
54
- setDevice (state, isMobile) {
55
- state.isMobile = isMobile
56
- },
57
- setTheme (state, theme) {
58
- state.theme = theme
59
- },
60
- setLayout (state, layout) {
61
- state.layout = layout
62
- },
63
- setMultiPage (state, multiPage) {
64
- state.multiPage = multiPage
65
- },
66
- setAnimate (state, animate) {
67
- state.animate = animate
68
- },
69
- setWeekMode (state, weekMode) {
70
- state.weekMode = weekMode
71
- },
72
- setFixedHeader (state, fixedHeader) {
73
- state.fixedHeader = fixedHeader
74
- },
75
- setFixedSideBar (state, fixedSideBar) {
76
- state.fixedSideBar = fixedSideBar
77
- },
78
- setLang (state, lang) {
79
- state.lang = lang
80
- },
81
- setHideSetting (state, hideSetting) {
82
- state.hideSetting = hideSetting
83
- },
84
- correctPageMinHeight (state, minHeight) {
85
- state.pageMinHeight += minHeight
86
- },
87
- setMenuData (state, menuData) {
88
- state.menuData = menuData
89
- },
90
- setAsyncRoutes (state, asyncRoutes) {
91
- state.asyncRoutes = asyncRoutes
92
- },
93
- setPageWidth (state, pageWidth) {
94
- state.pageWidth = pageWidth
95
- },
96
- setActivatedFirst (state, activatedFirst) {
97
- state.activatedFirst = activatedFirst
98
- },
99
- setFixedTabs (state, fixedTabs) {
100
- state.fixedTabs = fixedTabs
101
- },
102
- setCustomTitle (state, { path, title }) {
103
- if (title) {
104
- const obj = state.customTitles.find(item => item.path === path)
105
- if (obj) {
106
- obj.title = title
107
- } else {
108
- state.customTitles.push({ path, title })
109
- }
110
- sessionStorage.setItem(process.env.VUE_APP_TBAS_TITLES_KEY, JSON.stringify(state.customTitles))
111
- }
112
- },
113
- setSetting (state, setting) {
114
- for (const key in setting) {
115
- state[key] = setting[key]
116
- }
117
- }
118
- }
119
- }
1
+ import config from '@vue2-client/config'
2
+ import { ADMIN } from '@vue2-client/config/default'
3
+ import { formatFullPath } from '@vue2-client/utils/i18n'
4
+ import { filterMenu } from '@vue2-client/utils/authority-utils'
5
+ import { getLocalSetting } from '@vue2-client/utils/themeUtil'
6
+ import deepClone from 'lodash.clonedeep'
7
+
8
+ const localSetting = getLocalSetting(true)
9
+ const customTitlesStr = sessionStorage.getItem(process.env.VUE_APP_TBAS_TITLES_KEY)
10
+ const customTitles = (customTitlesStr && JSON.parse(customTitlesStr)) || []
11
+
12
+ export default {
13
+ namespaced: true,
14
+ state: {
15
+ isMobile: false,
16
+ animates: ADMIN.animates,
17
+ palettes: ADMIN.palettes,
18
+ pageMinHeight: 0,
19
+ menuData: [],
20
+ activatedFirst: undefined,
21
+ customTitles,
22
+ ...config,
23
+ ...localSetting
24
+ },
25
+ getters: {
26
+ menuData (state, getters, rootState) {
27
+ if (state.filterMenu) {
28
+ const { permissions, roles } = rootState.account
29
+ return filterMenu(deepClone(state.menuData), permissions, roles)
30
+ }
31
+ return state.menuData
32
+ },
33
+ firstMenu (state, getters) {
34
+ const { menuData } = getters
35
+ if (menuData.length > 0 && !menuData[0].fullPath) {
36
+ formatFullPath(menuData)
37
+ }
38
+ return menuData.map(item => {
39
+ const menuItem = { ...item }
40
+ delete menuItem.children
41
+ return menuItem
42
+ })
43
+ },
44
+ subMenu (state) {
45
+ const { menuData, activatedFirst } = state
46
+ if (menuData.length > 0 && !menuData[0].fullPath) {
47
+ formatFullPath(menuData)
48
+ }
49
+ const current = menuData.find(menu => menu.fullPath === activatedFirst)
50
+ return current && current.children || []
51
+ }
52
+ },
53
+ mutations: {
54
+ setDevice (state, isMobile) {
55
+ state.isMobile = isMobile
56
+ },
57
+ setTheme (state, theme) {
58
+ state.theme = theme
59
+ },
60
+ setLayout (state, layout) {
61
+ state.layout = layout
62
+ },
63
+ setMultiPage (state, multiPage) {
64
+ state.multiPage = multiPage
65
+ },
66
+ setAnimate (state, animate) {
67
+ state.animate = animate
68
+ },
69
+ setWeekMode (state, weekMode) {
70
+ state.weekMode = weekMode
71
+ },
72
+ setFixedHeader (state, fixedHeader) {
73
+ state.fixedHeader = fixedHeader
74
+ },
75
+ setFixedSideBar (state, fixedSideBar) {
76
+ state.fixedSideBar = fixedSideBar
77
+ },
78
+ setLang (state, lang) {
79
+ state.lang = lang
80
+ },
81
+ setHideSetting (state, hideSetting) {
82
+ state.hideSetting = hideSetting
83
+ },
84
+ correctPageMinHeight (state, minHeight) {
85
+ state.pageMinHeight += minHeight
86
+ },
87
+ setMenuData (state, menuData) {
88
+ state.menuData = menuData
89
+ },
90
+ setAsyncRoutes (state, asyncRoutes) {
91
+ state.asyncRoutes = asyncRoutes
92
+ },
93
+ setPageWidth (state, pageWidth) {
94
+ state.pageWidth = pageWidth
95
+ },
96
+ setActivatedFirst (state, activatedFirst) {
97
+ state.activatedFirst = activatedFirst
98
+ },
99
+ setFixedTabs (state, fixedTabs) {
100
+ state.fixedTabs = fixedTabs
101
+ },
102
+ setCustomTitle (state, { path, title }) {
103
+ if (title) {
104
+ const obj = state.customTitles.find(item => item.path === path)
105
+ if (obj) {
106
+ obj.title = title
107
+ } else {
108
+ state.customTitles.push({ path, title })
109
+ }
110
+ sessionStorage.setItem(process.env.VUE_APP_TBAS_TITLES_KEY, JSON.stringify(state.customTitles))
111
+ }
112
+ },
113
+ setSetting (state, setting) {
114
+ for (const key in setting) {
115
+ state[key] = setting[key]
116
+ }
117
+ }
118
+ }
119
+ }
@@ -1,85 +1,85 @@
1
- /**
2
- * 判断是否有路由的权限
3
- * @param authority 路由权限配置
4
- * @param permissions 用户权限集合
5
- * @returns {boolean|*}
6
- */
7
- function hasPermission (authority, permissions) {
8
- let required = '*'
9
- if (typeof authority === 'string') {
10
- required = authority
11
- } else if (Array.isArray(authority)) {
12
- required = authority
13
- } else if (typeof authority === 'object') {
14
- required = authority.permission
15
- }
16
- return required === '*' || hasAnyItem(required, permissions, (r, t) => !!(r === t || r === t.id))
17
- }
18
-
19
- /**
20
- * 判断是否有路由需要的角色
21
- * @param authority 路由权限配置
22
- * @param roles 用户角色集合
23
- */
24
- function hasRole (authority, roles) {
25
- let required
26
- if (typeof authority === 'object') {
27
- required = authority.role
28
- }
29
- return authority === '*' || hasAnyItem(required, roles, (r, t) => !!(r === t || r === t.id))
30
- }
31
-
32
- /**
33
- * 判断目标数组是否有所需元素
34
- * @param {String | String[]}required 所需元素,数组或单个元素
35
- * @param {String[]|Object[]} source 目标数组
36
- * @param {Function} filter 匹配条件
37
- * (r: String, s: String|Object) => boolean
38
- * @returns {boolean}
39
- */
40
- function hasAnyItem (required, source, filter) {
41
- if (!required) {
42
- return false
43
- }
44
- const checkedList = Array.isArray(required) ? required : [required]
45
- return !!source.find(s => checkedList.find(r => filter(r, s)))
46
- }
47
-
48
- /**
49
- * 路由权限校验
50
- * @param route 路由
51
- * @param permissions 用户权限集合
52
- * @param roles 用户角色集合
53
- * @returns {boolean}
54
- */
55
- function hasAuthority (route, permissions, roles) {
56
- const authorities = [...route.meta.pAuthorities, route.meta.authority]
57
- for (const authority of authorities) {
58
- if (!hasPermission(authority, permissions) && !hasRole(authority, roles)) {
59
- return false
60
- }
61
- }
62
- return true
63
- }
64
-
65
- /**
66
- * 根据权限配置过滤菜单数据
67
- * @param menuData
68
- * @param permissions
69
- * @param roles
70
- */
71
- function filterMenu (menuData, permissions, roles) {
72
- return menuData.filter(menu => {
73
- if (menu.meta && menu.meta.invisible === undefined) {
74
- if (!hasAuthority(menu, permissions, roles)) {
75
- return false
76
- }
77
- }
78
- if (menu.children && menu.children.length > 0) {
79
- menu.children = filterMenu(menu.children, permissions, roles)
80
- }
81
- return true
82
- })
83
- }
84
-
85
- export { filterMenu, hasAuthority }
1
+ /**
2
+ * 判断是否有路由的权限
3
+ * @param authority 路由权限配置
4
+ * @param permissions 用户权限集合
5
+ * @returns {boolean|*}
6
+ */
7
+ function hasPermission (authority, permissions) {
8
+ let required = '*'
9
+ if (typeof authority === 'string') {
10
+ required = authority
11
+ } else if (Array.isArray(authority)) {
12
+ required = authority
13
+ } else if (typeof authority === 'object') {
14
+ required = authority.permission
15
+ }
16
+ return required === '*' || hasAnyItem(required, permissions, (r, t) => !!(r === t || r === t.id))
17
+ }
18
+
19
+ /**
20
+ * 判断是否有路由需要的角色
21
+ * @param authority 路由权限配置
22
+ * @param roles 用户角色集合
23
+ */
24
+ function hasRole (authority, roles) {
25
+ let required
26
+ if (typeof authority === 'object') {
27
+ required = authority.role
28
+ }
29
+ return authority === '*' || hasAnyItem(required, roles, (r, t) => !!(r === t || r === t.id))
30
+ }
31
+
32
+ /**
33
+ * 判断目标数组是否有所需元素
34
+ * @param {String | String[]}required 所需元素,数组或单个元素
35
+ * @param {String[]|Object[]} source 目标数组
36
+ * @param {Function} filter 匹配条件
37
+ * (r: String, s: String|Object) => boolean
38
+ * @returns {boolean}
39
+ */
40
+ function hasAnyItem (required, source, filter) {
41
+ if (!required) {
42
+ return false
43
+ }
44
+ const checkedList = Array.isArray(required) ? required : [required]
45
+ return !!source.find(s => checkedList.find(r => filter(r, s)))
46
+ }
47
+
48
+ /**
49
+ * 路由权限校验
50
+ * @param route 路由
51
+ * @param permissions 用户权限集合
52
+ * @param roles 用户角色集合
53
+ * @returns {boolean}
54
+ */
55
+ function hasAuthority (route, permissions, roles) {
56
+ const authorities = [...route.meta.pAuthorities, route.meta.authority]
57
+ for (const authority of authorities) {
58
+ if (!hasPermission(authority, permissions) && !hasRole(authority, roles)) {
59
+ return false
60
+ }
61
+ }
62
+ return true
63
+ }
64
+
65
+ /**
66
+ * 根据权限配置过滤菜单数据
67
+ * @param menuData
68
+ * @param permissions
69
+ * @param roles
70
+ */
71
+ function filterMenu (menuData, permissions, roles) {
72
+ return menuData.filter(menu => {
73
+ if (menu.meta && menu.meta.invisible === undefined) {
74
+ if (!hasAuthority(menu, permissions, roles)) {
75
+ return false
76
+ }
77
+ }
78
+ if (menu.children && menu.children.length > 0) {
79
+ menu.children = filterMenu(menu.children, permissions, roles)
80
+ }
81
+ return true
82
+ })
83
+ }
84
+
85
+ export { filterMenu, hasAuthority }
@@ -1,6 +1,6 @@
1
- export default {
2
- 401: '认证失败,无法访问系统资源',
3
- 403: '当前操作没有权限',
4
- 404: '访问资源不存在',
5
- default: '系统未知错误,请反馈给管理员'
6
- }
1
+ export default {
2
+ 401: '认证失败,无法访问系统资源',
3
+ 403: '当前操作没有权限',
4
+ 404: '访问资源不存在',
5
+ default: '系统未知错误,请反馈给管理员'
6
+ }
@@ -1,15 +1,15 @@
1
- # vue2迁移vue3
2
-
3
- 1. 完成vue-cli,webpack,babel,eslint的升级
4
- - core-js 3.30.1 -> 3.33.0
5
- - add regenerator-runtime
6
- - @babel/core 7.21.4 -> 7.22.20
7
- - babel-eslint 10.1.0 -> @babel/eslint-parser 7.22.15
8
- - @vue/cli 4.5.19 -> 5.0.8
9
- - babel-jest 25.5.1 -> 26.6.3
10
- - eslint 6.8.0 -> 7.32.0
11
- - jest 24.0.0 -> 26.6.3
12
- - webpack 4.46.0 -> 5.88.2
13
- 2. 完成vue2的2.7升级
14
- - vue 2.6.14 -> 2.7.14
15
- - eslint 7.32.0 -> 8.51.0
1
+ # vue2迁移vue3
2
+
3
+ 1. 完成vue-cli,webpack,babel,eslint的升级
4
+ - core-js 3.30.1 -> 3.33.0
5
+ - add regenerator-runtime
6
+ - @babel/core 7.21.4 -> 7.22.20
7
+ - babel-eslint 10.1.0 -> @babel/eslint-parser 7.22.15
8
+ - @vue/cli 4.5.19 -> 5.0.8
9
+ - babel-jest 25.5.1 -> 26.6.3
10
+ - eslint 6.8.0 -> 7.32.0
11
+ - jest 24.0.0 -> 26.6.3
12
+ - webpack 4.46.0 -> 5.88.2
13
+ 2. 完成vue2的2.7升级
14
+ - vue 2.6.14 -> 2.7.14
15
+ - eslint 7.32.0 -> 8.51.0