w-web-perm 1.0.1 → 1.0.3
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/README.md +58 -0
- package/dist/css/{chunk-vendors.65775501.css → chunk-vendors.1c6c57f9.css} +1 -1
- package/dist/index.tmp +1 -1
- package/dist/js/app-legacy.317c7b7b.js +2 -0
- package/dist/js/app-legacy.317c7b7b.js.map +1 -0
- package/dist/js/app.317c7b7b.js +2 -0
- package/dist/js/app.317c7b7b.js.map +1 -0
- package/dist/js/chunk-vendors-legacy.a074d0c0.js +13 -0
- package/dist/js/chunk-vendors-legacy.a074d0c0.js.map +1 -0
- package/dist/js/chunk-vendors.a074d0c0.js +13 -0
- package/dist/js/chunk-vendors.a074d0c0.js.map +1 -0
- package/dist/w-web-perm.umd.js +2 -2
- package/dist/w-web-perm.umd.js.map +1 -1
- package/docs/WWebPerm.html +1 -1
- package/docs/WWebPerm.mjs.html +58 -8
- package/docs/index.html +1 -1
- package/g.mInitialData.mjs +147 -0
- package/package.json +4 -3
- package/server/WWebPerm.mjs +57 -7
- package/src/components/LayoutContentGroups.vue +3 -2
- package/src/components/LayoutContentTargets.vue +9 -2
- package/src/components/VeUser.vue +5 -4
- package/src/components/ruleGroup.vue +6 -28
- package/src/main.js +5 -10
- package/src/perm.mjs +85 -47
- package/src/plugins/mDataSupport.mjs +3 -46
- package/src/plugins/mShare.mjs +25 -5
- package/src/schema/tables/ruleGroups.mjs +1 -2
- package/src/schema/tables/targets.mjs +21 -28
- package/src/store/mutations.mjs +1 -1
- package/srv.mjs +24 -7
- package/tableTags-web-perm.json +1 -1
- package/dist/js/app-legacy.a31aa3a9.js +0 -2
- package/dist/js/app-legacy.a31aa3a9.js.map +0 -1
- package/dist/js/app.a31aa3a9.js +0 -2
- package/dist/js/app.a31aa3a9.js.map +0 -1
- package/dist/js/chunk-vendors-legacy.f5f1a231.js +0 -13
- package/dist/js/chunk-vendors-legacy.f5f1a231.js.map +0 -1
- package/dist/js/chunk-vendors.f5f1a231.js +0 -13
- package/dist/js/chunk-vendors.f5f1a231.js.map +0 -1
package/docs/WWebPerm.html
CHANGED
|
@@ -813,7 +813,7 @@
|
|
|
813
813
|
<br class="clear">
|
|
814
814
|
|
|
815
815
|
<footer>
|
|
816
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on
|
|
816
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Mon Jul 31 2023 10:16:16 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
817
817
|
</footer>
|
|
818
818
|
|
|
819
819
|
<script>prettyPrint();</script>
|
package/docs/WWebPerm.mjs.html
CHANGED
|
@@ -357,8 +357,11 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
|
|
|
357
357
|
}
|
|
358
358
|
|
|
359
359
|
return {
|
|
360
|
-
user:
|
|
361
|
-
|
|
360
|
+
user: {
|
|
361
|
+
...userFind,
|
|
362
|
+
ruleGroupsNames: urs.ruleGroupsNames, //ruleGroupsNames併入user內顯示
|
|
363
|
+
},
|
|
364
|
+
rules: urs.rules,
|
|
362
365
|
}
|
|
363
366
|
}
|
|
364
367
|
|
|
@@ -410,11 +413,12 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
|
|
|
410
413
|
},
|
|
411
414
|
{
|
|
412
415
|
method: 'GET',
|
|
413
|
-
path: '/api/getUserByToken',
|
|
416
|
+
path: '/api/getUserByToken', //名稱getUserByToken為w-ui-loginout預設值, 若要更改兩邊須同時修改
|
|
414
417
|
handler: async function (req, res) {
|
|
415
|
-
// console.log('
|
|
418
|
+
// console.log('getUserByToken', req)
|
|
416
419
|
|
|
417
420
|
async function core() {
|
|
421
|
+
//提供對象為browser使用者, 且認定權限系統須系統管理員才能使用, 須先檢測token是否為系統管理員, 確認後回傳該使用者(系統管理員)資訊物件
|
|
418
422
|
|
|
419
423
|
//token
|
|
420
424
|
let token = get(req, 'query.token', '')
|
|
@@ -425,7 +429,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
|
|
|
425
429
|
// console.log('userSelf', userSelf)
|
|
426
430
|
|
|
427
431
|
//check
|
|
428
|
-
if (get(userSelf, 'isAdmin') !== 'y') {
|
|
432
|
+
if (get(userSelf, 'isAdmin') !== 'y') { //權限系統須系統管理員才能使用
|
|
429
433
|
return Promise.reject(`user does not have permission`)
|
|
430
434
|
}
|
|
431
435
|
|
|
@@ -433,7 +437,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
|
|
|
433
437
|
}
|
|
434
438
|
|
|
435
439
|
//pm2resolve core
|
|
436
|
-
let r = await pm2resolve(core)() //w-ui-loginout接收已預設格式用pm2resolve轉過,
|
|
440
|
+
let r = await pm2resolve(core)() //w-ui-loginout接收已預設格式用pm2resolve轉過, 須另提取state進行判斷
|
|
437
441
|
// console.log('getUserByToken', r)
|
|
438
442
|
|
|
439
443
|
return r
|
|
@@ -441,11 +445,12 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
|
|
|
441
445
|
},
|
|
442
446
|
{
|
|
443
447
|
method: 'GET',
|
|
444
|
-
path: '/api/getPerm',
|
|
448
|
+
path: '/api/getPerm',
|
|
445
449
|
handler: async function (req, res) {
|
|
446
450
|
// console.log('getPerm', req)
|
|
447
451
|
|
|
448
452
|
async function core() {
|
|
453
|
+
//提供對象為node與browser使用者, 須先檢測token是否有效, 再依照token取得使用者資訊物件, 再由其userId查詢回傳該使用者權限資訊物件
|
|
449
454
|
|
|
450
455
|
//parseToken
|
|
451
456
|
let token = parseToken(req)
|
|
@@ -485,6 +490,51 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
|
|
|
485
490
|
let r = await pm2resolve(core)()
|
|
486
491
|
// console.log('getPerm r', r)
|
|
487
492
|
|
|
493
|
+
return r
|
|
494
|
+
},
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
method: 'GET',
|
|
498
|
+
path: '/api/getPermById',
|
|
499
|
+
handler: async function (req, res) {
|
|
500
|
+
// console.log('getPermById', req)
|
|
501
|
+
|
|
502
|
+
async function core() {
|
|
503
|
+
//提供對象為node使用者, 且認定權限系統須系統管理員才能使用, 須先檢測token是否為系統管理員, 再由query取得欲查詢的使用者userId, 再由其userId查詢回傳該使用者權限資訊物件
|
|
504
|
+
|
|
505
|
+
//token
|
|
506
|
+
let token = get(req, 'query.token', '')
|
|
507
|
+
// console.log('token', token)
|
|
508
|
+
|
|
509
|
+
//getGenUserByUserId
|
|
510
|
+
let userSelf = await getTokenUserForSelf(token)
|
|
511
|
+
// console.log('userSelf', userSelf)
|
|
512
|
+
|
|
513
|
+
//check
|
|
514
|
+
if (get(userSelf, 'isAdmin') !== 'y') { //權限系統須系統管理員才能使用
|
|
515
|
+
return Promise.reject(`user does not have permission`)
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
//userId
|
|
519
|
+
let userId = get(req, 'query.userId', '')
|
|
520
|
+
// console.log('userId', userId)
|
|
521
|
+
|
|
522
|
+
//getGenUserAndRulesByUserId
|
|
523
|
+
let r = await getGenUserAndRulesByUserId(userId)
|
|
524
|
+
// console.log('getGenUserAndRulesByUserId', r)
|
|
525
|
+
|
|
526
|
+
//check
|
|
527
|
+
if (!iseobj(r)) {
|
|
528
|
+
return Promise.reject(`user does not have permrules`)
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
return r
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
//pm2resolve core
|
|
535
|
+
let r = await pm2resolve(core)() //w-ui-loginout接收已預設格式用pm2resolve轉過, 須另提取state進行判斷
|
|
536
|
+
// console.log('getUserByToken', r)
|
|
537
|
+
|
|
488
538
|
return r
|
|
489
539
|
},
|
|
490
540
|
},
|
|
@@ -545,7 +595,7 @@ export default WWebPerm
|
|
|
545
595
|
<br class="clear">
|
|
546
596
|
|
|
547
597
|
<footer>
|
|
548
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on
|
|
598
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Mon Jul 31 2023 10:16:16 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
549
599
|
</footer>
|
|
550
600
|
|
|
551
601
|
<script>prettyPrint();</script>
|
package/docs/index.html
CHANGED
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
<br class="clear">
|
|
72
72
|
|
|
73
73
|
<footer>
|
|
74
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on
|
|
74
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Mon Jul 31 2023 10:16:16 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
75
75
|
</footer>
|
|
76
76
|
|
|
77
77
|
<script>prettyPrint();</script>
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import map from 'lodash/map'
|
|
2
|
+
import ds from './src/schema/index.mjs'
|
|
3
|
+
import { woItems } from './g.mOrm.mjs'
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
async function initialData() {
|
|
7
|
+
let rs
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
//人工建置數據時得要嚴格建立各階分層, 否則會無法查找到自動建立之parentId
|
|
11
|
+
rs = [
|
|
12
|
+
'主要資訊',
|
|
13
|
+
'主要資訊/主選單區',
|
|
14
|
+
'主要資訊/內容區',
|
|
15
|
+
'主要資訊/內容區/待處理任務區',
|
|
16
|
+
'計畫資料管理系統',
|
|
17
|
+
'計畫資料管理系統/主選單區',
|
|
18
|
+
'計畫資料管理系統/內容區',
|
|
19
|
+
'計畫資料管理系統/內容區/另存按鈕',
|
|
20
|
+
'計畫資料管理系統/內容區/刪除按鈕',
|
|
21
|
+
'計畫資料管理系統/內容區/查詢',
|
|
22
|
+
// '計畫資料管理系統/內容區/查詢/關鍵字功能',
|
|
23
|
+
'計畫資料管理系統/內容區/查詢/分類功能',
|
|
24
|
+
'計畫資料管理系統/內容區/查詢/計畫功能',
|
|
25
|
+
'計畫資料管理系統/內容區/查詢/欄位功能',
|
|
26
|
+
'輔助參考文獻系統',
|
|
27
|
+
'輔助參考文獻系統/主選單區',
|
|
28
|
+
'需求管理系統',
|
|
29
|
+
'需求管理系統/主選單區',
|
|
30
|
+
'需求管理系統/內容區',
|
|
31
|
+
'需求管理系統/內容區/編輯按鈕',
|
|
32
|
+
'知識管理系統',
|
|
33
|
+
'知識管理系統/主選單區',
|
|
34
|
+
'知識管理系統/內容區',
|
|
35
|
+
'知識管理系統/內容區/編輯按鈕',
|
|
36
|
+
'GIS(2D)',
|
|
37
|
+
'GIS(2D)/主選單區',
|
|
38
|
+
'模板下載',
|
|
39
|
+
'模板下載/主選單區',
|
|
40
|
+
'批次上傳系統',
|
|
41
|
+
'批次上傳系統/主選單區',
|
|
42
|
+
'API管理系統',
|
|
43
|
+
'API管理系統/主選單區',
|
|
44
|
+
'後台管理系統',
|
|
45
|
+
'後台管理系統/主選單區',
|
|
46
|
+
]
|
|
47
|
+
rs = map(rs, (key, k) => {
|
|
48
|
+
let v = ds.targets.funNew({
|
|
49
|
+
description: key,
|
|
50
|
+
})
|
|
51
|
+
v.id = key
|
|
52
|
+
return v
|
|
53
|
+
})
|
|
54
|
+
await woItems.targets.delAll()
|
|
55
|
+
await woItems.targets.insert(rs)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
rs = [
|
|
59
|
+
['L0權限群組', '普通瀏覽者用之權限群組',
|
|
60
|
+
`{ "___all___": { "show": "n", "active": "n" },
|
|
61
|
+
"主要資訊": { "show": "y", "active": "y" },
|
|
62
|
+
"主要資訊/主選單區": { "show": "y", "active": "y" },
|
|
63
|
+
"計畫資料管理系統": { "show": "y", "active": "y" },
|
|
64
|
+
"計畫資料管理系統/主選單區": { "show": "y", "active": "y" },
|
|
65
|
+
"計畫資料管理系統/內容區": { "show": "y", "active": "y" },
|
|
66
|
+
"需求管理系統": { "show": "y", "active": "y" },
|
|
67
|
+
"需求管理系統/主選單區": { "show": "y", "active": "y" },
|
|
68
|
+
"知識管理系統": { "show": "y", "active": "y" },
|
|
69
|
+
"知識管理系統/主選單區": { "show": "y", "active": "y" },
|
|
70
|
+
"GIS": { "show": "y", "active": "y" },
|
|
71
|
+
"GIS/主選單區": { "show": "y", "active": "y" },
|
|
72
|
+
"模板下載": { "show": "y", "active": "y" },
|
|
73
|
+
"模板下載/主選單區": { "show": "y", "active": "y" },
|
|
74
|
+
}`],
|
|
75
|
+
['L1權限群組', '一般使用者用之權限群組',
|
|
76
|
+
`{ "___all___": { "show": "n", "active": "n" },
|
|
77
|
+
"主要資訊": { "show": "y", "active": "y" },
|
|
78
|
+
"主要資訊/主選單區": { "show": "y", "active": "y" },
|
|
79
|
+
"計畫資料管理系統": { "show": "y", "active": "y" },
|
|
80
|
+
"計畫資料管理系統/主選單區": { "show": "y", "active": "y" },
|
|
81
|
+
"計畫資料管理系統/內容區": { "show": "y", "active": "y" },
|
|
82
|
+
"計畫資料管理系統/內容區/編輯按鈕": { "show": "y", "active": "n" },
|
|
83
|
+
"輔助參考文獻系統": { "show": "y", "active": "y" },
|
|
84
|
+
"輔助參考文獻系統/主選單區": { "show": "y", "active": "y" },
|
|
85
|
+
"需求管理系統": { "show": "y", "active": "y" },
|
|
86
|
+
"需求管理系統/主選單區": { "show": "y", "active": "y" },
|
|
87
|
+
"需求管理系統/內容區": { "show": "y", "active": "y" },
|
|
88
|
+
"需求管理系統/內容區/編輯按鈕": { "show": "y", "active": "n" },
|
|
89
|
+
"知識管理系統": { "show": "y", "active": "y" },
|
|
90
|
+
"知識管理系統/主選單區": { "show": "y", "active": "y" },
|
|
91
|
+
"知識管理系統/內容區": { "show": "y", "active": "y" },
|
|
92
|
+
"知識管理系統/內容區/編輯按鈕": { "show": "y", "active": "n" },
|
|
93
|
+
"GIS": { "show": "y", "active": "y" },
|
|
94
|
+
"GIS/主選單區": { "show": "y", "active": "y" },
|
|
95
|
+
"模板下載": { "show": "y", "active": "y" },
|
|
96
|
+
"模板下載/主選單區": { "show": "y", "active": "y" },
|
|
97
|
+
}`],
|
|
98
|
+
['L2權限群組', '系統管理者用之權限群組',
|
|
99
|
+
`{ "___all___": { "show": "y", "active": "y" } }`],
|
|
100
|
+
]
|
|
101
|
+
rs = map(rs, ([name, description, crules], k) => {
|
|
102
|
+
let v = ds.ruleGroups.funNew({
|
|
103
|
+
userId: 'id-for-admin',
|
|
104
|
+
name,
|
|
105
|
+
description,
|
|
106
|
+
crules,
|
|
107
|
+
})
|
|
108
|
+
v.id = `id-for-${name}`
|
|
109
|
+
v.order = k
|
|
110
|
+
return v
|
|
111
|
+
})
|
|
112
|
+
await woItems.ruleGroups.delAll()
|
|
113
|
+
await woItems.ruleGroups.insert(rs)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
rs = [
|
|
117
|
+
['viewer', '普通瀏覽者', 'id-for-L0權限群組'],
|
|
118
|
+
['basic', '一般使用者', 'id-for-L1權限群組'],
|
|
119
|
+
['admin', '系統管理者', 'id-for-L2權限群組'],
|
|
120
|
+
]
|
|
121
|
+
rs = map(rs, ([key, name, ruleGroupsIds], k) => {
|
|
122
|
+
let v = ds.users.funNew({
|
|
123
|
+
userId: 'id-for-admin',
|
|
124
|
+
name,
|
|
125
|
+
email: `${key}@example.com`,
|
|
126
|
+
ruleGroupsIds,
|
|
127
|
+
})
|
|
128
|
+
v.id = `id-for-${key}`
|
|
129
|
+
if (key === 'admin') {
|
|
130
|
+
v.isAdmin = 'y'
|
|
131
|
+
}
|
|
132
|
+
return v
|
|
133
|
+
})
|
|
134
|
+
await woItems.users.delAll()
|
|
135
|
+
await woItems.users.insert(rs)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
initialData()
|
|
141
|
+
.catch((err) => {
|
|
142
|
+
console.log('initialData catch', err)
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
//重建資料庫
|
|
147
|
+
//node --experimental-modules --es-module-specifier-resolution=node g.mInitialData.mjs
|
package/package.json
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "w-web-perm",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"main": "dist/w-web-perm.umd.js",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@mdi/js": "^7.2.96",
|
|
7
7
|
"axios": "^1.3.4",
|
|
8
|
+
"json5": "^2.2.3",
|
|
8
9
|
"lodash": "^4.17.21",
|
|
9
10
|
"showdown": "^2.1.0",
|
|
10
|
-
"w-component-vue": "^2.3.
|
|
11
|
+
"w-component-vue": "^2.3.18",
|
|
11
12
|
"w-data-collector": "^1.0.19",
|
|
12
13
|
"w-serv-hapi": "^1.0.11",
|
|
13
14
|
"w-serv-orm": "^1.0.7",
|
|
14
15
|
"w-ui-loginout": "^1.0.4",
|
|
15
|
-
"wsemi": "^1.7.
|
|
16
|
+
"wsemi": "^1.7.19"
|
|
16
17
|
},
|
|
17
18
|
"devDependencies": {
|
|
18
19
|
"@vue/cli-plugin-babel": "^5.0.8",
|
package/server/WWebPerm.mjs
CHANGED
|
@@ -310,8 +310,11 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
|
|
|
310
310
|
}
|
|
311
311
|
|
|
312
312
|
return {
|
|
313
|
-
user:
|
|
314
|
-
|
|
313
|
+
user: {
|
|
314
|
+
...userFind,
|
|
315
|
+
ruleGroupsNames: urs.ruleGroupsNames, //ruleGroupsNames併入user內顯示
|
|
316
|
+
},
|
|
317
|
+
rules: urs.rules,
|
|
315
318
|
}
|
|
316
319
|
}
|
|
317
320
|
|
|
@@ -363,11 +366,12 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
|
|
|
363
366
|
},
|
|
364
367
|
{
|
|
365
368
|
method: 'GET',
|
|
366
|
-
path: '/api/getUserByToken',
|
|
369
|
+
path: '/api/getUserByToken', //名稱getUserByToken為w-ui-loginout預設值, 若要更改兩邊須同時修改
|
|
367
370
|
handler: async function (req, res) {
|
|
368
|
-
// console.log('
|
|
371
|
+
// console.log('getUserByToken', req)
|
|
369
372
|
|
|
370
373
|
async function core() {
|
|
374
|
+
//提供對象為browser使用者, 且認定權限系統須系統管理員才能使用, 須先檢測token是否為系統管理員, 確認後回傳該使用者(系統管理員)資訊物件
|
|
371
375
|
|
|
372
376
|
//token
|
|
373
377
|
let token = get(req, 'query.token', '')
|
|
@@ -378,7 +382,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
|
|
|
378
382
|
// console.log('userSelf', userSelf)
|
|
379
383
|
|
|
380
384
|
//check
|
|
381
|
-
if (get(userSelf, 'isAdmin') !== 'y') {
|
|
385
|
+
if (get(userSelf, 'isAdmin') !== 'y') { //權限系統須系統管理員才能使用
|
|
382
386
|
return Promise.reject(`user does not have permission`)
|
|
383
387
|
}
|
|
384
388
|
|
|
@@ -386,7 +390,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
|
|
|
386
390
|
}
|
|
387
391
|
|
|
388
392
|
//pm2resolve core
|
|
389
|
-
let r = await pm2resolve(core)() //w-ui-loginout接收已預設格式用pm2resolve轉過,
|
|
393
|
+
let r = await pm2resolve(core)() //w-ui-loginout接收已預設格式用pm2resolve轉過, 須另提取state進行判斷
|
|
390
394
|
// console.log('getUserByToken', r)
|
|
391
395
|
|
|
392
396
|
return r
|
|
@@ -394,11 +398,12 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
|
|
|
394
398
|
},
|
|
395
399
|
{
|
|
396
400
|
method: 'GET',
|
|
397
|
-
path: '/api/getPerm',
|
|
401
|
+
path: '/api/getPerm',
|
|
398
402
|
handler: async function (req, res) {
|
|
399
403
|
// console.log('getPerm', req)
|
|
400
404
|
|
|
401
405
|
async function core() {
|
|
406
|
+
//提供對象為node與browser使用者, 須先檢測token是否有效, 再依照token取得使用者資訊物件, 再由其userId查詢回傳該使用者權限資訊物件
|
|
402
407
|
|
|
403
408
|
//parseToken
|
|
404
409
|
let token = parseToken(req)
|
|
@@ -438,6 +443,51 @@ function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
|
|
|
438
443
|
let r = await pm2resolve(core)()
|
|
439
444
|
// console.log('getPerm r', r)
|
|
440
445
|
|
|
446
|
+
return r
|
|
447
|
+
},
|
|
448
|
+
},
|
|
449
|
+
{
|
|
450
|
+
method: 'GET',
|
|
451
|
+
path: '/api/getPermById',
|
|
452
|
+
handler: async function (req, res) {
|
|
453
|
+
// console.log('getPermById', req)
|
|
454
|
+
|
|
455
|
+
async function core() {
|
|
456
|
+
//提供對象為node使用者, 且認定權限系統須系統管理員才能使用, 須先檢測token是否為系統管理員, 再由query取得欲查詢的使用者userId, 再由其userId查詢回傳該使用者權限資訊物件
|
|
457
|
+
|
|
458
|
+
//token
|
|
459
|
+
let token = get(req, 'query.token', '')
|
|
460
|
+
// console.log('token', token)
|
|
461
|
+
|
|
462
|
+
//getGenUserByUserId
|
|
463
|
+
let userSelf = await getTokenUserForSelf(token)
|
|
464
|
+
// console.log('userSelf', userSelf)
|
|
465
|
+
|
|
466
|
+
//check
|
|
467
|
+
if (get(userSelf, 'isAdmin') !== 'y') { //權限系統須系統管理員才能使用
|
|
468
|
+
return Promise.reject(`user does not have permission`)
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
//userId
|
|
472
|
+
let userId = get(req, 'query.userId', '')
|
|
473
|
+
// console.log('userId', userId)
|
|
474
|
+
|
|
475
|
+
//getGenUserAndRulesByUserId
|
|
476
|
+
let r = await getGenUserAndRulesByUserId(userId)
|
|
477
|
+
// console.log('getGenUserAndRulesByUserId', r)
|
|
478
|
+
|
|
479
|
+
//check
|
|
480
|
+
if (!iseobj(r)) {
|
|
481
|
+
return Promise.reject(`user does not have permrules`)
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
return r
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
//pm2resolve core
|
|
488
|
+
let r = await pm2resolve(core)() //w-ui-loginout接收已預設格式用pm2resolve轉過, 須另提取state進行判斷
|
|
489
|
+
// console.log('getUserByToken', r)
|
|
490
|
+
|
|
441
491
|
return r
|
|
442
492
|
},
|
|
443
493
|
},
|
|
@@ -148,6 +148,7 @@
|
|
|
148
148
|
|
|
149
149
|
<script>
|
|
150
150
|
import { mdiStackOverflow, mdiVectorPolylinePlus, mdiCheckboxMarkedCircle, mdiCloudUploadOutline } from '@mdi/js/mdi.js'
|
|
151
|
+
// import JSON5 from 'json5'
|
|
151
152
|
import get from 'lodash/get'
|
|
152
153
|
import each from 'lodash/each'
|
|
153
154
|
import map from 'lodash/map'
|
|
@@ -211,9 +212,9 @@ export default {
|
|
|
211
212
|
|
|
212
213
|
let vo = this
|
|
213
214
|
|
|
214
|
-
//rs
|
|
215
|
+
//rs
|
|
215
216
|
let rs = map(vo.ruleGroups, (v) => {
|
|
216
|
-
// let rules =
|
|
217
|
+
// let rules = JSON5.parse(v.crules)
|
|
217
218
|
return {
|
|
218
219
|
...v,
|
|
219
220
|
// rules,
|
|
@@ -123,6 +123,7 @@
|
|
|
123
123
|
|
|
124
124
|
<script>
|
|
125
125
|
import { mdiGamepadCircle, mdiStackOverflow, mdiAccountGroupOutline, mdiBallotRecountOutline, mdiCloudUploadOutline } from '@mdi/js/mdi.js'
|
|
126
|
+
import JSON5 from 'json5'
|
|
126
127
|
import get from 'lodash/get'
|
|
127
128
|
import set from 'lodash/set'
|
|
128
129
|
import each from 'lodash/each'
|
|
@@ -141,6 +142,10 @@ import WTree from 'w-component-vue/src/components/WTree.vue'
|
|
|
141
142
|
import { getTreeBlocks } from '../plugins/mShare.mjs'
|
|
142
143
|
|
|
143
144
|
|
|
145
|
+
//dlm
|
|
146
|
+
let dlm = '.'
|
|
147
|
+
|
|
148
|
+
|
|
144
149
|
export default {
|
|
145
150
|
components: {
|
|
146
151
|
WIcon,
|
|
@@ -202,6 +207,8 @@ export default {
|
|
|
202
207
|
|
|
203
208
|
//getTreeBlocks
|
|
204
209
|
let treeBlocks = getTreeBlocks(vo.targets)
|
|
210
|
+
// console.log('targets', vo.targets)
|
|
211
|
+
// console.log('treeBlocks', treeBlocks)
|
|
205
212
|
|
|
206
213
|
//save
|
|
207
214
|
vo.treeBlocks = treeBlocks
|
|
@@ -379,7 +386,7 @@ export default {
|
|
|
379
386
|
let nkParent = dropRight(v.nk, 2)
|
|
380
387
|
let p = get(treeBlocksTemp, nkParent)
|
|
381
388
|
v.parentId = p.id
|
|
382
|
-
v.id = `${v.parentId}
|
|
389
|
+
v.id = `${v.parentId}${dlm}${v.text}` //[tag:dlm]
|
|
383
390
|
}
|
|
384
391
|
v.order = k //需重新給予order
|
|
385
392
|
set(treeBlocksTemp, v.nk, v)
|
|
@@ -448,7 +455,7 @@ export default {
|
|
|
448
455
|
//gs
|
|
449
456
|
let gs = []
|
|
450
457
|
each(vo.ruleGroups, (v) => {
|
|
451
|
-
let rules =
|
|
458
|
+
let rules = JSON5.parse(v.crules)
|
|
452
459
|
let r = replaceObjKeys(rules, kpDiffs)
|
|
453
460
|
if (r.isChanged) {
|
|
454
461
|
gs.push({
|
|
@@ -153,6 +153,7 @@
|
|
|
153
153
|
<script>
|
|
154
154
|
import { mdiAccountEdit, mdiFileTree } from '@mdi/js/mdi.js'
|
|
155
155
|
import Vue from 'vue'
|
|
156
|
+
// import JSON5 from 'json5'
|
|
156
157
|
import get from 'lodash/get'
|
|
157
158
|
import each from 'lodash/each'
|
|
158
159
|
import map from 'lodash/map'
|
|
@@ -227,9 +228,9 @@ export default {
|
|
|
227
228
|
|
|
228
229
|
let vo = this
|
|
229
230
|
|
|
230
|
-
//rs
|
|
231
|
+
//rs
|
|
231
232
|
let rs = map(vo.ruleGroups, (v) => {
|
|
232
|
-
// let rules =
|
|
233
|
+
// let rules = JSON5.parse(v.crules)
|
|
233
234
|
return {
|
|
234
235
|
...v,
|
|
235
236
|
// rules,
|
|
@@ -311,8 +312,8 @@ export default {
|
|
|
311
312
|
//mergedGroup
|
|
312
313
|
let mergedGroup = {
|
|
313
314
|
id: 'merged-group',
|
|
314
|
-
name:
|
|
315
|
-
crules: JSON.stringify(urs),
|
|
315
|
+
name: urs.ruleGroupsNames,
|
|
316
|
+
crules: JSON.stringify(urs.rules),
|
|
316
317
|
}
|
|
317
318
|
|
|
318
319
|
//mergedGroup
|
|
@@ -92,9 +92,10 @@
|
|
|
92
92
|
|
|
93
93
|
<WTree
|
|
94
94
|
:viewHeightMax="treeHeight"
|
|
95
|
-
:
|
|
96
|
-
:
|
|
97
|
-
:
|
|
95
|
+
:indent="0.5"
|
|
96
|
+
:iconToggleColor="'#666'"
|
|
97
|
+
:iconToggleBackgroundColor="'transparent'"
|
|
98
|
+
:iconToggleBackgroundColorHover="'transparent'"
|
|
98
99
|
:data="treeBlocks"
|
|
99
100
|
>
|
|
100
101
|
<template v-slot:item="props">
|
|
@@ -207,6 +208,7 @@
|
|
|
207
208
|
|
|
208
209
|
<script>
|
|
209
210
|
import { mdiEyeCheck, mdiEyeOff, mdiEyedropper, mdiEyedropperOff } from '@mdi/js/mdi.js'
|
|
211
|
+
import JSON5 from 'json5'
|
|
210
212
|
import get from 'lodash/get'
|
|
211
213
|
import set from 'lodash/set'
|
|
212
214
|
import each from 'lodash/each'
|
|
@@ -275,7 +277,7 @@ export default {
|
|
|
275
277
|
let group = cloneDeep(vo.group)
|
|
276
278
|
|
|
277
279
|
//save rules
|
|
278
|
-
let rules =
|
|
280
|
+
let rules = JSON5.parse(group.crules)
|
|
279
281
|
group.rules = rules
|
|
280
282
|
// console.log('rules', rules)
|
|
281
283
|
|
|
@@ -303,30 +305,6 @@ export default {
|
|
|
303
305
|
return get(this, `$store.state.targets`)
|
|
304
306
|
},
|
|
305
307
|
|
|
306
|
-
// blocks: function() {
|
|
307
|
-
// // console.log('computed blocks')
|
|
308
|
-
|
|
309
|
-
// let vo = this
|
|
310
|
-
|
|
311
|
-
// //rs
|
|
312
|
-
// let rs = map(vo.targets, (v) => {
|
|
313
|
-
|
|
314
|
-
// //text, parentId
|
|
315
|
-
// let s = sep(v.id, '.')
|
|
316
|
-
// let text = get(takeRight(s), 0) //取最後節點
|
|
317
|
-
// s = dropRight(s, 1)
|
|
318
|
-
// let parentId = join(s, '.') //取父節點
|
|
319
|
-
|
|
320
|
-
// return {
|
|
321
|
-
// ...v,
|
|
322
|
-
// parentId,
|
|
323
|
-
// text,
|
|
324
|
-
// }
|
|
325
|
-
// })
|
|
326
|
-
|
|
327
|
-
// return rs
|
|
328
|
-
// },
|
|
329
|
-
|
|
330
308
|
treeBlocks: function() {
|
|
331
309
|
// console.log('computed treeBlocks')
|
|
332
310
|
|
package/src/main.js
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
import get from 'lodash/get'
|
|
2
|
-
// import '@babel/polyfill' //需提供Vuetify的Symbol等API
|
|
3
|
-
// import 'core-js/stable' //需提供Vuetify的Symbol等API, 官網說使用transpileDependencies但不夠, 改用之前提到的@babel/polyfill會被提示已廢棄, 改使用給webpack的polyfill方式才行
|
|
4
|
-
// import 'regenerator-runtime/runtime'
|
|
5
|
-
// import 'intersection-observer' //需供Vuetify的Intersection Observer, 專案內有使用v-intersect才需引入, 而w-component-vue沒用v-intersect
|
|
6
1
|
import Vue from 'vue'
|
|
2
|
+
import get from 'lodash/get'
|
|
7
3
|
import WServHapiClient from 'w-serv-hapi/src/WServHapiClient.mjs'
|
|
8
4
|
import WAlert from 'w-component-vue/src/components/WAlert.mjs'
|
|
9
5
|
import domMutation from 'w-component-vue/src/js/domMutation.mjs'
|
|
@@ -14,10 +10,9 @@ import store from './store/index.mjs'
|
|
|
14
10
|
import mVuetify from './plugins/mVuetify.mjs'
|
|
15
11
|
import ui from './plugins/mUI.mjs'
|
|
16
12
|
import mDataSelectorSchema from './plugins/mDataSelectorSchema.mjs'
|
|
17
|
-
import mDataSupport from './plugins/mDataSupport.mjs'
|
|
13
|
+
// import mDataSupport from './plugins/mDataSupport.mjs'
|
|
18
14
|
import * as s from './plugins/mShare.mjs'
|
|
19
15
|
import ds from './schema/index.mjs'
|
|
20
|
-
// console.log('globalState', globalState)
|
|
21
16
|
// console.log('ds', ds)
|
|
22
17
|
|
|
23
18
|
|
|
@@ -36,15 +31,15 @@ Vue.prototype.$alert = function() {
|
|
|
36
31
|
//dssm
|
|
37
32
|
let dssm = mDataSelectorSchema(ds)
|
|
38
33
|
|
|
39
|
-
//dspt
|
|
40
|
-
let dspt = mDataSupport(Vue.prototype)
|
|
34
|
+
// //dspt
|
|
35
|
+
// let dspt = mDataSupport(Vue.prototype)
|
|
41
36
|
|
|
42
37
|
//prototype
|
|
43
38
|
Vue.prototype.$ui = ui
|
|
44
39
|
Vue.prototype.$t = ui.getKpText
|
|
45
40
|
Vue.prototype.$s = s
|
|
46
41
|
Vue.prototype.$dssm = dssm
|
|
47
|
-
Vue.prototype.$dspt = dspt
|
|
42
|
+
// Vue.prototype.$dspt = dspt
|
|
48
43
|
// Vue.prototype.$ds = ds
|
|
49
44
|
Vue.prototype.$dg = {}
|
|
50
45
|
|